LLM-as-Judge : principe
Utiliser un LLM (généralement plus puissant) pour évaluer les sorties d'un autre LLM. Cette approche permet d'automatiser l'évaluation à grande échelle sans annotateurs humains, avec une corrélation de 80-90% avec le jugement humain.
Pourquoi LLM-as-Judge ?
- Les métriques traditionnelles (BLEU, ROUGE) ne capturent pas la qualité sémantique
- L'évaluation humaine ne passe pas à l'échelle
- Permet d'évaluer des critères subjectifs (ton, clarté, utilité)
- Feedback rapide pendant le développement
Implémentation basique
from langchain_openai import ChatOpenAI
judge_llm = ChatOpenAI(model="gpt-4o", temperature=0)
judge_prompt = """Évalue la réponse suivante sur une échelle de 1 à 5.
Critères :
- Exactitude (1-5) : L'information est-elle correcte ?
- Complétude (1-5) : La réponse couvre-t-elle tous les aspects ?
- Clarté (1-5) : La réponse est-elle bien structurée et compréhensible ?
Question : {question}
Réponse à évaluer : {answer}
Contexte de référence : {reference}
Retourne un JSON avec les scores et justifications.
"""Grilles de scoring structurées
Rubric-based evaluation
rubric = {
5: "Réponse parfaite, complète, sans erreur, bien structurée",
4: "Réponse correcte avec des détails mineurs manquants",
3: "Réponse partiellement correcte, manque des éléments importants",
2: "Réponse avec des erreurs significatives ou très incomplète",
1: "Réponse incorrecte, hors sujet ou dangereuse"
}Pairwise comparison
Comparer deux réponses plutôt que noter absolument :
comparison_prompt = """Voici deux réponses à la même question.
Laquelle est meilleure et pourquoi ?
Question: {question}
Réponse A: {answer_a}
Réponse B: {answer_b}
Choisis A, B, ou Égalité. Justifie."""DeepEval : framework d'évaluation
from deepeval import evaluate
from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
from deepeval.test_case import LLMTestCase
test_case = LLMTestCase(
input="Qu'est-ce que le machine learning ?",
actual_output="Le ML est une branche de l'IA...",
retrieval_context=["Le machine learning..."]
)
metric = AnswerRelevancyMetric(threshold=0.7)
metric.measure(test_case)
print(metric.score, metric.reason)Biais connus du LLM-judge
- Position bias : Tend à préférer la première réponse dans les comparaisons
- Verbosity bias : Préfère les réponses plus longues
- Self-enhancement bias : Le modèle préfère ses propres sorties
- Mitigation : Randomiser l'ordre, utiliser des rubrics explicites, calibrer sur des exemples humains
Bonnes pratiques
- Utiliser un modèle plus puissant comme juge (GPT-4o pour juger GPT-3.5)
- Toujours demander une justification avec le score
- Calibrer avec 50-100 exemples notés par des humains
- Monitorer la cohérence inter-évaluations (même question, même réponse = même score)