alexkueck commited on
Commit
24104d7
·
verified ·
1 Parent(s): 092ed9e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -48
app.py CHANGED
@@ -1,10 +1,12 @@
1
  import os
2
  import gradio as gr
3
- from langchain.vectorstores import Chroma
4
  from transformers import pipeline
5
  from sentence_transformers import SentenceTransformer
6
- from langchain import LLMChain, PromptTemplate
7
- from langchain.llms import HuggingFacePipeline
 
 
8
 
9
  #Konstanten
10
  ANTI_BOT_PW = os.getenv("CORRECT_VALIDATE")
@@ -18,45 +20,22 @@ CHROMA_EXCEL = './chroma/kkg/excel'
18
  hf_token = os.getenv("HF_READ")
19
  os.environ["HUGGINGFACEHUB_API_TOKEN"] = os.getenv("HF_READ")
20
 
21
- # Initialisierung des Sentence-BERT Modells für die Embeddings
22
- embedding_model = SentenceTransformer('all-MiniLM-L6-v2')
 
 
 
 
 
 
23
 
24
- # Initialisierung des Q&A-Modells
25
- qa_pipeline = pipeline("question-answering", model="distilbert-base-cased-distilled-squad", tokenizer="distilbert-base-cased-distilled-squad", token=hf_token)
26
-
27
- # Erstellung eines HuggingFacePipeline LLM Modells
28
- llm = HuggingFacePipeline(pipeline=qa_pipeline)
29
-
30
- # Verbindung zur Chroma DB und Laden der Dokumente
31
- chroma_db = Chroma(embedding=embedding_model, persist_directory = PATH_WORK + CHROMA_DIR)
32
-
33
- # Erstellung eines HuggingFacePipeline LLM Modells
34
- llm_pipeline = pipeline("text2text-generation", model=model, tokenizer=tokenizer, retriever=retriever)
35
- llm = HuggingFacePipeline(pipeline=llm_pipeline)
36
-
37
-
38
- # Erstellen eines eigenen Retrievers mit Chroma DB und Embeddings
39
- #retriever = chroma_db.as_retriever()
40
-
41
- # Erstellung der RAG-Kette mit dem benutzerdefinierten Retriever
42
- #rag_chain = RagChain(model=model, retriever=retriever, tokenizer=tokenizer, vectorstore=chroma_db)
43
  #############################################
 
 
 
44
 
45
 
46
- def document_retrieval_chroma2():
47
- #HF embeddings -----------------------------------
48
- #Alternative Embedding - für Vektorstore, um Ähnlichkeitsvektoren zu erzeugen - die ...InstructEmbedding ist sehr rechenaufwendig
49
- embeddings = HuggingFaceInstructEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2", model_kwargs={"device": "cpu"})
50
- #etwas weniger rechenaufwendig:
51
- #embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", model_kwargs={"device": "cpu"}, encode_kwargs={'normalize_embeddings': False})
52
- #oder einfach ohne Langchain:
53
- #embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
54
 
55
- #ChromaDb um die embedings zu speichern
56
- db = Chroma(embedding_function = embeddings, persist_directory = PATH_WORK + CHROMA_DIR)
57
- print ("Chroma DB bereit ...................")
58
-
59
- return db
60
 
61
 
62
 
@@ -82,19 +61,60 @@ def get_rag_response(question):
82
 
83
 
84
 
85
-
86
- # Funktion, die für den Chatbot genutzt wird
87
- def chatbot_response(user_input, chat_history=[]):
88
- response = get_rag_response(user_input)
89
- answer = response['answer']
90
- documents = response['documents']
91
-
92
- doc_links = "\n\n".join([f"Link: {doc['link']}\nPassage: {doc['passage']}" for doc in documents])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
- bot_response = f"{answer}\n\nRelevant Documents:\n{doc_links}"
 
95
 
96
- chat_history.append((user_input, bot_response))
97
- return chat_history, chat_history
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
 
99
 
100
  #############################
 
1
  import os
2
  import gradio as gr
