Parlons de votre projet
Aller au contenu
Toutes les publications

Sorties structurées : le format garanti supprime une étape fragile

Par Docteur en intelligence artificielle · Conseil, conception de systèmes et formation

ArchitectureFiabilitéIntégrationProduction6 août 202410 min

Analyser du texte pour en extraire un objet est la source d'erreur la plus banale d'une chaîne automatisée. Le format garanti la supprime entièrement.

Illustration de l’article « Sorties structurées : le format garanti supprime une étape fragile »

Qu’est-ce qu’une sortie structurée garantie ?

Une sortie structurée garantie est une réponse de modèle de langage contrainte à respecter un schéma fourni à l’avance, avec les champs, les types et les valeurs autorisées qu’il définit. Le modèle ne peut pas produire autre chose qu’un objet conforme.

La différence avec une simple consigne est de nature, pas de degré. Écrire dans le prompt « réponds en JSON avec les champs date et montant » augmente la probabilité d’obtenir le bon format. La garantie, elle, agit au moment de la génération : à chaque jeton, seuls les jetons compatibles avec le schéma restent possibles. Une accolade oubliée ou une phrase d’introduction deviennent impossibles, pas seulement improbables.

Le schéma s’écrit le plus souvent en JSON Schema : un objet, des propriétés nommées, un type pour chacune, une liste de champs obligatoires, éventuellement des énumérations. C’est un contrat lisible par un développeur, par un analyste métier et par le système qui consommera la sortie.

Quel problème les sorties structurées résolvent-elles ?

Un modèle qui produit du texte libre oblige à analyser ce texte pour en extraire des données, et cette analyse échoue régulièrement de façon imprévisible, ce que la garantie de format supprime. C’est une étape entière qui disparaît de la chaîne.

Le symptôme est connu de toute équipe ayant branché un modèle sur une chaîne automatisée. Le modèle produit un objet correct dans la grande majorité des cas, puis ajoute une phrase d’introduction, oublie une accolade, ou entoure sa réponse de balises de code. Chaque variante casse l’analyse.

La réponse habituelle consistait à empiler des rustines : nettoyer le texte, tenter plusieurs analyses, redemander au modèle en cas d’échec. Ce dispositif fonctionne, coûte des appels supplémentaires, et reste une source d’incidents. C’est l’un des cinq verrous qui empêchent de sortir du prototype : une chaîne qui casse sur une variante de forme n’est pas exploitable sans surveillance humaine.

Chaîne de traitement avant et après la garantie de format
Le format garanti retire une étape qui était la principale source d'incidents.

Que garantit une sortie structurée, et que ne garantit-elle pas ?

Une sortie structurée garantit la forme de la réponse, c’est-à-dire les champs et leurs types, mais elle ne garantit jamais que le contenu de ces champs soit juste. C’est la distinction essentielle, et elle est fréquemment mal comprise.

Un modèle contraint produira toujours un objet valide, avec les champs demandés et les types demandés. Il ne garantit en rien que la date extraite soit la bonne date, ni que la catégorie choisie soit la bonne catégorie.

La conséquence est qu’on supprime une classe d’erreurs, les erreurs de forme, sans toucher à l’autre : les erreurs de fond. Le jeu de tests reste donc entièrement nécessaire, et il devient même plus lisible : puisque la sortie est structurée, la comparaison avec la réponse attendue devient automatisable champ par champ.

C’est un gain secondaire important. Une chaîne à sortie structurée est beaucoup plus facile à évaluer, ce qui rend praticable le dispositif décrit dans l’évaluation continue.

Consigne, mode JSON ou format garanti : quelle différence ?

Trois niveaux de contrainte coexistent pour obtenir des données structurées d’un modèle : la consigne dans le prompt, le mode JSON et le format garanti par schéma. Seul le dernier dispense d’une couche de réparation.

Le mode JSON, proposé par plusieurs fournisseurs avant la garantie de schéma, assure une syntaxe valide mais pas la présence des bons champs : on obtient du JSON correct, pas forcément l’objet attendu.

CritèreConsigne dans le promptMode JSONFormat garanti par schéma
Syntaxe toujours valideNonOuiOui
Champs et types conformes au schémaNonNonOui
Valeurs justesNonNonNon
Couche de réparation nécessaireOui, complèteOui, partielleNon, sauf contrôles métier
Évaluation champ par champFragilePossibleDirecte

