fix(sql-formatting): Fix SQL code formatting

Fixed SQL code formatting errors by:
- catching both single and double backslashes in the formatting
- explicitly telling LLM how to format linebreaks

Also did some changes to the UI and allowed general questions
about the database content to be asked.
This commit is contained in:
2024-10-06 11:59:45 +02:00
parent 76a7168aa3
commit 5cec810947
2 changed files with 44 additions and 25 deletions

View File

@@ -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

View File

@@ -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