3
+ from langchain-community.vectorstores import Chroma
4
  from transformers import pipeline
5
  from sentence_transformers import SentenceTransformer
6
+ import langchain.chains.LLMChain
7
+ import langchain_core.prompts.PromptTemplate
8
+ from langchain_huggingface import HuggingFacePipeline
9
+
10
 
11
  #Konstanten
12
  ANTI_BOT_PW = os.getenv("CORRECT_VALIDATE")
 
20
  hf_token = os.getenv("HF_READ")
21
  os.environ["HUGGINGFACEHUB_API_TOKEN"] = os.getenv("HF_READ")
22
 
23
+ ###############################################
24
+ #globale Variablen
25
+ ##############################################
26
+ #nur bei ersten Anfrage splitten der Dokumente - um die Vektordatenbank entsprechend zu füllen
27
+ #splittet = False
28
+ #DB für Vektorstore
29
+ vektordatenbank = None
30
+ retriever = None
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  #############################################
33
+ # Allgemeine Konstanten
34
+ #Filepath zu temp Folder (temp) mit File von ausgewähltem chatverlauf
35
+ file_path_download = ""
36
 
37
 
 
 
 
 
 
 
 
 
38
 
 
 
 
 
 
39
 
40
 
41
 
 
61
 
62
 
63
 
64
+ #Eingaben der GUI verarbeiten
65
+ def generate_auswahl(prompt_in, file, file_history, chatbot, history, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,top_k=5, validate=False):
66
+ global vektordatenbank, retriever
67
+
68
+ #nur wenn man sich validiert hat, kann die Anwendung los legen
69
+ if (validate and not prompt_in == "" and not prompt_in == None):
70
+ # Vektorstore initialisieren
71
+ #falls schon ein File hochgeladen wurde, ist es in history_file gespeichert - falls ein neues File hochgeladen wurde, wird es anschließend neu gesetzt
72
+ neu_file = file_history
73
+
74
+ #prompt normalisieren bevor er an die KIs geht
75
+ prompt = normalise_prompt(prompt_in)
76
+
77
+ #muss nur einmal ausgeführt werden...
78
+ if vektordatenbank == None:
79
+ print("db neu aufbauen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")
80
+ splits = document_loading_splitting()
81
+ vektordatenbank, retriever = document_storage_chroma(splits)
82
+
83
+ #kein Bild hochgeladen -> auf Text antworten...
84
+ status = "Antwort der KI ..."
85
+ if (file == None and file_history == None):
86
+ result, status = generate_text(prompt, chatbot, history,vektordatenbank, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3, top_k=3)
87
+ history = history + [[prompt, result]]
88
+ else:
89
+ #Es wurde ein File neu angehängt -> das hochladen und dann Prompt bearbeiten
90
+ #das history_fiel muss neu gesetzt werden
91
+ if (file != None):
92
+ # file_history wird neu gesetzt in der Rückgabe dieser Funktion...
93
+ neu_file = file
94
 
95
+ #File hochladen in Chroma und dann Antwort generieren
96
+ result = generate_text_zu_doc(neu_file, prompt, k, rag_option, chatbot, history, vektordatenbank)
97
 
98
+ #die history erweitern - abhängig davon, ob gerade ein file hochgeladen wurde oder nicht
99
+ if (file != None):
100
+ history = history + [[(file,), None],[prompt, result]]
101
+ else:
102
+ history = history + [[prompt, result]]
103
+
104
+ chatbot[-1][1] = ""
105
+ for character in result:
106
+ chatbot[-1][1] += character
107
+ time.sleep(0.03)
108
+ yield chatbot, history, None, neu_file, status
109
+ if shared_state.interrupted:
110
+ shared_state.recover()
111
+ try:
112
+ yield chatbot, history, None, neu_file, "Stop: Success"
113
+ except:
114
+ pass
115
+ else: #noch nicht validiert, oder kein Prompt
116
+ return chatbot, history, None, file_history, "Erst validieren oder einen Prompt eingeben!"
117
+
118
 
119
 
120
  #############################