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 = """
|
||||
**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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user