Update utils.py
Browse files
utils.py
CHANGED
@@ -131,8 +131,8 @@ CHROMA_WORD = './chroma/kkg/word'
|
|
131 |
CHROMA_EXCEL = './chroma/kkg/excel'
|
132 |
YOUTUBE_DIR = "/youtube"
|
133 |
HISTORY_PFAD = "/data/history"
|
134 |
-
|
135 |
-
|
136 |
###############################################
|
137 |
#URLs zu Dokumenten oder andere Inhalte, die einbezogen werden sollen
|
138 |
PDF_URL = "https://arxiv.org/pdf/2303.08774.pdf"
|
@@ -242,20 +242,8 @@ def clean_text(text):
|
|
242 |
#RAG Hilfsfunktionen - Dokumenten bearbeiten für Vektorstore
|
243 |
##################################################
|
244 |
##################################################
|
245 |
-
# Directory Loader Konfigurieren
|
246 |
##################################################
|
247 |
-
# Funktion, um für einen best. File-typ ein directory-loader zu definieren
|
248 |
-
def create_directory_loaderBack(file_type, directory_path):
|
249 |
-
#verscheidene Dokument loaders:
|
250 |
-
loaders = {
|
251 |
-
'.pdf': PyPDFLoader,
|
252 |
-
'.word': UnstructuredWordDocumentLoader,
|
253 |
-
}
|
254 |
-
return DirectoryLoader(
|
255 |
-
path=directory_path,
|
256 |
-
glob=f"**/*{file_type}",
|
257 |
-
loader_cls=loaders[file_type],
|
258 |
-
)
|
259 |
|
260 |
#besseren directory Loader als CustomLoader definieren, der den inhalt des dokuemnts, die seitenzahlen, die überschriften und die pfadezu den dokumenten extrahieren
|
261 |
def create_directory_loader(file_type, directory_path):
|
@@ -345,7 +333,9 @@ def document_loading_splitting():
|
|
345 |
# Document splitting
|
346 |
text_splitter = RecursiveCharacterTextSplitter(chunk_overlap = 150, chunk_size = 1500)
|
347 |
splits = text_splitter.split_documents(docs)
|
348 |
-
|
|
|
|
|
349 |
return splits
|
350 |
|
351 |
###########################################
|
@@ -481,6 +471,49 @@ def rag_chain(llm, prompt, retriever):
|
|
481 |
return result
|
482 |
|
483 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
484 |
|
485 |
#############################################################
|
486 |
#in einem Dictionary die wichtigen Infos zu jedem Dok zusammenstellen
|
@@ -579,11 +612,23 @@ def download_link(doc):
|
|
579 |
|
580 |
|
581 |
def display_files():
|
582 |
-
files = os.listdir(
|
583 |
files_table = "<table style='width:100%; border-collapse: collapse;'>"
|
584 |
files_table += "<tr style='background-color: #930BBA; color: white; font-weight: bold; font-size: larger;'><th>Dateiname</th><th>Größe (KB)</th></tr>"
|
585 |
for i, file in enumerate(files):
|
586 |
-
file_path = os.path.join(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
587 |
file_size = os.path.getsize(file_path) / 1024 # Größe in KB
|
588 |
row_color = "#4f4f4f" if i % 2 == 0 else "#3a3a3a" # Wechselnde Zeilenfarben
|
589 |
files_table += f"<tr style='background-color: {row_color}; border-bottom: 1px solid #ddd;'>"
|
@@ -594,11 +639,12 @@ def display_files():
|
|
594 |
|
595 |
|
596 |
# gefundene relevante Dokumente auflisten (links)
|
|
|
597 |
def list_pdfs():
|
598 |
if not os.path.exists(DOCS_DIR):
|
599 |
return []
|
600 |
return [f for f in os.listdir(SAVE_DIR) if f.endswith('.pdf')]
|
601 |
-
|
602 |
##########################################
|
603 |
#Extension des hochgeladenen Files bestimmen
|
604 |
def analyze_file(file):
|
|
|
131 |
CHROMA_EXCEL = './chroma/kkg/excel'
|
132 |
YOUTUBE_DIR = "/youtube"
|
133 |
HISTORY_PFAD = "/data/history"
|
134 |
+
DOCS_DIR_PDF = "chroma/kkg/pdf"
|
135 |
+
DOCS_DIR_WORD = "chroma/kkg/word"
|
136 |
###############################################
|
137 |
#URLs zu Dokumenten oder andere Inhalte, die einbezogen werden sollen
|
138 |
PDF_URL = "https://arxiv.org/pdf/2303.08774.pdf"
|
|
|
242 |
#RAG Hilfsfunktionen - Dokumenten bearbeiten für Vektorstore
|
243 |
##################################################
|
244 |
##################################################
|
245 |
+
# Directory Loader Konfigurieren um Text zu extrahieren
|
246 |
##################################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
|
248 |
#besseren directory Loader als CustomLoader definieren, der den inhalt des dokuemnts, die seitenzahlen, die überschriften und die pfadezu den dokumenten extrahieren
|
249 |
def create_directory_loader(file_type, directory_path):
|
|
|
333 |
# Document splitting
|
334 |
text_splitter = RecursiveCharacterTextSplitter(chunk_overlap = 150, chunk_size = 1500)
|
335 |
splits = text_splitter.split_documents(docs)
|
336 |
+
for split in splits:
|
337 |
+
if 'DIVIS' in split['content']:
|
338 |
+
print("DIVIS found in chunk:", split)
|
339 |
return splits
|
340 |
|
341 |
###########################################
|
|
|
471 |
return result
|
472 |
|
473 |
|
474 |
+
#############################################
|
475 |
+
#keine History des chatbots einbeziehen, keine Zusammenfassung am Anfang - nur mit Vektorstore arbeiten, um relevante Dokumente anzuzeigen
|
476 |
+
def rag_chain_simple( prompt, retriever):
|
477 |
+
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
478 |
+
relevant_docs=[]
|
479 |
+
most_relevant_docs=[]
|
480 |
+
|
481 |
+
#passend zum Prompt relevante Dokuemnte raussuchen
|
482 |
+
relevant_docs = retriever.invoke(prompt)
|
483 |
+
#zu jedem relevanten Dokument die wichtigen Informationen zusammenstellen (im Dict)
|
484 |
+
extracted_docs = extract_document_info(relevant_docs)
|
485 |
+
|
486 |
+
if (len(extracted_docs)>0):
|
487 |
+
# Inahlte Abrufen der relevanten Dokumente
|
488 |
+
doc_contents = [doc["content"] for doc in extracted_docs]
|
489 |
+
|
490 |
+
#Berechne die Ähnlichkeiten und finde das relevanteste Dokument
|
491 |
+
question_embedding = embedder_modell.encode(prompt, convert_to_tensor=True)
|
492 |
+
doc_embeddings = embedder_modell.encode(doc_contents, convert_to_tensor=True)
|
493 |
+
similarity_scores = util.pytorch_cos_sim(question_embedding, doc_embeddings)
|
494 |
+
most_relevant_doc_indices = similarity_scores.argsort(descending=True).squeeze().tolist()
|
495 |
+
|
496 |
+
#Erstelle eine Liste der relevantesten Dokumente
|
497 |
+
most_relevant_docs = [extracted_docs[i] for i in most_relevant_doc_indices]
|
498 |
+
|
499 |
+
#Kombiniere die Inhalte aller relevanten Dokumente
|
500 |
+
combined_content = " ".join([doc["content"] for doc in most_relevant_docs])
|
501 |
+
|
502 |
+
# Erstelle das Ergebnis-Dictionary
|
503 |
+
result = {
|
504 |
+
"answer": "Folgende relevante Dokumente wurden gefunden:",
|
505 |
+
"relevant_docs": most_relevant_docs
|
506 |
+
}
|
507 |
+
else:
|
508 |
+
# keine relevanten Dokumente gefunden
|
509 |
+
result = {
|
510 |
+
"answer": "Keine relevanten Dokumente gefunden",
|
511 |
+
"relevant_docs": most_relevant_docs
|
512 |
+
}
|
513 |
+
|
514 |
+
return result
|
515 |
+
|
516 |
+
|
517 |
|
518 |
#############################################################
|
519 |
#in einem Dictionary die wichtigen Infos zu jedem Dok zusammenstellen
|
|
|
612 |
|
613 |
|
614 |
def display_files():
|
615 |
+
files = os.listdir(DOCS_DIR_PDF)
|
616 |
files_table = "<table style='width:100%; border-collapse: collapse;'>"
|
617 |
files_table += "<tr style='background-color: #930BBA; color: white; font-weight: bold; font-size: larger;'><th>Dateiname</th><th>Größe (KB)</th></tr>"
|
618 |
for i, file in enumerate(files):
|
619 |
+
file_path = os.path.join(DOCS_DIR_PDF, file)
|
620 |
+
file_size = os.path.getsize(file_path) / 1024 # Größe in KB
|
621 |
+
row_color = "#4f4f4f" if i % 2 == 0 else "#3a3a3a" # Wechselnde Zeilenfarben
|
622 |
+
files_table += f"<tr style='background-color: {row_color}; border-bottom: 1px solid #ddd;'>"
|
623 |
+
files_table += f"<td><b>{download_link(file)}</b></td>"
|
624 |
+
files_table += f"<td>{file_size:.2f}</td></tr>"
|
625 |
+
files_table += "</table>"
|
626 |
+
|
627 |
+
files = os.listdir(DOCS_DIR_WORD)
|
628 |
+
files_table += "<table style='width:100%; border-collapse: collapse;'>"
|
629 |
+
files_table += "<tr style='background-color: #930BBA; color: white; font-weight: bold; font-size: larger;'><th>Dateiname</th><th>Größe (KB)</th></tr>"
|
630 |
+
for i, file in enumerate(files):
|
631 |
+
file_path = os.path.join(DOCS_DIR_WORD, file)
|
632 |
file_size = os.path.getsize(file_path) / 1024 # Größe in KB
|
633 |
row_color = "#4f4f4f" if i % 2 == 0 else "#3a3a3a" # Wechselnde Zeilenfarben
|
634 |
files_table += f"<tr style='background-color: {row_color}; border-bottom: 1px solid #ddd;'>"
|
|
|
639 |
|
640 |
|
641 |
# gefundene relevante Dokumente auflisten (links)
|
642 |
+
"""
|
643 |
def list_pdfs():
|
644 |
if not os.path.exists(DOCS_DIR):
|
645 |
return []
|
646 |
return [f for f in os.listdir(SAVE_DIR) if f.endswith('.pdf')]
|
647 |
+
"""
|
648 |
##########################################
|
649 |
#Extension des hochgeladenen Files bestimmen
|
650 |
def analyze_file(file):
|