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
- La fonction recoit une description en texte libre de la structure JSON souhaitee
- Elle retourne un objet Python (dict ou list), pas une chaine de caracteres
- Elle utilise la technique de prefill (
\“json\n) et de **stop sequence** (````) - Le JSON retourne doit etre valide et parseable par
json.loads()
Cas de test
Votre fonction doit fonctionner avec ces trois descriptions :
"un utilisateur avec nom, email et age""une liste de 3 produits avec nom et prix""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
dictou unelist - 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
schemaa 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