Aller au contenu principal

Exercice : donnees structurees

Objectif

Creer 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 recoit une description en texte libre de la structure JSON souhaitee
  2. Elle retourne un objet Python (dict ou list), pas une chaine de caracteres
  3. Elle utilise la technique de prefill (\“json\n) et de **stop sequence** (````)
  4. Le JSON retourne doit etre 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

Etape 1 : Ecrire la fonction

Creez la fonction generate_json() en utilisant le SDK Anthropic :

import anthropic
import json

client = anthropic.Anthropic()

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

Etape 2 : Tester avec les trois cas

Ecrivez un script de test qui :

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

Etape 3 : Gerer les erreurs

Que se passe-t-il si Claude genere 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):
    """
    Genere 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-4-20250514",
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": f"Genere 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 age",
    "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 resultat 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 parametre schema a la fonction pour fournir un exemple de structure attendue dans le prompt
  • Implementez un retry automatique en cas de JSON invalide (relancer l’appel API)
  • Testez avec des descriptions plus complexes : structures imbriquees, tableaux mixtes, valeurs nullables
  • Comparez les resultats entre differents modeles (Haiku vs Sonnet) pour evaluer la fiabilite du JSON genere