Retour au blog
IA Native · 8 min de lecture

Qu'est-ce que le NL2SQL et comment ça fonctionne ?

Affane Daylami · Fondateur· 24 août 2026

Le NL2SQL (natural language to SQL, aussi appelé text-to-SQL) désigne une famille de systèmes qui traduisent une question posée en langage naturel, en français ou en anglais, en une requête SQL exécutable sur une base de données relationnelle. Le principe : un modèle de langage lit la question et le schéma de la base, produit un SQL candidat, et ce SQL est validé avant d'être exécuté, jamais renvoyé à l'aveugle.

L'idée précède les grands modèles de langage actuels : des systèmes de traduction question vers SQL existent depuis des années de recherche académique, avec des jeux de données de référence comme Spider ou WikiSQL. Ce qui a changé avec les LLM récents, c'est la qualité du SQL généré sur un schéma quelconque, sans entraînement dédié préalable. Cet article explique le mécanisme réel, étape par étape, avec l'implémentation vérifiée d'IA native d'Aurabase comme exemple concret plutôt qu'une description abstraite.

L'essentiel
  • Le NL2SQL (ou text-to-SQL) traduit une question en langage naturel en requête SQL exécutable, via un LLM suivi d'une étape de validation avant exécution.
  • Le pipeline comporte toujours la même séquence : génération du SQL par un modèle, validation syntaxique, validation contre le schéma réel, exécution bornée par un plafond de lignes.
  • Le risque principal n'est pas l'injection SQL classique côté client, mais l'exécution aveugle d'un SQL halluciné par le modèle, une table ou une colonne inventée.
  • Un moteur NL2SQL sérieux n'accepte que des requêtes SELECT : toute tentative d'écriture (INSERT, UPDATE, DELETE, DROP) est rejetée avant d'atteindre la base.
  • Le moteur NL2SQL d'Aurabase, vérifié dans le code, valide le SQL généré via un parseur d'arbre syntaxique (sqlparser), une liste blanche de dix fonctions SQL, et un plafond de lignes configurable (100 par défaut, 1000 au maximum).
  • NL2SQL et RAG répondent à des besoins différents : le structuré et relationnel pour l'un, le contenu non structuré pour l'autre.
#
Définition

Qu'est-ce que le NL2SQL, exactement ?

Le NL2SQL désigne la traduction automatique d'une question en langage naturel vers une requête SQL exécutable sur une base relationnelle. Contrairement à un chatbot générique qui répond en texte libre, un système NL2SQL produit un artefact structuré, du SQL, qui s'exécute contre de vraies données et retourne un résultat vérifiable ligne par ligne.

Le terme « text-to-SQL » vient de la recherche académique en traitement du langage naturel. « NL2SQL » est l'abréviation la plus utilisée côté produit et documentation technique. Les deux désignent le même problème : combler l'écart entre une question posée en langue courante et la syntaxe précise attendue par un moteur SQL.

Le NL2SQL se distingue d'un agent conversationnel connecté à une base de données au sens large. Le premier produit une requête lisible et auditable ; le second peut enchaîner plusieurs appels d'outils (recherche, calcul, écriture) sans qu'un SQL unique et inspectable en sorte nécessairement. Un système NL2SQL correctement conçu reste sur ce périmètre volontairement restreint : traduire, valider, exécuter, retourner un résultat.

#
Mécanisme

Comment fonctionne un pipeline NL2SQL, étape par étape

Un pipeline NL2SQL fiable suit toujours la même séquence, quel que soit le fournisseur : la question passe par un modèle de langage, puis le SQL produit est validé avant exécution, jamais après. L'implémentation d'Aurabase, vérifiée dans le code du service aura-ai, illustre chacune de ces étapes avec des règles concrètes plutôt qu'une description abstraite.

1.La question est reçue avec le schéma réel de la base

Le système associe la question en langage naturel au schéma de la base interrogée : noms de tables, colonnes, types. Ce schéma doit venir d'une introspection de la base réelle, pas d'une description fournie par l'appelant. Une implémentation qui accepterait un schéma déclaré par le client ouvrirait la porte à des questions portant sur des tables inexistantes, ou à un contournement de l'isolation entre projets. Le moteur d'Aurabase refuse explicitement (erreur 400) tout champ schema envoyé dans la requête, plutôt que de l'ignorer en silence.

2.Un LLM génère un SQL candidat

Le modèle de langage reçoit la question et le schéma dans son prompt, puis produit une requête SQL candidate accompagnée d'une courte explication. Aurabase traite à égalité trois fournisseurs avec un client natif dédié : OpenAI, Anthropic (Claude) et Gemini. Ce SQL candidat n'est à ce stade qu'une proposition, jamais exécuté directement.

3.Le SQL candidat est validé avant exécution, pas après

