alexkueck commited on
Commit
0fca2bc
1 Parent(s): 18e76ce

Update utils.py

Browse files
Files changed (1) hide show
  1. utils.py +19 -79
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
- """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="gpt-4-0125-preview", streaming=True)
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="""Du bist ein Bewerter, der die Relevanz von einem erhaltenen Dokument zu einer Nutzeranfrage bewerten soll. \n
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
- # Chain
390
- rag_chain = prompt | llm | StrOutputParser()
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
  ####################################