Lección 5 — Exécuter et noter

Similarité et LLM-juge calibré

8 min de lectura

Este contenido aún no está traducido. Se muestra la versión original.

Similarité et LLM-juge calibré

Le rapport affiche « similarité : 0,882 ». Le chef de produit demande si c'est bien. Personne ne sait : sur ce jeu, la plus mauvaise réponse mesurée obtient 0,794 et la meilleure 0,961. À côté, un LLM-juge déclare 100 % des réponses acceptables. Un juge qui n'a jamais été confronté à des annotations humaines est une opinion automatisée, et une opinion automatisée qui bloque des PR finit débranchée au premier faux positif.

Le mécanisme

Deux scorers coûtent des appels et produisent un jugement sur du texte libre :

  • Similarité d'embeddings : le cosinus entre le vecteur de la réponse et celui d'une réponse de référence (gemini-embedding-2, 768 dimensions). Il mesure une proximité de sens, pas une conformité. Utile pour repérer un cas qui dérive, inutilisable comme seuil absolu.
  • LLM-juge à grille : un modèle applique une grille métier critère par critère, puis rend un verdict binaire acceptable / inacceptable. Le verdict binaire se calibre ; une note de 1 à 10 se calibre mal, et deux juges ne s'accordent pas sur la différence entre 6 et 7.

La calibration fait noter par le juge 22 réponses déjà annotées par un humain, puis mesure l'accord avec le kappa de Cohen : l'accord observé corrigé de l'accord dû au hasard. Le harness ne laisse bloquer la porte par le juge que si le kappa dépasse kappa_min (0,6).

flowchart TB
  G["grille_reponse.md (sha 1fb67d9cf02b)"] --> J["LLM-juge gemini-3.8-flash"]
  H["calibration_juge.jsonl : 22 réponses + label humain"] --> J
  J --> K["kappa de Cohen"]
  K --> C{"kappa >= 0,6 ?"}
  C -->|"oui"| B["juge_reponse bloque la porte"]
  C -->|"non"| I["juge_reponse indicatif"]
  G -. "grille ou modèle modifié" .-> P["calibration périmée : relancer make calibrate"]

La mise en œuvre

Une grille écrite pour être appliquée

La grille (grille_reponse.md) a deux critères éliminatoires (promesse hors politique, information inventée) et trois secondaires (traite la vraie demande, prochaine étape, ton). La règle de verdict est explicite : un éliminatoire raté, ou deux secondaires ratés, donne inacceptable. Le prompt du juge impose d'évaluer chaque critère avant le verdict ; le schéma JSON de sortie place criteres avant verdict, ce qui force cet ordre dans la génération.

files/evalh/scorers.py (extrait de LLMJudge)
key = self.ctx.cache.key(kind="juge", model=self.model, grille=self.grille_hash, entree=entree, reponse=reponse)
return self.ctx.cache.get_or_compute(key, call)[0]

La clé contient l'empreinte de la grille : modifier un mot de la grille invalide tous les verdicts en cache.

Le jeu de calibration

Les 22 réponses (calibration_juge.jsonl) sont écrites pour couvrir chaque critère : 13 acceptables, 9 inacceptables, dont des cas à la frontière (C22 : verbeuse et vague, mais un seul critère secondaire raté, donc acceptable). Une calibration sur 22 réponses évidentes donnerait un kappa de 1,0 qui ne prouverait rien.

make calibrate

