Construire des requêtes SQL avec l'IA | Original, traduit par l'IA
Schéma de base de données (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
);
ci-dessus est la base de données postgre, ci-dessous est la définition de la table. voici les instructions de requête en langage naturel.
je veux obtenir certains utilisateurs dont le prénom est andy, créés_ à peu près le jour du mois dernier, et qui ont 20 ans en 2025, et dont le dernier_connexion ressemble à la semaine dernière, donnez-moi le sql pour interroger de tels utilisateurs
Requête SQL générée :
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';
Ci-dessous se trouve une définition de table PostgreSQL pour une table conversations
qui pourrait être utilisée pour stocker les interactions des utilisateurs avec un système d’IA comme Grok. La table est conçue pour suivre les conversations, y compris l’utilisateur impliqué, le contenu de la conversation, les horodatages et les métadonnées pertinentes.
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
);
Explication :
- id : Identifiant unique pour chaque conversation.
- user_id : Référence la table
users
pour lier la conversation à un utilisateur spécifique. - title : Titre optionnel pour la conversation (par exemple, défini par l’utilisateur ou un résumé généré automatiquement).
- conversation_type : Indique le type de conversation (par exemple, ‘chat’, ‘query’, ‘voice’).
- started_at : Horodatage de début de la conversation.
- ended_at : Horodatage de fin de la conversation (nullable si en cours).
- status : Suivi de l’état de la conversation (par exemple, ‘active’, ‘completed’, ‘paused’).
- message_count : Suivi du nombre de messages échangés dans la conversation.
- last_message_at : Horodatage du dernier message.
- is_archived : Booléen pour indiquer si la conversation est archivée.
- ai_model_version : Stocke la version du modèle d’IA utilisé (par exemple, ‘Grok 3’).
- total_tokens_used : Suivi de l’utilisation des tokens pour la conversation (utile pour la facturation ou l’analyse API).
- created_at et updated_at : Horodatages de création et de dernière mise à jour de l’enregistrement de la conversation.
- FOREIGN KEY : Assure l’intégrité référentielle avec la table
users
, avecON DELETE CASCADE
pour supprimer les conversations si l’utilisateur associé est supprimé.
Cette table est conçue pour être flexible et peut être étendue en fonction des besoins spécifiques, comme le stockage des messages individuels dans une table messages
séparée ou l’ajout de champs pour l’analyse de sentiment ou les balises de conversation. Faites-moi savoir si vous avez besoin d’une table connexe (par exemple, pour les messages) ou d’une requête pour interagir avec cette table !
Pour permettre à un frontend où les utilisateurs peuvent interroger leurs propres conversations en langage naturel (par exemple, “donnez-moi mes 5 dernières conversations” ou “conversations dont le titre contient le mot java”), vous devez vous assurer que la requête SQL restreint les résultats aux conversations de l’utilisateur authentifié. Cela implique d’incorporer l’identité de l’utilisateur (par exemple, user_id
) dans la requête et de traduire l’entrée en langage naturel en conditions SQL. Ci-dessous se trouvent des exemples de requêtes et de requêtes SQL correspondantes pour la table conversations
, en veillant à ce que les utilisateurs ne puissent accéder qu’à leurs propres données.
Considérations clés
- Authentification de l’utilisateur : Le frontend doit transmettre l’ID de l’utilisateur authentifié (
user_id
) au backend pour filtrer les conversations. - Analyse du langage naturel : L’entrée en langage naturel est analysée pour identifier les conditions clés (par exemple, “5 dernières” ou “titre contient le mot java”).
- Sécurité : Toujours filtrer par
user_id
pour empêcher les utilisateurs d’accéder aux conversations des autres. - Référence de table : Utilisation de la table
conversations
définie ci-dessus.
Exemples de requêtes en langage naturel et de requêtes SQL
Requête 1 : “Donnez-moi mes 5 dernières conversations”
Exigences analysées :
- Filtrer les conversations par l’ID de l’utilisateur authentifié (
user_id
). - Trier par
started_at
(oulast_message_at
pour la récence) par ordre décroissant. - Limiter à 5 résultats.
Requête SQL :
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;
:authenticated_user_id
est un espace réservé pour l’ID de l’utilisateur connecté, transmis de manière sécurisée depuis le frontend/backend.started_at DESC
garantit que les conversations les plus récentes sont retournées.LIMIT 5
limite la sortie à 5 conversations.
Requête 2 : “Conversations dont le titre contient le mot java”
Exigences analysées :
- Filtrer les conversations par l’ID de l’utilisateur authentifié (
user_id
). - Rechercher les conversations dont le
title
contient “java” (insensible à la casse). - Utiliser
ILIKE
pour une correspondance partielle et insensible à la casse dans PostgreSQL.
Requête SQL :
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
AND title ILIKE '%java%';
:authenticated_user_id
garantit que seules les conversations de l’utilisateur sont interrogées.ILIKE '%java%'
correspond aux titres contenant “java” (par exemple, “Conseils Java”, “À propos de la programmation Java”).
Notes d’implémentation pour le frontend
- Authentification de l’utilisateur :
- Le frontend doit envoyer l’ID de l’utilisateur authentifié (par exemple, à partir d’un jeton JWT ou d’une session) à l’API backend.
- Le backend doit valider le
user_id
et l’utiliser dans la clauseWHERE
pour filtrer les résultats.
- Traitement du langage naturel :
- Utiliser un analyseur basé sur des règles simples ou un modèle d’IA (comme Grok) pour interpréter la requête en langage naturel et extraire :
- Intention : Lister les conversations.
- Filtres : Mots-clés (par exemple, “java”), tri (par exemple, “dernières”), ou limites (par exemple, “5”).
- Par exemple, mapper “5 dernières” à
ORDER BY started_at DESC LIMIT 5
et “titre contient le mot java” àtitle ILIKE '%java%'
.
- Utiliser un analyseur basé sur des règles simples ou un modèle d’IA (comme Grok) pour interpréter la requête en langage naturel et extraire :
- Conception de l’API :
- Créer un point de terminaison (par exemple,
/api/conversations
) qui accepte :user_id
: À partir de la session authentifiée.query
: L’entrée en langage naturel ou des paramètres structurés (par exemple,{ filter: "title contains java" }
).
- Le backend traduit la requête en SQL, en veillant à ce que
user_id
soit toujours inclus dans la clauseWHERE
.
- Créer un point de terminaison (par exemple,
- Sécurité :
- Ne jamais permettre aux utilisateurs d’entrer directement du SQL ou de modifier le filtre
user_id
. - Utiliser des requêtes paramétrées (par exemple,
:authenticated_user_id
) pour éviter les injections SQL. - Valider les entrées pour éviter les motifs malveillants dans les recherches
ILIKE
.
- Ne jamais permettre aux utilisateurs d’entrer directement du SQL ou de modifier le filtre
- Affichage du frontend :
- Retourner des champs comme
id
,title
,started_at
,last_message_at
etstatus
pour afficher une liste de conversations. - Permettre des options de tri ou de filtrage dans l’interface utilisateur (par exemple, des menus déroulants pour “dernières” ou une entrée de texte pour la recherche de titre).
- Retourner des champs comme
Exemple de flux de travail
- L’utilisateur se connecte, et le frontend récupère son
user_id
(par exemple,123
). - L’utilisateur tape “donnez-moi mes 5 dernières conversations” dans une barre de recherche.
- Le frontend envoie une requête au backend :
/api/conversations?user_id=123&query=5 dernières
. - Le backend analyse la requête, génère le SQL :
SELECT * FROM conversations WHERE user_id = 123 ORDER BY started_at DESC LIMIT 5;
- Le backend retourne les résultats en JSON, et le frontend affiche les conversations.
Notes supplémentaires
- Si
title
est nullable, ajoutezAND title IS NOT NULL
à la deuxième requête pour éviter de correspondre aux titres null. - Pour des requêtes plus complexes (par exemple, “conversations sur java de la semaine dernière”), combinez les conditions :
SELECT * FROM conversations WHERE user_id = :authenticated_user_id AND title ILIKE '%java%' AND started_at >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
- Si vous avez besoin d’un analyseur de langage naturel plus avancé, envisagez d’intégrer un modèle d’IA (par exemple, Grok via l’API xAI) pour mapper des requêtes complexes en SQL. Pour les détails de l’API, visitez xAI API.
Faites-moi savoir si vous avez besoin d’aide pour le code frontend, la configuration de l’API backend ou des exemples de requêtes supplémentaires !