Interroger une BDD SQL
Créer une chaîne pour interagir avec une base de données SQL en utilisant LangChain est une excellente option pour exécuter des requêtes dynamiques tout en utilisant un modèle de langage pour générer, valider ou interpréter les résultats. LangChain propose des outils spécifiques comme le SqlDatabaseChain
pour cette tâche.
1. Dépendances nécessaires
Assurez-vous d’installer les dépendances :
npm install langchain sqlite3 dotenv
Si vous utilisez une autre base de données, installez le driver correspondant :
- PostgreSQL :
npm install pg
- MySQL :
npm install mysql2
2. Configuration initiale
Créez un fichier .env
pour gérer vos informations sensibles (par exemple, la chaîne de connexion à la base de données).
SQLITE_DB_PATH=./your_database.sqliteOPENAI_API_KEY=your_openai_api_key
3. Étapes principales
Étape 1 : Initialiser la connexion SQL
Voici un exemple pour SQLite :
import { SqlDatabase } from "langchain/sql_db";import sqlite3 from "sqlite3";import dotenv from "dotenv";
dotenv.config();
async function initializeDatabase() { const db = new sqlite3.Database(process.env.SQLITE_DB_PATH!); return new SqlDatabase(db);}
Pour une autre base de données (PostgreSQL, MySQL), vous devrez remplacer SQLite par un driver adapté.
Étape 2 : Configurer le modèle LLM
Créez un modèle GPT-4 ou GPT-3.5 pour générer ou interpréter les requêtes SQL.
import { OpenAIChat } from "langchain/llms/openai";
const llm = new OpenAIChat({ openAIApiKey: process.env.OPENAI_API_KEY!, temperature: 0.0, // Réponses déterministes pour les requêtes SQL});
Étape 3 : Construire la chaîne SQL
Utilisez SqlDatabaseChain
pour relier la base de données et le modèle LLM.
import { SqlDatabaseChain } from "langchain/chains";
async function createSQLChain() { const sqlDatabase = await initializeDatabase();
const sqlChain = SqlDatabaseChain.fromLLM(llm, sqlDatabase, { returnDirect: true, // Renvoie directement les résultats de la requête SQL });
return sqlChain;}
Étape 4 : Exécuter une requête via la chaîne
Utilisez la chaîne pour exécuter des requêtes dynamiques.
async function runSQLQuery(userQuery: string) { const sqlChain = await createSQLChain();
try { const response = await sqlChain.run(userQuery); console.log("Résultat de la requête :", response); } catch (error) { console.error("Erreur lors de l'exécution de la requête :", error); }}
// Exemple d'exécutionconst query = "Donne-moi les 5 derniers utilisateurs inscrits dans la table 'users'.";runSQLQuery(query).catch(console.error);
4. Exemple de résultat
Si la base de données contient une table users
avec des colonnes id
, name
, et created_at
, et que vous exécutez :
Donne-moi les 5 derniers utilisateurs inscrits dans la table 'users'.
La chaîne générera la requête SQL suivante :
SELECT * FROM users ORDER BY created_at DESC LIMIT 5;
Et affichera un résultat similaire à :
Résultat de la requête :[ { id: 101, name: "Alice", created_at: "2024-11-28 12:30:00" }, { id: 102, name: "Bob", created_at: "2024-11-27 14:15:00" }, ...]
5. Points importants
- Validation des requêtes SQL : Utilisez un
outputParser
pour valider les requêtes générées ou filtrer les résultats. - Sécurité :
- Évitez les injections SQL en limitant les champs que le LLM peut manipuler.
- Fournissez un schéma explicite pour guider le modèle.
- Personnalisation des résultats :
- Utilisez les options de LangChain pour transformer les résultats en JSON, texte formaté, ou tout autre format adapté.
- Gestion des erreurs : Gérez les cas où la table ou la colonne demandée n’existe pas.
6. Étapes suivantes
- Documenter le schéma de la base de données pour guider le modèle.
- Créer une UI : Connectez cette chaîne à une application React/Next.js pour permettre aux utilisateurs de poser des questions dynamiques.
- Monitorer l’utilisation : Tracez les requêtes et réponses pour améliorer la précision du modèle.