KI zur Erstellung von SQL-Abfragen nutzen | Original, von KI übersetzt
Datenbank-Schema (PostgreSQL):
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
first_name VARCHAR(100),
last_name VARCHAR(100),
date_of_birth DATE,
gender VARCHAR(10),
phone_number VARCHAR(20),
address TEXT,
city VARCHAR(100),
state VARCHAR(100),
country VARCHAR(100),
zip_code VARCHAR(20),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
last_login TIMESTAMP WITH TIME ZONE,
is_active BOOLEAN DEFAULT TRUE,
role VARCHAR(50),
profile_picture_url VARCHAR(255),
bio TEXT,
failed_login_attempts INTEGER DEFAULT 0,
account_balance NUMERIC(10, 2) DEFAULT 0.00
);
Oben ist die PostgreSQL-Datenbank, unten die Tabellendefinition. Hier sind die Anweisungen für die Abfrage in natürlicher Sprache.
Ich möchte einige Benutzer abfragen, deren Vorname Andy ist, die am Tag des letzten Monats erstellt wurden, die 2025 20 Jahre alt sind und deren letzter Login in der letzten Woche liegt. Geben Sie mir die SQL-Abfrage für solche Benutzer.
Generierte SQL-Abfrage:
SELECT *
FROM users
WHERE first_name ILIKE 'andy'
AND CAST(created_at AS DATE) BETWEEN
(CURRENT_DATE - INTERVAL '1 MONTH' - INTERVAL '1 DAY')
AND
(CURRENT_DATE - INTERVAL '1 MONTH' + INTERVAL '1 DAY')
AND EXTRACT(YEAR FROM AGE(date_of_birth)) = 20
AND last_login >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
Unten ist eine PostgreSQL-Tabellendefinition für eine conversations
-Tabelle, die verwendet werden kann, um Benutzerinteraktionen mit einem KI-System wie Grok zu speichern. Die Tabelle ist so gestaltet, dass sie Gespräche verfolgt, einschließlich des beteiligten Benutzers, des Gesprächsinhaltes, Zeitstempel und relevanter Metadaten.
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
title VARCHAR(255),
conversation_type VARCHAR(50) DEFAULT 'chat',
started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ended_at TIMESTAMP WITH TIME ZONE,
status VARCHAR(50) DEFAULT 'active',
message_count INTEGER DEFAULT 0,
last_message_at TIMESTAMP WITH TIME ZONE,
is_archived BOOLEAN DEFAULT FALSE,
ai_model_version VARCHAR(100),
total_tokens_used INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Erklärung:
- id: Eindeutige Kennung für jedes Gespräch.
- user_id: Verweist auf die
users
-Tabelle, um das Gespräch einem bestimmten Benutzer zuzuordnen. - title: Optionaler Titel für das Gespräch (z. B. benutzerdefiniert oder automatisch generierte Zusammenfassung).
- conversation_type: Gibt den Typ des Gesprächs an (z. B. ‘chat’, ‘query’, ‘voice’).
- started_at: Zeitstempel, wann das Gespräch begann.
- ended_at: Zeitstempel, wann das Gespräch beendet wurde (optional, falls noch aktiv).
- status: Verfolgt den Gesprächsstatus (z. B. ‘active’, ‘completed’, ‘paused’).
- message_count: Verfolgt die Anzahl der Nachrichten im Gespräch.
- last_message_at: Zeitstempel der letzten Nachricht.
- is_archived: Boolean, um anzugeben, ob das Gespräch archiviert ist.
- ai_model_version: Speichert die Version des verwendeten KI-Modells (z. B. ‘Grok 3’).
- total_tokens_used: Verfolgt den Token-Verbrauch für das Gespräch (nützlich für API-Abrechnung oder Analysen).
- created_at und updated_at: Zeitstempel für die Erstellung und die letzte Aktualisierung des Gesprächsdatensatzes.
- FOREIGN KEY: Gewährleistet die referentielle Integrität mit der
users
-Tabelle, mitON DELETE CASCADE
, um Gespräche zu löschen, wenn der zugehörige Benutzer gelöscht wird.
Diese Tabelle ist flexibel gestaltet und kann je nach Bedarf erweitert werden, z. B. durch Speicherung einzelner Nachrichten in einer separaten messages
-Tabelle oder durch Hinzufügen von Feldern für die Stimmungsanalyse oder Gesprächstags.
Um eine Frontend-Anwendung zu ermöglichen, bei der Benutzer ihre eigenen Gespräche mit natürlicher Sprache abfragen können (z. B. “Gib mir meine letzten 5 Gespräche” oder “Gespräche, deren Titel das Wort Java enthält”), müssen Sie sicherstellen, dass die SQL-Abfrage die Ergebnisse auf die Gespräche des authentifizierten Benutzers beschränkt. Dies erfordert die Integration der Benutzeridentität (z. B. user_id
) in die Abfrage und die Übersetzung der natürlichen Sprache in SQL-Bedingungen. Unten finden Sie Beispiele für natürliche Sprachbefehle und entsprechende SQL-Abfragen für die conversations
-Tabelle, wobei sichergestellt wird, dass Benutzer nur auf ihre eigenen Daten zugreifen können.
Wichtige Überlegungen
- Benutzerauthentifizierung: Die Frontend-Anwendung muss die ID des authentifizierten Benutzers (
user_id
) an die Backend-Anwendung weiterleiten, um die Gespräche zu filtern. - Verarbeitung natürlicher Sprache: Die natürliche Spracheingabe wird analysiert, um wichtige Bedingungen zu identifizieren (z. B. “letzte 5” oder “Titel enthält das Wort Java”).
- Sicherheit: Immer durch
user_id
filtern, um zu verhindern, dass Benutzer auf die Gespräche anderer zugreifen. - Tabellenreferenz: Verwendung der oben definierten
conversations
-Tabelle.
Natürliche Sprachbefehle und SQL-Abfragen
Befehl 1: “Gib mir meine letzten 5 Gespräche”
Analysierte Anforderungen:
- Filtern Sie die Gespräche nach der
user_id
des authentifizierten Benutzers. - Sortieren Sie nach
started_at
(oderlast_message_at
für die Aktualität) in absteigender Reihenfolge. - Begrenzen Sie die Ergebnisse auf 5.
SQL-Abfrage:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;
:authenticated_user_id
ist ein Platzhalter für die ID des angemeldeten Benutzers, der sicher von der Frontend-/Backend-Anwendung übergeben wird.started_at DESC
stellt sicher, dass die neuesten Gespräche zurückgegeben werden.LIMIT 5
begrenzt die Ausgabe auf 5 Gespräche.
Befehl 2: “Gespräche, deren Titel das Wort Java enthält”
Analysierte Anforderungen:
- Filtern Sie die Gespräche nach der
user_id
des authentifizierten Benutzers. - Suchen Sie nach Gesprächen, bei denen der
title
“java” enthält (case-insensitive). - Verwenden Sie
ILIKE
für partielle, case-insensitive Übereinstimmungen in PostgreSQL.
SQL-Abfrage:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
AND title ILIKE '%java%';
:authenticated_user_id
stellt sicher, dass nur die Gespräche des Benutzers abgefragt werden.ILIKE '%java%'
stimmt mit Titeln überein, die “java” enthalten (z. B. “Java-Tipps”, “Über Java-Programmierung”).
Implementierungshinweise für die Frontend-Anwendung
- Benutzerauthentifizierung:
- Die Frontend-Anwendung muss die ID des authentifizierten Benutzers (z. B. aus einem JWT-Token oder einer Sitzung) an die Backend-API senden.
- Die Backend-Anwendung sollte die
user_id
validieren und sie in derWHERE
-Klausel verwenden, um die Ergebnisse zu filtern.
- Verarbeitung natürlicher Sprache:
- Verwenden Sie einen einfachen regelbasierten Parser oder ein KI-Modell (wie Grok), um die natürliche Sprachabfrage zu interpretieren und Folgendes zu extrahieren:
- Absicht: Gespräche auflisten.
- Filter: Schlüsselwörter (z. B. “java”), Sortierung (z. B. “letzte”) oder Begrenzungen (z. B. “5”).
- Beispielsweise “letzte 5” auf
ORDER BY started_at DESC LIMIT 5
und “Titel enthält das Wort java” auftitle ILIKE '%java%'
abbilden.
- Verwenden Sie einen einfachen regelbasierten Parser oder ein KI-Modell (wie Grok), um die natürliche Sprachabfrage zu interpretieren und Folgendes zu extrahieren:
- API-Design:
- Erstellen Sie ein Endpunkt (z. B.
/api/conversations
), das Folgendes akzeptiert:user_id
: Aus der authentifizierten Sitzung.query
: Die natürliche Spracheingabe oder strukturierte Parameter (z. B.{ filter: "title contains java" }
).
- Die Backend-Anwendung übersetzt die Abfrage in SQL, wobei sichergestellt wird, dass
user_id
immer in derWHERE
-Klausel enthalten ist.
- Erstellen Sie ein Endpunkt (z. B.
- Sicherheit:
- Erlauben Sie Benutzern niemals, SQL direkt einzugeben oder den
user_id
-Filter zu ändern. - Verwenden Sie parameterisierte Abfragen (z. B.
:authenticated_user_id
), um SQL-Injection zu verhindern. - Validieren Sie Eingaben, um böswillige Muster in
ILIKE
-Suchen zu vermeiden.
- Erlauben Sie Benutzern niemals, SQL direkt einzugeben oder den
- Frontend-Anzeige:
- Geben Sie Felder wie
id
,title
,started_at
,last_message_at
undstatus
zurück, um eine Gesprächsliste anzuzeigen. - Bieten Sie Sortierungs- oder Filteroptionen in der Benutzeroberfläche an (z. B. Dropdown-Menüs für “letzte” oder Textfelder für die Titelsuche).
- Geben Sie Felder wie
Beispiel-Workflow
- Der Benutzer meldet sich an, und die Frontend-Anwendung ruft seine
user_id
ab (z. B.123
). - Der Benutzer gibt “Gib mir meine letzten 5 Gespräche” in ein Suchfeld ein.
- Die Frontend-Anwendung sendet eine Anfrage an die Backend-Anwendung:
/api/conversations?user_id=123&query=letzte 5
. - Die Backend-Anwendung analysiert die Abfrage, generiert die SQL-Abfrage:
SELECT * FROM conversations WHERE user_id = 123 ORDER BY started_at DESC LIMIT 5;
- Die Backend-Anwendung gibt die Ergebnisse als JSON zurück, und die Frontend-Anwendung zeigt die Gespräche an.
Zusätzliche Hinweise
- Wenn
title
NULL sein kann, fügen SieAND title IS NOT NULL
zur zweiten Abfrage hinzu, um die Übereinstimmung mit NULL-Titeln zu vermeiden. - Für komplexere Abfragen (z. B. “Gespräche über Java aus der letzten Woche”) kombinieren Sie Bedingungen:
SELECT * FROM conversations WHERE user_id = :authenticated_user_id AND title ILIKE '%java%' AND started_at >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
- Wenn Sie einen fortschrittlicheren natürlichen Sprachparser benötigen, können Sie ein KI-Modell (z. B. Grok über die xAI-API) integrieren, um komplexe Abfragen auf SQL abzubilden. Für API-Details besuchen Sie xAI API.
Lassen Sie es mich wissen, wenn Sie Hilfe bei der Frontend-Code-Erstellung, der Backend-API-Konfiguration oder zusätzlichen Abfragebeispielen benötigen!