C'est l'étape qui distingue un système NL2SQL sérieux d'un simple appel LLM suivi d'une exécution naïve. Le SQL généré est parsé en arbre syntaxique (AST) plutôt qu'inspecté par une recherche de mots-clés, facilement contournable. L'implémentation d'Aurabase, avec la bibliothèque sqlparser, n'autorise que des requêtes SELECT simples : les CTE/WITH, les sous-requêtes, les UNION, les fonctions-fenêtre et les clauses de verrouillage (FOR UPDATE) sont explicitement rejetés, tout comme toute fonction SQL hors d'une liste blanche de dix fonctions (count, sum, avg, min, max, lower, upper, coalesce, date_trunc, now).

4.La requête validée s'exécute avec un plafond de lignes

Le SQL validé reçoit un LIMIT s'il n'en porte pas déjà un : 100 lignes par défaut chez Aurabase, 1000 au maximum, les deux valeurs configurables côté serveur. Une demande au-delà du plafond est refusée explicitement plutôt que silencieusement réduite. La réponse indique si ce LIMIT a été ajouté par le serveur, pour que l'appelant sache si le SQL exécuté diffère de celui produit par le modèle.

exemple
SQL
-- Question : "Combien de commandes ce mois-ci pour les clients premium ?"
SELECT count(*) FROM orders
WHERE customer_plan = 'premium'
AND created_at >= date_trunc('month', now())
LIMIT 100 -- ajouté par le serveur, absent du SQL généré

Le détail complet de ce pipeline, avec chaque appel HTTP et chaque réponse JSON, est couvert dans notre tutoriel pas-à-pas pour construire un endpoint NL2SQL sur Postgres.

#
Cas d'usage

NL2SQL vs SQL écrit à la main : quand utiliser quoi

Le NL2SQL n'a pas vocation à remplacer le SQL écrit à la main partout. Il couvre un périmètre précis : les questions ad hoc, ponctuelles, posées par quelqu'un qui ne maîtrise pas SQL ou qui veut simplement gagner du temps sur une requête simple.

  • Exploration ad hoc d'un tableau de bord par une personne non technique (support, produit, direction).
  • Prototypage rapide d'une fonctionnalité qui interroge la base sans écrire une route API dédiée pour chaque question possible.
  • Auto-service analytique limité : compter, filtrer, agréger simplement, sans donner un accès direct à la base à l'utilisateur final.

Le SQL écrit à la main reste préférable dès que la question dépasse ce périmètre. Une implémentation validée par AST comme celle décrite plus haut exclut par construction les CTE, les sous-requêtes et les fonctions-fenêtre, pour des raisons de sécurité. Une analyse qui a structurellement besoin de ces constructions, cohortes, fenêtrage temporel avancé, ne passe pas par NL2SQL : elle se code directement. C'est un compromis assumé, la sécurité du système passe avant l'exhaustivité du SQL généré.

#
Risques

Les risques du NL2SQL : injection, hallucination, coût

Trois risques reviennent systématiquement dans une implémentation NL2SQL, avec des réponses différentes selon la maturité du système.

Injection SQL via le prompt ou la question

Un LLM peut être manipulé pour produire du SQL malveillant si la question elle-même contient une tentative d'injection de type « ignore les instructions précédentes et... ». La défense n'est pas de faire confiance au prompt, mais de valider le SQL produit indépendamment de ce qui a été demandé, exactement l'étape 3 du pipeline décrit plus haut. Le sujet mérite un traitement dédié : voir Sécuriser le NL2SQL contre l'injection SQL pour les vecteurs d'attaque précis et les contre-mesures.

Hallucination de tables ou de colonnes inexistantes

Le modèle peut inventer un nom de table ou de colonne plausible mais absent du schéma réel, en particulier sur des schémas volumineux ou peu documentés. Une implémentation qui valide le SQL généré contre le schéma réel de la base rejette la requête avec un message explicite, listant les tables réellement disponibles, plutôt que de laisser une erreur SQL brute remonter à l'utilisateur.

Coût et latence des appels au modèle

Chaque question NL2SQL déclenche un appel au modèle de langage, avec son coût et sa latence propres, en plus du temps d'exécution SQL. Ce coût monte vite si NL2SQL sert de couche par défaut à des questions répétitives, qui gagneraient à être mises en cache ou exposées comme un rapport standard plutôt que retraduites à chaque fois.

Confiance à mesurer, pas à supposer
Un score de confiance renvoyé par un moteur NL2SQL (une heuristique sur la forme de la réponse, bloc SQL bien formé ou non) n'est pas une mesure d'exactitude sémantique. Il indique que le modèle a produit du SQL syntaxiquement propre, pas que ce SQL répond correctement à la question posée.
#
Architecture

