Update utils.py
Browse files
utils.py
CHANGED
|
@@ -283,15 +283,24 @@ def document_storage_chroma(splits):
|
|
| 283 |
#Dokumente, die vom Retriever rausgesucht wurden auf Relevanz untersuchen
|
| 284 |
def grade_documents_direct(prompt, documents):
|
| 285 |
print("---CHECK RELEVANCE---")
|
| 286 |
-
|
| 287 |
# Data model
|
| 288 |
class grade(BaseModel):
|
| 289 |
-
|
| 290 |
binary_score: str = Field(description="Relevanz Bewertung 'ja' oder 'nein'")
|
| 291 |
-
|
| 292 |
# LLM
|
| 293 |
-
model = ChatOpenAI(temperature=0.3, model="
|
| 294 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 295 |
# Tool
|
| 296 |
grade_tool_oai = convert_to_openai_tool(grade)
|
| 297 |
|
|
@@ -306,17 +315,17 @@ def grade_documents_direct(prompt, documents):
|
|
| 306 |
|
| 307 |
# Prompt
|
| 308 |
prompt = PromptTemplate(
|
| 309 |
-
template="
|
| 310 |
Hier ist das erhaltene Dokument: \n\n {context} \n\n
|
| 311 |
Hier ist die Nutzeranfrage: {question} \n
|
| 312 |
Wenn das erhaltene Dokument Keywörter oder semantische Bedeutung in Bezug auf die Nutzeranfrage hat, bewerte es als relevant. \n
|
| 313 |
-
Gib eine binäre Bewertung von 'ja' oder 'nein' Bewertung, um anzuzeigen ob das Dokuemnt relevant ist zur Nutzeranfrage oder nicht."
|
| 314 |
input_variables=["context", "question"],
|
| 315 |
)
|
| 316 |
|
| 317 |
# Chain
|
| 318 |
chain = prompt | llm_with_tool | parser_tool
|
| 319 |
-
|
| 320 |
# Score
|
| 321 |
filtered_docs = []
|
| 322 |
|
|
@@ -379,6 +388,7 @@ def rag_chain(llm, prompt, retriever):
|
|
| 379 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
| 380 |
relevant_docs = retriever.get_relevant_documents(prompt)
|
| 381 |
filtered_docs = grade_documents_direct(prompt, relevant_docs)
|
|
|
|
| 382 |
neu_prompt=prompt
|
| 383 |
if (len(filtered_docs)<2): #frage neu formulieren
|
| 384 |
neu_prompt = transform_query_direct(prompt)
|
|
@@ -386,10 +396,8 @@ def rag_chain(llm, prompt, retriever):
|
|
| 386 |
filtered_docs = grade_documents_direct(relevant_docs)
|
| 387 |
|
| 388 |
if (len(filtered_docs)>0):
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
# Run
|
| 392 |
-
result = rag_chain.invoke({"context": documents, "question": neu_prompt})
|
| 393 |
else:
|
| 394 |
#Normale Abfrage, da keine relevanten Dokumente gefunden
|
| 395 |
llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
|
|
@@ -888,74 +896,6 @@ def create_picture(history, prompt):
|
|
| 888 |
########################################
|
| 889 |
# Ausgabe in PDF des Chathistory
|
| 890 |
########################################
|
| 891 |
-
"""
|
| 892 |
-
#Aufzählungen in der History erkennen und auch als Auflistung darstellen
|
| 893 |
-
def erkennen_und_formatieren_von_aufzaehlungen_backup(text, styles):
|
| 894 |
-
# Aufzählungszeichen oder Nummerierungen erkennen
|
| 895 |
-
aufzaehlungszeichen = ['-', '*', '•']
|
| 896 |
-
nummerierung = [f'{i}.' for i in range(1, 11)] # Beispiel für einfache Nummerierungserkennung
|
| 897 |
-
nummerierung2 = [f'{i}. ' for i in range(1, 11)]
|
| 898 |
-
nummerierung3 = [f' {i}. ' for i in range(1, 11)]
|
| 899 |
-
|
| 900 |
-
zeilen = text.split('\n')
|
| 901 |
-
list_items = []
|
| 902 |
-
for zeile in zeilen:
|
| 903 |
-
# Prüft, ob die Zeile mit einem Aufzählungszeichen oder einer Nummerierung beginnt
|
| 904 |
-
if any(zeile.lstrip().startswith(zeichen) for zeichen in aufzaehlungszeichen + nummerierung + nummerierung2 + nummerierung3) :
|
| 905 |
-
# Entfernt das Aufzählungszeichen/Nummerierung für die Darstellung
|
| 906 |
-
for zeichen in aufzaehlungszeichen + nummerierung + nummerierung2 + nummerierung3:
|
| 907 |
-
if zeile.lstrip().startswith(zeichen):
|
| 908 |
-
zeile = zeile.lstrip()[len(zeichen):].lstrip()
|
| 909 |
-
break
|
| 910 |
-
list_items.append(ListItem(Paragraph(zeile, styles['BodyText'])))
|
| 911 |
-
else:
|
| 912 |
-
# Wenn die Zeile nicht als Teil einer Aufzählung erkannt wird, breche die Schleife ab
|
| 913 |
-
break
|
| 914 |
-
if list_items:
|
| 915 |
-
# Eine Aufzählung wurde erkannt
|
| 916 |
-
return ListFlowable(list_items, bulletType='bullet', start='bulletchar', bulletFontName='Helvetica')
|
| 917 |
-
else:
|
| 918 |
-
# Keine Aufzählung erkannt, gebe einen normalen Paragraph zurück
|
| 919 |
-
return Paragraph(text, styles['BodyText'])
|
| 920 |
-
|
| 921 |
-
#Aufzählungen in der History erkennen und auch als Auflistung darstellen
|
| 922 |
-
def erkennen_und_formatieren_von_aufzaehlungen(text, styles):
|
| 923 |
-
# Aufzählungszeichen oder Nummerierungen erkennen
|
| 924 |
-
aufzaehlungszeichen = ['-', '*', '•']
|
| 925 |
-
# Regulärer Ausdruck für Nummerierungen (z.B. "1.", "2.")
|
| 926 |
-
# Verbesserter regulärer Ausdruck, der optionale Leerzeichen vor der Nummerierung berücksichtigt
|
| 927 |
-
nummerierung_regex = r"^\s*\d+\.\s*" # Optional Leerzeichen, gefolgt von Ziffern und einem Punkt, dann Leerzeichen
|
| 928 |
-
zeilen = text.split('\n')
|
| 929 |
-
list_items = []
|
| 930 |
-
for zeile in zeilen:
|
| 931 |
-
# Prüft, ob die Zeile mit einem Aufzählungszeichen beginnt
|
| 932 |
-
print("zeile:.............................")
|
| 933 |
-
print(zeile)
|
| 934 |
-
if any(zeile.lstrip().startswith(zeichen) for zeichen in aufzaehlungszeichen) or re.match(nummerierung_regex, zeile.lstrip()):
|
| 935 |
-
# Entfernt das Aufzählungszeichen/Nummerierung für die Darstellung
|
| 936 |
-
if (re.match(nummerierung_regex, zeile.lstrip())):
|
| 937 |
-
cleaned_line = re.sub(nummerierung_regex, '', zeile.lstrip(), 1).lstrip() # Entfernt nummerierte Aufzählungszeichen
|
| 938 |
-
else:
|
| 939 |
-
for zeichen in aufzaehlungszeichen:
|
| 940 |
-
if zeile.lstrip().startswith(zeichen):
|
| 941 |
-
cleaned_line = zeile.lstrip()[len(zeichen):].lstrip()
|
| 942 |
-
break
|
| 943 |
-
print(cleaned_line)
|
| 944 |
-
list_items.append(ListItem(Paragraph(cleaned_line, styles['BodyText'])))
|
| 945 |
-
else:
|
| 946 |
-
# Wenn die Zeile nicht als Teil einer Aufzählung erkannt wird, breche die Schleife ab
|
| 947 |
-
# und behandle den gesamten Text als normalen Paragraphen, wenn keine Liste erkannt wurde
|
| 948 |
-
if not list_items:
|
| 949 |
-
return Paragraph(text, styles['BodyText'])
|
| 950 |
-
break
|
| 951 |
-
if list_items:
|
| 952 |
-
# Eine Aufzählung wurde erkannt
|
| 953 |
-
return ListFlowable(list_items, bulletType='bullet', start='bulletchar', bulletFontName='Helvetica')
|
| 954 |
-
else:
|
| 955 |
-
# Keine Aufzählung erkannt, gebe einen normalen Paragraph zurück
|
| 956 |
-
return Paragraph(text, styles['BodyText'])
|
| 957 |
-
"""
|
| 958 |
-
|
| 959 |
####################################
|
| 960 |
# Erkennt Aufzählungen im Text und gibt eine entsprechend formatierte ListFlowable oder Paragraph zurück.
|
| 961 |
####################################
|
|
|
|
| 283 |
#Dokumente, die vom Retriever rausgesucht wurden auf Relevanz untersuchen
|
| 284 |
def grade_documents_direct(prompt, documents):
|
| 285 |
print("---CHECK RELEVANCE---")
|
| 286 |
+
"""
|
| 287 |
# Data model
|
| 288 |
class grade(BaseModel):
|
| 289 |
+
#Binary score for relevance check.
|
| 290 |
binary_score: str = Field(description="Relevanz Bewertung 'ja' oder 'nein'")
|
| 291 |
+
"""
|
| 292 |
# LLM
|
| 293 |
+
model = ChatOpenAI(temperature=0.3, model="text-davinci-003", streaming=True)
|
| 294 |
|
| 295 |
+
xxx = """Du bist ein Bewerter, der die Relevanz von einem erhaltenen Dokument zu einer Nutzeranfrage bewerten soll. \n
|
| 296 |
+
Hier ist das erhaltene Dokument: \n\n {context} \n\n
|
| 297 |
+
Hier ist die Nutzeranfrage: {question} \n
|
| 298 |
+
Wenn das erhaltene Dokument Keywörter oder semantische Bedeutung in Bezug auf die Nutzeranfrage hat, bewerte es als relevant. \n
|
| 299 |
+
Gib eine binäre Bewertung von 'ja' oder 'nein' Bewertung, um anzuzeigen ob das Dokuemnt relevant ist zur Nutzeranfrage oder nicht."""
|
| 300 |
+
grade_prompt = PromptTemplate(input_variables = ["context", "question"],
|
| 301 |
+
template = xxx)
|
| 302 |
+
|
| 303 |
+
"""
|
| 304 |
# Tool
|
| 305 |
grade_tool_oai = convert_to_openai_tool(grade)
|
| 306 |
|
|
|
|
| 315 |
|
| 316 |
# Prompt
|
| 317 |
prompt = PromptTemplate(
|
| 318 |
+
template="Du bist ein Bewerter, der die Relevanz von einem erhaltenen Dokument zu einer Nutzeranfrage bewerten soll. \n
|
| 319 |
Hier ist das erhaltene Dokument: \n\n {context} \n\n
|
| 320 |
Hier ist die Nutzeranfrage: {question} \n
|
| 321 |
Wenn das erhaltene Dokument Keywörter oder semantische Bedeutung in Bezug auf die Nutzeranfrage hat, bewerte es als relevant. \n
|
| 322 |
+
Gib eine binäre Bewertung von 'ja' oder 'nein' Bewertung, um anzuzeigen ob das Dokuemnt relevant ist zur Nutzeranfrage oder nicht.",
|
| 323 |
input_variables=["context", "question"],
|
| 324 |
)
|
| 325 |
|
| 326 |
# Chain
|
| 327 |
chain = prompt | llm_with_tool | parser_tool
|
| 328 |
+
"""
|
| 329 |
# Score
|
| 330 |
filtered_docs = []
|
| 331 |
|
|
|
|
| 388 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
| 389 |
relevant_docs = retriever.get_relevant_documents(prompt)
|
| 390 |
filtered_docs = grade_documents_direct(prompt, relevant_docs)
|
| 391 |
+
|
| 392 |
neu_prompt=prompt
|
| 393 |
if (len(filtered_docs)<2): #frage neu formulieren
|
| 394 |
neu_prompt = transform_query_direct(prompt)
|
|
|
|
| 396 |
filtered_docs = grade_documents_direct(relevant_docs)
|
| 397 |
|
| 398 |
if (len(filtered_docs)>0):
|
| 399 |
+
llm_chain = LLMChain(llm = llm, prompt = RAG_CHAIN_PROMPT)
|
| 400 |
+
result = llm_chain.run({"context": documents, "question": neu_prompt})
|
|
|
|
|
|
|
| 401 |
else:
|
| 402 |
#Normale Abfrage, da keine relevanten Dokumente gefunden
|
| 403 |
llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
|
|
|
|
| 896 |
########################################
|
| 897 |
# Ausgabe in PDF des Chathistory
|
| 898 |
########################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 899 |
####################################
|
| 900 |
# Erkennt Aufzählungen im Text und gibt eine entsprechend formatierte ListFlowable oder Paragraph zurück.
|
| 901 |
####################################
|