Update utils.py
Browse files
utils.py
CHANGED
|
@@ -280,7 +280,7 @@ def document_storage_chroma(splits):
|
|
| 280 |
return vectorstore, retriever
|
| 281 |
|
| 282 |
#Dokumente, die vom Retriever rausgesucht wurden auf Relevanz untersuchen
|
| 283 |
-
def grade_documents_direct(
|
| 284 |
print("---CHECK RELEVANCE---")
|
| 285 |
# Data model
|
| 286 |
class grade(BaseModel):
|
|
@@ -317,33 +317,21 @@ def grade_documents_direct(state):
|
|
| 317 |
|
| 318 |
# Score
|
| 319 |
filtered_docs = []
|
| 320 |
-
|
| 321 |
-
search = "nein" # Default do not opt for re-questioning to supplement retrieval
|
| 322 |
for d in documents:
|
| 323 |
score = chain.invoke({"question": question, "context": d.page_content})
|
| 324 |
grade = score[0].binary_score
|
| 325 |
if grade == "ja":
|
| 326 |
-
#search = "nein" # mind. ein relevantes Dokument -> keine Websuche nötig
|
| 327 |
print("---Bewertung: Dokument ist relevant---")
|
| 328 |
-
anzahl_relevant = anzahl_relevant +1
|
| 329 |
filtered_docs.append(d)
|
| 330 |
else:
|
| 331 |
print("---Bewertung: Dokument irrelevant---")
|
| 332 |
-
search = "ja" # mind ein Dokument irrelevant -> Frage umformulieren
|
| 333 |
continue
|
| 334 |
-
#wenn mehrheit der Dokumente relevant -> generieren starten damit
|
| 335 |
-
if (anzahl_relevant>= len(documents)/2):
|
| 336 |
-
search = "nein"
|
| 337 |
-
print("second trial grade_docs:.....................")
|
| 338 |
-
print(second_trial)
|
| 339 |
return filtered_docs
|
| 340 |
|
| 341 |
|
| 342 |
def transform_query_direct(query):
|
| 343 |
print("---TRANSFORM QUERY---")
|
| 344 |
-
state_dict = state["keys"]
|
| 345 |
-
question = state_dict["question"]
|
| 346 |
-
documents = state_dict["documents"]
|
| 347 |
|
| 348 |
# Create a prompt template with format instructions and the query
|
| 349 |
prompt = PromptTemplate(
|
|
@@ -365,7 +353,7 @@ def transform_query_direct(query):
|
|
| 365 |
better_question = chain.invoke({"question": question})
|
| 366 |
second_trial="ja"
|
| 367 |
|
| 368 |
-
return
|
| 369 |
|
| 370 |
|
| 371 |
###############################################
|
|
@@ -384,8 +372,30 @@ def llm_chain2(llm, prompt):
|
|
| 384 |
return result
|
| 385 |
#############################################
|
| 386 |
#langchain nutzen, um prompt an llm zu leiten, aber vorher in der VektorDB suchen, um passende splits zum Prompt hinzuzufügen
|
| 387 |
-
def rag_chain(llm, prompt,
|
| 388 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 389 |
workflow = StateGraph(GraphState)
|
| 390 |
|
| 391 |
# Define the nodes
|
|
@@ -431,6 +441,7 @@ def rag_chain(llm, prompt, vectorstore, retriever):
|
|
| 431 |
|
| 432 |
# Final generation
|
| 433 |
return value['keys']['generation']
|
|
|
|
| 434 |
|
| 435 |
############################################
|
| 436 |
# rag_chain Alternative für RAg mit Bild-Upload, da hier das llm so nicht genutzt werden kann und der prompt mit den RAG Erweiterungen anders übergeben wird
|
|
|
|
| 280 |
return vectorstore, retriever
|
| 281 |
|
| 282 |
#Dokumente, die vom Retriever rausgesucht wurden auf Relevanz untersuchen
|
| 283 |
+
def grade_documents_direct(documents):
|
| 284 |
print("---CHECK RELEVANCE---")
|
| 285 |
# Data model
|
| 286 |
class grade(BaseModel):
|
|
|
|
| 317 |
|
| 318 |
# Score
|
| 319 |
filtered_docs = []
|
| 320 |
+
|
|
|
|
| 321 |
for d in documents:
|
| 322 |
score = chain.invoke({"question": question, "context": d.page_content})
|
| 323 |
grade = score[0].binary_score
|
| 324 |
if grade == "ja":
|
|
|
|
| 325 |
print("---Bewertung: Dokument ist relevant---")
|
|
|
|
| 326 |
filtered_docs.append(d)
|
| 327 |
else:
|
| 328 |
print("---Bewertung: Dokument irrelevant---")
|
|
|
|
| 329 |
continue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 330 |
return filtered_docs
|
| 331 |
|
| 332 |
|
| 333 |
def transform_query_direct(query):
|
| 334 |
print("---TRANSFORM QUERY---")
|
|
|
|
|
|
|
|
|
|
| 335 |
|
| 336 |
# Create a prompt template with format instructions and the query
|
| 337 |
prompt = PromptTemplate(
|
|
|
|
| 353 |
better_question = chain.invoke({"question": question})
|
| 354 |
second_trial="ja"
|
| 355 |
|
| 356 |
+
return better_question
|
| 357 |
|
| 358 |
|
| 359 |
###############################################
|
|
|
|
| 372 |
return result
|
| 373 |
#############################################
|
| 374 |
#langchain nutzen, um prompt an llm zu leiten, aber vorher in der VektorDB suchen, um passende splits zum Prompt hinzuzufügen
|
| 375 |
+
def rag_chain(llm, prompt, retriever):
|
| 376 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
| 377 |
+
relevant_docs = retriever.get_relevant_documents(prompt)
|
| 378 |
+
filtered_docs = grade_documents_direct(relevant_docs)
|
| 379 |
+
neu_prompt=prompt
|
| 380 |
+
if (len(filtered_docs)<2): #frage neu formulieren
|
| 381 |
+
neu_prompt = transform_query_direct(prompt)
|
| 382 |
+
relevant_docs = retriever.get_relevant_documents(neu_prompt)
|
| 383 |
+
filtered_docs = grade_documents_direct(relevant_docs)
|
| 384 |
+
|
| 385 |
+
if (len(filtered_docs)>0):
|
| 386 |
+
# Chain
|
| 387 |
+
rag_chain = prompt | llm | StrOutputParser()
|
| 388 |
+
# Run
|
| 389 |
+
result = rag_chain.invoke({"context": documents, "question": neu_prompt})
|
| 390 |
+
else:
|
| 391 |
+
#Normale Abfrage, da keine relevanten Dokumente gefunden
|
| 392 |
+
llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
|
| 393 |
+
result = llm_chain.run({"question": neu_prompt})
|
| 394 |
+
return result
|
| 395 |
+
|
| 396 |
+
|
| 397 |
+
|
| 398 |
+
"""
|
| 399 |
workflow = StateGraph(GraphState)
|
| 400 |
|
| 401 |
# Define the nodes
|
|
|
|
| 441 |
|
| 442 |
# Final generation
|
| 443 |
return value['keys']['generation']
|
| 444 |
+
"""
|
| 445 |
|
| 446 |
############################################
|
| 447 |
# rag_chain Alternative für RAg mit Bild-Upload, da hier das llm so nicht genutzt werden kann und der prompt mit den RAG Erweiterungen anders übergeben wird
|