ISMS Copilot
Engineering

Le zéro silencieux : quand une note de juge manquante devient une mesure

Lors de notre ablation du 17 juillet 2026 sur les stratégies de génération de documents GRC (GLM-5.2 et Claude Opus 4.8 en tant que rédacteurs et juges selon une grille de 1 à 10), le passage 2 comptait 79 lignes de jugement sur 446 sans note globale. L'agrégateur les a comptées comme des 0. Ce remplissage par des zéros avait artificiellement créé un écart de 3,25 points dans le passage 1, et lorsque cet écart a disparu, nous avons élaboré une théorie sur un biais des juges pour l'expliquer. L'écart apparié entre les deux juges sur les mêmes documents était de 0,12.

par ISMS Copilot··17 min read
Le zéro silencieux : quand une note de juge manquante devient une mesure

Le nombre le plus dangereux dans une évaluation jugée par LLM n'est pas un score biaisé. C'est un score manquant, car un agrégateur permissif le transforme en zéro sans vous en informer, et vous construisez ensuite une théorie pour expliquer ce zéro. Nous le savons parce que nous l'avons fait deux fois dans la même évaluation. Lors d'une ablation hors ligne conclue le 17 juillet 2026, nous avons comparé dix stratégies de génération pour des livrables GRC (packs de politiques, registre des traitements RGPD, analyse des écarts SOC 2, politique IA ISO/IEC 42001, classification selon l'AI Act UE), notés à l'aveugle par deux modèles de jugement selon une grille de 1 à 10. Le passage 1 indiquait qu'un rendu complet d'un livrable en une seule passe surpassait un rendu étape par étape de 3,25 points. Le passage 2 a vu cet effet s'effondrer à 0,66, et notre propre note méthodologique a diagnostiqué cet effondrement comme un artefact du juge : un modèle de juge était « 1,5 à 2 points plus indulgent » que l'autre. Les deux conclusions étaient le même bug. Soixante-dix-neuf des 446 lignes de jugement du passage 2 ne comportaient pas de champ overall, le réducteur appliquait Number(r[d]) || 0, et chaque moyenne globale dans la feuille de score du rapport, ainsi que les deux chiffres clés liés aux cadres réglementaires, sont reproduits exactement en traitant ces 79 lignes comme des zéros. Nous appelons cela le zéro silencieux, et cet article explique ce qu'il nous a coûté et ce que nous vérifions désormais.

L'évaluation et ses résultats

La configuration était classique pour ce type de travail. Neuf scénarios figés, tous synthétiques et construits autour d'une entreprise fictive de SaaS berlinoise de 20 personnes (un dixième, une note de diligence fournisseur, était présent dans le fichier de fixtures mais n'a pas été rendu dans les passages analysés ici), tirés des cas les plus complexes d'écriture de conformité que nous rencontrons : un rapport d'audit interne à plusieurs sections, un pack de politiques à plusieurs documents, un registre des traitements RGPD Art. 30, des tâches lourdes en cadres réglementaires sur SOC 2, ISO/IEC 42001 et l'AI Act UE, une politique ancrée dans l'espace de travail, une série de douze documents, un brief au périmètre ambigu. Dix variantes modifiaient la stratégie de génération : rendre un brief pré-approuvé section par section étape par étape, rendre le même brief en une seule passe, régénérer le brief avec un planificateur plus strict en amont, écrire librement à partir de la tâche client sans brief, ajouter une boucle de réflexion critique-révision, et échanger le modèle rédacteur. Les deux modèles rédacteurs étaient z-ai/glm-5.2 et anthropic/claude-opus-4.8, tous deux appelés via OpenRouter en juillet 2026. Jusqu'à trois essais par scénario et variante dans le passage 2 ; deux variantes n'étaient que partiellement peuplées (la variante de brief régénéré à 18 rendus et la réexécution hors ligne par étapes à 17, contre 27 pour les autres variantes nouvellement rendues), et la référence capturée est un ensemble unique de neuf documents.

