Évaluer les Performances de Claude : Guide des Evals
By Learnia Team
Évaluer les Performances de Claude : Guide des Evals
📅 Dernière mise à jour : 10 mars 2026 — Couvre les evals automatisées, humaines, model-graded et l'outil de la console Anthropic.
🔗 Article pilier : API Claude : Guide Complet
Pourquoi Évaluer Claude ?
L'IA est probabiliste — la même requête peut produire des résultats différents. Les évaluations vous permettent de :
- →Mesurer la qualité des réponses de manière objective
- →Comparer des prompts pour trouver la meilleure formulation
- →Valider les changements de modèle sans surprise en production
- →Détecter les régressions lors des mises à jour d'API
- →Justifier les décisions auprès des stakeholders avec des données
Les 3 Types d'Évaluations
1. Évaluations Automatisées
Des scores calculés par du code — rapides, reproductibles, pas de jugement humain nécessaire.
| Méthode | Description | Quand l'utiliser |
|---|---|---|
| Exact match | La réponse est exactement le texte attendu | QA factuelles, classification |
| Contains | La réponse contient un mot/phrase clé | Extraction d'informations |
| Regex | La réponse matche un pattern | Formats structurés (dates, emails) |
| JSON schema | La réponse respecte un schéma JSON | Sorties structurées |
| Code assertion | Un script vérifie des conditions | Logique business complexe |
import json
import re
def eval_exact_match(response, expected):
"""Vérifie une correspondance exacte."""
return response.strip().lower() == expected.strip().lower()
def eval_contains(response, keywords):
"""Vérifie que la réponse contient les mots-clés."""
response_lower = response.lower()
return all(kw.lower() in response_lower for kw in keywords)
def eval_json_schema(response, required_fields):
"""Vérifie que la réponse est un JSON valide avec les champs requis."""
try:
data = json.loads(response)
return all(field in data for field in required_fields)
except json.JSONDecodeError:
return False
def eval_regex(response, pattern):
"""Vérifie que la réponse matche un pattern regex."""
return bool(re.search(pattern, response))
# Exemples d'utilisation
assert eval_exact_match("Paris", "Paris")
assert eval_contains("Python est un langage interprété", ["python", "langage"])
assert eval_json_schema('{"name": "Alice", "age": 30}', ["name", "age"])
assert eval_regex("Le prix est de 29.99€", r"\d+\.\d{2}€")
2. Évaluations Humaines
Des annotateurs humains évaluent les réponses selon des critères définis. Le gold standard en termes de qualité.
| Critère | Échelle | Description |
|---|---|---|
| Précision | 1-5 | Les faits sont-ils corrects ? |
| Pertinence | 1-5 | La réponse est-elle adaptée à la question ? |
| Complétude | 1-5 | Tous les aspects sont-ils couverts ? |
| Clarté | 1-5 | La réponse est-elle bien structurée et compréhensible ? |
| Utilité | 1-5 | L'utilisateur peut-il agir sur cette réponse ? |
Process recommandé :
- →Créez un guide d'annotation avec des exemples pour chaque score
- →Formez 2-3 annotateurs sur les critères
- →Faites évaluer chaque réponse par 2 annotateurs minimum
- →Calculez l'accord inter-annotateurs (Kappa de Cohen)
- →Résolvez les désaccords par discussion
3. Évaluations Model-Graded
Un LLM évalue les réponses d'un autre LLM. Scalable et rapide, avec un bon proxy de l'évaluation humaine.
import anthropic
client = anthropic.Anthropic()
def model_graded_eval(question, response, criteria):
"""Utilise Claude pour évaluer une réponse."""
eval_prompt = f"""Évalue cette réponse selon les critères donnés.
Question posée : {question}
Réponse à évaluer : {response}
Critères d'évaluation :
{criteria}
Retourne un JSON avec :
- "score": note de 1 à 5
- "reasoning": justification en 2-3 phrases
- "issues": liste des problèmes identifiés (ou liste vide)
"""
eval_response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": eval_prompt}]
)
return json.loads(eval_response.content[0].text)
# Utilisation
result = model_graded_eval(
question="Quels sont les avantages de TypeScript sur JavaScript ?",
response="TypeScript ajoute le typage statique, ce qui réduit les bugs...",
criteria="""
- Précision technique (les affirmations sont-elles correctes ?)
- Complétude (les avantages principaux sont-ils couverts ?)
- Exemples (des exemples concrets sont-ils donnés ?)
"""
)
print(f"Score: {result['score']}/5")
print(f"Raison: {result['reasoning']}")
Concevoir des Cas de Test
Structure d'un Cas de Test
test_case = {
"id": "tc-001",
"category": "extraction",
"input": "Marie Dupont, 35 ans, développeuse chez TechCorp à Lyon.",
"expected_output": {
"name": "Marie Dupont",
"age": 35,
"job": "développeuse",
"company": "TechCorp",
"city": "Lyon"
},
"eval_method": "json_schema",
"tags": ["extraction", "structured_output"]
}
Catégories de Cas de Test
| Catégorie | Exemples | Couverture recommandée |
|---|---|---|
| Happy path | Cas standard, inputs bien formés | 40% des cas |
| Edge cases | Inputs limites, formats inhabituels | 25% des cas |
| Adversarial | Inputs trompeurs, contradictoires | 15% des cas |
| Multilingual | Inputs en plusieurs langues | 10% des cas |
| Empty/invalid | Inputs vides, nuls, corrompus | 10% des cas |
Script d'Évaluation Complet
import anthropic
import json
from datetime import datetime
client = anthropic.Anthropic()
def run_eval_suite(test_cases, model, system_prompt, eval_fn):
"""Exécute une suite d'évaluations complète."""
results = []
passed = 0
for tc in test_cases:
# Appel à Claude
response = client.messages.create(
model=model,
max_tokens=1024,
system=system_prompt,
messages=[{"role": "user", "content": tc["input"]}]
)
output = response.content[0].text
# Évaluation
score = eval_fn(output, tc["expected_output"])
passed += 1 if score else 0
results.append({
"id": tc["id"],
"input": tc["input"],
"expected": tc["expected_output"],
"actual": output,
"passed": score,
"tokens": response.usage.input_tokens + response.usage.output_tokens
})
# Rapport
total = len(test_cases)
print(f"\n{'='*50}")
print(f"Résultats : {passed}/{total} ({passed/total*100:.1f}%)")
print(f"Modèle : {model}")
print(f"Date : {datetime.now().isoformat()}")
print(f"{'='*50}")
# Cas échoués
failed = [r for r in results if not r["passed"]]
if failed:
print(f"\n❌ {len(failed)} cas échoués :")
for r in failed[:5]:
print(f" - {r['id']}: attendu '{r['expected']}', reçu '{r['actual'][:100]}...'")
return results
# Exécution
test_cases = [
{"id": "tc-001", "input": "Quelle est la capitale de la France ?", "expected_output": "Paris"},
{"id": "tc-002", "input": "Quelle est la capitale de l'Allemagne ?", "expected_output": "Berlin"},
{"id": "tc-003", "input": "Quelle est la capitale du Japon ?", "expected_output": "Tokyo"},
]
results = run_eval_suite(
test_cases=test_cases,
model="claude-sonnet-4-20250514",
system_prompt="Réponds uniquement avec le nom de la ville, sans phrase.",
eval_fn=lambda output, expected: expected.lower() in output.lower()
)
A/B Testing de Prompts
Comparez systématiquement deux versions d'un prompt pour identifier la meilleure.
def ab_test_prompts(test_cases, prompt_a, prompt_b, model, eval_fn):
"""Compare deux prompts sur les mêmes cas de test."""
results_a = run_eval_suite(test_cases, model, prompt_a, eval_fn)
results_b = run_eval_suite(test_cases, model, prompt_b, eval_fn)
score_a = sum(1 for r in results_a if r["passed"]) / len(results_a)
score_b = sum(1 for r in results_b if r["passed"]) / len(results_b)
tokens_a = sum(r["tokens"] for r in results_a)
tokens_b = sum(r["tokens"] for r in results_b)
print(f"\n📊 Résultats A/B Test")
print(f"{'Métrique':<20} {'Prompt A':<15} {'Prompt B':<15} {'Gagnant':<10}")
print(f"{'─'*60}")
print(f"{'Score':<20} {score_a:.1%}{'':>9} {score_b:.1%}{'':>9} {'A' if score_a > score_b else 'B'}")
print(f"{'Tokens total':<20} {tokens_a:<15} {tokens_b:<15} {'A' if tokens_a < tokens_b else 'B'}")
return {"prompt_a": score_a, "prompt_b": score_b}
# Exemple
ab_test_prompts(
test_cases=test_cases,
prompt_a="Tu es un assistant géographie. Réponds avec le nom de la ville uniquement.",
prompt_b="Réponds en un seul mot : le nom de la capitale demandée.",
model="claude-sonnet-4-20250514",
eval_fn=lambda output, expected: expected.lower() in output.lower()
)
Outil d'Évaluation de la Console Anthropic
La console Anthropic offre un outil d'évaluation intégré avec une interface graphique.
Fonctionnalités
| Fonctionnalité | Description |
|---|---|
| Eval sets | Collections de cas de test réutilisables |
| Scoring automatique | Exact match, contains, model-graded |
| Comparaison côte à côte | Visualiser les résultats de 2 prompts |
| Historique | Suivre l'évolution des scores dans le temps |
| Export | Télécharger les résultats en CSV |
Workflow dans la Console
- →Créer un Eval Set : Ajoutez vos cas de test (input + expected output)
- →Configurer le Scoring : Choisissez votre méthode d'évaluation
- →Lancer l'Eval : Sélectionnez le modèle et le prompt
- →Analyser les Résultats : Visualisez les scores, identifiez les échecs
- →Itérer : Modifiez le prompt et relancez
Benchmarking entre Modèles
Comparez les performances de différents modèles Claude sur votre cas d'usage spécifique.
models = [
"claude-haiku-3-5-20241022",
"claude-sonnet-4-20250514",
"claude-opus-4-20250918"
]
for model in models:
print(f"\n📊 Évaluation de {model}")
run_eval_suite(test_cases, model, system_prompt, eval_fn)
| Critère de choix | Haiku | Sonnet | Opus |
|---|---|---|---|
| Speed-first (chatbot) | ✅ Meilleur | 👍 Bon | ⚠️ Lent |
| Quality-first (analyse) | ⚠️ Basique | 👍 Bon | ✅ Meilleur |
| Cost-first (volume) | ✅ Meilleur | 👍 Bon | ⚠️ Cher |
| Reasoning (code, math) | ⚠️ Limité | 👍 Bon | ✅ Meilleur |
Erreurs Courantes dans les Evals
| Erreur | Impact | Solution |
|---|---|---|
| Trop peu de cas de test | Résultats non significatifs | Minimum 50-100 cas |
| Pas de reproductibilité | temperature=1 donne des résultats variables | Fixez temperature=0 pour les evals |
| Eval sur le training set | Surévaluation des performances | Utilisez des cas jamais vus |
| Un seul critère | Vue partielle de la qualité | Combinez plusieurs métriques |
| Pas de baseline | Impossible de mesurer le progrès | Sauvegardez toujours les résultats actuels |
Pour aller plus loin
- →Évaluations avec Promptfoo : guide pratique — Implémentez un framework d'évaluation complet avec Promptfoo
- →Détection des hallucinations et biais IA — Techniques pour identifier et prévenir les erreurs des modèles
Module 0 — Prompting Fundamentals
Build your first effective prompts from scratch with hands-on exercises.
Weekly AI Insights
Tools, techniques & news — curated for AI practitioners. Free, no spam.
Free, no spam. Unsubscribe anytime.
→Related Articles
FAQ
Pourquoi évaluer les performances de Claude ?+
Les évaluations permettent de mesurer objectivement la qualité des réponses de Claude pour votre cas d'usage. Elles sont essentielles pour comparer des prompts, valider des changements de modèle et garantir la fiabilité en production.
Quels types d'évaluations existent ?+
Trois types principaux : les evals automatisées (string matching, regex, code-based), les evals humaines (annotateurs qui notent les réponses), et les evals model-graded (un LLM qui évalue les réponses d'un autre LLM).
Comment utiliser l'outil d'évaluation de la console Anthropic ?+
Accédez à la console Anthropic, créez un eval set avec des cas de test, définissez les critères de scoring, lancez l'évaluation et comparez les résultats entre différents prompts ou modèles.
Combien de cas de test faut-il pour une évaluation fiable ?+
Un minimum de 50-100 cas de test est recommandé pour des résultats statistiquement significatifs. Pour les cas critiques en production, visez 200+ cas de test couvrant les edge cases.
Peut-on utiliser Claude pour évaluer ses propres réponses ?+
Oui, c'est le principe du model-graded eval. Un modèle Claude évalue les réponses d'un autre appel Claude selon des critères définis. C'est plus scalable que les evals humaines mais potentiellement biaisé.