SucheRAG / app.py
alexkueck's picture
Update app.py
24104d7 verified
raw
history blame
5.04 kB
import os
import gradio as gr
from langchain-community.vectorstores import Chroma
from transformers import pipeline
from sentence_transformers import SentenceTransformer
import langchain.chains.LLMChain
import langchain_core.prompts.PromptTemplate
from langchain_huggingface import HuggingFacePipeline
#Konstanten
ANTI_BOT_PW = os.getenv("CORRECT_VALIDATE")
PATH_WORK = "."
CHROMA_DIR = "/chroma/kkg"
CHROMA_PDF = './chroma/kkg/pdf'
CHROMA_WORD = './chroma/kkg/word'
CHROMA_EXCEL = './chroma/kkg/excel'
# Hugging Face Token direkt im Code setzen
hf_token = os.getenv("HF_READ")
os.environ["HUGGINGFACEHUB_API_TOKEN"] = os.getenv("HF_READ")
###############################################
#globale Variablen
##############################################
#nur bei ersten Anfrage splitten der Dokumente - um die Vektordatenbank entsprechend zu füllen
#splittet = False
#DB für Vektorstore
vektordatenbank = None
retriever = None
#############################################
# Allgemeine Konstanten
#Filepath zu temp Folder (temp) mit File von ausgewähltem chatverlauf
file_path_download = ""
def get_rag_response(question):
# Abfrage der relevanten Dokumente aus Chroma DB
docs = chroma_db.search(question, top_k=5)
passages = [doc['text'] for doc in docs]
links = [doc.get('url', 'No URL available') for doc in docs]
# Generieren der Antwort
context = " ".join(passages)
qa_input = {"question": question, "context": context}
answer = qa_pipeline(qa_input)['answer']
# Zusammenstellen der Ausgabe
response = {
"answer": answer,
"documents": [{"link": link, "passage": passage} for link, passage in zip(links, passages)]
}
return response
#Eingaben der GUI verarbeiten
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):
global vektordatenbank, retriever
#nur wenn man sich validiert hat, kann die Anwendung los legen
if (validate and not prompt_in == "" and not prompt_in == None):
# Vektorstore initialisieren
#falls schon ein File hochgeladen wurde, ist es in history_file gespeichert - falls ein neues File hochgeladen wurde, wird es anschließend neu gesetzt
neu_file = file_history
#prompt normalisieren bevor er an die KIs geht
prompt = normalise_prompt(prompt_in)
#muss nur einmal ausgeführt werden...
if vektordatenbank == None:
print("db neu aufbauen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")
splits = document_loading_splitting()
vektordatenbank, retriever = document_storage_chroma(splits)
#kein Bild hochgeladen -> auf Text antworten...
status = "Antwort der KI ..."
if (file == None and file_history == None):
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)
history = history + [[prompt, result]]
else:
#Es wurde ein File neu angehängt -> das hochladen und dann Prompt bearbeiten
#das history_fiel muss neu gesetzt werden
if (file != None):
# file_history wird neu gesetzt in der Rückgabe dieser Funktion...
neu_file = file
#File hochladen in Chroma und dann Antwort generieren
result = generate_text_zu_doc(neu_file, prompt, k, rag_option, chatbot, history, vektordatenbank)
#die history erweitern - abhängig davon, ob gerade ein file hochgeladen wurde oder nicht
if (file != None):
history = history + [[(file,), None],[prompt, result]]
else:
history = history + [[prompt, result]]
chatbot[-1][1] = ""
for character in result:
chatbot[-1][1] += character
time.sleep(0.03)
yield chatbot, history, None, neu_file, status
if shared_state.interrupted:
shared_state.recover()
try:
yield chatbot, history, None, neu_file, "Stop: Success"
except:
pass
else: #noch nicht validiert, oder kein Prompt
return chatbot, history, None, file_history, "Erst validieren oder einen Prompt eingeben!"
#############################
#GUI.........
def user (user_input, history):
return "", history + [[user_input, None]]
with gr.Blocks() as chatbot:
chat_interface = gr.Chatbot()
msg = gr.Textbox()
clear = gr.Button("Löschen")
#Buttons listener
msg.submit(user, [msg, chat_interface], [msg, chat_interface], queue = False). then(chatbot_response, [msg, chat_interface], [chat_interface, chat_interface])
clear.click(lambda: None, None, chat_interface, queue=False)
chatbot.launch()