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()