Le jugement était aveugle et absolu : chaque juge voyait la tâche client et un document, jamais la variante ni le modèle rédacteur, et devait retourner un JSON strict avec cinq sous-scores (exactitude, exhaustivité, profondeur, citations, honnêteté), un overall, une liste de drapeaux de fabrication, et un verdict en une ligne. Deux modèles de jugement, les mêmes que les rédacteurs. Le passage 1 utilisait une affectation anti-préférence personnelle, le juge GLM pour les variantes écrites par Claude et le juge Claude pour les variantes écrites par GLM, car la préférence personnelle des évaluateurs LLM est documentée : Panickssery, Bowman et Feng ont montré que les évaluateurs LLM reconnaissent et favorisent leurs propres générations (arXiv:2404.13076, 15 avril 2024), et Zheng et al. ont répertorié des biais d'auto-amélioration, de position et de verbosité dans les configurations LLM-as-a-judge (arXiv:2306.05685, 9 juin 2023). Le passage 2 a appliqué les deux juges à chaque variante et a fait la moyenne, ce qui est une meilleure conception.

Le résultat principal du passage 1, issu de la feuille de score : le rendu ciblé en une seule passe a obtenu une note globale de 7,56 contre 4,31 pour le rendu étape par étape du même brief sur le même modèle. Un effet de topologie de 3,25 points. Le résultat principal du passage 2 : cet effet était de 0,66, l'écriture libre à partir de la tâche était la meilleure variante, et la conception étape par étape était en bas du classement en qualité et la pire en honnêteté et en fabrication. La note méthodologique du rapport expliquait l'écart entre les passages : juger des variantes différentes avec des juges différents avait rendu les scores absolus incomparables, car le juge GLM était environ 1,5 à 2 points plus indulgent que le juge Claude. « Ne jamais comparer les scores absolus des juges LLM entre des variantes jugées par des modèles différents » était la leçon retenue. Cela semblait juste. Ce n'était pas ce que disaient les données.

Ce que contenaient réellement les lignes

