Update utils.py
Browse files
utils.py
CHANGED
|
@@ -145,10 +145,11 @@ urls = [
|
|
| 145 |
#Modell und Tokenizer für die Anfrage der RAG Chain
|
| 146 |
##################################################
|
| 147 |
# Schritt 1: Initialisiere den Sentence-Transformer und das Generierungsmodell
|
| 148 |
-
embedder_modell = SentenceTransformer('all-MiniLM-L6-v2')
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
|
|
|
| 152 |
|
| 153 |
|
| 154 |
|
|
@@ -210,6 +211,8 @@ def clean_text(text):
|
|
| 210 |
#RAG Hilfsfunktionen - Dokumenten bearbeiten für Vektorstore
|
| 211 |
##################################################
|
| 212 |
##################################################
|
|
|
|
|
|
|
| 213 |
# Funktion, um für einen best. File-typ ein directory-loader zu definieren
|
| 214 |
def create_directory_loaderBack(file_type, directory_path):
|
| 215 |
#verscheidene Dokument loaders:
|
|
@@ -250,7 +253,7 @@ def create_directory_loader(file_type, directory_path):
|
|
| 250 |
|
| 251 |
################################################
|
| 252 |
# Custom Loader-Funktionen zu dem DirektoryLoader
|
| 253 |
-
#
|
| 254 |
def load_pdf_with_metadata(file_path):
|
| 255 |
document = fitz.open(file_path)
|
| 256 |
documents = []
|
|
@@ -261,7 +264,8 @@ def load_pdf_with_metadata(file_path):
|
|
| 261 |
page_number = page_num + 1
|
| 262 |
documents.append(Document(content=content, title=title, page=page_number, path=file_path))
|
| 263 |
return documents
|
| 264 |
-
|
|
|
|
| 265 |
def load_word_with_metadata(file_path):
|
| 266 |
document = docx.Document(file_path)
|
| 267 |
title = "Dokument"
|
|
@@ -315,9 +319,10 @@ def document_loading_splitting():
|
|
| 315 |
|
| 316 |
###########################################
|
| 317 |
#Chroma DB die splits ablegen - vektorisiert...
|
|
|
|
| 318 |
def document_storage_chroma(splits):
|
| 319 |
# Embedding-Funktion definieren
|
| 320 |
-
embedding_fn = HuggingFaceEmbeddings(model_name=
|
| 321 |
|
| 322 |
# Vectorstore initialisieren und Dokumente hinzufügen
|
| 323 |
vectorstore = Chroma.from_documents(documents=splits, embedding=embedding_fn, persist_directory = PATH_WORK + CHROMA_DIR)
|
|
@@ -329,17 +334,18 @@ def document_storage_chroma(splits):
|
|
| 329 |
|
| 330 |
############################################
|
| 331 |
#dokumente in chroma db vektorisiert ablegen können - die Db vorbereiten daüfur
|
|
|
|
| 332 |
def document_retrieval_chroma(llm, prompt):
|
| 333 |
#HF embeddings -----------------------------------
|
| 334 |
#Alternative Embedding - für Vektorstore, um Ähnlichkeitsvektoren zu erzeugen - die ...InstructEmbedding ist sehr rechenaufwendig
|
| 335 |
#embeddings = HuggingFaceInstructEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2", model_kwargs={"device": "cpu"})
|
| 336 |
#etwas weniger rechenaufwendig:
|
| 337 |
-
embeddings = HuggingFaceEmbeddings(model_name=
|
| 338 |
|
| 339 |
#ChromaDb um die embedings zu speichern
|
| 340 |
db = Chroma(embedding_function = embeddings, persist_directory = PATH_WORK + CHROMA_DIR)
|
| 341 |
return db
|
| 342 |
-
|
| 343 |
|
| 344 |
|
| 345 |
|
|
@@ -359,15 +365,13 @@ def rag_chain(llm, prompt, retriever):
|
|
| 359 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
| 360 |
relevant_docs=[]
|
| 361 |
most_relevant_docs=[]
|
|
|
|
|
|
|
| 362 |
relevant_docs = retriever.get_relevant_documents(prompt)
|
|
|
|
| 363 |
extracted_docs = extract_document_info(relevant_docs)
|
| 364 |
|
| 365 |
if (len(extracted_docs)>0):
|
| 366 |
-
#llm_chain = LLMChain(llm = llm, prompt = RAG_CHAIN_PROMPT)
|
| 367 |
-
#result = llm_chain.run({"context": relevant_docs, "question": prompt})
|
| 368 |
-
# Erstelle ein PromptTemplate mit Platzhaltern für Kontext und Frage
|
| 369 |
-
#RAG_CHAIN_PROMPT = PromptTemplate(template="Context: {context}\n\nQuestion: {question}\n\nAnswer:")
|
| 370 |
-
|
| 371 |
# Inahlte Abrufen der relevanten Dokumente
|
| 372 |
doc_contents = [doc["content"] for doc in extracted_docs]
|
| 373 |
|
|
@@ -394,11 +398,12 @@ def rag_chain(llm, prompt, retriever):
|
|
| 394 |
answer = tokenizer_rag.decode(outputs[0], skip_special_tokens=True)
|
| 395 |
"""
|
| 396 |
#############################################
|
| 397 |
-
#Verschiedene LLMs ausprobieren
|
|
|
|
| 398 |
#############################################
|
| 399 |
#1. Alternative, wenn llm direkt übergeben....................................
|
| 400 |
-
|
| 401 |
-
|
| 402 |
|
| 403 |
|
| 404 |
#2. Alternative, wenn mit API_URL ...........................................
|
|
@@ -408,7 +413,7 @@ def rag_chain(llm, prompt, retriever):
|
|
| 408 |
#für text-generation:
|
| 409 |
#messages = [{"role": "user", "content": input_text},]
|
| 410 |
#für summarizatiuon
|
| 411 |
-
answer = llm(input_text,max_length=1024, min_length=150, do_sample=False)
|
| 412 |
|
| 413 |
# Erstelle das Ergebnis-Dictionary
|
| 414 |
result = {
|
|
@@ -430,8 +435,8 @@ def query(api_llm, payload):
|
|
| 430 |
return response.json()
|
| 431 |
|
| 432 |
|
| 433 |
-
|
| 434 |
-
|
| 435 |
def extract_document_info(documents):
|
| 436 |
extracted_info = []
|
| 437 |
for doc in documents:
|
|
|
|
| 145 |
#Modell und Tokenizer für die Anfrage der RAG Chain
|
| 146 |
##################################################
|
| 147 |
# Schritt 1: Initialisiere den Sentence-Transformer und das Generierungsmodell
|
| 148 |
+
embedder_modell = SentenceTransformer("sentence-transformers/all-mpnet-base-v2") #'all-MiniLM-L6-v2')
|
| 149 |
+
EMBEDDING_MODELL = "sentence-transformers/all-mpnet-base-v2"
|
| 150 |
+
#HF_MODELL = "t5-small"
|
| 151 |
+
#modell_rag = AutoModelForSeq2SeqLM.from_pretrained(HF_MODELL)
|
| 152 |
+
#tokenizer_rag = AutoTokenizer.from_pretrained(HF_MODELL)
|
| 153 |
|
| 154 |
|
| 155 |
|
|
|
|
| 211 |
#RAG Hilfsfunktionen - Dokumenten bearbeiten für Vektorstore
|
| 212 |
##################################################
|
| 213 |
##################################################
|
| 214 |
+
# Directory Loader Konfigurieren
|
| 215 |
+
##################################################
|
| 216 |
# Funktion, um für einen best. File-typ ein directory-loader zu definieren
|
| 217 |
def create_directory_loaderBack(file_type, directory_path):
|
| 218 |
#verscheidene Dokument loaders:
|
|
|
|
| 253 |
|
| 254 |
################################################
|
| 255 |
# Custom Loader-Funktionen zu dem DirektoryLoader
|
| 256 |
+
# für PDF Dokumente:
|
| 257 |
def load_pdf_with_metadata(file_path):
|
| 258 |
document = fitz.open(file_path)
|
| 259 |
documents = []
|
|
|
|
| 264 |
page_number = page_num + 1
|
| 265 |
documents.append(Document(content=content, title=title, page=page_number, path=file_path))
|
| 266 |
return documents
|
| 267 |
+
|
| 268 |
+
#für WOrD Dokumente
|
| 269 |
def load_word_with_metadata(file_path):
|
| 270 |
document = docx.Document(file_path)
|
| 271 |
title = "Dokument"
|
|
|
|
| 319 |
|
| 320 |
###########################################
|
| 321 |
#Chroma DB die splits ablegen - vektorisiert...
|
| 322 |
+
|
| 323 |
def document_storage_chroma(splits):
|
| 324 |
# Embedding-Funktion definieren
|
| 325 |
+
embedding_fn = HuggingFaceEmbeddings(model_name=EMBEDDING_MODELL, model_kwargs={"device": "cpu"}, encode_kwargs={'normalize_embeddings': False})
|
| 326 |
|
| 327 |
# Vectorstore initialisieren und Dokumente hinzufügen
|
| 328 |
vectorstore = Chroma.from_documents(documents=splits, embedding=embedding_fn, persist_directory = PATH_WORK + CHROMA_DIR)
|
|
|
|
| 334 |
|
| 335 |
############################################
|
| 336 |
#dokumente in chroma db vektorisiert ablegen können - die Db vorbereiten daüfur
|
| 337 |
+
"""
|
| 338 |
def document_retrieval_chroma(llm, prompt):
|
| 339 |
#HF embeddings -----------------------------------
|
| 340 |
#Alternative Embedding - für Vektorstore, um Ähnlichkeitsvektoren zu erzeugen - die ...InstructEmbedding ist sehr rechenaufwendig
|
| 341 |
#embeddings = HuggingFaceInstructEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2", model_kwargs={"device": "cpu"})
|
| 342 |
#etwas weniger rechenaufwendig:
|
| 343 |
+
embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODELL, model_kwargs={"device": "cpu"}, encode_kwargs={'normalize_embeddings': False})
|
| 344 |
|
| 345 |
#ChromaDb um die embedings zu speichern
|
| 346 |
db = Chroma(embedding_function = embeddings, persist_directory = PATH_WORK + CHROMA_DIR)
|
| 347 |
return db
|
| 348 |
+
"""
|
| 349 |
|
| 350 |
|
| 351 |
|
|
|
|
| 365 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
| 366 |
relevant_docs=[]
|
| 367 |
most_relevant_docs=[]
|
| 368 |
+
|
| 369 |
+
#passend zum Prompt relevante Dokuemnte raussuchen
|
| 370 |
relevant_docs = retriever.get_relevant_documents(prompt)
|
| 371 |
+
#zu jedem relevanten Dokument die wichtigen Informationen zusammenstellen (im Dict)
|
| 372 |
extracted_docs = extract_document_info(relevant_docs)
|
| 373 |
|
| 374 |
if (len(extracted_docs)>0):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 375 |
# Inahlte Abrufen der relevanten Dokumente
|
| 376 |
doc_contents = [doc["content"] for doc in extracted_docs]
|
| 377 |
|
|
|
|
| 398 |
answer = tokenizer_rag.decode(outputs[0], skip_special_tokens=True)
|
| 399 |
"""
|
| 400 |
#############################################
|
| 401 |
+
#Verschiedene LLMs ausprobieren als Generierungsmodell
|
| 402 |
+
#für die Zusammenfassung
|
| 403 |
#############################################
|
| 404 |
#1. Alternative, wenn llm direkt übergeben....................................
|
| 405 |
+
llm_chain = LLMChain(llm = llm, prompt = RAG_CHAIN_PROMPT)
|
| 406 |
+
answer = llm_chain.run({"context": combined_content, "question": prompt})
|
| 407 |
|
| 408 |
|
| 409 |
#2. Alternative, wenn mit API_URL ...........................................
|
|
|
|
| 413 |
#für text-generation:
|
| 414 |
#messages = [{"role": "user", "content": input_text},]
|
| 415 |
#für summarizatiuon
|
| 416 |
+
#answer = llm(input_text,max_length=1024, min_length=150, do_sample=False)
|
| 417 |
|
| 418 |
# Erstelle das Ergebnis-Dictionary
|
| 419 |
result = {
|
|
|
|
| 435 |
return response.json()
|
| 436 |
|
| 437 |
|
| 438 |
+
#############################################################
|
| 439 |
+
#in einem Dictionary die wichtigen Infos zu jedem Dok zusammenstellen
|
| 440 |
def extract_document_info(documents):
|
| 441 |
extracted_info = []
|
| 442 |
for doc in documents:
|