Aller au contenu principal
Leçon 8 sur 66 · Claude sur Google Cloud (Vertex AI / Agent Platform)

Contrôler la sortie du modèle

Leçon 8 sur 66 Mis à jour le 5 novembre 2026 Développeur
Sur cette page
  1. Ce qui a changé : la fin du pré-remplissage
  2. Supprimer les préambules : la consigne directe
  3. Imposer un format : les sorties structurées
  4. Couper la réponse : les séquences d’arrêt
  5. Reprendre une réponse interrompue
  6. Si vous maintenez du code ancien
  7. À vous de jouer
  8. Points clés à retenir

Claude génère du texte librement par défaut. Dans une application, vous voulez pourtant souvent qu’une réponse commence directement par le contenu utile, respecte un format exploitable par votre code, ou s’arrête à un endroit précis. Les outils pour y parvenir ont changé en 2026 : la technique la plus enseignée jusqu’ici, le pré-remplissage de la réponse, n’est plus acceptée par les modèles actuels. Cette leçon présente ce qui fonctionne aujourd’hui, puis l’ancienne technique, que vous croiserez encore dans du code existant.

Ce qui a changé : la fin du pré-remplissage

Ce que faisait le préremplissage, et ce qui le remplace Deux colonnes : les usages du préremplissage (couper un préambule, forcer un format, reprendre une réponse) et leurs remplaçants (consigne directe, sorties structurées, reprise dans le message user) ; erreur 400 depuis Claude 4.6. CONTRÔLER LA SORTIE Ce que faisait le préremplissage, et ce qui le remplace Préremplissage Couper un préambule Commencer la réponse à la place de Claude. Forcer un format Ouvrir un bloc de code JSON ou une accolade. Reprendre Repasser le début d'une réponse coupée. → Aujourd'hui Consigne directe « Réponds sans introduction », dans le système. Sorties structurées Un schéma dans output_config.format. Reprise Citer la fin obtenue dans le message user. Un dernier message assistant partiel renvoie 400 depuis Claude 4.6 ; les séquences d'arrêt, elles, n'ont pas changé.
D'après la leçon « Controlling model output » (Claude Academy, Claude on Google Cloud), la page Errors et la page Structured outputs (documentation Claude).

Le pré-remplissage consistait à envoyer, en dernier message, le début de la réponse de l’assistant — par exemple { pour obtenir du JSON — afin que Claude le complète. Depuis la génération Claude 4.6, Anthropic ne l’accepte plus : une requête dont le dernier message est un message assistant partiel renvoie une erreur 400. Cela concerne tous les modèles actuels, de Claude Haiku 5.5 à Claude Fable 5.1. Les modèles antérieurs encore disponibles, comme Claude Haiku 4.5, le tolèrent toujours, et placer des messages assistant ailleurs dans l’historique reste parfaitement normal.

La raison avancée par Anthropic est simple : les modèles suivent désormais assez bien les consignes pour que la plupart des usages du pré-remplissage soient inutiles. Chacun de ces usages a donc un remplaçant documenté, que voici dans l’ordre où vous en aurez besoin.

Supprimer les préambules : la consigne directe

Le premier réflexe consiste à demander explicitement ce que vous voulez, de préférence dans le prompt système. Une consigne comme « Réponds directement, sans phrase d’introduction du type “Voici…” ou “D’après…” » suffit dans la grande majorité des cas. Si un préambule passe malgré tout de temps en temps, retirez-le côté code plutôt que de compliquer le prompt.

from anthropic import AnthropicVertex

client = AnthropicVertex(project_id="votre-projet", region="global")

SYSTEME = (
    "Réponds directement, sans phrase d'introduction ni de conclusion. "
    "Ne commence jamais par « Voici » ou « Bien sûr »."
)

response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    system=SYSTEME,
    messages=[{"role": "user", "content": "Résume en deux phrases le rôle d'une API."}],
)
print(next(b.text for b in response.content if b.type == "text"))

Une variante utile consiste à demander la réponse entre balises XML, par exemple <resume>…</resume> : votre code récupère alors ce qui se trouve entre les balises et ignore le reste.

Imposer un format : les sorties structurées

Quand votre code doit exploiter la réponse, ne comptez plus sur un caractère de départ pour obtenir du JSON. Les sorties structurées imposent un schéma JSON à la réponse : vous décrivez la forme attendue dans output_config.format, et Claude produit un objet conforme. C’est désormais l’outil prévu pour ce besoin.

