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