Leçon 3 — Méthodes d'évaluation

Métriques exactes, LLM-juge et évaluation humaine

7 min de lecture

Trois familles de notation

La documentation d'Anthropic distingue la notation par code, par humain et par modèle. Vertex AI fait une distinction proche entre métriques calculées (computation-based) et métriques basées sur un modèle (model-based). La règle d'or : utilisez la méthode la moins chère qui mesure correctement le critère.

flowchart TD
  A["Critère à mesurer"] --> B{"Sortie fermée ? (catégorie, chiffre, JSON)"}
  B -- "Oui" --> C["Métrique exacte (code)"]
  B -- "Non" --> D{"Vérifiable par mots-clés ou regex ?"}
  D -- "Oui" --> E["Heuristique (code)"]
  D -- "Non" --> F{"Jugement de sens, ton, fidélité ?"}
  F -- "Oui" --> G["LLM-juge avec grille"]
  G --> H["Calibrage sur un échantillon noté par un humain"]
MéthodeExemplesCoûtLimites
ExacteClassification d'un ticket, extraction d'une date, JSON conforme au schémaQuasi nulInutilisable sur du texte libre
HeuristiqueContient « 25 jours », ne contient pas « 30 jours », cite [doc:…], longueur maxQuasi nulReformulations, négations (« pas 25 jours »)
SimilaritéROUGE, BLEU, similarité d'embeddings avec la référenceFaibleMesure la ressemblance, pas la justesse
LLM-jugeFidélité au contexte, complétude, ton, respect de consignesUn appel LLM par cas et par critèreBiais, variabilité, coût
HumainValidation finale, calibrage du juge, cas ambigusÉlevéLent, peu scalable, désaccords entre annotateurs

Le LLM-juge : une grille, pas une impression

Demander « cette réponse est-elle bonne ? note de 1 à 10 » produit des notes instables. Un bon juge reçoit un critère précis, une grille décrite niveau par niveau, et doit justifier avant de noter. C'est l'approche de G-Eval (Liu et al., 2023) : critères explicites et étapes d'évaluation.

juge.py
GRILLE_FIDELITE = """Tu évalues la FIDÉLITÉ d'une réponse à un contexte documentaire.

Contexte :
<contexte>{contexte}</contexte>

Question : {question}
Réponse à évaluer :
<reponse>{reponse}</reponse>

Grille :
5 = toutes les affirmations sont soutenues par le contexte
4 = une précision mineure non soutenue, sans impact sur le sens
3 = une affirmation non soutenue qui pourrait induire en erreur
2 = plusieurs affirmations non soutenues
1 = la réponse contredit le contexte ou invente l'essentiel

Liste d'abord chaque affirmation et indique si elle est soutenue.
Puis termine par une ligne unique : NOTE: <1-5>"""

import re

def noter(appeler_llm, question, reponse, contexte):
    texte = appeler_llm(GRILLE_FIDELITE.format(
        contexte=contexte, question=question, reponse=reponse))
    m = re.search(r"NOTE:\s*([1-5])", texte)
    return int(m.group(1)) if m else None  # None = juge illisible, à compter à part

Avec Claude, placez le contexte et la réponse dans des balises XML (comme ci-dessus) : la documentation Anthropic recommande cette structuration pour séparer clairement les données des instructions. Sur Vertex AI, le service d'évaluation propose des métriques basées sur un modèle prêtes à l'emploi et des modèles de prompt pour définir les vôtres.

Les biais connus des juges

L'article « Judging LLM-as-a-Judge » (Zheng et al., 2023, arXiv 2306.05685) a mis en évidence plusieurs biais :

BiaisSymptômeParade
PositionEn comparaison A/B, le juge préfère souvent la première (ou la seconde) réponseÉvaluer les deux ordres, ne garder que les verdicts cohérents
VerbositéUne réponse longue paraît meilleureGrille qui pénalise le hors-sujet, critère de concision explicite
Auto-complaisanceUn modèle favorise les réponses de sa propre familleUtiliser un juge d'une autre famille que le modèle évalué, ou vérifier sur échantillon humain
Raisonnement limitéLe juge se trompe sur des calculs ou de la logiqueFournir la réponse de référence au juge

Vous comparez deux prompts en demandant à un juge « quelle réponse est la meilleure, A ou B ? ». Le prompt B gagne 70 % du temps, mais B est toujours présenté en second. Que faire ?

Mesurer l'accord juge / humain

Le plus simple : le taux d'accord sur un verdict binaire (note au moins 4 = acceptable).

accord.py
def taux_accord(notes_juge, notes_humain, seuil=4):
    paires = [(j >= seuil, h >= seuil) for j, h in zip(notes_juge, notes_humain) if j is not None]
    return sum(a == b for a, b in paires) / len(paires)

juge   = [5, 4, 2, 5, 3, 4, 1, 5]
humain = [5, 5, 2, 4, 4, 4, 1, 5]
print(taux_accord(juge, humain))  # 0.875 : un seul désaccord (cas 5)

L'évaluation humaine reste indispensable

L'humain ne note pas tout, il intervient à trois endroits :

  1. Écrire et valider le jeu doré (leçon précédente).
  2. Calibrer le juge LLM sur un échantillon.
  3. Trancher les cas où le juge est illisible ou hésitant, et relire un échantillon des échecs à chaque campagne.

Pour limiter la subjectivité : même grille que le juge, deux annotateurs sur une partie des cas, et notation à l'aveugle (l'annotateur ne sait pas quelle version a produit la réponse).

Quelle méthode convient le mieux pour vérifier qu'un classifieur de tickets renvoie l'une des cinq catégories autorisées ?

Exercice : choisir la méthode et écrire une grille

Pour un assistant de support client fictif, associez à chaque critère la méthode la moins chère qui fonctionne, puis rédigez la grille du critère qui nécessite un juge.

  1. La réponse est au format JSON {"reponse": str, "sources": [str]}.
  2. La réponse ne mentionne aucun concurrent (liste de 6 noms connue).
  3. Le ton reste courtois même face à un client agressif.
  4. La catégorie du ticket (facturation, technique, resiliation) est correcte.
Voir la solution
#MéthodePourquoi
1Exacte : validation de schéma (json.loads + Pydantic ou jsonschema)Sortie structurée, vérifiable par code
2Heuristique : interdit avec la liste des 6 nomsListe fermée, recherche de chaînes suffisante
3LLM-juge avec grilleJugement de ton, non vérifiable par mots-clés
4Exacte : comparaison à la catégorie attendueSortie fermée

Grille pour le critère 3 :

Tu évalues la COURTOISIE de la réponse d'un conseiller à un client.
5 = ton calme et respectueux, reconnaît la frustration, propose une action
4 = ton respectueux mais impersonnel
3 = une formulation sèche ou condescendante
2 = plusieurs formulations sèches, ou reproche adressé au client
1 = ton agressif, ironique ou insultant
Cite les formulations qui justifient ta note, puis termine par : NOTE: <1-5>

Ensuite : faites noter 30 réponses par un humain avec la même grille et mesurez le taux d'accord avant d'utiliser le juge en CI.

Je sais faire

  • Choisir entre métrique exacte, heuristique, LLM-juge et humain pour un critère donné.
  • Écrire une grille de juge avec niveaux décrits et justification avant la note.
  • Citer trois biais des juges LLM et une parade pour chacun.
  • Mesurer le taux d'accord entre un juge et un annotateur humain.
Suivant