Aller au contenu principal

Données structurées

Mis à jour le 30 juillet 2026

Quand vous avez besoin que Claude génère des données structurées — JSON, code Python, listes —, un problème revient systématiquement : Claude ajoute spontanément du texte explicatif, des en-têtes ou du formatage Markdown autour du contenu. Charmant en conversation, rédhibitoire dès qu’un programme consomme la sortie : ces ajouts compliquent, voire cassent, l’utilisation programmatique.

Donnons un visage au problème : imaginez une application web qui génère des règles AWS EventBridge. L’utilisateur entre une description, clique sur « générer » et attend un JSON propre qu’il peut copier directement dans sa console AWS. Si Claude renvoie le JSON enveloppé dans un bloc de code Markdown avec du texte explicatif, l’utilisateur ne peut pas simplement copier l’ensemble — et un parseur automatique échouerait tout net.

Le problème des réponses par défaut

Par défaut, Claude tend à formater les sorties structurées ainsi :

# Regle EventBridge
{json}
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {"state": ["running"]}
}
{/json}
Cette regle capture les changements d'etat des instances EC2.

Un titre, un bloc de code, une phrase de conclusion : c’est excellent pour de la documentation, mais problématique pour un usage programmatique — la donnée utile est noyée dans son emballage.

La solution : pré-remplissage + séquences d’arrêt

Les deux techniques de la leçon précédente, combinées, ferment chacune une extrémité de la réponse :

messages = []
add_user_message(messages, "Générez une règle EventBridge courte en JSON")
add_assistant_message(messages, "```json")

text = chat(messages, stop_sequences=["```"])

Cette technique fonctionne ainsi :

  1. Le pré-remplissage avec le délimiteur d’ouverture fait croire à Claude qu’il a déjà commencé le bloc de code
  2. Claude génère directement le contenu JSON
  3. Quand Claude tente de fermer le bloc Markdown, la séquence d’arrêt interrompt la génération
  4. Vous récupérez uniquement le contenu JSON

Le pré-remplissage neutralise le préambule — impossible d’écrire « Voici la règle : » quand, du point de vue du modèle, le bloc de code est déjà ouvert. La séquence d’arrêt neutralise la conclusion — la génération meurt à l’instant exact où le bloc se referme. Entre les deux, il ne reste que la donnée.

Traitement du résultat

Le texte retourné peut contenir des caractères de saut de ligne en bordure. Nettoyez-le facilement :

import json

# Valider et formater en tant que JSON
parsed_data = json.loads(text.strip())

# Ou simplement nettoyer les espaces
clean_text = text.strip()

Le passage par json.loads fait mieux que nettoyer : il valide. Si le modèle a produit un JSON bancal, l’exception éclate ici, immédiatement et au bon endroit — pas trois couches plus loin dans votre application, sur une donnée corrompue qu’on croyait sûre.

Au-delà du JSON

Cette technique s’applique à tout type de données structurées : snippets de code Python (pré-remplir ```python), listes à puces, données CSV, fichiers de configuration — tout format où une sortie propre et copiable est nécessaire.

Le principe, généralisable à volonté : identifiez les délimiteurs que Claude utiliserait naturellement autour de votre type de contenu, pré-remplissez le délimiteur d’ouverture et arrêtez-vous au délimiteur de fermeture. Le format cesse d’être une consigne qu’on espère respectée — c’est un rail posé des deux côtés de la génération.

Points clés à retenir

  • Par défaut, Claude emballe les données structurées de texte et de Markdown — fatal pour un parseur
  • Pré-remplir ```json supprime le préambule ; stop_sequences=["```"] coupe avant la conclusion
  • Le résultat est le contenu nu du bloc, prêt à l’emploi
  • json.loads(text.strip()) nettoie et valide — les malformations éclatent tôt et au bon endroit
  • Le principe se transpose à tout format : ouvrir le délimiteur pour le modèle, s’arrêter au délimiteur de fermeture