Utiliser un LLM pour évaluer les sorties d’un LLM
Découvrez pourquoi les LLM évaluateurs fonctionnent et où ils échouent par rapport à l’évaluation humaine.
Utiliser un LLM pour évaluer les sorties d’un LLM est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.
Pourquoi utiliser un LLM comme juge ?
Les métriques d’évaluation traditionnelles — BLEU, ROUGE et correspondance exacte — fonctionnent pour les sorties structurées, mais échouent à mesurer des qualités nuancées comme l’utilité, l’exactitude, le ton et la créativité.
L’évaluation humaine restitue ces nuances, mais elle est lente et coûteuse. Évaluation par LLM offre une solution intermédiaire : une évaluation automatisée qui comprend le sens sémantique, le contexte et la qualité subjective, à grande échelle et à faible coût.
Pourquoi les LLM utilisés comme juges sont efficaces
Les LLM utilisés comme juges sont efficaces parce qu’ils partagent la même compréhension du langage que le modèle évalué. Ils peuvent déterminer :
- si une réponse est factuellement exacte, et non simplement similaire à une référence sur le plan lexical
- si une réponse est utile au regard de l’objectif indiqué
- si le ton respecte les exigences
- si un résumé restitue les points essentiels
Ce sont des qualités que de simples métriques de comparaison de chaînes ne peuvent pas mesurer.
Un LLM juge simple
Le juge LLM le plus élémentaire consiste à demander au modèle d’évaluer une réponse sur une échelle numérique, avec une brève justification. C’est la base sur laquelle reposent tous les schémas de jugement plus avancés.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
def simple_llm_judge(question, response, criterion):
judge_prompt = (
f'Rate the following response on {criterion} from 1 to 5.\n\n'
f'Question: {question}\n'
f'Response: {response}\n\n'
f'Return JSON: {{"score": <1-5>, "reason": "<one sentence>"}}'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=100,
messages=[{'role': 'user', 'content': judge_prompt}]
)
try:
result = json.loads(r.content[0].text)
return result['score'], result['reason']
except Exception:
return None, r.content[0].text
score, reason = simple_llm_judge(
question='What is recursion in programming?',
response='Recursion is when a function calls itself.',
criterion='clarity and completeness'
)
print(f'Score: {score}/5 — {reason}')Là où les LLM juges échouent : biais de position
Biais de position : lorsqu’on lui présente deux réponses (A et B), le juge LLM préfère celle qui apparaît en premier, quelle que soit sa qualité. Des études montrent que ce biais affecte 60 à 70 % des comparaisons par paires lorsqu’on utilise une invite de jugement naïve.
Cela signifie que l’ordre dans lequel vous présentez les options modifie le verdict du juge.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
def demonstrate_position_bias(question, response_a, response_b):
def ask_judge(first, second, order):
prompt = (
f'Question: {question}\n\n'
f'Response 1: {first}\n\n'
f'Response 2: {second}\n\n'
f'Which response is better? Reply with 1 or 2.'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=10,
messages=[{'role': 'user', 'content': prompt}]
)
choice = r.content[0].text.strip()
# Map back to original labels
if order == 'AB':
return 'A' if choice == '1' else 'B'
else: # BA
return 'B' if choice == '1' else 'A'
result_ab = ask_judge(response_a, response_b, 'AB')
result_ba = ask_judge(response_b, response_a, 'BA')
print(f'Order A-B: Judge picked {result_ab}')
print(f'Order B-A: Judge picked {result_ba}')
if result_ab != result_ba:
print('Position bias detected: different results!')
return result_ab, result_baLà où les LLM juges échouent : biais de verbosité
Biais de verbosité : les juges LLM ont tendance à attribuer de meilleures notes aux réponses plus longues et plus détaillées, même lorsqu’une réponse concise est objectivement meilleure. Une réponse qui utilise 400 mots pour exprimer ce que 50 mots suffiraient à dire obtient souvent une note supérieure à la version concise.
Réduisez ce biais en demandant explicitement au juge de pénaliser toute longueur inutile, c’est-à-dire unnecessary.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
def length_aware_judge(question, response):
judge_prompt = (
f'Evaluate this response for quality. Be aware of verbosity bias: '
f'do NOT score longer responses higher just because they are longer.\n\n'
f'Question: {question}\n'
f'Response: {response}\n\n'
f'Evaluate on:\n'
f'1. Accuracy (does it correctly answer the question?)\n'
f'2. Conciseness (does it avoid unnecessary filler?)\n'
f'3. Helpfulness (does it serve the user well?)\n\n'
f'Penalize responses that add filler, repetition, or irrelevant information.\n'
f'Score each 1-5 and provide an overall score. Return JSON.'
)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{'role': 'user', 'content': judge_prompt}]
)
print(r.content[0].text)Là où les LLM juges échouent : auto-préférence
Biais d’auto-préférence : lorsque Claude évalue deux réponses, il a tendance à préférer les réponses à la manière de Claude. Lorsque GPT-4 évalue des réponses, il préfère celles qui ressemblent à GPT-4. Il s’agit d’un biais systématique qui affecte tous les juges LLM.
Mesure corrective : utilisez plusieurs modèles différents comme juges et agrégez leurs scores. Les désaccords signalent un cas limite nécessitant un examen humain.
import anthropic
import openai
anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')
def multi_model_judge(question, response):
judge_prompt = (
f'Rate this response 1-10 for overall quality.\n'
f'Q: {question}\nA: {response}\n'
f'Reply with only a number.'
)
# Judge 1: Claude
r_claude = anthropic_client.messages.create(
model='claude-opus-4-5',
max_tokens=10,
messages=[{'role': 'user', 'content': judge_prompt}]
)
score_claude = float(r_claude.content[0].text.strip())
# Judge 2: GPT-4o
r_gpt = openai_client.chat.completions.create(
model='gpt-4o',
max_tokens=10,
messages=[{'role': 'user', 'content': judge_prompt}]
)
score_gpt = float(r_gpt.choices[0].message.content.strip())
avg = (score_claude + score_gpt) / 2
print(f'Claude judge: {score_claude}, GPT judge: {score_gpt}, Average: {avg}')
if abs(score_claude - score_gpt) > 2:
print('WARNING: High disagreement — consider human review')
return avgInflation des scores
Inflation des scores : les juges LLM ont tendance à attribuer des notes élevées (4 à 5 sur 5) à la plupart des réponses, ce qui resserre la répartition et rend difficile la distinction entre une bonne réponse et une excellente réponse. Les réponses qui vaudraient 3/5 obtiennent souvent une note de 4 à 4,5/5.
Solution : utilisez une grille d’évaluation qui impose un étalonnage, ou une notation relative (par paires) plutôt qu’absolue.
# Anti-inflation judge prompt with explicit score anchors
CALIBRATED_JUDGE_PROMPT = (
'Rate this response 1-5 using these STRICT score definitions:\n'
'1 = Completely wrong, harmful, or completely off-topic\n'
'2 = Partially relevant but contains significant errors or omissions\n'
'3 = Correct and addresses the question but lacks depth or precision\n'
'4 = Correct, reasonably complete, and clearly expressed\n'
'5 = Exceptional: correct, complete, insightful, and concise\n\n'
'Only give 5 if the response is genuinely outstanding.\n'
'Give 3 for any adequate-but-not-impressive response.\n\n'
'Question: {question}\n'
'Response: {response}\n\n'
'Score (1-5) and one-sentence reason:'
)
# Compare to non-anchored prompt which tends to cluster at 4-5
print('Anchored rubrics force the judge to use the full scale')Quand les LLM juges sont les plus efficaces
Les juges LLM sont les plus fiables lorsque :
- Les critères sont clairs et bien définis
- L’écart de qualité entre les réponses est important (une réponse manifestement bonne comparée à une réponse manifestement mauvaise)
- Le domaine relève des connaissances du modèle juge
- Vous évaluez des qualités subjectives (ton, utilité) sur lesquelles les évaluateurs humains sont également en désaccord
Ils sont les moins fiables pour évaluer des connaissances récentes, des domaines très techniques ou de subtiles erreurs factuelles dont la détection nécessite des connaissances spécialisées.
Quand une évaluation humaine est nécessaire
Maintenez une intervention humaine pour :
- Évaluer des réponses dans des domaines spécialisés (médical, juridique et sécurité)
- Établir un étalonnage de référence pour votre juge LLM
- Prendre des décisions à forts enjeux, lorsque les erreurs du juge LLM ont des conséquences réelles
- Évaluer de nouvelles tâches pour lesquelles le modèle juge dispose de peu de données d’apprentissage
- Détecter de subtiles erreurs factuelles qui nécessitent une expertise du domaine
def triage_for_human_review(question, response, llm_score, confidence_threshold=0.7):
"""
Route low-confidence or high-stakes evaluations to human review.
"""
# Route to human if judge is uncertain
if llm_score is None:
return 'human_review', 'LLM judge failed to produce a score'
# Route to human for borderline scores (near decision boundaries)
if 2.5 <= llm_score <= 3.5:
return 'human_review', f'Borderline score {llm_score} — needs human judgment'
# Route to human for domain-specific high-risk content
HIGH_RISK_KEYWORDS = ['medication', 'legal advice', 'financial advice', 'security']
if any(kw in question.lower() for kw in HIGH_RISK_KEYWORDS):
return 'human_review', 'High-risk domain — human verification required'
# Else: LLM score is sufficient
return 'auto_accept', f'Score {llm_score} — LLM judgment sufficient'
routing, reason = triage_for_human_review('What medication should I take?', 'Take aspirin.', 4.5)
print(f'{routing}: {reason}')Construire une chaîne d’évaluation
Une chaîne pratique d’évaluation par LLM suit ce processus : générer des réponses → exécuter le juge LLM → orienter les cas limites vers des humains → agréger les scores → produire un rapport sur les indicateurs de qualité. Journalisez tout afin de disposer de pistes d’audit.
import anthropic
import json
client = anthropic.Anthropic(api_key='sk-ant-...')
def evaluate_batch(examples, product_under_test, criteria):
results = []
for ex in examples:
response = product_under_test(ex['question'])
score, reason = simple_llm_judge(ex['question'], response, criteria)
results.append({
'question': ex['question'],
'response': response,
'score': score,
'reason': reason,
'needs_review': score is None or 2.5 <= (score or 0) <= 3.5
})
# Summarize
valid_scores = [r['score'] for r in results if r['score'] is not None]
avg_score = sum(valid_scores) / len(valid_scores) if valid_scores else 0
review_count = sum(1 for r in results if r['needs_review'])
print(f'Average score: {avg_score:.2f}/5')
print(f'Cases needing review: {review_count}/{len(results)}')
return results, avg_score
# results, avg = evaluate_batch(test_cases, my_product, 'helpfulness')Évaluation sans référence ou avec référence
Les juges LLM peuvent fonctionner selon deux modes :
- Avec référence : Le juge compare la réponse à une réponse correcte connue. La précision est élevée, mais des données annotées sont nécessaires.
- Sans référence : Le juge évalue la réponse selon ses qualités propres (est-elle cohérente ? utile ? bien rédigée ?). Cette approche est plus souple, mais moins précise pour l’exactitude factuelle.
Utilisez l’évaluation avec référence lorsque vous disposez de réponses de référence validées. Utilisez l’évaluation sans référence pour les tâches ouvertes comme la synthèse, l’évaluation du ton ou la qualité de l’écriture créative.
Vérification des connaissances : biais de position
Qu’est-ce que le biais de position dans l’évaluation avec un LLM comme évaluateur, et quelles en sont les conséquences ?
Récapitulatif : évaluation avec un LLM comme évaluateur
Les évaluateurs LLM comprennent les nuances, l’exactitude sémantique et la qualité subjective — des aspects que les métriques traditionnelles ne peuvent pas mesurer. Ils présentent les biais suivants : biais de position (préférence pour la première option), biais de verbosité (préférence pour les réponses plus longues), préférence pour leur propre style et inflation des notes (regroupement autour de 4 ou 5 sur 5). Réduisez ces biais en randomisant l’ordre des réponses, en donnant des instructions explicites contre la verbosité, en utilisant des grilles avec des repères qui définissent chaque niveau de notation et en faisant appel à plusieurs modèles différents comme évaluateurs. Confiez les notes limites et les domaines à haut risque à des évaluateurs humains. Utilisez les évaluateurs LLM pour passer à grande échelle ; utilisez des humains pour l’étalonnage et les décisions à forts enjeux.
Apprends AI Prompt Engineering avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 53
- Leçons
- 199
Questions Fréquemment Posées
La leçon « Utiliser un LLM pour évaluer les sorties d’un LLM » est-elle gratuite ?
Oui — le texte complet de « Utiliser un LLM pour évaluer les sorties d’un LLM » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Utiliser un LLM pour évaluer les sorties d’un LLM » ?
Découvrez pourquoi les LLM évaluateurs fonctionnent et où ils échouent par rapport à l’évaluation humaine. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?
Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Utiliser un LLM pour évaluer les sorties d’un LLM » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?
Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Utiliser un LLM pour évaluer les sorties d’un LLM
- Prompts d’évaluation fondés sur une grille
- Évaluation comparative : A ou B
- Étalonnage et biais des évaluateurs LLM