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:
|