Imposer des formats de sortie de façon fiable
De la simple demande dans le prompt jusqu'au véritable schéma JSON de l'API – trois niveaux pour imposer un format de sortie fixe.
Le niveau le plus simple : le prompt
Le classique est une consigne de format claire dans le prompt : « Réponds exclusivement en JSON avec les champs nom, âge, ville » plus un exemple de sortie. Cela fonctionne souvent bien, mais ce n'est pas garanti – le modèle peut malgré tout ajouter une phrase avant, ou oublier un champ.
Le niveau plus fiable : les fonctionnalités de l'API
Les API de LLM modernes proposent leurs propres mécanismes qui imposent techniquement un format au lieu de simplement le recommander. Claude propose pour cela les Structured Outputs avec validation par schéma JSON ; OpenAI nomme sa fonctionnalité également Structured Outputs. Les deux garantissent que la réponse correspond exactement au schéma fourni – plus besoin de corriger après coup du JSON cassé.
Distinction importante
Les consignes de prompt sont un pattern – une habitude qui fonctionne la plupart du temps, mais sans garantie. Les fonctionnalités d'API comme les Structured Outputs sont en revanche une garantie technique de l'interface elle-même. Pour un formatage non critique, le prompt suffit souvent ; pour du code qui retraite le résultat, la fonctionnalité API vaut la peine.
La validation comme troisième filet de sécurité
Même avec des formats garantis, la validation reste utile : vérifie la réponse par rapport à ton schéma et prévois une boucle de nouvelle tentative en cas d'erreur. Cela couvre les cas qui dépassent la simple question de format – par exemple du JSON valide mais avec des valeurs absurdes sur le fond.
EXEMPLE
Niveau prompt (pas de garantie) : « Réponds UNIQUEMENT avec du JSON valide au format {\"stadt\": string, \"land\": string}, sans texte supplémentaire. » Niveau API (garanti, pseudocode) : output_config={\"format\": {\"type\": \"json_schema\", \"schema\": {\"type\": \"object\", \"properties\": {\"stadt\": {\"type\": \"string\"}, \"land\": {\"type\": \"string\"}}, \"required\": [\"stadt\", \"land\"]}}} – chaque réponse correspond garantie à ce schéma.
🛠️ EXERCICE — À TOI DE JOUER
Impose un format JSON fixe, une fois uniquement via le prompt et une fois via un paramètre de schéma, et compare la fiabilité.
- Demande au modèle, via une consigne de prompt, une réponse JSON avec des champs fixes pour 5 requêtes de test.
- Vérifie si les 5 réponses sont bien du JSON valide et complet, sans texte supplémentaire.
- Répète les mêmes requêtes avec un véritable schéma JSON via une fonctionnalité Structured Outputs de ton choix.
- Compare le taux d'erreur des deux approches.
✅ AUTO-VÉRIFICATION
- ☐ Y a-t-il eu, dans la variante purement prompt, au moins une réponse avec du texte supplémentaire ou un champ manquant ?
- ☐ La variante par schéma était-elle réellement conforme à 100 % dans les 5 cas ?
QUIZ RAPIDE
Quelle est la différence centrale entre une consigne de format dans le prompt et une fonctionnalité d'API comme les Structured Outputs ?
SOURCES
- Documentation Claude : Structured Outputs ↗ platform.claude.com
- Documentation OpenAI : Structured Outputs ↗ developers.openai.com