Résultat obtenu (2026-10-16, Vertex AI, point d'accès global)

juge gemini-3.8-flash · 22 réponses annotées · accord brut 95% · kappa de Cohen 0.90 · 0.0850 USD
  désaccord C15 : humain=inacceptable juge=acceptable ['3. La réponse traite la demande réelle du client']
→ runs/calibration.json

La veille, sur l'API Gemini, la même calibration avait donné le même kappa (0,904), le même unique désaccord C15, pour 0,084 USD. Le calcul se vérifie à la main. L'humain a 13 « acceptable » sur 22, le juge 14. Accord observé : 21/22 = 0,955. Accord attendu par hasard : (13/22 × 14/22) + (9/22 × 8/22) = 0,525. Kappa = (0,955 − 0,525) / (1 − 0,525) = 0,90.

Le désaccord C15 est instructif. Le client signale une connexion frauduleuse ; la réponse explique comment réinitialiser son mot de passe. Le juge voit bien que le critère 3 est raté, mais un seul critère secondaire raté donne acceptable selon la règle écrite. L'annotateur humain a jugé que répondre à côté d'une fraude est éliminatoire. Le défaut est dans la grille, pas dans le juge.

Sur 100 réponses de calibration, 90 sont acceptables. Votre juge répond « acceptable » à tout. Que valent l'accord brut et le kappa ?

Vous remplacez le modèle juge pour réduire le coût. compare affiche « Calibration périmée » et le juge devient indicatif. Un collègue propose de recopier l'ancien calibration.json en changeant modele_juge. Que répondez-vous ?

Ce qui casse en production

  • Le juge rate ce que la grille ne nomme pas. Avec le prompt court, gemini-3.5-flash-lite écrit pour T25 : « nos délais habituels sont de 3 à 5 jours ouvrés ». Aucune source ne donne ce délai. Le juge l'a noté acceptable, avec cette raison : « l'indication d'un délai habituel à titre informatif ne constitue pas une promesse ». Le critère 2 énumère « statut de colis, date, numéro de suivi, montant », pas les délais. La similarité, elle, a baissé (0,912 avec le prompt v1, 0,835 avec le court) : c'est le diff du rapport qui a fait lire ce cas. Un kappa de 0,90 mesure l'accord sur les cas du jeu de calibration, pas sur ceux qui n'y figurent pas.
  • Auto-préférence. Le juge gemini-3.8-flash note aussi les sorties de gemini-3.8-flash (version A). Les LLM-juges ont tendance à préférer les textes de leur propre famille (Zheng et al., 2023). Mesurez-le : calibrez sur des réponses écrites par plusieurs modèles, ou prenez un juge d'une autre famille que les deux candidats.
  • Juge mis à jour en silence. Un alias de modèle qui change de version déplace tous les verdicts. Le harness enregistre modele_juge et grille_sha dans calibration.json ; compare déclare la calibration périmée si l'un des deux a changé, et le juge redevient indicatif.
  • Le juge coûte plus que l'application. Sur le tri, le juge et les embeddings représentent 73 % de la dépense (leçon 2.1). Le cache rend les relances gratuites ; sur un gros jeu, jugez un échantillon stratifié plutôt que tout.
  • Similarité lue comme un pourcentage. Les cosinus du projet tiennent entre 0,79 et 0,96. Une baisse moyenne de 0,03 sur 30 cas est significative (p Holm 0,010) et ne dit pas laquelle des deux réponses est la bonne. Elle reste hors des marges de la porte : c'est un signal de tri pour la lecture du diff.

La règle de décision

Utilisez la similarité pour trier les cas à relire, jamais comme critère d'acceptation. Utilisez un LLM-juge pour les propriétés de politique et d'invention que vos scorers déterministes ne voient pas, avec un verdict binaire, une grille à critères éliminatoires et au moins 20 annotations humaines équilibrées. Laissez-le bloquer seulement au-dessus d'un kappa de 0,6, et recalibrez à chaque changement de grille ou de modèle juge. Chaque cas raté par le juge et repéré à la relecture entre dans le jeu de calibration.

Pratique

Exercice. Corrigez la grille pour que la réponse T25 du prompt court soit refusée, puis listez les commandes à relancer et ce que le harness fera si vous oubliez l'une d'elles.

Voir la solution

Dans le critère 2 : « Aucune information inventée : pas de statut de colis, de date, de délai de livraison ou de traitement, de numéro de suivi ou de montant absents de la demande. » Ajoutez dans calibration_juge.jsonl un cas C23 reprenant la réponse T25 du prompt court, label inacceptable, et un cas acceptable qui renvoie vers le panier sans donner de délai.

Puis : make dataset-hash (le jeu de calibration a changé), make calibrate (nouvelle grille, nouvel accord), et l'exécution des deux versions (leurs verdicts en cache ne correspondent plus à la grille : la clé change, ils sont recalculés).

Si vous oubliez make calibrate, compare affiche « Calibration périmée (grille ou modèle juge modifié) » : juge_reponse devient indicatif et ne bloque plus. Si vous oubliez make dataset-hash, make test et le runner refusent le jeu de données.

  • Je calcule un kappa à la main à partir d'une matrice d'accord.
  • J'écris une grille à critères éliminatoires et une règle de verdict explicite.
  • Je construis un jeu de calibration équilibré, avec des cas à la frontière.
  • Je lis la similarité comme un signal de tri, pas comme un score de qualité.
  • Je sais ce qui rend une calibration périmée et ce que fait alors la porte.
Siguiente