Évaluation et Benchmarks de LLM
Méthodes et benchmarks pour évaluer les performances des grands modèles de langage - MMLU, HumanEval, MT-Bench et métriques clés
Évaluation et Benchmarks de LLM
Évaluer un LLM est complexe : comment mesurer la "qualité" d'un modèle capable de tout faire, du code à la poésie ? Les benchmarks tentent de standardiser cette évaluation.
Pourquoi évaluer ?
┌─────────────────────────────────────────────────────────────────┐
│ OBJECTIFS DE L'ÉVALUATION │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. COMPARER les modèles entre eux │
│ GPT-4 vs Claude vs Gemini │
│ │
│ 2. SUIVRE les progrès au fil du temps │
│ GPT-3 → GPT-4 → GPT-4o │
│ │
│ 3. IDENTIFIER les forces et faiblesses │
│ Bon en code, faible en maths │
│ │
│ 4. VALIDER le déploiement │
│ Le modèle est-il prêt pour la production ? │
│ │
└─────────────────────────────────────────────────────────────────┘Benchmarks de connaissances
MMLU (Massive Multitask Language Understanding)
57 tâches couvrant des domaines variés (sciences, histoire, droit, etc.).
┌─────────────────────────────────────────────────────────────────┐
│ MMLU │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Exemple - Physique: │
│ "Un objet de 2kg tombe de 10m. Quelle est son énergie │
│ cinétique juste avant l'impact ? (g = 10 m/s²)" │
│ │
│ A) 100 J B) 200 J C) 20 J D) 50 J │
│ │
│ Réponse correcte: B (E = mgh = 2 × 10 × 10 = 200 J) │
│ │
├─────────────────────────────────────────────────────────────────┤
│ Résultats (2024): │
│ ├── GPT-4o: 88.7% │
│ ├── Claude 3.5: 88.3% │
│ ├── Gemini 1.5: 85.9% │
│ ├── Llama 3 70B: 82.0% │
│ └── Humain expert: ~89% │
└─────────────────────────────────────────────────────────────────┘GPQA (Graduate-Level Google-Proof QA)
Questions de niveau doctorat, impossibles à googler.
| Modèle | Score |
|---|---|
| Claude 3.5 Sonnet | 59.4% |
| GPT-4o | 53.6% |
| Expert PhD | 81% |
| Non-expert PhD | 34% |
ARC (AI2 Reasoning Challenge)
Raisonnement scientifique niveau collège.
# Exemple de question ARC
{
"question": "Qu'est-ce qui cause les saisons sur Terre ?",
"choices": [
"La distance au Soleil",
"L'inclinaison de l'axe terrestre",
"La rotation de la Terre",
"La forme de l'orbite"
],
"answer": "B"
}Benchmarks de code
HumanEval
164 problèmes de programmation Python.
# Exemple HumanEval
def has_close_elements(numbers: List[float], threshold: float) -> bool:
"""
Check if in given list of numbers, are any two numbers
closer to each other than given threshold.
>>> has_close_elements([1.0, 2.0, 3.0], 0.5)
False
>>> has_close_elements([1.0, 2.8, 3.0, 4.0], 0.3)
True
"""
# Le modèle doit compléter cette fonction| Modèle | Pass@1 |
|---|---|
| Claude 3.5 Sonnet | 92.0% |
| GPT-4o | 90.2% |
| Gemini 1.5 Pro | 84.1% |
| Llama 3.1 405B | 89.0% |
MBPP (Mostly Basic Python Problems)
974 problèmes Python de difficulté variable.
SWE-Bench
Résolution de vraies issues GitHub.
┌─────────────────────────────────────────────────────────────────┐
│ SWE-BENCH │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Input: Issue GitHub (bug report) │
│ Task: Générer un patch qui résout le problème │
│ Validation: Les tests du repo passent │
│ │
│ Résultats: │
│ ├── Claude 3.5 + Aider: 49% │
│ ├── GPT-4o + Aider: 45% │
│ ├── Devin (agent): 13.9% │
│ └── Humain senior: ~70% │
│ │
└─────────────────────────────────────────────────────────────────┘Benchmarks de raisonnement
GSM8K (Math)
Problèmes de maths niveau primaire/collège.
Problème: Sally a 3 pommes. Elle en achète 5 de plus,
puis en donne la moitié à son frère.
Combien lui reste-t-il de pommes ?
Solution attendue:
1. Sally commence avec 3 pommes
2. Elle en achète 5: 3 + 5 = 8 pommes
3. Elle donne la moitié: 8 / 2 = 4 pommes
Réponse: 4 pommes| Modèle | Accuracy |
|---|---|
| GPT-4o | 95.3% |
| Claude 3.5 | 96.4% |
| Gemini 1.5 | 94.4% |
MATH
Compétitions mathématiques (AMC, AIME).
BigBench Hard
Tâches difficiles pour les modèles actuels.
Tâches incluses:
├── Boolean Expressions
├── Causal Judgment
├── Date Understanding
├── Logical Deduction
├── Navigate
├── Penguins in a Table
├── Salient Translation
└── Web of LiesBenchmarks conversationnels
MT-Bench
Évalue les capacités conversationnelles multi-tours.
┌─────────────────────────────────────────────────────────────────┐
│ MT-BENCH │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Tour 1: "Compose un poème sur l'automne" │
│ Réponse: [poème généré] │
│ │
│ Tour 2: "Réécris-le pour qu'il rime en -oir" │
│ Réponse: [poème modifié] │
│ │
│ Évaluation par LLM juge (GPT-4): │
│ ├── Qualité de la réponse 1: 8/10 │
│ ├── Qualité de la réponse 2: 7/10 │
│ └── Score final: 7.5/10 │
│ │
└─────────────────────────────────────────────────────────────────┘AlpacaEval
Comparaison directe avec GPT-4 comme référence.
| Modèle | Win Rate vs GPT-4 |
|---|---|
| Claude 3.5 Sonnet | 52.4% |
| GPT-4 Turbo | 50.0% |
| Llama 3.1 405B | 39.3% |
Chatbot Arena
Évaluation par des humains (votes crowdsourcés).
┌─────────────────────────────────────────────────────────────────┐
│ CHATBOT ARENA (ELO) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Méthodologie: │
│ 1. L'utilisateur pose une question │
│ 2. Deux modèles répondent (anonymes) │
│ 3. L'utilisateur vote pour le meilleur │
│ 4. Score ELO calculé (comme aux échecs) │
│ │
│ Leaderboard (Dec 2024): │
│ 1. GPT-4o 1287 │
│ 2. Claude 3.5 1282 │
│ 3. Gemini 1.5 Pro 1267 │
│ 4. Llama 3.1 405B 1253 │
│ │
└─────────────────────────────────────────────────────────────────┘Benchmarks spécialisés
Multimodalité
| Benchmark | Description | Leader |
|---|---|---|
| MMMU | Questions multimodales universitaires | GPT-4V |
| MathVista | Maths avec diagrammes | Claude 3.5 |
| ChartQA | Compréhension de graphiques | Gemini |
Sécurité
| Benchmark | Mesure |
|---|---|
| TruthfulQA | Vérité vs hallucinations |
| BBQ | Biais sociaux |
| RealToxicity | Génération de contenu toxique |
Agents
| Benchmark | Description |
|---|---|
| AgentBench | Performance sur tâches d'agent |
| ToolBench | Utilisation d'outils |
| WebArena | Navigation web |
Métriques d'évaluation
Métriques automatiques
# Perplexité - mesure la surprise du modèle
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer
def compute_perplexity(text, model, tokenizer):
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs, labels=inputs["input_ids"])
return torch.exp(outputs.loss).item()
# BLEU - similarité avec référence (traduction)
from nltk.translate.bleu_score import sentence_bleu
reference = ["the", "cat", "sat", "on", "the", "mat"]
hypothesis = ["the", "cat", "is", "on", "the", "mat"]
score = sentence_bleu([reference], hypothesis)
# ROUGE - recall sur n-grams (résumé)
from rouge_score import rouge_scorer
scorer = rouge_scorer.RougeScorer(['rouge1', 'rougeL'])
scores = scorer.score(reference_summary, generated_summary)LLM-as-Judge
Utiliser un LLM pour évaluer un autre LLM.
def llm_judge(question, response_a, response_b):
prompt = f"""
Compare ces deux réponses à la question suivante.
Question: {question}
Réponse A: {response_a}
Réponse B: {response_b}
Évalue chaque réponse sur:
1. Exactitude (1-10)
2. Clarté (1-10)
3. Complétude (1-10)
Quelle réponse est meilleure ? Explique ton raisonnement.
"""
return judge_model.generate(prompt)Framework d'évaluation
lm-evaluation-harness
# Installation
pip install lm-evaluation-harness
# Évaluer un modèle sur MMLU
lm_eval --model hf \
--model_args pretrained=meta-llama/Llama-2-7b-hf \
--tasks mmlu \
--batch_size 8OpenAI Evals
from openai import evals
# Définir une évaluation custom
class MyEvaluation(evals.Evaluation):
def run(self, recorder):
for sample in self.get_samples():
response = self.completion_fn(sample["prompt"])
is_correct = self.check(response, sample["expected"])
recorder.record({"correct": is_correct})Bonnes pratiques
Évaluation robuste
┌─────────────────────────────────────────────────────────────────┐
│ BONNES PRATIQUES │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ✓ Utiliser plusieurs benchmarks (pas un seul) │
│ ✓ Tester sur des données hors distribution │
│ ✓ Vérifier la contamination des données │
│ ✓ Inclure des évaluations humaines │
│ ✓ Mesurer la variance (plusieurs runs) │
│ ✓ Documenter les prompts utilisés │
│ │
│ ✗ Se fier uniquement aux benchmarks publics │
│ ✗ Optimiser pour un seul benchmark │
│ ✗ Ignorer les cas limites │
│ ✗ Comparer des modèles avec différents prompts │
│ │
└─────────────────────────────────────────────────────────────────┘Contamination des données
def check_contamination(test_sample, training_data):
"""
Vérifie si l'exemple de test était dans les données d'entraînement
"""
# N-gram overlap
test_ngrams = set(get_ngrams(test_sample, n=10))
train_ngrams = set(get_ngrams(training_data, n=10))
overlap = len(test_ngrams & train_ngrams) / len(test_ngrams)
if overlap > 0.5:
return "LIKELY_CONTAMINATED"
return "CLEAN"Tableau récapitulatif
| Benchmark | Type | Métrique | Difficulté |
|---|---|---|---|
| MMLU | Connaissances | Accuracy | ★★★☆ |
| HumanEval | Code | Pass@1 | ★★★☆ |
| GSM8K | Maths | Accuracy | ★★☆☆ |
| MATH | Maths | Accuracy | ★★★★ |
| MT-Bench | Conversation | Score /10 | ★★★☆ |
| SWE-Bench | Code réel | % résolu | ★★★★★ |
| GPQA | Sciences | Accuracy | ★★★★★ |
Pour aller plus loin
- Chatbot Arena Leaderboard - Classement en temps réel
- Open LLM Leaderboard - Hugging Face
- lm-evaluation-harness - Framework
- HELM - Stanford