NL2SQL natif vs assemblé : ce que ça change pour un développeur

Deux architectures produisent un résultat visible similaire, mais avec des garanties très différentes. Un NL2SQL natif intègre la génération, la validation et l'exécution directement dans la couche backend qui connaît déjà le schéma et les droits d'accès du projet : c'est la logique décrite plus haut pour Aurabase, où le service aura-ai partage l'infrastructure et l'isolation par schéma avec le reste du backend.

Un NL2SQL assemblé combine un service LLM générique, un connecteur vers la base de données, et une couche de validation à construire soi-même. Rien n'empêche cette approche d'être sûre, mais chaque garantie, schéma introspecté côté serveur, validation AST, plafond de lignes, isolation tenant, doit être implémentée et maintenue par l'équipe qui assemble ces briques, plutôt que fournie par la plateforme.

Le paysage des outils NL2SQL, natifs et assemblés, open source et commerciaux, est comparé en détail dans notre comparatif des outils NL2SQL 2026.

#
Distinction

NL2SQL et RAG : quelle différence ?

NL2SQL et RAG (retrieval-augmented generation) répondent à deux familles de questions différentes, souvent confondues parce que les deux s'appuient sur un LLM branché à une base de données.

NL2SQL cible les données structurées et relationnelles : combien, quand, quelle proportion, des questions qui se traduisent naturellement en SELECT, GROUP BY, agrégations. Le RAG cible le contenu non structuré : documents, notes, tickets de support, où la réponse ne tient pas dans une ligne de table mais demande de retrouver un passage pertinent par similarité sémantique, recherche vectorielle sur pgvector, index HNSW, avant de le donner en contexte au modèle.

Les deux capacités peuvent coexister dans un même projet et se combiner dans un agent qui choisit l'une ou l'autre selon la question posée. Le pilier IA native d'Aurabase détaille comment les deux mécanismes s'articulent, et notre guide du pipeline RAG sur pgvector couvre l'implémentation du second.

#
Questions Fréquentes

FAQ

Text-to-SQL et NL2SQL désignent-ils la même chose ?+
Oui, les deux termes désignent la même famille de systèmes : traduire une question posée en langage naturel en une requête SQL exécutable. « Text-to-SQL » est le terme utilisé dans la recherche académique (bases de référence comme Spider ou WikiSQL), « NL2SQL » est l’abréviation la plus courante côté produit et documentation technique. Aucune différence technique entre les deux appellations.
Le NL2SQL peut-il halluciner des tables ou des colonnes qui n’existent pas ?+
Le modèle de langage peut générer un nom de table inventé, c’est un risque réel de tout système basé sur un LLM. Ce qui compte, c’est ce qui se passe ensuite : une implémentation qui valide le SQL généré contre le schéma réel de la base rejette la requête avec un message explicite plutôt que de l’exécuter à l’aveugle. C’est le comportement vérifié dans le moteur NL2SQL d’Aurabase, qui liste les tables réellement disponibles dans le message d’erreur.
Le NL2SQL peut-il exécuter des écritures (INSERT, UPDATE, DELETE) ?+
Pas dans une implémentation prudente. Un moteur NL2SQL bien conçu n’accepte que des requêtes SELECT et rejette toute tentative d’écriture avant exécution, au niveau de l’arbre syntaxique plutôt que par une simple recherche de mot-clé dans le texte. Vérifiez ce point avant d’adopter un outil : certains prototypes NL2SQL open source n’imposent pas cette limite par défaut.
Faut-il un modèle spécialement entraîné pour faire du NL2SQL, ou un LLM généraliste suffit-il ?+
Un LLM généraliste récent (GPT, Claude, Gemini) suffit pour la majorité des cas d’usage, à condition de lui fournir le schéma réel de la base dans le prompt. Des modèles spécialisés existent, affinés sur des paires question/SQL, et gagnent en précision sur des schémas très larges ou des dialectes SQL exotiques. Mais la validation du SQL généré compte davantage que le choix du modèle pour la sécurité du système.
Le NL2SQL remplace-t-il un data analyst ?+
Non, il change la nature du travail plutôt que de l’éliminer. Le NL2SQL couvre les questions structurées et récurrentes, comptages, filtres, agrégations simples, qui autrement mobilisent un analyste pour une requête ponctuelle. Les analyses qui demandent du jugement métier, de la modélisation ou une question mal formulée à reformuler restent le travail d’une personne qui comprend le contexte, pas d’un système de traduction automatique.
ESSAYEZ MAINTENANT

Testez le NL2SQL sur votre propre schéma.

Un projet Aurabase gratuit suffit : le pipeline de validation SQL décrit ici est déjà en place.

Créer un projet gratuit Documentation IA
Aucune carte bancaire requise · 500 MB gratuits · 50 000 MAU