diff --git a/app/app.py b/app/app.py index a14296a..ebf7640 100644 --- a/app/app.py +++ b/app/app.py @@ -42,11 +42,6 @@ app.index_string = header_style notification_md = """ **Hinweise:** -Aufgrund des sparsamen pricing Tiers kann es einige Sekunden dauern, bis die -Verbindung zur Datenbank hergestellt wird. Im Falle eines Fehlers oder langer Ladedauer -(> 2 min.) gern ein-zwei mal erneut versuchen (die Seite neu Laden). Sobald die Verbindung -einmal hergestellt wurde, geht es schnell. - GPT-4o kann einige Fehler machen. Sollte dies passieren wird eine Fehlermeldung angezeigt. In diesem Fall lohnt es sich oft, die Anfrage leicht verändert erneut zu stellen und evtl zusätzliche Informationen zu geben. @@ -55,7 +50,12 @@ Das Modell ist dazu aufgefordert, den Output stets auf 100 Zeilen zu begrenzen. Alle Daten sind komplett zufällig generiert und haben keine Beziehung zu realen Personen. -**Beispielfragen**: +Es können sowohl allgemeine Fragen gestellt werden, als auch Fragen, die eine SQL-Abfrage erfordern. + +Beispiel für allgemeine Frage: 'Nenne mir alle Tabellen in der Datenbank, sowie die entsprechenden +Spalten und eine kurze Erklärung über deren Inhalt.' + +**SQL-Beispielfragen**: - Wie viele Kunden haben wir in Hannover? - Zeige alle Kunden in Bremen. - Berechne den gesamten Stromverbrauch aller Kunden in Magdeburg. @@ -163,7 +163,10 @@ def get_layout() -> html.Div: className="header-container", ), # Header html.Div( - "Ganz ohne SQL-Kenntnisse Daten zu Zählerstandmessungen unserer Kunden abrufen!", + ( + "Chatte mit unserer SQL-Datenbank, die Daten zu Zählerstandmessungen der " + "KundInnen enthält!" + ), style={"margin-left": "20px", "font-weight": "bold", "font-size": "20px"}, ), dcc.Store( @@ -222,7 +225,7 @@ def get_layout() -> html.Div: html.Div( ( "Hier kann der ausgegebene SQL-Code getestet oder mit selbst" - "geschriebenen Code verglichen werden." + "geschriebenem Code verglichen werden." ), style={"margin-left": "20px", "font-weight": "bold", "font-size": "16px"}, ), @@ -294,17 +297,26 @@ def update_output(n_clicks: int, value: str, data: str) -> Tuple[Any, Any, Dict[ # parse LLM response to dict, then try to execute the query try: parsed_result = json.loads(result, strict=False) - - result_table = execute_query(parsed_result["query"]) - children = [ - html.P([html.B("Zusammenfassung: "), f"{parsed_result['summary']}"]), - html.P([html.B("SQL Abfrage: "), f"{parsed_result['query']}"]), - render_table(result_table), - ] + if parsed_result["query"] == "NA": + children = [ + html.P([html.B("Zusammenfassung: "), f"{parsed_result['summary']}"]), + ] + else: + result_table = execute_query(parsed_result["query"]) + children = [ + html.P([html.B("Zusammenfassung:\n"), f"{parsed_result['summary']}"]), + html.P([html.B("SQL Abfrage:\n"), f"{parsed_result['query']}"]), + render_table(result_table), + ] return children, value, err_style, html.P("") - except Exception as e: - err_style["height"] = "400px" - err_child = html.Div(f"Folgender Fehler ist aufgetreten: {e}.LLM Output: {result}.") + except Exception: + err_style["height"] = "50px" + err_child = html.Div( + ( + "Ein Fehler ist aufgetreten. Versuchen Sie, " + "die Anfrage genauer zu beschreiben und versuchen Sie es erneut." + ) + ) return no_update, value, err_style, err_child diff --git a/app/data_chat.py b/app/data_chat.py index 9d3c267..307beaf 100644 --- a/app/data_chat.py +++ b/app/data_chat.py @@ -78,13 +78,20 @@ def send_message(message: str) -> str: Gib NUR JSON aus. Ersetze in der vorangehenden JSON-Antwort "your-query" durch die Microsoft SQL Server Query, um die angeforderten Daten abzurufen. - Ersetze in der vorangehenden JSON-Antwort "your-summary" durch eine Zusammenfassung der Abfrage. + Ersetze in der vorangehenden JSON-Antwort "your-summary" durch eine Zusammenfassung der + Abfrage. Gib immer alle Spalten der Tabelle an. - Wenn die resultierende Abfrage nicht ausführbar ist, ersetze "your-query“ durch NA, aber ersetze - trotzdem "your-query" durch eine Zusammenfassung der Abfrage. + Wenn die resultierende Abfrage nicht ausführbar ist, ersetze "your-query“ durch NA, aber + ersetze trotzdem "your-query" durch eine Zusammenfassung der Abfrage. + Wenn eine allgemeine Frage zur Datenbank gestellt wird, die keine SQL-Abfrage erfordert, z.B. + über das Schema oder den Inhalt der Datenbank, gib in Textform eine JSON-Antwort unter + "summary" zurück. In diesem Fall gib unter "query" NA zurück. Verwende KEINE MySQL-Syntax, sondern AUSSCHLIESSLICH Microsoft SQL. - Begrenze die SQL-Abfrage immer auf 100 Zeilen. - Formatiere den Output bestmöglich. + Begrenze die SQL-Abfrage immer auf 100 Zeilen. Bedenke dabei besonders, dass es in + Microsoft SQL keine LIMIT-Klausel gibt. Verwende stattdessen TOP 100 im SELECT-Statement! + Formatiere den Output bestmöglich. Benutze als Zeilenumbruch ausschließlich \\n als Zeichen! + Benutze auf gar keinen Fall einzelne Schrägstriche \\ oder doppelte + Schrägstriche \\\\ als Zeilenumbruch! """ # Set up credentials @@ -112,6 +119,6 @@ def send_message(message: str) -> str: ) result_str = response.choices[0].message.content.replace("```json\n", "").replace("```", "") - if ("\n") not in result_str: - result_str = result_str.replace("\\", "\n") + result_str = result_str.replace(" \\ ", " \n ") + result_str = result_str.replace(" \\\\ ", " \n ") return result_str