Le 19 août 2026, nous avons relu le fichier brut des jugements, ligne par ligne, au lieu de la feuille de score. Sur les 446 lignes uniques (scénario, variante, essai, juge) enregistrées dans le passage 2 (sur 466 prévues ; 20 jugements prévus n'ont aucune ligne, ce que le harnais a enregistré comme des échecs et correctement exclus de toute moyenne), 79 n'avaient pas de clé overall, soit 18 %. Elles se répartissaient en deux catégories. Soixante-cinq lignes étaient des jugements complets moins un champ : tous les cinq sous-scores présents, les drapeaux de fabrication présents, le verdict en une ligne présent, et pas de overall. Le juge avait retourné le JSON demandé avec une clé manquante, celle qui se trouvait entre honesty et fabrication_flags dans le schéma demandé. Quatorze lignes étaient des objets JSON sans aucun champ de grille, que le parseur a acceptés car il acceptait tout objet JSON. L'absence n'était pas uniformément répartie entre les juges : dans notre exécution, 56 des 229 lignes du juge Claude (24 %) n'avaient pas de overall, toutes de type partiel, et 23 des 217 lignes du juge GLM (11 %) n'en avaient pas, dont 9 partielles et les 14 objets vides. Nous n'avons pas enquêté sur les raisons ; notre invite du juge, la gestion du mode JSON sur la route que nous avons utilisée, et la limite de sortie de 1 200 tokens sont autant de candidats, et le taux est une propriété de notre appel, non une affirmation sur l'un ou l'autre fournisseur.

L'agrégateur a ensuite fait ce que tout code TypeScript naturel aurait fait :

for (const d of dims) out[d] = Number(mean(js.map((r) => Number(r[d]) || 0)).toFixed(2));

Une ligne sans overall devenait un 0 dans une colonne où chaque valeur réelle se situait entre 1 et 10, et la distribution valide était fortement concentrée en haut (sur les 367 scores overall valides, 299 étaient de 8 ou plus). Un zéro dans une cellule de seize lignes déplace la moyenne d'environ un demi-point aux niveaux de score que nous avons observés. Huit zéros dans une cellule de seize la divisent par deux.

Voici la feuille de score du passage 2 telle que publiée, à côté des mêmes lignes avec les scores manquants traités comme tels. Les deux juges, tous les scénarios, score global sur 10 :

VarianteScore global publiéScore global validen valide / n juges
Rendu étape par étape du brief, sorties de référence capturées6,567,5014 / 16
Rendu étape par étape du brief, réexécution hors ligne (GLM-5.2)6,128,0825 / 33
Rendu du brief en une seule passe (GLM-5.2)6,788,0742 / 50
Rendu du brief en une seule passe + réflexion (GLM-5.2)7,028,1444 / 51
Brief régénéré + rendu en une seule passe (GLM-5.2)6,327,6828 / 34
Écriture libre à partir de la tâche (GLM-5.2)6,388,3040 / 52
Écriture libre + réflexion (GLM-5.2)6,087,7141 / 52
Rendu du brief en une seule passe (Claude Opus 4.8)7,458,5946 / 53
Rendu du brief en une seule passe + réflexion (Claude Opus 4.8)6,568,5340 / 52
Écriture libre à partir de la tâche (Claude Opus 4.8)7,538,4947 / 53

Tous les scores globaux publiés dans ce tableau sont les moyennes remplies par des zéros arrondies à deux décimales. Les dix variantes qui semblaient s'étendre de 6,08 à 7,53 s'étendent en réalité de 7,50 à 8,59, une plage d'environ un point, et les quatre meilleures variantes sont à moins de 0,3 point les unes des autres. Le résultat principal lié aux cadres réglementaires, celui sur lequel le rapport s'est le plus appuyé (« libre Claude 8,06 contre brief 6,59 ; libre GLM 7,19 contre brief 6,40 »), devient 9,06 contre 8,62 (16 et 13 lignes valides) et 8,85 contre 8,73 (13 et 11). Un écart de 1,47 point devient 0,44 ; un écart de 0,79 point devient 0,12.

Le passage 1 est le cas le plus flagrant. Les 4,31 du rendu étape par étape provenaient de seize lignes du juge Claude dont huit n'avaient pas de overall ; les huit qui en avaient donnaient une moyenne de 8,62. Les 7,56 du rendu ciblé provenaient de dix-huit lignes dont deux manquaient ; les seize valides donnaient une moyenne de 8,50. L'écart de 3,25 points de topologie qui a lancé toute l'enquête était, sur les lignes qui portaient un score, de moins 0,12.

La théorie que nous avons construite sur ce bug

C'est la partie à bien intérioriser, car le bug lui-même est banal. Lorsque le passage 2 n'a pas reproduit le passage 1, nous avons fait ce que font les personnes prudentes : nous avons cherché un mécanisme. La conception anti-préférence personnelle signifiait que les variantes écrites par Claude et GLM dans le passage 1 avaient été notées par des juges différents, les biais documentés des juges LLM rendaient plausible l'idée que « les juges diffèrent par leur sévérité », et une feuille de score où les variantes jugées par Claude étaient basses et celles jugées par GLM étaient hautes semblait mesurer quelque chose. Nous avons donc noté un écart de sévérité de 1,5 à 2 points et une règle interdisant de comparer les scores absolus entre juges.

Les lignes brutes nous permettent de tester directement cette théorie, car le passage 2 avait les deux juges noter le même document. Sur les 148 paires (scénario, variante, essai) où les deux juges ont retourné un overall, l'écart moyen GLM-moins-Claude était de +0,12. Soixante-treize paires étaient identiques, 41 avaient GLM plus élevé d'un point, 17 avaient Claude plus élevé d'un point, et 17 différaient de deux points ou plus. Dans les données du passage 1, le même écart apparié était de moins 0,06 sur 72 paires. Parmi les 148 paires complètes, il n'y a aucun signe d'un écart de sévérité de 1,5 point. Ce qu'il y avait : des valeurs manquantes, en deux couches. Entre les juges, 24 % des lignes d'un juge n'avaient pas de overall contre 11 % pour l'autre, et l'affectation anti-préférence personnelle a placé le juge au taux le plus élevé sur toutes les variantes écrites par GLM, de sorte qu'en tant que groupe, ces variantes ont collecté plus de zéros, ce qui a fait baisser leurs scores dans les comparaisons inter-groupes. Au sein d'un même juge, l'absence variait selon la variante : les deux variantes du résultat principal du passage 1 étaient toutes deux écrites par GLM et jugées par Claude, et elles comptaient huit contre deux lignes sans overall. L'« effet de topologie » de 3,25 points n'a jamais été une comparaison entre juges. Nous avions interprété l'absence comme de la sévérité, et l'explication était suffisamment satisfaisante pour que personne n'ouvre le fichier.

Voilà la forme générale du zéro silencieux. Une valeur manquante coercée en un nombre ne ressemble pas à une erreur ; elle ressemble à un faible score, et les faibles scores appellent des explications. Un juge avec un écart de sévérité constant est une défaillance bien plus douce : l'écart s'annule dans toute comparaison intra-juge et apparaît immédiatement dans un contrôle apparié. Une cellule remplie de zéros n'est pas cohérente. Elle évolue en fonction de la fréquence à laquelle le parseur a échoué dans cette cellule, et dans nos données, ce taux était corrélé à la variante.

Ce qui a survécu

Tout dans le rapport n'était pas faux, et la séparation est instructive. Les soixante-cinq lignes partielles comportaient toujours honesty et fabrication_flags, donc ces deux colonnes n'ont perdu que les quatorze lignes vides. Recalculés sur les lignes avec une valeur valide pour honesty, la référence capturée du rendu étape par étape conserve toujours la plus faible honnêteté (5,81 sur 16 jugements) et des drapeaux de fabrication sur 16 des 16, tandis que la variante d'écriture libre de Claude obtient la plus forte honnêteté (9,75 sur 52) et des drapeaux sur 1 des 52. Cet écart est réel. Le classement en qualité s'est en grande partie dissous en une plage d'un point, et l'affirmation selon laquelle « l'écriture libre bat le rendu guidé par un brief » est passée d'un résultat principal à +0,23 pour GLM-5.2 (8,30 contre 8,07) et -0,10 pour Claude Opus 4.8 (8,49 contre 8,59). L'affirmation selon laquelle « la réflexion nuit » s'est maintenue pour l'écriture libre GLM (7,71 avec réflexion contre 8,30 sans) et s'est annulée pour le rendu guidé par un brief de Claude (8,53 contre 8,59). Nous n'avons pas relancé l'ablation ; les conclusions tirées par le rapport sont en cours de recalcul à partir des lignes valides, et les leçons méthodologiques que nous avons réellement apprises sont ci-dessous.

Il existe également une lecture en termes de conformité, et elle n'est pas anodine. L'article 9.1 b) de l'ISO/IEC 27001:2022 exige qu'une organisation détermine les méthodes de surveillance, de mesure, d'analyse et d'évaluation de manière à garantir des résultats valides, et indique que les méthodes sélectionnées doivent produire des résultats comparables et reproductibles pour être considérées comme valides (ISO/IEC 27001:2022, article 9.1, édition 2022-10). Un auditeur interne qui constaterait qu'un tableau de bord de performance d'un SMSI a été en moyenne des cellules vides comme des zéros pourrait soulever une non-conformité contre cette clause. Une feuille de score d'évaluation qui guide une décision architecturale est, par analogie, une méthode de mesure au même titre, et nous l'avons tenue à un standard inférieur à celui que nous appliquerions à un client.

