Merge pull request 'fix(sql-formatting): Fix SQL code formatting' (#10) from fix/sql-formatting into main

Reviewed-on: #10
This commit was merged in pull request #10.
This commit is contained in:
2024-10-06 10:06:26 +00:00
2 changed files with 44 additions and 25 deletions

View File

@@ -42,11 +42,6 @@ app.index_string = header_style
notification_md = """ notification_md = """
**Hinweise:** **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. 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 In diesem Fall lohnt es sich oft, die Anfrage leicht verändert erneut zu stellen und evtl
zusätzliche Informationen zu geben. 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. 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? - Wie viele Kunden haben wir in Hannover?
- Zeige alle Kunden in Bremen. - Zeige alle Kunden in Bremen.
- Berechne den gesamten Stromverbrauch aller Kunden in Magdeburg. - Berechne den gesamten Stromverbrauch aller Kunden in Magdeburg.
@@ -163,7 +163,10 @@ def get_layout() -> html.Div:
className="header-container", className="header-container",
), # Header ), # Header
html.Div( 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"}, style={"margin-left": "20px", "font-weight": "bold", "font-size": "20px"},
), ),
dcc.Store( dcc.Store(
@@ -222,7 +225,7 @@ def get_layout() -> html.Div:
html.Div( html.Div(
( (
"Hier kann der ausgegebene SQL-Code getestet oder mit selbst" "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"}, 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 # parse LLM response to dict, then try to execute the query
try: try:
parsed_result = json.loads(result, strict=False) parsed_result = json.loads(result, strict=False)
if parsed_result["query"] == "NA":
result_table = execute_query(parsed_result["query"]) children = [
children = [ html.P([html.B("Zusammenfassung: "), f"{parsed_result['summary']}"]),
html.P([html.B("Zusammenfassung: "), f"{parsed_result['summary']}"]), ]
html.P([html.B("SQL Abfrage: "), f"{parsed_result['query']}"]), else:
render_table(result_table), 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("") return children, value, err_style, html.P("")
except Exception as e: except Exception:
err_style["height"] = "400px" err_style["height"] = "50px"
err_child = html.Div(f"Folgender Fehler ist aufgetreten: {e}.LLM Output: {result}.") 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 return no_update, value, err_style, err_child

View File

@@ -78,13 +78,20 @@ def send_message(message: str) -> str:
Gib NUR JSON aus. Gib NUR JSON aus.
Ersetze in der vorangehenden JSON-Antwort "your-query" durch die Microsoft SQL Server Query, Ersetze in der vorangehenden JSON-Antwort "your-query" durch die Microsoft SQL Server Query,
um die angeforderten Daten abzurufen. 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. Gib immer alle Spalten der Tabelle an.
Wenn die resultierende Abfrage nicht ausführbar ist, ersetze "your-query“ durch NA, aber ersetze Wenn die resultierende Abfrage nicht ausführbar ist, ersetze "your-query“ durch NA, aber
trotzdem "your-query" durch eine Zusammenfassung der Abfrage. 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. Verwende KEINE MySQL-Syntax, sondern AUSSCHLIESSLICH Microsoft SQL.
Begrenze die SQL-Abfrage immer auf 100 Zeilen. Begrenze die SQL-Abfrage immer auf 100 Zeilen. Bedenke dabei besonders, dass es in
Formatiere den Output bestmöglich. 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 # Set up credentials
@@ -112,6 +119,6 @@ def send_message(message: str) -> str:
) )
result_str = response.choices[0].message.content.replace("```json\n", "").replace("```", "") 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 return result_str