Aller au contenu

LexiqueÉtage 2 · Le Harnaisle bloc et ses plaques rapportées : ce qu’on lui ajouteÉtage 2 · Le Harnais

sortie structurée

Nº 043 · v2026-08EN : structured output

Une sortie structurée est une réponse contrainte à respecter une forme précise, pour qu’un autre logiciel puisse la lire directement. Comme un formulaire plutôt qu’une lettre libre : les cases sont imposées, ce qui ne dit rien de la justesse de ce qu’on y écrit.

Ce que ce n’est pas

Une sortie structurée ne garantit que la forme. Obtenir un résultat bien formé, avec tous les champs attendus et les bons types, ne dit rien de l’exactitude des valeurs : une date inventée reste une date valide, et un champ obligatoire pousse même le modèle à le remplir plutôt qu’à s’abstenir. Ce n’est pas davantage une garantie métier, puisque la forme accepte un montant négatif, un code inexistant ou un client qui n’a jamais existé. La structure rend une réponse lisible par une machine, elle ne la rend pas vraie.

En profondeur

Le besoin

Le besoin naît du raccordement. Tant qu’une réponse est lue par une personne, sa présentation importe peu ; dès qu’elle alimente un autre logiciel, la moindre variation casse la chaîne, et l’on ne bâtit pas une automatisation sur du texte libre. Contraindre la sortie consiste à décrire à l’avance la forme attendue, champs et types compris, puis à n’accepter qu’une réponse conforme. Selon les cas, la contrainte est simplement demandée dans les instructions ou réellement imposée pendant la production du texte, et les deux ne donnent pas les mêmes garanties : demander une forme, c’est espérer ; l’imposer, c’est rendre toute autre issue impossible.

Le même mécanisme, une autre destination

Le mécanisme est le même que celui d’un appel d’outils, à ceci près que la destination change : dans un cas la forme sert à réclamer une action, dans l’autre à livrer un résultat exploitable. Une contrainte de forme a aussi un coût rarement mesuré, puisque la description du format occupe le contexte et se relit à chaque requête. Sur les tâches qui demandent du raisonnement, exiger d’emblée une forme rigide dégrade parfois la qualité, le modèle n’ayant plus la place de dérouler son cheminement avant de conclure. La parade habituelle consiste à séparer les deux moments : laisser d’abord répondre, contraindre ensuite la mise en forme.

La forme n’est pas le fond

Le piège central est la confiance que la forme inspire. Une réponse bien rangée, avec ses champs et ses valeurs, se lit comme une donnée vérifiée alors qu’elle reste une production plausible, et cette apparence de rigueur traverse ensuite toute la chaîne sans que personne la remette en cause. La conséquence pratique est qu’une sortie structurée appelle une validation métier en aval, distincte du contrôle de forme : cohérence des valeurs entre elles, existence réelle des identifiants, plafonds, règles du domaine. Le second piège est l’absence de porte de sortie, car sans champ permettant de dire qu’il ne sait pas, un modèle contraint remplit toujours : mieux vaut prévoir l’incertitude que la découvrir plus tard dans les données.

Sous le capot3 temps · la forme réelle des objets

