File size: 5,044 Bytes
72aebc1 b676165 24104d7 092ed9e b676165 24104d7 b676165 1393d5f 6658f37 46f3018 c6a49dd b1d9638 f6c70f7 24104d7 f6c70f7 b676165 24104d7 b676165 72aebc1 5afc810 72aebc1 e7e4a86 5afc810 b676165 24104d7 ca1744a 24104d7 ca1744a 24104d7 b676165 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
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() |