La ligne « valeurs justes » est la même dans les trois colonnes. C’est elle qui justifie de garder un jeu de tests, quel que soit le niveau de contrainte retenu.

Comment concevoir un schéma de sortie qui tienne

  • Prévoir explicitement l’incertitude. Un champ « confiance » ou une valeur « indéterminé » évite que le modèle invente pour remplir. Voir le refus de répondre est une fonctionnalité.
  • Fermer les listes de valeurs. Une catégorie choisie parmi six valeurs possibles est vérifiable ; une catégorie en texte libre ne l’est pas.
  • Demander la source. Un champ indiquant le passage d’où vient l’information rend chaque sortie vérifiable sans relecture complète.
  • Rester plat. Un schéma profondément imbriqué augmente les erreurs de contenu sans rien apporter à l’exploitation.

Comment migrer une chaîne existante vers un format garanti ?

Migrer une chaîne existante vers un format garanti se fait en cinq étapes, de l’écriture du schéma jusqu’au retrait explicite du code de réparation devenu inutile. L’ordre compte : on ne retire rien avant d’avoir mesuré.

  1. Écrire le schéma à partir de l’usage. Partir de ce que le système aval consomme réellement, champ par champ, et non de ce que le modèle sait produire.
  2. Fermer et prévoir le doute. Remplacer chaque texte libre qui peut l’être par une énumération, et ajouter une valeur « indéterminé » partout où l’information peut manquer.
  3. Rejouer le jeu de tests. Comparer l’ancienne chaîne et la nouvelle sur les mêmes cas, champ par champ. Le taux d’erreurs de forme doit tomber ; le taux d’erreurs de fond ne doit pas monter.
  4. Inventorier la couche de fiabilisation. Lister chaque nettoyage, chaque reprise, chaque nouvelle tentative, avec l’incident qui l’a motivée quand on le retrouve.
  5. Retirer, puis surveiller. Supprimer ce qui ne sert plus et garder uniquement les contrôles métier, par exemple une date d’échéance antérieure à la date de signature.

La troisième étape est la plus souvent sautée. Elle est pourtant la seule qui permette d’affirmer que la migration n’a rien dégradé.

Pourquoi un schéma de sortie trop ambitieux coûte-t-il cher ?

Demander vingt champs en un seul appel dégrade la qualité de chacun, alors que deux appels de dix champs coûtent à peine plus cher et produisent de meilleurs résultats. C’est le réglage que les équipes découvrent après coup.

Le mécanisme tient à l’attention du modèle : plus la sortie demandée est vaste, moins chaque champ reçoit de soin. Un schéma qui demande simultanément une classification, une extraction de dates, un résumé et une évaluation de risque produit les quatre médiocrement.

La règle empirique que j’applique : un appel, une intention. Extraire les données factuelles d’un côté, porter un jugement de l’autre. Cela double le nombre d’appels et améliore sensiblement les deux résultats.

Ce découpage a un second bénéfice : il permet d’envoyer chaque intention au palier de modèle qui lui convient. L’extraction part sur un petit modèle, le jugement sur un grand, ce qui compense largement le coût du second appel. C’est le raisonnement de Claude 3 : choisir le palier, que la baisse de prix des petits modèles rend encore plus rentable, comme le montre GPT-4o mini et les usages qui basculent.

Le test qui révèle un schéma trop chargé

Retirer la moitié des champs et comparer la qualité des champs restants. Si elle s’améliore nettement, le schéma demandait trop en un seul appel, et le découper coûtera moins que les erreurs qu’il produisait.

Qu’est-ce que le format garanti change pour l’intégration aux systèmes existants ?

Une sortie garantie rend un modèle branchable sur un système d’information sans couche de traduction, ce qui déplace le travail d’intégration de la rustine technique vers la spécification métier. C’est le changement structurel de fond.

Jusqu’ici, brancher un modèle sur un progiciel supposait une couche intermédiaire chargée de fiabiliser la sortie : nettoyage, validation, reprise sur erreur. Cette couche représentait souvent une part importante du code.

