Update app.py
Browse files
app.py
CHANGED
@@ -147,26 +147,34 @@ def add_text(chatbot, history, prompt, file):
|
|
147 |
print(chatbot)
|
148 |
return chatbot, history, prompt, "", gr.File( label=None, interactive=False, height=20, min_width=20, visible=False, scale=2) #gr.Textbox(value="", interactive=False)
|
149 |
|
150 |
-
|
|
|
151 |
def file_anzeigen(file):
|
152 |
return gr.File(visible=True), file
|
153 |
|
|
|
|
|
154 |
def umwandeln_fuer_anzeige(image):
|
155 |
buffer = io.BytesIO()
|
156 |
image.save(buffer, format='PNG')
|
157 |
return buffer.getvalue()
|
158 |
|
159 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
160 |
def process_image(image_path, prompt):
|
161 |
-
#Bild aus tmp in Space ablegen
|
162 |
-
#temp_image_path = "/tmp/gradio/01834b95fcf793903d65ab947cc410dc1600d0df/bbb 1.png"
|
163 |
-
# Zielverzeichnis für das dauerhafte Bild
|
164 |
-
#target_directory = HISTORY_PFAD
|
165 |
-
# Ziel-Pfad für das dauerhafte Bild
|
166 |
-
#target_image_path = os.path.join(target_directory, "bbb 1.png")
|
167 |
-
# Kopieren Sie das temporäre Bild in das Zielverzeichnis
|
168 |
-
#shutil.copy(temp_image_path, target_image_path)
|
169 |
-
|
170 |
# Convert image to base64
|
171 |
with open(image_path, "rb") as image_file:
|
172 |
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
|
@@ -201,7 +209,8 @@ def process_image(image_path, prompt):
|
|
201 |
}
|
202 |
return headers, payload
|
203 |
|
204 |
-
|
|
|
205 |
def transfer_input(inputs):
|
206 |
textbox = reset_textbox()
|
207 |
return (
|
@@ -210,6 +219,9 @@ def transfer_input(inputs):
|
|
210 |
gr.Button.update(visible=True),
|
211 |
)
|
212 |
##################################################
|
|
|
|
|
|
|
213 |
# Funktion, um für einen best. File-typ ein directory-loader zu definieren
|
214 |
def create_directory_loader(file_type, directory_path):
|
215 |
#verscheidene Dokument loaders:
|
@@ -222,7 +234,7 @@ def create_directory_loader(file_type, directory_path):
|
|
222 |
glob=f"**/*{file_type}",
|
223 |
loader_cls=loaders[file_type],
|
224 |
)
|
225 |
-
|
226 |
#die Inhalte splitten, um in Vektordatenbank entsprechend zu laden als Splits
|
227 |
def document_loading_splitting():
|
228 |
global splittet
|
@@ -262,6 +274,7 @@ def document_loading_splitting():
|
|
262 |
splittet = True
|
263 |
return splits
|
264 |
|
|
|
265 |
#Chroma DB die splits ablegen - vektorisiert...
|
266 |
def document_storage_chroma(splits):
|
267 |
#OpenAi embeddings----------------------------------
|
@@ -276,7 +289,7 @@ def document_storage_mongodb(splits):
|
|
276 |
embedding = OpenAIEmbeddings(disallowed_special = ()),
|
277 |
collection = MONGODB_COLLECTION,
|
278 |
index_name = MONGODB_INDEX_NAME)
|
279 |
-
|
280 |
#dokumente in chroma db vektorisiert ablegen können - die Db vorbereiten daüfur
|
281 |
def document_retrieval_chroma(llm, prompt):
|
282 |
#OpenAI embeddings -------------------------------
|
@@ -291,7 +304,7 @@ def document_retrieval_chroma(llm, prompt):
|
|
291 |
#ChromaDb um die embedings zu speichern
|
292 |
db = Chroma(embedding_function = embeddings, persist_directory = PATH_WORK + CHROMA_DIR)
|
293 |
return db
|
294 |
-
|
295 |
#dokumente in mongo db vektorisiert ablegen können - die Db vorbereiten daüfür
|
296 |
def document_retrieval_mongodb(llm, prompt):
|
297 |
db = MongoDBAtlasVectorSearch.from_connection_string(MONGODB_URI,
|
@@ -302,13 +315,14 @@ def document_retrieval_mongodb(llm, prompt):
|
|
302 |
|
303 |
###############################################
|
304 |
#Langchain anlegen
|
305 |
-
|
306 |
#langchain nutzen, um prompt an LLM zu leiten - llm und prompt sind austauschbar
|
307 |
def llm_chain(llm, prompt):
|
308 |
llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
|
309 |
result = llm_chain.run({"question": prompt})
|
310 |
return result
|
311 |
|
|
|
312 |
#langchain nutzen, um prompt an llm zu leiten, aber vorher in der VektorDB suchen, um passende splits zum Prompt hinzuzufügen
|
313 |
def rag_chain(llm, prompt, db):
|
314 |
rag_chain = RetrievalQA.from_chain_type(llm,
|
@@ -340,24 +354,7 @@ def generate_prompt_with_history(text, history, max_length=4048):
|
|
340 |
else:
|
341 |
return None
|
342 |
|
343 |
-
|
344 |
-
#prompt = "The following is a conversation between a human and an AI assistant named Baize (named after a mythical creature in Chinese folklore). Baize is an open-source AI assistant developed by UCSD and Sun Yat-Sen University. The human and the AI assistant take turns chatting. Human statements start with [|Human|] and AI assistant statements start with [|AI|]. The AI assistant always provides responses in as much detail as possible, and in Markdown format. The AI assistant always declines to engage with topics, questions and instructions related to unethical, controversial, or sensitive issues. Complete the transcript in exactly that format.\n[|Human|]Hello!\n[|AI|]Hi!"
|
345 |
-
#prompt = "Das folgende ist eine Unterhaltung in deutsch zwischen einem Menschen und einem KI-Assistenten, der Baize genannt wird. Baize ist ein open-source KI-Assistent, der von UCSD entwickelt wurde. Der Mensch und der KI-Assistent chatten abwechselnd miteinander in deutsch. Die Antworten des KI Assistenten sind immer so ausführlich wie möglich und in Markdown Schreibweise und in deutscher Sprache. Wenn nötig übersetzt er sie ins Deutsche. Die Antworten des KI-Assistenten vermeiden Themen und Antworten zu unethischen, kontroversen oder sensiblen Themen. Die Antworten sind immer sehr höflich formuliert..\n[|Human|]Hallo!\n[|AI|]Hi!"
|
346 |
-
prompt=""
|
347 |
-
history = ["\n{}\n{}".format(x[0],x[1]) for x in history]
|
348 |
-
history.append("\n{}\n".format(text))
|
349 |
-
history_text = ""
|
350 |
-
flag = False
|
351 |
-
for x in history[::-1]:
|
352 |
-
history_text = x + history_text
|
353 |
-
flag = True
|
354 |
-
print ("Prompt: ..........................")
|
355 |
-
print(prompt+history_text)
|
356 |
-
if flag:
|
357 |
-
return prompt+history_text
|
358 |
-
else:
|
359 |
-
return None
|
360 |
-
|
361 |
#Prompt und History für OPenAi Schnittstelle
|
362 |
def generate_prompt_with_history_openai(prompt, history):
|
363 |
history_openai_format = []
|
@@ -370,6 +367,7 @@ def generate_prompt_with_history_openai(prompt, history):
|
|
370 |
print(history_openai_format)
|
371 |
return history_openai_format
|
372 |
|
|
|
373 |
#Prompt und History für Hugging Face Schnittstelle
|
374 |
def generate_prompt_with_history_hf(prompt, history):
|
375 |
history_transformer_format = history + [[prompt, ""]]
|
@@ -378,6 +376,7 @@ def generate_prompt_with_history_hf(prompt, history):
|
|
378 |
messages = "".join(["".join(["\n<human>:"+item[0], "\n<bot>:"+item[1]]) #curr_system_message +
|
379 |
for item in history_transformer_format])
|
380 |
|
|
|
381 |
#Prompt und History für Langchain Schnittstelle
|
382 |
def generate_prompt_with_history_langchain(prompt, history):
|
383 |
history_langchain_format = []
|
@@ -391,37 +390,12 @@ def generate_prompt_with_history_langchain(prompt, history):
|
|
391 |
|
392 |
###################################################
|
393 |
#Funktion von Gradio aus, die den dort eingegebenen Prompt annimmt und weiterverarbeitet
|
394 |
-
|
395 |
-
def chatbot_response(messages):
|
396 |
-
print("messages.......................")
|
397 |
-
print(messages)
|
398 |
-
responses = []
|
399 |
-
for message in messages:
|
400 |
-
if message['type'] == 'text':
|
401 |
-
#invoke(message['data'], history, rag_option, model_option, openai_api_key, temperature=0.5, max_new_tokens=4048, top_p=0.6, repetition_penalty=1.3,)
|
402 |
-
responses.append({'type': 'text', 'data': f"Echo: {message['data']}"})
|
403 |
-
else:
|
404 |
-
print("Bild.............................")
|
405 |
-
return responses
|
406 |
-
|
407 |
-
def create_picture(history, prompt):
|
408 |
-
client = OpenAI()
|
409 |
-
response = client.images.generate(model="dall-e-3", prompt=prompt,size="1024x1024",quality="standard",n=1,)
|
410 |
-
image_url = response.data[0].url
|
411 |
-
return image_url
|
412 |
-
|
413 |
-
# prompt describing the desired image
|
414 |
-
#text = "batman art in red and blue color"
|
415 |
-
# calling the custom function "generate"
|
416 |
-
# saving the output in "url1"
|
417 |
-
#url1 = create_picture(text)
|
418 |
-
# using requests library to get the image in bytes
|
419 |
-
#response = requests.get(url1)
|
420 |
-
# using the Image module from PIL library to view the image
|
421 |
-
#Image.open(response.raw)
|
422 |
-
|
423 |
|
424 |
|
|
|
|
|
|
|
425 |
def generate_auswahl(prompt, file, chatbot, history, rag_option, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,):
|
426 |
#Bild nach Anweisung zeichnen und in History darstellen...
|
427 |
if (prompt.find('zeichnen') != -1):
|
@@ -432,7 +406,7 @@ def generate_auswahl(prompt, file, chatbot, history, rag_option, model_option, o
|
|
432 |
image_64 = umwandeln_fuer_anzeige(image)
|
433 |
chatbot[-1][1] = "<img src='data:image/png;base64,{0}'/>".format(b64encode(image_64).decode('utf-8'))
|
434 |
history = history + [(prompt, result)]
|
435 |
-
return chatbot, history, "Success"
|
436 |
else:
|
437 |
#kein Bild hochgeladen -> auf Text antworten...
|
438 |
if (file == None):
|
@@ -442,19 +416,12 @@ def generate_auswahl(prompt, file, chatbot, history, rag_option, model_option, o
|
|
442 |
else:
|
443 |
#Es wurde ein Bild angehängt -> wenn prompt dazu, das Bild analysieren
|
444 |
#geht nur über spezielle OpenAI-Schnittstelle...
|
445 |
-
|
446 |
-
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
|
447 |
-
#als json ausgeben
|
448 |
-
data = response.json()
|
449 |
-
#in Wörterbuch umwandeln
|
450 |
-
#data = json.loads(j_string)
|
451 |
-
# Den "content" auswählen, da dort die Antwort der Ki enthalten ist
|
452 |
-
result = data['choices'][0]['message']['content']
|
453 |
history = history + [((file,), None),(prompt, result)]
|
454 |
|
455 |
chatbot[-1][1] = result
|
456 |
|
457 |
-
return chatbot, history, "Success"
|
458 |
"""
|
459 |
for character in result:
|
460 |
history[-1][1] += character
|
@@ -467,13 +434,28 @@ def generate_auswahl(prompt, file, chatbot, history, rag_option, model_option, o
|
|
467 |
except:
|
468 |
pass
|
469 |
"""
|
470 |
-
|
|
|
471 |
def generate_bild(prompt):
|
472 |
data = {"inputs": prompt}
|
473 |
response = requests.post(API_URL, headers=HEADERS, json=data)
|
474 |
print("fertig Bild")
|
475 |
return response
|
476 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
477 |
def generate_text (prompt, file, chatbot, history, rag_option, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,):
|
478 |
global splittet
|
479 |
print(splittet)
|
@@ -506,7 +488,6 @@ def generate_text (prompt, file, chatbot, history, rag_option, model_option, ope
|
|
506 |
#Anfrage an OpenAI ----------------------------
|
507 |
print("OpenAI normal.......................")
|
508 |
llm = ChatOpenAI(model_name = MODEL_NAME, openai_api_key = openai_api_key, temperature=temperature)#, top_p = top_p)
|
509 |
-
print("openAI")
|
510 |
else:
|
511 |
#oder an Hugging Face --------------------------
|
512 |
llm = HuggingFaceHub(repo_id=repo_id, model_kwargs={"temperature": 0.5, "max_length": 128})
|
@@ -522,6 +503,7 @@ def generate_text (prompt, file, chatbot, history, rag_option, model_option, ope
|
|
522 |
splits = document_loading_splitting()
|
523 |
document_storage_chroma(splits)
|
524 |
db = document_retrieval_chroma(llm, history_text_und_prompt)
|
|
|
525 |
result = rag_chain(llm, history_text_und_prompt, db)
|
526 |
elif (rag_option == "MongoDB"):
|
527 |
#splits = document_loading_splitting()
|
@@ -532,7 +514,6 @@ def generate_text (prompt, file, chatbot, history, rag_option, model_option, ope
|
|
532 |
print("LLM aufrufen ohne RAG: ...........")
|
533 |
result = llm_chain(llm, history_text_und_prompt)
|
534 |
|
535 |
-
|
536 |
except Exception as e:
|
537 |
raise gr.Error(e)
|
538 |
|
@@ -585,7 +566,7 @@ with gr.Blocks(css=customCSS, theme=small_and_beautiful_theme) as demo:
|
|
585 |
with gr.Row():
|
586 |
emptyBtn = gr.ClearButton( [user_input, chatbot], value="🧹 Neue Session", scale=3)
|
587 |
upload = gr.UploadButton("📁", file_types=["image", "video", "audio"], scale=3)
|
588 |
-
file_display = gr.File( label=None, interactive=False, height=
|
589 |
|
590 |
with gr.Column():
|
591 |
with gr.Column(min_width=50, scale=1):
|
@@ -649,7 +630,7 @@ with gr.Blocks(css=customCSS, theme=small_and_beautiful_theme) as demo:
|
|
649 |
max_context_length_tokens,
|
650 |
repetition_penalty
|
651 |
],
|
652 |
-
outputs=[chatbot, history,
|
653 |
show_progress=True,
|
654 |
)
|
655 |
|
@@ -678,65 +659,3 @@ demo.queue().launch(debug=True)
|
|
678 |
|
679 |
|
680 |
|
681 |
-
"""
|
682 |
-
additional_inputs = [
|
683 |
-
#gr.Radio(["Off", "Chroma", "MongoDB"], label="Retrieval Augmented Generation", value = "Off"),
|
684 |
-
gr.Radio(["Aus", "An"], label="RAG - LI Erweiterungen", value = "Aus"),
|
685 |
-
gr.Radio(["OpenAI", "HuggingFace"], label="Modellauswahl", value = "HuggingFace"),
|
686 |
-
gr.Textbox(label = "OpenAI API Key", value = "sk-", lines = 1),
|
687 |
-
gr.Slider(label="Temperature", value=0.65, minimum=0.0, maximum=1.0, step=0.05, interactive=True, info="Höhere Werte erzeugen diversere Antworten", visible=True),
|
688 |
-
gr.Slider(label="Max new tokens", value=1024, minimum=0, maximum=4096, step=64, interactive=True, info="Maximale Anzahl neuer Tokens", visible=True),
|
689 |
-
gr.Slider(label="Top-p (nucleus sampling)", value=0.6, minimum=0.0, maximum=1, step=0.05, interactive=True, info="Höhere Werte verwenden auch Tokens mit niedrigerer Wahrscheinlichkeit.", visible=True),
|
690 |
-
gr.Slider(label="Repetition penalty", value=1.2, minimum=1.0, maximum=2.0, step=0.05, interactive=True, info="Strafe für wiederholte Tokens", visible=True)
|
691 |
-
]
|
692 |
-
|
693 |
-
with gr.Blocks() as demo:
|
694 |
-
reference_image = gr.Image(label="Reference Image")
|
695 |
-
|
696 |
-
chatbot_stream = gr.Chatbot()
|
697 |
-
|
698 |
-
chat_interface_stream = gr.ChatInterface(fn=invoke,
|
699 |
-
additional_inputs = additional_inputs,
|
700 |
-
additional_inputs_accordion = gr.Accordion(label="Weitere Eingaben...", open=False),
|
701 |
-
title = "ChatGPT vom LI",
|
702 |
-
theme="soft",
|
703 |
-
chatbot=chatbot_stream,
|
704 |
-
retry_btn="🔄 Wiederholen",
|
705 |
-
undo_btn="↩️ Letztes löschen",
|
706 |
-
clear_btn="🗑️ Verlauf löschen",
|
707 |
-
submit_btn = "Abschicken",
|
708 |
-
description = description,
|
709 |
-
)
|
710 |
-
|
711 |
-
gr.HTML(
|
712 |
-
|
713 |
-
<div style="display: flex; justify-content: center; align-items: center; text-align: center;">
|
714 |
-
<a href="https://github.com/magic-research/magic-animate" style="margin-right: 20px; text-decoration: none; display: flex; align-items: center;">
|
715 |
-
</a>
|
716 |
-
<div>
|
717 |
-
<h1 >Chatbot des LI - hier im Test mit Image Eingabe</h1>
|
718 |
-
<div style="display: flex; justify-content: center; align-items: center; text-align: center;>
|
719 |
-
<a href="https://arxiv.org/abs/2311.16498"><img src="https://img.shields.io/badge/Arxiv-2311.16498-red"></a>
|
720 |
-
</div>
|
721 |
-
</div>
|
722 |
-
</div>
|
723 |
-
)
|
724 |
-
|
725 |
-
with gr.Row():
|
726 |
-
prompt = gr.Textbox(
|
727 |
-
scale=4,
|
728 |
-
show_label=False,
|
729 |
-
placeholder="Gib einen Text ein oder lade eine Datei (Bild, File, Audio) hoch",
|
730 |
-
container=False,
|
731 |
-
)
|
732 |
-
btn = gr.UploadButton("📁", file_types=["image", "video", "audio"])
|
733 |
-
|
734 |
-
txt_msg = txt.submit(invoke, [chat_interface_stream, prompt], [chat_interface_stream, prompt], queue=False).then(bot, chat_interface_stream, chat_interface_stream, api_name="bot_response")
|
735 |
-
txt_msg.then(lambda: gr.Textbox(interactive=True), None, [prompt], queue=False)
|
736 |
-
file_msg = btn.upload(add_file, [chat_interface_stream, btn], [chat_interface_stream], queue=False).then(bot, chat_interface_stream, chat_interface_stream)
|
737 |
-
|
738 |
-
#chatbot_stream.like(print_like_dislike, None, None)
|
739 |
-
|
740 |
-
|
741 |
-
demo.queue().launch()
|
742 |
-
"""
|
|
|
147 |
print(chatbot)
|
148 |
return chatbot, history, prompt, "", gr.File( label=None, interactive=False, height=20, min_width=20, visible=False, scale=2) #gr.Textbox(value="", interactive=False)
|
149 |
|
150 |
+
############################################
|
151 |
+
#nach dem Upload soll das zusätzliche Fenster mit dem image drinnen angezeigt werden
|
152 |
def file_anzeigen(file):
|
153 |
return gr.File(visible=True), file
|
154 |
|
155 |
+
##########################################
|
156 |
+
#Hilfsfunktion, um ein von Stable Diffusion erzeugtes Bild für die Ausgabe in der History vorzubereiten
|
157 |
def umwandeln_fuer_anzeige(image):
|
158 |
buffer = io.BytesIO()
|
159 |
image.save(buffer, format='PNG')
|
160 |
return buffer.getvalue()
|
161 |
|
162 |
+
#########################################
|
163 |
+
#nicht im Einsatz, da Stable Diffusion die Bilder erzeugt
|
164 |
+
def create_picture(history, prompt):
|
165 |
+
client = OpenAI()
|
166 |
+
response = client.images.generate(model="dall-e-3", prompt=prompt,size="1024x1024",quality="standard",n=1,)
|
167 |
+
image_url = response.data[0].url
|
168 |
+
# using requests library to get the image in bytes
|
169 |
+
response2 = requests.get(image_url)
|
170 |
+
# using the Image module from PIL library to view the image
|
171 |
+
image = Image.open(response2.raw)
|
172 |
+
return image
|
173 |
+
|
174 |
+
##########################################
|
175 |
+
#ein hochgeladenes Bild so vorbereiten, dass OpenAI API es annehmen kann und bearbeiten
|
176 |
+
#muss ein base64 Bils sein und header und payload entsprechend konfigurieren
|
177 |
def process_image(image_path, prompt):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
# Convert image to base64
|
179 |
with open(image_path, "rb") as image_file:
|
180 |
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
|
|
|
209 |
}
|
210 |
return headers, payload
|
211 |
|
212 |
+
###################################################
|
213 |
+
#zur Zeit nicht im Gebrauch
|
214 |
def transfer_input(inputs):
|
215 |
textbox = reset_textbox()
|
216 |
return (
|
|
|
219 |
gr.Button.update(visible=True),
|
220 |
)
|
221 |
##################################################
|
222 |
+
#RAG Hilfsfunktionen - Dokumenten bearbeiten für Vektorstore
|
223 |
+
##################################################
|
224 |
+
##################################################
|
225 |
# Funktion, um für einen best. File-typ ein directory-loader zu definieren
|
226 |
def create_directory_loader(file_type, directory_path):
|
227 |
#verscheidene Dokument loaders:
|
|
|
234 |
glob=f"**/*{file_type}",
|
235 |
loader_cls=loaders[file_type],
|
236 |
)
|
237 |
+
################################################
|
238 |
#die Inhalte splitten, um in Vektordatenbank entsprechend zu laden als Splits
|
239 |
def document_loading_splitting():
|
240 |
global splittet
|
|
|
274 |
splittet = True
|
275 |
return splits
|
276 |
|
277 |
+
###########################################
|
278 |
#Chroma DB die splits ablegen - vektorisiert...
|
279 |
def document_storage_chroma(splits):
|
280 |
#OpenAi embeddings----------------------------------
|
|
|
289 |
embedding = OpenAIEmbeddings(disallowed_special = ()),
|
290 |
collection = MONGODB_COLLECTION,
|
291 |
index_name = MONGODB_INDEX_NAME)
|
292 |
+
############################################
|
293 |
#dokumente in chroma db vektorisiert ablegen können - die Db vorbereiten daüfur
|
294 |
def document_retrieval_chroma(llm, prompt):
|
295 |
#OpenAI embeddings -------------------------------
|
|
|
304 |
#ChromaDb um die embedings zu speichern
|
305 |
db = Chroma(embedding_function = embeddings, persist_directory = PATH_WORK + CHROMA_DIR)
|
306 |
return db
|
307 |
+
###########################################
|
308 |
#dokumente in mongo db vektorisiert ablegen können - die Db vorbereiten daüfür
|
309 |
def document_retrieval_mongodb(llm, prompt):
|
310 |
db = MongoDBAtlasVectorSearch.from_connection_string(MONGODB_URI,
|
|
|
315 |
|
316 |
###############################################
|
317 |
#Langchain anlegen
|
318 |
+
###############################################
|
319 |
#langchain nutzen, um prompt an LLM zu leiten - llm und prompt sind austauschbar
|
320 |
def llm_chain(llm, prompt):
|
321 |
llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
|
322 |
result = llm_chain.run({"question": prompt})
|
323 |
return result
|
324 |
|
325 |
+
#############################################
|
326 |
#langchain nutzen, um prompt an llm zu leiten, aber vorher in der VektorDB suchen, um passende splits zum Prompt hinzuzufügen
|
327 |
def rag_chain(llm, prompt, db):
|
328 |
rag_chain = RetrievalQA.from_chain_type(llm,
|
|
|
354 |
else:
|
355 |
return None
|
356 |
|
357 |
+
##############################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
#Prompt und History für OPenAi Schnittstelle
|
359 |
def generate_prompt_with_history_openai(prompt, history):
|
360 |
history_openai_format = []
|
|
|
367 |
print(history_openai_format)
|
368 |
return history_openai_format
|
369 |
|
370 |
+
#############################################
|
371 |
#Prompt und History für Hugging Face Schnittstelle
|
372 |
def generate_prompt_with_history_hf(prompt, history):
|
373 |
history_transformer_format = history + [[prompt, ""]]
|
|
|
376 |
messages = "".join(["".join(["\n<human>:"+item[0], "\n<bot>:"+item[1]]) #curr_system_message +
|
377 |
for item in history_transformer_format])
|
378 |
|
379 |
+
##############################################
|
380 |
#Prompt und History für Langchain Schnittstelle
|
381 |
def generate_prompt_with_history_langchain(prompt, history):
|
382 |
history_langchain_format = []
|
|
|
390 |
|
391 |
###################################################
|
392 |
#Funktion von Gradio aus, die den dort eingegebenen Prompt annimmt und weiterverarbeitet
|
393 |
+
###################################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
394 |
|
395 |
|
396 |
+
#########################################################
|
397 |
+
#Funktion wird direkt aufgerufen aus der GUI - von hier muss auch die Rückmeldung kommen....
|
398 |
+
#man kann einen Text-Prompt eingeben (mit oder ohne RAG), dazu ein Image hochladen, ein Bild zu einem reinen textprompt erzeugen lassen
|
399 |
def generate_auswahl(prompt, file, chatbot, history, rag_option, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,):
|
400 |
#Bild nach Anweisung zeichnen und in History darstellen...
|
401 |
if (prompt.find('zeichnen') != -1):
|
|
|
406 |
image_64 = umwandeln_fuer_anzeige(image)
|
407 |
chatbot[-1][1] = "<img src='data:image/png;base64,{0}'/>".format(b64encode(image_64).decode('utf-8'))
|
408 |
history = history + [(prompt, result)]
|
409 |
+
return chatbot, history, gr.File(visible=False), "Success"
|
410 |
else:
|
411 |
#kein Bild hochgeladen -> auf Text antworten...
|
412 |
if (file == None):
|
|
|
416 |
else:
|
417 |
#Es wurde ein Bild angehängt -> wenn prompt dazu, das Bild analysieren
|
418 |
#geht nur über spezielle OpenAI-Schnittstelle...
|
419 |
+
result= generate_text_zu_bild(file, prompt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
420 |
history = history + [((file,), None),(prompt, result)]
|
421 |
|
422 |
chatbot[-1][1] = result
|
423 |
|
424 |
+
return chatbot, history, gr.File(visible=False), "Success"
|
425 |
"""
|
426 |
for character in result:
|
427 |
history[-1][1] += character
|
|
|
434 |
except:
|
435 |
pass
|
436 |
"""
|
437 |
+
##################################################
|
438 |
+
#zu einem Text-Prompt ein Bild via Stable Diffusion generieren
|
439 |
def generate_bild(prompt):
|
440 |
data = {"inputs": prompt}
|
441 |
response = requests.post(API_URL, headers=HEADERS, json=data)
|
442 |
print("fertig Bild")
|
443 |
return response
|
444 |
|
445 |
+
##################################################
|
446 |
+
#zu einem Bild und Text-Prompt eine Analyse generieren
|
447 |
+
def generate_text_zu_bild(file, prompt):
|
448 |
+
headers, payload = process_image(file, prompt)
|
449 |
+
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
|
450 |
+
#als json ausgeben
|
451 |
+
data = response.json()
|
452 |
+
# Den "content" auswählen, da dort die Antwort der Ki enthalten ist
|
453 |
+
result = data['choices'][0]['message']['content']
|
454 |
+
return result
|
455 |
+
|
456 |
+
####################################################
|
457 |
+
#aus einem Text-Prompt die Antwort von KI bekommen
|
458 |
+
#mit oder ohne RAG möglich
|
459 |
def generate_text (prompt, file, chatbot, history, rag_option, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,):
|
460 |
global splittet
|
461 |
print(splittet)
|
|
|
488 |
#Anfrage an OpenAI ----------------------------
|
489 |
print("OpenAI normal.......................")
|
490 |
llm = ChatOpenAI(model_name = MODEL_NAME, openai_api_key = openai_api_key, temperature=temperature)#, top_p = top_p)
|
|
|
491 |
else:
|
492 |
#oder an Hugging Face --------------------------
|
493 |
llm = HuggingFaceHub(repo_id=repo_id, model_kwargs={"temperature": 0.5, "max_length": 128})
|
|
|
503 |
splits = document_loading_splitting()
|
504 |
document_storage_chroma(splits)
|
505 |
db = document_retrieval_chroma(llm, history_text_und_prompt)
|
506 |
+
print("LLM aufrufen mit RAG: ...........")
|
507 |
result = rag_chain(llm, history_text_und_prompt, db)
|
508 |
elif (rag_option == "MongoDB"):
|
509 |
#splits = document_loading_splitting()
|
|
|
514 |
print("LLM aufrufen ohne RAG: ...........")
|
515 |
result = llm_chain(llm, history_text_und_prompt)
|
516 |
|
|
|
517 |
except Exception as e:
|
518 |
raise gr.Error(e)
|
519 |
|
|
|
566 |
with gr.Row():
|
567 |
emptyBtn = gr.ClearButton( [user_input, chatbot], value="🧹 Neue Session", scale=3)
|
568 |
upload = gr.UploadButton("📁", file_types=["image", "video", "audio"], scale=3)
|
569 |
+
file_display = gr.File( label=None, interactive=False, height=30, min_width=30, visible=False, scale=2)
|
570 |
|
571 |
with gr.Column():
|
572 |
with gr.Column(min_width=50, scale=1):
|
|
|
630 |
max_context_length_tokens,
|
631 |
repetition_penalty
|
632 |
],
|
633 |
+
outputs=[chatbot, history, file_display, status_display], #[chatbot, history, status_display]
|
634 |
show_progress=True,
|
635 |
)
|
636 |
|
|
|
659 |
|
660 |
|
661 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|