Update utils.py
Browse files
utils.py
CHANGED
@@ -19,6 +19,10 @@ import operator
|
|
19 |
from typing import Annotated, Sequence, TypedDict
|
20 |
import pprint
|
21 |
|
|
|
|
|
|
|
|
|
22 |
import gradio as gr
|
23 |
from pypinyin import lazy_pinyin
|
24 |
import tiktoken
|
@@ -51,7 +55,7 @@ from langchain_core.pydantic_v1 import BaseModel, Field
|
|
51 |
from langchain_core.runnables import RunnablePassthrough
|
52 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
53 |
from chromadb.errors import InvalidDimensionException
|
54 |
-
import io
|
55 |
#from PIL import Image, ImageDraw, ImageOps, ImageFont
|
56 |
#import base64
|
57 |
#from tempfile import NamedTemporaryFile
|
@@ -127,6 +131,18 @@ urls = [
|
|
127 |
]
|
128 |
|
129 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
##################################################
|
131 |
#Normalisierung eines Prompts
|
132 |
##################################################
|
@@ -303,6 +319,7 @@ def llm_chain2(llm, prompt):
|
|
303 |
def rag_chain(llm, prompt, retriever):
|
304 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
305 |
relevant_docs=[]
|
|
|
306 |
relevant_docs = retriever.get_relevant_documents(prompt)
|
307 |
|
308 |
print("releant docs1......................")
|
@@ -313,14 +330,43 @@ def rag_chain(llm, prompt, retriever):
|
|
313 |
#result = llm_chain.run({"context": relevant_docs, "question": prompt})
|
314 |
# Erstelle ein PromptTemplate mit Platzhaltern für Kontext und Frage
|
315 |
#RAG_CHAIN_PROMPT = PromptTemplate(template="Context: {context}\n\nQuestion: {question}\n\nAnswer:")
|
316 |
-
|
317 |
-
#
|
318 |
-
|
319 |
-
|
320 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
321 |
else:
|
322 |
# keine relevanten Dokumente gefunden
|
323 |
-
result =
|
|
|
|
|
|
|
324 |
|
325 |
return result
|
326 |
|
|
|
19 |
from typing import Annotated, Sequence, TypedDict
|
20 |
import pprint
|
21 |
|
22 |
+
from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer
|
23 |
+
from sentence_transformers import SentenceTransformer, util
|
24 |
+
from typing import List, Dict
|
25 |
+
|
26 |
import gradio as gr
|
27 |
from pypinyin import lazy_pinyin
|
28 |
import tiktoken
|
|
|
55 |
from langchain_core.runnables import RunnablePassthrough
|
56 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
57 |
from chromadb.errors import InvalidDimensionException
|
58 |
+
#import io
|
59 |
#from PIL import Image, ImageDraw, ImageOps, ImageFont
|
60 |
#import base64
|
61 |
#from tempfile import NamedTemporaryFile
|
|
|
131 |
]
|
132 |
|
133 |
|
134 |
+
|
135 |
+
##################################################
|
136 |
+
#Modell und Tokenizer für die Anfrage der RAG Chain
|
137 |
+
##################################################
|
138 |
+
# Schritt 1: Initialisiere den Sentence-Transformer und das Generierungsmodell
|
139 |
+
embedder_modell = SentenceTransformer('all-MiniLM-L6-v2')
|
140 |
+
HF_MODELL = "t5-small"
|
141 |
+
modell_rag = AutoModelForSeq2SeqLM.from_pretrained(HF_MODELL)
|
142 |
+
tokenizer_rag = AutoTokenizer.from_pretrained(HF_MODELL)
|
143 |
+
|
144 |
+
|
145 |
+
|
146 |
##################################################
|
147 |
#Normalisierung eines Prompts
|
148 |
##################################################
|
|
|
319 |
def rag_chain(llm, prompt, retriever):
|
320 |
#Langgraph nutzen für ein wenig mehr Intelligenz beim Dokumente suchen
|
321 |
relevant_docs=[]
|
322 |
+
most_relevant_docs=[]
|
323 |
relevant_docs = retriever.get_relevant_documents(prompt)
|
324 |
|
325 |
print("releant docs1......................")
|
|
|
330 |
#result = llm_chain.run({"context": relevant_docs, "question": prompt})
|
331 |
# Erstelle ein PromptTemplate mit Platzhaltern für Kontext und Frage
|
332 |
#RAG_CHAIN_PROMPT = PromptTemplate(template="Context: {context}\n\nQuestion: {question}\n\nAnswer:")
|
333 |
+
|
334 |
+
# Inahlte Abrufen der relevanten Dokumente
|
335 |
+
doc_contents = [doc["content"] for doc in relevant_docs]
|
336 |
+
|
337 |
+
#Berechne die Ähnlichkeiten und finde das relevanteste Dokument
|
338 |
+
question_embedding = embedder_modell.encode(prompt, convert_to_tensor=True)
|
339 |
+
doc_embeddings = embedder_modell.encode(doc_contents, convert_to_tensor=True)
|
340 |
+
similarity_scores = util.pytorch_cos_sim(question_embedding, doc_embeddings)
|
341 |
+
most_relevant_doc_indices = similarity_scores.argsort(descending=True).squeeze().tolist()
|
342 |
+
|
343 |
+
#Erstelle eine Liste der relevantesten Dokumente
|
344 |
+
most_relevant_docs = [relevant_docs[i] for i in most_relevant_doc_indices]
|
345 |
+
|
346 |
+
#Kombiniere die Inhalte aller relevanten Dokumente
|
347 |
+
combined_content = " ".join([doc["content"] for doc in most_relevant_docs])
|
348 |
+
|
349 |
+
#Formuliere die Eingabe für das Generierungsmodell
|
350 |
+
input_text = f"frage: {prompt} kontext: {combined_content}"
|
351 |
+
inputs = tokenizer_rag(input_text, return_tensors="pt", max_length=1024, truncation=True)
|
352 |
+
|
353 |
+
#Generiere die Antwort
|
354 |
+
outputs = model_rag.generate(inputs['input_ids'], max_length=150, num_beams=2, early_stopping=True)
|
355 |
+
answer = tokenizer_rag.decode(outputs[0], skip_special_tokens=True)
|
356 |
+
|
357 |
+
|
358 |
+
# Erstelle das Ergebnis-Dictionary
|
359 |
+
result = {
|
360 |
+
"answer": answer,
|
361 |
+
"relevant_docs": most_relevant_docs
|
362 |
+
}
|
363 |
+
|
364 |
else:
|
365 |
# keine relevanten Dokumente gefunden
|
366 |
+
result = {
|
367 |
+
"answer": "Keine relevanten Dokumente gefunden",
|
368 |
+
"relevant_docs": most_relevant_docs
|
369 |
+
}
|
370 |
|
371 |
return result
|
372 |
|