Section 11.4.8 : Comparer les LLMs — Benchmarks et choix stratégique
🎯 Objectif pédagogique
Développer un cadre de décision pour choisir le bon LLM selon la tâche, le budget et les contraintes. Vous serez capable de comparer les modèles sur des critères objectifs et de justifier vos choix.
Quel modèle pour quel usage ?
Marc connaît GPT-4o et Claude. Mais il y a des dizaines de modèles. Comment choisir ? Pas par hype ou préférence — par critères objectifs.
Panorama des LLMs (2025)
| Modèle | Provider | Context | $/M tokens (input) | Forces |
|---|---|---|---|---|
| GPT-4o | OpenAI | 128k | 2.50$ | Polyvalent, rapide, tools |
| GPT-4o-mini | OpenAI | 128k | 0.15$ | Rapport qualité/prix imbattable |
| Claude 3.5 Sonnet | Anthropic | 200k | 3.00$ | Longs docs, instructions, éthique |
| Claude 3.5 Haiku | Anthropic | 200k | 0.25$ | Rapide, pas cher, bon pour le batch |
| Gemini 1.5 Pro | 2M | 1.25$ | Contexte énorme (2M tokens) | |
| Llama 3.1 70B | Meta (OS) | 128k | Gratuit* | Open-source, self-hosted |
| Mistral Large | Mistral | 128k | 2.00$ | Européen, bon en français |
| Qwen 2.5 72B | Alibaba (OS) | 128k | Gratuit* | Open-source, multilingue |
*Gratuit si self-hosted (coût serveur GPU uniquement)
Comment comparer : les critères qui comptent
Pour chaque projet, évaluez ces 7 critères :
1. QUALITÉ — Le modèle répond-il correctement ?
→ Tester sur 10 exemples représentatifs de votre tâche
2. COÛT — Combien ça coûte par requête ?
→ Calculer: (prompt_tokens + completion_tokens) × price_per_M
3. VITESSE — Temps de réponse
→ Mesurez le TTFT (time to first token) et tokens/seconde
4. CONTEXTE — Quelle longueur de prompt supportée ?
→ Si vos documents font 100 pages → Claude ou Gemini
5. FORMAT — Structured output fiable ?
→ Testez le JSON output sur 50 requêtes, comptez les erreurs
6. CONFIDENTIALITÉ — Où vont les données ?
→ API = données sur les serveurs du provider
→ Self-hosted (Llama, Mistral) = données chez vous
7. DISPONIBILITÉ — SLA, uptime, fallback
→ OpenAI a eu des pannes majeures en 2024
→ Toujours avoir un fallback provider
Matrice de décision par cas d'usage
| Tâche | 1er choix | 2ème choix | Pourquoi |
|---|---|---|---|
| Classification email | gpt-4o-mini | Claude Haiku | Simple, pas cher |
| Analyse document 100 pages | Claude Sonnet | Gemini Pro | Long contexte |
| Génération de code | GPT-4o | Claude Sonnet | Code quality |
| Chatbot simple | gpt-4o-mini | Llama 3 | Coût, vitesse |
| Données sensibles (santé) | Llama 3 self-hosted | Mistral on-prem | Confidentialité |
| Raisonnement complexe | GPT-4o | Claude Sonnet | Accuracy |
| Traduction français | Mistral Large | GPT-4o | FR natif, qualité |
| Batch 10k requêtes/jour | gpt-4o-mini batch | Claude Haiku | Prix volume |
Benchmark maison — Évaluez vous-même
# benchmark.py — Comparer les LLMs sur VOS cas d'usage
import time
import json
from llm_client import LLMClient
llm = LLMClient()
test_cases = [
\{
"prompt": "Classe cette offre (MATCH/PARTIEL/HORS): Data Analyst Python, Paris, 50k",
"expected": "MATCH",
"task": "classification"
\},
\{
"prompt": "Extrais en JSON: 'ML Engineer chez Google, 80k, Londres, TensorFlow requis'",
"expected_keys": ["position", "company", "salary", "location", "skills"],
"task": "extraction"
\},
\{
"prompt": "Pourquoi un ex-financier devrait-il devenir Data Analyst ? 3 arguments.",
"min_length": 100,
"task": "generation"
\}
]
models = [
("openai", "gpt-4o-mini"),
("openai", "gpt-4o"),
("anthropic", "claude-sonnet-4-20250514"),
]
results = []
for provider, model in models:
for test in test_cases:
start = time.time()
response = llm.ask(test["prompt"], provider=provider, model=model)
duration = time.time() - start
# Scoring basique
score = 0
if test["task"] == "classification" and test["expected"] in response:
score = 1
elif test["task"] == "extraction":
try:
data = json.loads(response)
score = len([k for k in test["expected_keys"] if k in data]) / len(test["expected_keys"])
except json.JSONDecodeError:
score = 0
elif test["task"] == "generation":
score = 1 if len(response) >= test["min_length"] else 0
results.append(\{
"model": model,
"task": test["task"],
"score": score,
"time": round(duration, 2),
"tokens": len(response.split()) # Approximation
\})
# Afficher les résultats
for r in results:
print(f"\{r['model']:30s\} | \{r['task']:15s\} | Score: \{r['score']:.1f\} | Time: \{r['time']:.2f\}s")
Les benchmarks publics ne suffisent pas
MMLU, HumanEval, et les leaderboards mesurent des capacités générales. Votre cas d'usage est spécifique. Un modèle qui score 90% sur HumanEval peut scorer 60% sur votre tâche d'analyse d'offres d'emploi en français. Faites TOUJOURS un benchmark custom sur vos données.
🏋️ Exercice pratique (25 minutes)
- →Identifiez 5 cas d'usage de votre projet (classification, extraction, génération...)
- →Testez chaque cas sur 2 modèles différents (gpt-4o-mini vs Claude)
- →Mesurez : qualité, temps de réponse, coût estimé
- →Documenter votre matrice de décision dans un fichier
Pourquoi ne pas toujours utiliser le modèle le plus puissant (GPT-4o) ?
Quel critère est souvent négligé mais crucial pour le choix d'un LLM en production ?