response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    messages=[{
        "role": "user",
        "content": "Extrais le nom, l'e-mail et l'offre qui intéresse ce prospect : "
                   "« Julie Martin ([email protected]) souhaite une démo de l'offre Entreprise. »",
    }],
    output_config={
        "format": {
            "type": "json_schema",
            "schema": {
                "type": "object",
                "properties": {
                    "nom": {"type": "string"},
                    "email": {"type": "string"},
                    "offre": {"type": "string"},
                },
                "required": ["nom", "email", "offre"],
                "additionalProperties": False,
            },
        }
    },
)
print(next(b.text for b in response.content if b.type == "text"))  # un JSON conforme au schéma

Le SDK Python propose aussi client.messages.parse(), qui prend un modèle Pydantic en paramètre output_format, valide la réponse et vous la rend sous forme d’objet. La leçon suivante, consacrée aux données structurées, déroule ces deux approches. Pour une classification, Anthropic recommande la même logique : un schéma dont le champ de sortie n’accepte que vos étiquettes, ou un outil dont un paramètre est une énumération.

Couper la réponse : les séquences d’arrêt

Les séquences d’arrêt n’ont pas changé. Vous fournissez une ou plusieurs chaînes dans stop_sequences ; dès que Claude en génère une, la production s’arrête, et la séquence elle-même n’apparaît pas dans le texte retourné. Le champ stop_reason de la réponse vaut alors stop_sequence, ce qui vous permet de distinguer un arrêt voulu d’une réponse tronquée par max_tokens.

response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    stop_sequences=["6"],
    messages=[{"role": "user", "content": "Compte de 1 à 10, un nombre par ligne."}],
)
print(next(b.text for b in response.content if b.type == "text"))   # "1\n2\n3\n4\n5\n"
print(response.stop_reason)       # "stop_sequence"

Une séquence d’arrêt est un couperet : elle tranche même au milieu d’une phrase. Elle sert surtout à borner une sortie quand vous connaissez le marqueur de fin, par exemple une balise fermante que vous avez demandée dans la consigne.

Reprendre une réponse interrompue

Le pré-remplissage servait aussi à faire continuer une réponse coupée. La méthode documentée consiste maintenant à placer la reprise dans le message utilisateur, en citant la fin du texte déjà obtenu : « Ta réponse précédente s’est interrompue sur “…”. Reprends exactement à cet endroit. » Si l’interruption vient d’une erreur et que l’utilisateur n’en souffre pas, relancer simplement la requête est souvent le plus simple.

Si vous maintenez du code ancien

Vous reconnaîtrez le motif suivant dans des projets écrits avant 2026 : la liste des messages se termine par un message assistant partiel. Sur un modèle actuel, il provoque l’erreur 400 évoquée plus haut.

# Ancien motif : refusé par les modèles Claude 4.6 et suivants
messages = [
    {"role": "user", "content": "Génère une liste HTML de trois couleurs."},
    {"role": "assistant", "content": "<ul>"},   # pré-remplissage
]

Pour migrer, remplacez le pré-remplissage par une consigne (« Réponds uniquement par une liste HTML <ul> ») et, si le format doit être garanti, par une sortie structurée. Conservez éventuellement la séquence d’arrêt </ul> si elle vous évite un post-traitement.

À vous de jouer

Supprimer un préambule. Demandez « Résume en deux phrases le rôle d’une API » sans consigne, puis avec la consigne système de cette leçon. Comptez les mots d’introduction dans chaque cas.

Voir l’erreur du préremplissage. Envoyez l’ancien motif <ul> à Sonnet 5.5 et lisez l’erreur 400 ; remplacez-le par une consigne et la séquence d’arrêt </ul>, et vérifiez stop_reason.

Sources officielles : Controlling model output (Claude Academy, qui enseigne encore le préremplissage avec Haiku 4.5) · Errors : prefill not supported et Structured outputs (documentation Claude)

Points clés à retenir

  • Le pré-remplissage de la réponse renvoie une erreur 400 depuis la génération Claude 4.6 ; il ne survit que sur des modèles plus anciens
  • Les préambules se suppriment par une consigne directe, idéalement dans le prompt système
  • Le format se garantit avec les sorties structurées (output_config.format), la classification avec un schéma ou une énumération
  • Les séquences d’arrêt fonctionnent comme avant et se repèrent grâce à stop_reason