Aller au contenu principal
Leçon 18 sur 95 · Construire avec l'API Claude

Générer des jeux de test

Leçon 18 sur 95 Mis à jour le 5 novembre 2026 Développeur
Sur cette page
  1. Le projet
  2. Deux sources de cas
  3. Générer avec un modèle rapide
  4. Examiner le jeu de test
  5. Améliorer la diversité
  6. Bonnes pratiques
  7. À vous de jouer
  8. Points clés à retenir

Avant d’évaluer un prompt, il faut des cas sur lesquels l’évaluer. Cette leçon reprend le projet du cours officiel, un assistant qui écrit du code pour des tâches AWS, et montre comment constituer son jeu de test : quelques cas écrits à la main, le volume généré par Claude, le tout vérifié et enregistré dans un fichier.

Mise à jour du 5 novembre 2026. Le cours officiel extrait le JSON généré en préremplissant le début d’un bloc de code JSON, avec une séquence d’arrêt, sur Claude Haiku 4.5. Les modèles actuels refusent le préremplissage (erreur 400 depuis Claude 4.6) : le code utilise ici les sorties structurées de la leçon 13, avec Claude Haiku 5.5. Le schéma enveloppe la liste dans un objet {"cas": [...]}.

Le projet

L’assistant doit aider à écrire trois types de sortie pour des usages AWS : du code Python, une configuration JSON, une expression régulière. Exigence clé : rendre la sortie propre, dans l’un de ces formats, sans explication, en-tête ni conclusion. Le premier prompt, la version 1, est volontairement naïf :

prompt = f"""
Résous la tâche suivante :
{task}
"""

Deux sources de cas

Le bon réflexe est de combiner. Les cas écrits à la main sont ceux qui comptent vraiment : les bugs déjà rencontrés, les demandes tordues d’utilisateurs réels, les formats qui ont cassé en production ; aucun modèle ne les inventera. La génération apporte le volume et la diversité : trente variantes qui couvrent des angles auxquels vous n’auriez pas pensé.

dataset_manuel = [
    {"input": "Écris un script Python qui liste tous les buckets S3.", "type": "python", "context": "SDK boto3"},
    {"input": "Génère une politique IAM en JSON qui autorise la lecture d'un bucket S3.", "type": "json", "context": "AWS IAM"},
    {"input": "Écris une expression régulière qui valide un ARN AWS.", "type": "regex",
     "context": "Format arn:partition:service:region:compte:ressource"},
]

Générer avec un modèle rapide

Pour générer des données de test, le cours officiel conseille un modèle rapide et économique : la famille Haiku. Claude Haiku 5.5 coûte 0,10 $ par million de tokens d’entrée, contre 2 $ pour Sonnet 5.5, et c’est le plus rapide de la gamme ; on réserve le modèle principal à l’évaluation elle-même.

Constituer le jeu de test Quatre étapes : écrire les cas critiques à la main, générer le volume avec Haiku 5.5 et un schéma, relire un échantillon, enregistrer et versionner dataset.json. JEUX DE TEST Constituer le jeu de test 1 À la main bugs connus, demandes réelles 2 Génération Haiku 5.5, schéma avec enum 3 Relecture 5 à 10 cas, doublons, cas irréalistes 4 Fichier dataset.json enregistré et versionné Réclamez la diversité : services, difficultés, cas limites. Le cours officiel extrait le JSON par préremplissage, refusé par les modèles actuels.
D'après la leçon « Generating test datasets » (Claude Academy, Building with the Claude API) et la page Structured outputs (documentation Claude).
import json
from anthropic import Anthropic

client = Anthropic()

SCHEMA_CAS = {
    "type": "object",
    "properties": {
        "cas": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "input": {"type": "string"},
                    "type": {"type": "string", "enum": ["python", "json", "regex"]},
                    "context": {"type": "string"},
                    "difficulty": {"type": "string", "enum": ["facile", "moyen", "difficile"]},
                },
                "required": ["input", "type", "context", "difficulty"],
                "additionalProperties": False,
            },
        }
    },
    "required": ["cas"],
    "additionalProperties": False,
}