Limites

Il s'agit d'une ré-agrégation des jugements que nous avions déjà, et non d'une nouvelle exécution, et les nombres de lignes valides héritent de toutes les limites de l'original : neuf scénarios, jusqu'à trois essais, des scores entiers de deux juges LLM concentrés entre 8 et 9, aucun test de significativité, et un juge qui est lui-même un modèle. Les cellules de lignes valides vont de 14 à 47 jugements par variante sur l'ensemble des scénarios et de 4 à 16 sur le sous-ensemble lié aux cadres réglementaires ; les scores valides ont un écart-type de 1,36, donc une erreur standard naïve au niveau des lignes pour une moyenne par variante (1,36 sur la racine carrée de n, sans tenir compte du fait que les juges sont appariés et que les essais sont regroupés par scénario) est d'environ 0,2 à 0,4, et nous considérons les différences inférieures à environ un demi-point entre variantes comme des égalités. Les taux d'absence de overall sont ce que nous avons observé avec notre invite via une route en juillet 2026, avec une limite de 1 200 tokens et le mode JSON demandé ; nous n'avons pas isolé la cause et ne savons pas si elle est stable. L'écart apparié des juges de 0,12 est spécifique à cette grille et à ces documents. Aucun de ces éléments ne change le fait central, qui ne dépend d'aucune de ces mises en garde : la colonne des scores globaux publiés a été calculée avec 18 % de ses lignes coercées en zéros, et les deux conclusions qui en ont été tirées ne résistent pas à leur suppression.