Elle disparaît en grande partie. Ce qui reste est le travail utile : décider quels champs sont nécessaires, quelles valeurs sont admissibles, que faire en cas de doute. Autrement dit, un travail de spécification métier plutôt qu’un travail de rustine technique.

C’est une bonne nouvelle pour la maintenabilité : une spécification se relit et se modifie, contrairement à une accumulation de correctifs dont personne ne se rappelle la raison.

La même logique vaut quand le modèle déclenche des actions. Un appel d’outil dont les arguments sont garantis conformes n’échoue plus sur une faute de syntaxe ; il peut encore échouer sur un mauvais choix, ce qui ramène à la question du périmètre à fixer avant l’autonomie d’un agent.

Quel code peut-on supprimer après le passage au format garanti ?

Le format garanti rend largement inutile la couche de fiabilisation de sortie, ce code de nettoyage et de reprise accumulé autour du modèle, qui pèse souvent lourd dans une chaîne existante. C’est un gain de maintenabilité rare.

Sur les systèmes que j’ai repris, cette couche représentait entre un cinquième et un tiers du code. C’est une observation sur un nombre limité de projets, pas une mesure générale : la proportion dépend de l’ancienneté de la chaîne et du nombre d’incidents qu’elle a traversés.

Ce code a une caractéristique commune : il s’est accumulé par incidents. Une exception un jour, un correctif ; une variante de format le mois suivant, un autre correctif. Au bout d’un an, personne ne sait plus quelles branches sont encore nécessaires, et personne n’ose les retirer.

La migration vers un format garanti offre l’occasion de nettoyer, à condition de le faire explicitement. Sans cette décision, la couche reste en place « au cas où » et continue d’être maintenue sans raison. Voir la dette technique d’un système d’IA.

Quelles erreurs éviter avec les sorties structurées ?

Les erreurs les plus fréquentes avec les sorties structurées viennent d’une confiance excessive dans le format, qui pousse à oublier que le contenu reste faillible. Elles se repèrent toutes avant la mise en production.

  • Rendre tous les champs obligatoires sans issue. Un champ obligatoire sans valeur « indéterminé » oblige le modèle à inventer quand l’information manque.
  • Laisser des textes libres là où une liste suffit. Chaque champ libre est un champ qu’on ne peut pas vérifier automatiquement.
  • Supprimer les tests avec la couche de réparation. Les tests de forme deviennent inutiles ; les tests de fond restent indispensables.
  • Changer le schéma sans versionner. Le schéma est un contrat avec le système aval ; il se versionne et se documente comme le prompt système qui doit tenir six mois.
  • Oublier les changements de modèle. Un modèle mis à jour respecte toujours le format, mais peut remplir les champs différemment ; seul le jeu de tests le détecte, comme le montre le jour où le modèle a changé sans prévenir.

Questions fréquentes

Le format garanti supprime-t-il le besoin de tests ?

Non. Le format est garanti, le contenu ne l’est pas : le modèle produira toujours un objet valide, mais rien n’assure que la date extraite soit la bonne. Le jeu de tests reste entièrement nécessaire, et il devient plus simple à exploiter.

Combien de champs demander en un appel ?

Le moins possible, et une seule intention à la fois. Un schéma qui demande simultanément une extraction, un résumé et un jugement produit les trois médiocrement ; deux appels séparés valent mieux.

Comment gérer les cas où le modèle ne sait pas ?

En prévoyant explicitement la valeur « indéterminé » ou un champ de confiance dans le schéma. Sans cette issue, le modèle inventera pour remplir le champ obligatoire. Les cas indéterminés peuvent alors être routés vers une relecture humaine.

Quelle différence entre le mode JSON et une sortie structurée ?

Le mode JSON garantit une syntaxe valide, pas la présence des champs attendus ni leurs types. La sortie structurée impose le respect d’un schéma précis. Seule la seconde permet de retirer la couche de validation de forme.

Faut-il garder le code de réparation existant ?

Non, mais il faut le retirer explicitement, après avoir rejoué le jeu de tests sur la nouvelle chaîne. Seuls les contrôles de cohérence métier doivent rester. Sans décision de retrait, ce code continue d’être maintenu sans raison.

Sources

Votre prochain projetParlons-en.Réserver un échange de 15 minutes sur Cal.com, dans un nouvel onglet