def generate_dataset(n_cases=10, category="python"):
    """Génère n_cases cas de test pour une catégorie, avec Haiku 5.5."""
    message = client.messages.create(
        model="claude-haiku-5-5",
        max_tokens=8000,  # la réflexion compte dans ce plafond
        messages=[{
            "role": "user",
            "content": f"""Génère {n_cases} cas de test pour évaluer un assistant qui écrit du code pour des tâches AWS.

Catégorie : {category}

Pour chaque cas, fournis :
- "input" : la demande de l'utilisateur, en français ;
- "type" : le type de sortie attendu ({category}) ;
- "context" : le contexte AWS utile ;
- "difficulty" : facile, moyen ou difficile.

Privilégie des tâches qu'une seule fonction Python, un seul objet JSON ou une seule expression régulière suffit à résoudre, sans beaucoup de code.""",
        }],
        output_config={"format": {"type": "json_schema", "schema": SCHEMA_CAS}},
    )
    text = next(block.text for block in message.content if block.type == "text")
    return json.loads(text)["cas"]

La consigne finale reprend celle du cours officiel : des tâches courtes, qu’une seule fonction, un seul objet ou une seule expression suffit à résoudre. Les enum du schéma garantissent que type et difficulty ne prennent que les valeurs prévues.

dataset = list(dataset_manuel)
for categorie in ["python", "json", "regex"]:
    print(f"Génération des cas : {categorie}…")
    cas = generate_dataset(n_cases=10, category=categorie)
    dataset.extend(cas)
    print(f"  {len(cas)} cas générés")

with open("dataset.json", "w", encoding="utf-8") as f:
    json.dump(dataset, f, indent=2, ensure_ascii=False)
print(f"Jeu de test enregistré : dataset.json ({len(dataset)} cas)")

Les cas manuels n’ont pas de champ difficulty : ajoutez-le si vous voulez les compter dans les statistiques ci-dessous.

Examiner le jeu de test

Cette vérification n’est pas facultative : un jeu de test défectueux fausse toutes les évaluations qui en dépendent, et le défaut ne se voit pas, puisque les scores s’affichent normalement. Deux défauts sont fréquents avec des cas générés : des variantes presque identiques qui gonflent une catégorie, et des demandes irréalistes ou mal posées.

from collections import Counter

with open("dataset.json", encoding="utf-8") as f:
    dataset = json.load(f)

print("Par type :", Counter(cas["type"] for cas in dataset))
print("Par difficulté :", Counter(cas.get("difficulty", "?") for cas in dataset))
for cas in dataset[:5]:
    print(f"  [{cas['type']}] {cas['input'][:70]}")

Améliorer la diversité

La génération tend à l’homogénéité : demandez trente cas et vous obtiendrez trente variations autour du plus probable. Les difficultés réelles se trouvent aux extrêmes : entrée vide, texte très long, caractères spéciaux, demande ambiguë. Il faut les réclamer explicitement. Ajoutez à la consigne de génération des exigences de couverture, par exemple :

- Couvre au moins cinq services AWS différents (S3, Lambda, IAM, EC2, DynamoDB, SQS…).
- Répartis les difficultés : un tiers facile, un tiers moyen, un tiers difficile.
- Inclus au moins deux cas limites.
- Les demandes doivent être réalistes, pas génériques.

et un champ aws_service au schéma pour vérifier la répartition.

Bonnes pratiques

PratiquePourquoi
Générer avec HaikuBien moins cher et plus rapide que le modèle évalué
Enregistrer le jeu en JSONLe même jeu d’une version de prompt à l’autre
Relire 5 à 10 cas à la mainÉcarter les cas hors sujet ou mal posés
Réclamer des cas limitesTester la robustesse, pas seulement le confort
Équilibrer les catégoriesÉviter qu’une catégorie pèse sur la moyenne
Versionner le jeuSavoir sur quel jeu un score a été mesuré

À vous de jouer

Votre jeu de test. Pour l’assistant de votre choix, écrivez cinq cas à la main, générez-en vingt avec Haiku 5.5, enregistrez le tout, puis relisez dix cas : combien garderiez-vous ?

Mesurer la diversité. Générez deux fois dix cas avec la consigne de base, puis avec les exigences de couverture. Comptez les services AWS distincts et les cas limites dans chaque jeu.

Sources officielles : Generating test datasets (Claude Academy) · Structured outputs et Define success criteria and build evaluations (documentation Claude)

Points clés à retenir

  • Les cas critiques s’écrivent à la main ; le volume se génère avec un modèle rapide, Haiku.
  • Les sorties structurées, avec des enum, garantissent un JSON exploitable ; le préremplissage du cours officiel ne fonctionne plus sur les modèles actuels.
  • Le jeu se relit avant usage, s’enregistre et se versionne.
  • La diversité se demande : services, difficultés, cas limites.