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