| import logging
|
| import gradio as gr
|
| import time
|
| import json
|
|
|
| from main import (
|
| load_model_with_questions_and_answers,
|
| simulate_question_answering,
|
| find_similar_question
|
| )
|
|
|
|
|
| logging.getLogger().setLevel(logging.CRITICAL)
|
|
|
|
|
| category_nodes, questions = load_model_with_questions_and_answers("model_with_qa.json")
|
|
|
| def test_model_with_answers(category_nodes, questions, query):
|
| """
|
| Testet das Modell mit einer Abfrage und gibt die gefundene Frage, Antwort und Gewichtung zurück.
|
|
|
| Args:
|
| category_nodes (list): Liste der Kategorie-Knoten.
|
| questions (list): Liste der Fragen.
|
| query (str): Die Abfrage, nach der gesucht werden soll.
|
|
|
| Returns:
|
| tuple: Die gefundene Frage, Antwort und Gewichtung.
|
| """
|
|
|
| matched_question = find_similar_question(questions, query)
|
|
|
| if matched_question and matched_question.get('question') != "Keine passende Frage gefunden":
|
| answer = matched_question.get('answer', 'Keine Antwort verfügbar')
|
|
|
|
|
| activation = simulate_question_answering(category_nodes, matched_question['question'], questions)
|
|
|
|
|
| return f"Frage: \"{query}\"", f"Antwort: \"{answer}\"", f"Gewichtung: {activation:.2f}"
|
| else:
|
|
|
| return f"Frage: \"{query}\"", "Antwort: \"Keine passende Frage gefunden\"", "Gewichtung: 0.00"
|
|
|
| def measure_response_time(func, *args, **kwargs):
|
| """
|
| Misst die Zeit, die eine Funktion benötigt, um ausgeführt zu werden, und gibt die Ergebnisse zusammen mit der Zeit zurück.
|
|
|
| Args:
|
| func (callable): Die auszuführende Funktion.
|
| *args: Positionsargumente für die Funktion.
|
| **kwargs: Schlüsselwortargumente für die Funktion.
|
|
|
| Returns:
|
| tuple: Die Ergebnisse der Funktion und die verstrichene Zeit in Millisekunden.
|
| """
|
| start_time = time.time()
|
| result = func(*args, **kwargs)
|
| end_time = time.time()
|
| elapsed_time = (end_time - start_time) * 1000
|
| return result, elapsed_time
|
|
|
| def extract_questions_and_answers_from_json(input_json, output_txt):
|
| """
|
| Extrahiert Fragen und Antworten aus einer JSON-Datei und schreibt sie in eine Textdatei.
|
|
|
| Args:
|
| input_json (str): Der Pfad zur Eingabe-JSON-Datei.
|
| output_txt (str): Der Pfad zur Ausgabe-Textdatei.
|
| """
|
| try:
|
| with open(input_json, mode='r', encoding='utf-8') as jsonfile, open(output_txt, mode='w', encoding='utf-8') as txtfile:
|
| data = json.load(jsonfile)
|
| questions = data.get('questions', [])
|
| for question in questions:
|
| q = question.get('question', '')
|
| a = question.get('answer', '')
|
| if q and a:
|
| txtfile.write(f'"question": "{q}",\n')
|
| txtfile.write(f'"answer": "{a}"\n\n')
|
| print(f"Fragen und Antworten wurden erfolgreich in {output_txt} geschrieben.")
|
| except FileNotFoundError:
|
| print(f"Die Datei {input_json} wurde nicht gefunden.")
|
| except json.JSONDecodeError:
|
| print(f"Fehler beim Parsen der JSON-Datei {input_json}.")
|
| except Exception as e:
|
| print(f"Ein Fehler ist aufgetreten: {e}")
|
|
|
| def load_questions_and_answers(file_path):
|
| """
|
| Lädt Fragen und Antworten aus einer Textdatei.
|
|
|
| Args:
|
| file_path (str): Der Pfad zur Textdatei.
|
|
|
| Returns:
|
| str: Der Inhalt der Textdatei.
|
| """
|
| try:
|
| with open(file_path, mode='r', encoding='utf-8') as file:
|
| content = file.read()
|
| return content
|
| except FileNotFoundError:
|
| return "Datei nicht gefunden."
|
| except Exception as e:
|
| return f"Fehler beim Lesen der Datei: {e}"
|
|
|
|
|
| def gradio_interface(query):
|
| """
|
| Gradio-Schnittstelle zur Verarbeitung der Benutzerabfrage.
|
|
|
| Args:
|
| query (str): Die Abfrage des Benutzers.
|
|
|
| Returns:
|
| tuple: Die gefundene Frage, Antwort, Gewichtung und die verstrichene Zeit in Millisekunden.
|
| """
|
| if category_nodes and questions:
|
| result, elapsed_time = measure_response_time(test_model_with_answers, category_nodes, questions, query)
|
| return *result, f"Reaktionszeit: {elapsed_time:.2f} ms"
|
| else:
|
| logging.critical("Kein Modell gefunden.")
|
| return "Fehler", "Kein Modell geladen.", "0.00", "Reaktionszeit: 0.00 ms"
|
|
|
|
|
| input_json = 'model_with_qa.json'
|
| output_txt = 'questions_and_answers.txt'
|
|
|
|
|
| extract_questions_and_answers_from_json(input_json, output_txt)
|
|
|
|
|
| questions_and_answers_content = load_questions_and_answers(output_txt)
|
|
|
|
|
| iface = gr.Interface(
|
| fn=gradio_interface,
|
| inputs=gr.Textbox(label="Frage eingeben", placeholder="Stellen Sie eine Frage..."),
|
| outputs=[
|
| gr.Textbox(label="Frage"),
|
| gr.Textbox(label="Antwort"),
|
| gr.Textbox(label="Gewichtung"),
|
| gr.Textbox(label="Reaktionszeit")
|
| ],
|
| title="Frage-Antwort-Modell",
|
| description="Stellen Sie eine Frage, und das Modell wird versuchen, eine passende Antwort mit Gewichtung zu finden."
|
| )
|
|
|
|
|
| with gr.Blocks() as demo:
|
| gr.Markdown("## Frage-Antwort-Modell")
|
| with gr.Row():
|
| with gr.Column():
|
| iface.render()
|
| with gr.Column():
|
| gr.Markdown("### Fragen und Antworten")
|
| gr.Textbox(value=questions_and_answers_content, lines=20, label="Fragen und Antworten", interactive=False)
|
|
|
|
|
| demo.launch()
|
|
|