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:
48
app/app.py
48
app/app.py
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user