Outils & Comparatifs IA

Text-to-SQL : pourquoi ça casse en production, et ce qu'on met à la place

Les scores de test du text-to-SQL ne se transposent pas sur une base de production. Les quatre modes d'échec les plus fréquents, pourquoi le modèle n'y est pour rien, et ce qu'on met à la place.

Tristan Dumas
Tristan Dumas

Consultant senior IA & automatisation, JUWA

11 septembre 20264 min de lecture
Text-to-SQL : pourquoi ça casse en production, et ce qu'on met à la place

Résumer avec

Le text-to-SQL est une promesse séduisante : l'utilisateur écrit sa question, le modèle génère la requête SQL correspondante, la base l'exécute. Les démonstrations sont spectaculaires et les résultats publiés sur des jeux de test sont élevés.

En production, sur une base d'entreprise réelle, le taux de réussite chute. Cet article explique où passe la différence, et ce qu'on met en place à la place.

Pourquoi les scores de test ne se transposent pas

Les jeux d'évaluation publics reposent sur des schémas propres, documentés, aux noms explicites, avec peu de tables et aucune règle métier implicite. Une base de production n'a aucune de ces propriétés.

Elle contient des tables mortes que personne n'a supprimées, des colonnes dont le nom ne décrit plus le contenu, des champs libres utilisés pour stocker autre chose que ce qui était prévu, des doublons de référentiel, et des règles que personne n'a écrites.

Un modèle qui génère du SQL sur ce terrain ne produit pas des erreurs franches. Il produit des requêtes valides, qui s'exécutent sans broncher, et qui renvoient un chiffre faux. C'est le cœur du problème.

Les quatre modes d'échec les plus fréquents

La table plausible mais fausse

Deux tables portent des noms voisins, l'une est l'historique actif, l'autre une archive de migration jamais nettoyée. Le modèle choisit la seconde parce que son nom colle mieux à la question. La requête s'exécute, le total est cohérent, il est faux de quarante pour cent.

Le filtre manquant

La règle « on exclut toujours les commandes au statut annulé » est connue de tout le service commercial et écrite nulle part. Le modèle ne l'invente pas. Chaque total est donc légèrement surévalué, dans une proportion qui varie selon la période.

La jointure approximative

Relier une facture à un chantier suppose parfois de passer par une table de liaison, avec une condition sur la date de validité. Le modèle peut construire une jointure directe qui semble raisonnable et qui duplique les lignes. Le compte est trop élevé, sans qu'aucune erreur ne s'affiche.

La requête coûteuse

Une question mal cadrée peut produire un balayage complet sur plusieurs tables volumineuses. En développement, on attend. En production, on dégrade le service pour tout le monde.

Le vrai problème n'est pas le modèle

La tentation est de conclure que les modèles ne sont pas encore assez bons, et d'attendre la génération suivante. C'est une mauvaise lecture.

Aucun modèle, aussi capable soit-il, ne peut deviner une règle métier qui n'est écrite nulle part. Il ne peut pas savoir que la table archivée ne doit pas servir, ni que les montants négatifs sont des avoirs, ni que l'entité fermée en 2022 doit sortir du périmètre. Ces informations n'existent pas dans le schéma. Elles existent dans la tête de trois personnes.

Améliorer le modèle ne résout donc pas le problème. Écrire les règles quelque part le résout.

Ce qu'on met en place à la place

L'approche que nous retenons ne consiste pas à faire écrire du SQL libre sur un schéma brut, mais à exposer des vues métier via un serveur MCP. La différence est structurelle.

PointText-to-SQL sur schéma brutVues métier exposées via MCP
Ce que voit le modèleTout le schéma, tables mortes comprisesUn ensemble restreint de vues validées
Règles métierÀ deviner à chaque requêteÉcrites une fois dans la vue
VérifiabilitéIl faut relire du SQL généréIl faut relire une vue, une seule fois
Risque de requête lourdeÉlevé, aucune borneVolumétrie plafonnée par construction
DroitsCeux du compte de connexionVues attachées à des rôles
Effort principalPrompt et post-traitementCadrage métier en amont

Le déplacement essentiel tient dans la ligne « vérifiabilité ». Avec du SQL généré à la volée, chaque réponse est un objet nouveau qu'il faudrait relire. Avec des vues, la relecture se fait une fois, par quelqu'un qui connaît le métier, et elle vaut pour toutes les questions suivantes.

Là où le text-to-SQL garde du sens

Il serait malhonnête de le disqualifier entièrement. Deux contextes lui conviennent.

Un entrepôt de données déjà modélisé. Si vos données sont passées par un travail de modélisation propre, avec des tables de faits et de dimensions correctement nommées, une bonne partie des pièges disparaît. Le schéma porte alors lui-même une partie des règles.

Un usage entre mains expertes. Un analyste qui lit le SQL généré, le corrige et l'exécute gagne un temps réel. Le risque n'existe que lorsque la requête n'est relue par personne.

La ligne de partage n'est donc pas technologique. Elle tient à la question de savoir si quelqu'un vérifie, et si cette personne en a les moyens.

Comment tester chez vous, sans rien installer

Un exercice de quinze minutes suffit à mesurer votre exposition au problème. Prenez trois indicateurs dont vous connaissez déjà la valeur exacte, issus d'un état comptable ou d'un tableau de bord validé.

Demandez à la personne qui écrit habituellement les requêtes de vous expliquer, pour chacun, les filtres qu'elle applique et pourquoi. Notez-les.

Si cette liste comporte plus de deux règles qui n'apparaissent nulle part dans le nom des tables ou des colonnes, vous savez déjà que le SQL généré à la volée produira des chiffres faux chez vous. Cette liste est aussi, très exactement, le point de départ de la définition de vos vues.

En résumé

Le text-to-SQL n'échoue pas parce que les modèles raisonnent mal. Il échoue parce qu'une base de production porte des règles implicites qu'aucun modèle ne peut inventer, et parce que ses erreurs prennent la forme de requêtes valides aux résultats faux.

La réponse consiste à sortir ces règles des têtes pour les inscrire dans des vues, puis à n'exposer que ces vues. C'est la démarche décrite sur la page serveur MCP et interrogation des données en langage naturel, et c'est aussi ce qui explique que la part la plus longue d'un projet se joue avant la première ligne de code.

FAQ

Questions fréquentes

L'essentiel de cet article, repris en questions-réponses.

Non. Aucun modèle ne peut deviner une règle métier qui n'est écrite nulle part, comme l'exclusion des commandes annulées ou l'abandon d'une table archivée. Le problème est dans le schéma, pas dans le modèle.

Parce que la requête générée est syntaxiquement valide et s'exécute normalement. Elle renvoie un chiffre cohérent, simplement calculé sur le mauvais périmètre. Rien ne signale l'erreur.

Oui, dans deux cas : sur un entrepôt déjà modélisé proprement, et entre les mains d'un analyste qui relit et corrige le SQL avant de l'exécuter. Le risque apparaît quand personne ne vérifie.

Une vue inscrit les règles métier une fois pour toutes et se relit une fois. Une requête générée est un objet nouveau à chaque question, qu'il faudrait relire à chaque fois.

Partager

Heineken
BlaBlaCar
DataBird
HelloSafe

Un projet IA en tête ? Parlons-en