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