Wer bei ppedv arbeitet muss irgendwann einen SQL Kurs absolvieren. Wir betreiben einen Microsoft SQL Server Datenbank. Nicht nur gewachsen, sondern migriert aus Clipper.
Folgender Beitrag ist Idee und Basis für ein Konzept. Ich nutze die OpenAI API, habe aber Oflline Modelle wie Phi-3 im Auge und möchte letztendlich das ganze in eine .NET Anwendung integrieren.
Zunächst ist es eine Illusion ChatGPT Zugriff auf die SQL Datenbank direkt zu geben. Man benötigt ein Schema. Aus irgendeinem Grund benutzt jeder YAML als Datei Format. Das Schema kann ich zwar aus der Datenbank generieren, muss es aber umfangreich per Hand nacharbeiten. Deshalb beginne ich mit einem Dummy
1: Kunden:
2: - Field: KundenID
3: Type: INT
4: Null: NO
5: Key: PRI
6: Default: NULL
7: Extra: AUTO_INCREMENT
8: Description: "Eindeutige Identifikationsnummer für jeden Kunden"
9: - Field: Name
Um dem LLM die Chance zu geben, die Absicht zu erkennen, habe ich eine Description angelegt.
Natürlich auch noch eine Relation
1: Rechnungen:
2: - Field: RechnungsID
3: Type: INT
4: Null: NO
5: Key: PRI
6: Default: NULL
7: Extra: AUTO_INCREMENT
8: - Field: KundenID
9: Type: INT
10: Null: NO
11: Key: ''
12: Default: NULL
13: Extra: ''
14: - Field: Datum
Nun erzeuge ich ein jupyter Notebook bzw eine Datei mit der Endung ipynb. Da gibt's viele Möglichkeiten. Hier kommt Visual Studio Code zum Einsatz, das dazu noch einen Handvoll Erweiterungen benötigt.
Das Notebook bekommt zwei Kommandos um die benötigten Python Bibliotheken zu laden.

Diese werden dann im Code Abschnitt importiert und das YAML Schema als String eingebunden.
1: from openai import OpenAI
2: import yaml
3:
4: # Beispiel-YAML-Schema laden
5: yaml_schema = """
Da diese recht umfangreich ist, fehlt es hier im Blog Beitrag.
Man benötigt von OpenAI für dieses Beispiel einen API Key. Ein LLM wird mit einem Prompt vorbereitet und einem weiteren die Anweisung.
1: db_schema = yaml.safe_load(yaml_schema)
2:
3: OpenAI.api_key = 'your key hereP'
4:
5: def generate_sql(natural_language_query, db_schema):
6:
7: client = OpenAI()
8:
9: completion = client.chat.completions.create(
10: model="gpt-4o",
11: messages=[
12: {"role": "system", "content": "You are a helpful assistant."},
13: {"role": "user", "content": f"Convert the following natural language query to SQL:\n\n{natural_language_query}\n\nDatabase schema:\n{yaml.dump(db_schema, default_flow_style=False)}"}
14: ],
15: max_tokens=150
16: )
17: return completion.choices[0].message.content
18:
19: query = "Zeige alle Kunden, die mehr als 1000 Euro ausgegeben haben."
20: sql_command = generate_sql(query, db_schema)
21: print(sql_command)
Das Ergbnis