Une sortie structurée est un schéma plus une contrainte. Le schéma se lit ; la contrainte, elle, se joue à un endroit précis de la production du texte, et c’est cet endroit qui sépare une forme espérée d’une forme garantie.

  1. 01

    Le schéma, et ce qu’il promet

    Le schéma décrit la forme attendue, champ par champ. Il part avec la demande, ce qui en fait un coût par tour et non un réglage posé une fois : allonger un schéma se paie à chaque appel.

    json
    {
      "name": "verdict_facture",
      "schema": {
        "type": "object",
        "properties": {
          "montant_ht": { "type": "number" },
          "devise": { "type": "string", "enum": ["EUR", "USD", "CHF"] },
          "date_emission": { "type": "string", "format": "date" },
          "confiance": { "type": "string", "enum": ["sûr", "incertain", "illisible"] }
        },
        "required": ["montant_ht", "devise", "date_emission", "confiance"],
        "additionalProperties": false
      },
      "strict": true
    }
    
    enum
    Une liste fermée. C’est la contrainte la plus utile du lot : elle rend une valeur hors liste impossible, là où une consigne en langue courante la rendrait seulement improbable.
    confiance
    La porte de sortie, et le champ que l’on oublie toujours. L’incertitude se prévoit dans le schéma, sans quoi elle ressortira déguisée en valeur, et on la découvrira bien plus tard dans les données.
    strict
    Le drapeau qui fait basculer d’une forme demandée à une forme imposée. Tout se joue là, et le temps suivant montre pourquoi.

    Le piègeC’est le coût rarement mesuré dont parle la couche 2, et il se voit ici : la contrainte s’applique dès le premier fragment produit. D’où le troisième temps, qui sépare les deux moments.

  2. 02

    Espérer, ou imposer

    Voici la différence, à l’endroit exact où elle se produit. Le modèle propose à chaque pas une distribution sur les tokens possibles ; contraindre consiste à annuler, avant le tirage, ceux qui mèneraient hors du schéma. Ce n’est donc pas une vérification après coup : c’est une amputation des issues.

    js
    // A · la forme DEMANDÉE : on prie, puis on vérifie, puis on recommence
    let brut = await modele.repondre({ messages: [...msgs, consigne('Réponds en JSON.')] });
    let objet = essayerDeLire(brut);          // peut échouer : texte avant, virgule finale...
    if (!objet) brut = await modele.repondre({ messages: [...msgs, reproche(brut)] });
    
    // B · la forme IMPOSÉE : à chaque pas, les tokens hors schéma sont écartés
    function prochainToken(scores, etatSchema) {
      const permis = automate.tokensAcceptables(etatSchema);   // dérivé du schéma
      for (const t of Object.keys(scores)) {
        if (!permis.has(t)) scores[t] = -Infinity;             // <- l'issue disparaît
      }
      return tirer(scores);
    }
    
    essayerDeLire
    Tout le code défensif que la contrainte réelle rend inutile : préambule à retirer, bloc de code à déballer, virgule en trop, guillemets fantaisistes.
    -Infinity
    Le token devient impossible, pas improbable. C’est la seule garantie de forme qui existe, et elle ne s’obtient pas en le demandant mieux.

    Le piègeC’est la même mécanique que l’appel d’outils, à la destination près, comme le dit la couche 2. Un fournisseur qui accepte un schéma pour ses outils mais pas pour ses réponses n’a donc pas une limite technique, il a une limite de surface exposée.

  3. 03

    Ce que la forme ne dit pas

    Une réponse conforme reste une production plausible. C’est le piège central de la fiche, et il est ici sous sa forme la plus concrète : le contrôle de forme est passé, et rien n’a encore été vérifié.

    js
    const r = { montant_ht: 1240.00, devise: 'EUR',
                 date_emission: '2027-13-45', confiance: 'sûr' };
    
    valider(r, schema).ok;   // true  <- la FORME est irréprochable
    
    // ce qu'il reste à faire, et que personne ne fait à la place du métier
    const controles = [
      () => estUneVraieDate(r.date_emission),        // faux : mois 13, jour 45
      () => r.montant_ht > 0 && r.montant_ht < 1e6,  // plafond du domaine
      () => existeEnBase(r.numero_fournisseur),      // l'identifiant existe-t-il ?
      () => r.confiance !== 'sûr' || sourceLisible(), // la confiance est déclarée,
    ];                                                // donc elle ne prouve rien
    
    if (!controles.every((c) => c())) rejeter(r);
    

    Le piègeLa quatrième ligne est la plus traître : un champ de confiance est rempli par le même mécanisme que le reste, donc « sûr » n’est pas une mesure, c’est une prédiction de plus. Il sert à recueillir un doute quand il y en a un, jamais à s’en passer.

Montré ailleurs
  • appel d’outilsle même mécanisme de forme imposée, tourné vers l’action au lieu du résultat
  • contextelà où le schéma s’ajoute, et se relit, à chaque requête

Ce qui varieLes noms de champs varient : le schéma se déclare tantôt sous « response_format », tantôt sous un nom d’outil, et le drapeau de contrainte réelle change de nom d’un fournisseur à l’autre. Ce qui ne varie pas : la contrainte, quand elle est réelle, s’applique pendant la production du texte et non après, et aucun schéma, si strict soit il, ne porte le moindre jugement sur la véracité des valeurs qu’il encadre.

Relations où vivent les voisins

Vérifier 3 questions · cliquez votre réponse

Niveau 1 · Reconnaître

Un système renvoie toujours un résultat comportant les champs « nom », « date » et « montant ». Que vous garantit cette régularité ?

Niveau 2 · Distinguer

Un champ obligatoire « numéro de facture » est rempli alors que le document n’en portait aucun. Pourquoi ?

Niveau 2 · Distinguer

Quelle différence entre une sortie structurée et un appel d’outils ?

À essayer 1 pratique

Des manipulations concrètes où ce terme se rencontre, en dix minutes.

Qui manipule ça 1 métier

Les postes dont ce terme fait partie du travail ordinaire.

Nº 043 · v2026-08 · première rédaction en · responsabilité éditoriale Anthony Capirchio

Lexigraph, « Sortie structurée », v2026-08, https://www.lexigraph.org/fr/sortie-structuree/, CC BY 4.0.

Signaler

Ce qui part avec votre message

Fiche · Sortie structurée
Nº 043 · v2026-08 · /fr/sortie-structuree

De quoi s’agit-il
0 / 600

Elle ne sert qu’à vous répondre, et à rien d’autre. Ce qui est enregistré