Le zéro silencieux, et une liste de contrôle

L'idée à retenir : dans une évaluation jugée par LLM, un appel au juge qui ne retourne pas de score n'est pas un point de données, et tout agrégateur capable de le transformer en l'un d'eux le fera tôt ou tard dans la cellule où cela compte le plus. Les atténuations des biais des juges valent la peine d'être mises en œuvre, mais elles sont sans valeur tant que vous n'avez pas compté vos valeurs nulles. Si vous exécutez une évaluation où un modèle note la sortie d'un autre modèle, appliquez cette liste :

  • Ne jamais coercer un score manquant. Number(x) || 0, x ?? 0, fillna(0) sur une colonne de score : tout cela transforme un jugement absent en un score inférieur au minimum de la grille, pire que tout jugement que la grille autorise. Traitez l'absence comme une absence (pandas ignore les NaN par défaut dans une moyenne ; notre réducteur fait maison ne le faisait pas) et faites échouer la feuille de score de manière visible si le nombre de lignes valides d'une cellule est inférieur à ce que vous aviez pré-enregistré.
  • Affichez n valide à côté de chaque moyenne. Une cellule qui affiche « 4,31 » et une cellule qui affiche « 4,31 (8/16) » ne font pas la même affirmation. La nôtre affichait n comme le nombre de lignes, ce qui masquait le fait qu'une moitié d'une variante n'avait pas de score.
  • Validez la sortie du juge contre le schéma et relancez. Un objet JSON n'est pas un jugement. Exigez tous les champs notés, rejetez et relancez en cas d'erreur, et enregistrez le taux d'erreur par juge et par variante. Un taux d'erreur qui diffère selon le juge ou la variante est en soi une découverte, et dans notre cas, c'était la découverte.
  • Avant de théoriser sur un biais des juges, calculez l'écart apparié. Si deux juges ont noté les mêmes documents, la différence sur ces paires est l'écart de notation entre eux sur cette tâche. Le nôtre était de 0,12 sur des paires complètes. Une histoire de 1,5 point que vous n'avez pas obtenue à partir de paires appariées est une histoire.
  • Traitez une taille d'effet invraisemblable comme une erreur de données en premier. Un écart de 3,25 points entre deux rendus du même brief sur le même modèle, avec des scores concentrés entre 8 et 9 et seize à dix-huit lignes par variante, était invraisemblablement grand par rapport à la distribution observée et aurait dû nous envoyer vers les lignes avant que nous cherchions un mécanisme.
  • Si vous échangez les juges par variante, vous échangez également leurs modes de défaillance. L'affectation anti-préférence personnelle est une conception défendable, mais tout défaut spécifique au juge (échecs de parse, troncature, refus) est alors confondu avec le traitement. Faire noter chaque juge sur chaque variante est plus sûr, et cela ne vous sauve pas non plus des zéros.
  • Recalculez le résultat principal à partir du fichier brut avant que le rapport n'écrive une théorie. La feuille de score est une vue. Les lignes sont les preuves. Notre rapport citait la feuille de score, expliquait son propre artefact par un mécanisme, et ancrait ce mécanisme comme une leçon. Le mécanisme était une clé manquante.

Tous les chiffres ci-dessus sont nos propres mesures sur nos propres fixtures GRC synthétiques (une entreprise fictive, aucune donnée client), rédacteurs et juges z-ai/glm-5.2 et anthropic/claude-opus-4.8 tels que servis via OpenRouter pour le rendu et le jugement, ablation conclue le 17 juillet 2026, ré-agrégée à partir des jugements enregistrés le 19 août 2026.

Articles connexes