Aller au contenu
Écosystème

Sorties structurées (Structured Outputs)

La technique de guidage qui garantit à 100 % qu'un modèle de langage respecte une grammaire formelle, un schéma JSON ou une syntaxe de programmation.

6 min de lecture
  • #écosystème
  • #JSON
  • #API
  • #fiabilité

Les sorties structurées sont une méthode d’inférence contrainte qui force mathématiquement le modèle à respecter une syntaxe stricte (comme un format JSON ou un tableau de base de données), rendant les erreurs de format totalement impossibles.

Imagine que tu doives remplir un formulaire administratif papier très strict pour obtenir une carte d’identité.

Dans la première situation, le fonctionnaire te donne une feuille blanche vierge et te dit : « Écris ton nom, ton prénom et ta date de naissance au format Jour-Mois-Année en séparant par des tirets, et n’oublie rien ! ». Si tu es pressé, fatigué ou distrait, tu risques d’écrire la date en lettres, d’inverser le jour et le mois, ou d’ajouter une petite phrase de politesse inutile en bas de page. C’est l’approche naïve du prompt ordinaire : on espère que l’IA va bien se tenir, mais elle dérape de temps en temps.

Dans la seconde situation, le fonctionnaire te tend une tablette tactile munie de cases pré-formatées. Pour le jour, le clavier n’affiche que les chiffres de 0 à 31 ; pour le mois, uniquement de 01 à 12 ; et pour l’année, quatre chiffres obligatoires. Toutes les autres touches du clavier sont physiquement éteintes et verrouillées. Même si tu essayais d’appuyer sur la lettre « Z », rien ne s’écrirait. Tu ne peux physiquement pas rendre un formulaire mal rempli.

C’est exactement ainsi que fonctionnent les sorties structurées : elles éteignent à la volée tous les tokens du modèle qui violeraient la structure demandée.

Lorsqu’un développeur souhaite intégrer un grand modèle dans une application informatique (pour alimenter une base de données, déclencher un paiement bancaire ou envoyer un courriel automatique), le modèle ne doit pas parler comme un poète bavard. Il doit renvoyer une structure de données machine parfaite, le plus souvent un objet JSON (JavaScript Object Notation).

Pendant longtemps, les ingénieurs ajoutaient des supplications dans leur prompt : « Réponds uniquement en JSON valide, sans texte d’introduction, sans balises Markdown et sans excuses ». Pourtant, sur des millions de requêtes, le modèle finissait toujours par commettre une erreur fatale dans 1 % à 10 % des cas :

  • Une virgule oubliée entre deux éléments ;
  • Une accolade manquante à la fin de la réponse ;
  • Une clé orthographiée avec une coquille ;
  • Une formule de politesse en préambule (« Bien sûr, voici votre JSON : ») qui faisait planter instantanément le programme informatique destinataire.

Pour régler définitivement ce problème, des chercheurs (notamment Rémi Louf et Brandon Willard avec la bibliothèque open source Outlines en 2023) ont déplacé le contrôle du prompt vers le moteur d’échantillonnage lui-même.

À chaque étape où le modèle s’apprête à générer un nouveau mot, le mécanisme procède en trois temps :

  1. L’analyse de la grammaire (Automate fini) : Un parseur logique (qui connaît le schéma JSON attendu ou la grammaire formelle BNF) inspecte ce qui a déjà été écrit. Il calcule l’ensemble exact des tokens autorisés pour l’étape suivante. Par exemple, si le modèle vient d’écrire {"nom": ", le parseur sait que le prochain caractère doit obligatoirement être une chaîne de texte terminée par un guillemet fermant, et jamais un chiffre ou une accolade ouvrante.
  2. Le masquage mathématique : Dans le vecteur de logits du modèle (qui attribue un score à chacun des 32 000 ou 128 000 mots possibles du dictionnaire), tous les tokens interdits par la grammaire voient leur score arbitrairement fixé à moins l’infini ($-\infty$).
  3. L’échantillonnage Softmax : Lorsque la fonction Softmax transforme ces scores en pourcentages de probabilité, la probabilité d’un mot valant $-\infty$ devient mathématiquement égale à zéro absolu.

Le modèle conserve l’intégralité de son intelligence et de sa liberté pour choisir le mot le plus pertinent parmi les options valides, mais il lui est algorithmiquement impossible de violer la syntaxe.

Cette technique ne se limite pas au format JSON. Grâce aux grammaires formelles en forme de Backus-Naur (BNF), particulièrement popularisées dans l’écosystème open source par le format GBNF de llama.cpp, on peut contraindre le modèle à produire :

  • Des requêtes de base de données SQL garanties sans erreur de syntaxe ;
  • Des formules logiques ou des expressions régulières valides ;
  • Uniquement l’un des trois mots « Vrai », « Faux » ou « Incertain » pour une tâche de classification binaire stricte.

Comme les automates grammaticaux sont compilés et indexés sur les tokens du modèle avant même le lancement de la génération, le masquage ne ralentit pas le temps de calcul : le surcoût temporel est inférieur à un dixième de milliseconde par token.

Les sorties structurées sont devenues la norme industrielle pour toutes les applications professionnelles de l’IA :

  • L’appel d’outils et les agents autonomes : Pour qu’un agent déclenche une fonction logicielle (comme envoyer un SMS, réserver un billet de train ou lancer une recherche web), ses paramètres d’appel doivent être parfaitement typés. Les sorties structurées garantissent que l’agent ne passera jamais un texte là où le logiciel attend un nombre entier.
  • L’extraction d’informations massives : Pour transformer des milliers de factures PDF numérisées ou de contrats juridiques en tableaux Excel propres, les entreprises utilisent des schémas JSON stricts : chaque montant, chaque date d’échéance et chaque raison sociale est automatiquement rangée dans la bonne colonne sans intervention humaine.
  • Les interfaces utilisateurs dynamiques : Les applications web modernes demandent aux modèles de générer des arborescences de composants graphiques prêtes à être rendues à l’écran, sans aucun risque qu’une balise HTML cassée ne déforme la page.
  • « Forcer une structure stricte bride l’imagination du modèle et réduit la qualité de ses réponses. » C’est faux : la contrainte ne porte que sur le contenant syntaxique (les guillemets et les virgules), absolument pas sur le fond sémantique. Le modèle dispose de tout son espace latent pour exprimer des idées riches à l’intérieur des champs demandés.
  • « Il suffit de dire “Réponds en JSON” dans le prompt pour que le système soit fiable. » C’est une illusion de sécurité. Même le modèle le plus sophistiqué du monde finit tôt ou tard par générer un JSON corrompu si l’on ne verrouille pas l’inférence par masquage de logits.

Voir aussi