Aller au contenu principal

Exercice : données structurées

Mis à jour le 30 juillet 2026

Objectif

Créer une fonction generate_json(description) qui utilise la technique prefill + stop sequence pour obtenir du JSON propre et parseable directement depuis Claude.

Cahier des charges

  1. La fonction reçoit une description en texte libre de la structure JSON souhaitée
  2. Elle retourne un objet Python (dict ou list), pas une chaîne de caractères
  3. Elle utilise la technique de prefill (\“json\n) et de **stop sequence** (````)
  4. Le JSON retourné doit être valide et parseable par json.loads()

Cas de test

Votre fonction doit fonctionner avec ces trois descriptions :

  1. "un utilisateur avec nom, email et age"
  2. "une liste de 3 produits avec nom et prix"
  3. "une config nginx avec server_name et location"

Instructions

Étape 1 : Écrire la fonction

Créez la fonction generate_json() en utilisant le SDK Anthropic :

import anthropic
import json

client = anthropic.Anthropic()

def generate_json(description):
    """
    Génère du JSON structure a partir d'une description textuelle.
    Retourne un objet Python (dict ou list), pas une chaine.
    """
    # A vous de jouer !
    pass

Étape 2 : Tester avec les trois cas

Écrivez un script de test qui :

  • Appelle generate_json() pour chaque description
  • Vérifie que le résultat est bien un dict ou une list
  • Affiche le JSON formate avec json.dumps(result, indent=2, ensure_ascii=False)

Étape 3 : Gérer les erreurs

Que se passe-t-il si Claude génère du JSON invalide ? Ajoutez une gestion d’erreur avec try/except.


Solution

Fonction principale

import anthropic
import json

client = anthropic.Anthropic()

def generate_json(description):
    """
    Génère du JSON structure a partir d'une description textuelle.
    Utilise le prefill + stop sequence pour obtenir du JSON propre.
    """
    response = client.messages.create(
        model="claude-sonnet-5",
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": f"Génère un objet JSON valide correspondant a : {description}"
            },
            {
                "role": "assistant",
                "content": "```json\n"
            }
        ],
        stop_sequences=["```"]
    )

    texte_brut = response.content[0].text.strip()

    try:
        return json.loads(texte_brut)
    except json.JSONDecodeError as e:
        print(f"Erreur de parsing JSON : {e}")
        print(f"Texte brut recu : {texte_brut[:200]}")
        return None

Script de test complet

# Cas de test
tests = [
    "un utilisateur avec nom, email et âge",
    "une liste de 3 produits avec nom et prix",
    "une config nginx avec server_name et location"
]

for description in tests:
    print(f"\n{'='*60}")
    print(f"Description : {description}")
    print('='*60)

    resultat = generate_json(description)

    if resultat is not None:
        print(f"Type : {type(resultat).__name__}")
        print(json.dumps(resultat, indent=2, ensure_ascii=False))

        # Verification supplementaire
        assert isinstance(resultat, (dict, list)), "Le résultat n'est ni un dict ni une list"
        print("Validation OK")
    else:
        print("ECHEC : JSON invalide")

Sortie attendue (les valeurs exactes varient)

============================================================
Description : un utilisateur avec nom, email et age
============================================================
Type : dict
{
  "nom": "Jean Dupont",
  "email": "[email protected]",
  "age": 32
}
Validation OK

============================================================
Description : une liste de 3 produits avec nom et prix
============================================================
Type : list
[
  {
    "nom": "Ordinateur portable",
    "prix": 899.99
  },
  {
    "nom": "Souris sans fil",
    "prix": 29.99
  },
  {
    "nom": "Clavier mecanique",
    "prix": 149.99
  }
]
Validation OK

============================================================
Description : une config nginx avec server_name et location
============================================================
Type : dict
{
  "server_name": "example.com",
  "location": {
    "/": {
      "proxy_pass": "http://localhost:3000",
      "proxy_set_header": {
        "Host": "$host",
        "X-Real-IP": "$remote_addr"
      }
    }
  }
}
Validation OK

Pour aller plus loin

  • Ajoutez un paramètre schema à la fonction pour fournir un exemple de structure attendue dans le prompt
  • Implémentez un retry automatique en cas de JSON invalide (relancer l’appel API)
  • Testez avec des descriptions plus complexes : structures imbriquées, tableaux mixtes, valeurs nullables
  • Comparez les résultats entre différents modèles (Haiku vs Sonnet) pour évaluer la fiabilité du JSON généré