Un tiers de mes échecs n'en étaient pas
Inférence auto-hébergée — publié le 3 septembre 2026
Il y a deux jours, j’ai écrit que le rappel de ce système était passé par six valeurs en une semaine sans que le modèle change, et que la mesure était fausse à chaque fois.
C’était vrai, et insuffisant sur trois points.
Le chiffre que je citais ne portait pas sur le corpus auquel je l’attribuais. Un tiers des échecs relevés n’étaient pas des échecs du système. Et une partie du mouvement que j’attribuais à la mesure était une amélioration réelle.
Cette note remplace cette lecture. Je n’efface pas ce que j’ai écrit avant : je dis ce qui était faux et pourquoi.
Le système, en une phrase
Un pipeline d’extraction déterministe — normalisation, découpage, balayage par une liste fermée de formes verbales — suivi d’une classification par un modèle local à température zéro, sortie contrainte par grammaire. Le modèle renvoie des identifiants, jamais du texte.
La tâche n’est pas de répondre à « que dit ce corpus sur X ». Elle est de relever chaque énoncé contraignant sans en manquer. L’exhaustivité ne s’obtient pas par une recherche de similarité : aucun top-k ne la garantit.
La première correction : mauvais dénominateur
Le chiffre que j’avais publié valait 96 sur 145. Il avait été mesuré sur un paquet de référence, et je l’avais rapproché d’un corpus de vérité-terrain qui en compte 421. Deux mesures distinctes. Le chiffre était juste ; l’attribution ne l’était pas.
J’ai donc publié une note sur les mesures sans périmètre énoncé, en citant une mesure sans périmètre énoncé.
Le corpus lui-même avait aussi changé de forme entre-temps. Il comptait 492 lignes dans la version que je citais, il en compte 536 aujourd’hui, onze lignes ayant été scindées pour donner un verbatim intégral par ligne. Le nombre d’énoncés contraignants n’a pas bougé — 421, aucune exigence nouvelle — mais citer 492 revenait à citer un état remplacé.
Ce que dit le corpus réel
Mesure du 2 septembre 2026, sur les 421 énoncés marqués contraignants, dénominateur explicite.
| Classification | Nombre | Part de 421 |
|---|---|---|
| Correspondance exacte | 214 | 50,8 % |
| Dérive de bornage tolérée | 18 | 4,3 % |
| En-tête collé toléré | 7 | 1,7 % |
| Référence non atomique créditée | 73 | 17,3 % |
| Non trouvé | 109 | 25,9 % |
Rappel par inclusion : 312 sur 421, soit 74,1 %.
Sur ce même corpus, la mesure du 25 août donnait 59,1 % par inclusion et 43,7 % en correspondance exacte. Les quinze points gagnés depuis ne sont pas un artefact : ils viennent de trois correctifs réels — élargissement du vocabulaire de verbes, retrait d’une restriction de section, correction d’espaces insécables.
Ce point compte, et je l’avais écrasé la première fois. Une partie du mouvement était bien une amélioration du système.
Pourquoi le plafond est là
Les 109 énoncés non trouvés ont été comparés mécaniquement, jamais par un modèle, à l’ensemble des candidats réellement produits par le balayage. Chaque catégorie est déduite d’un mécanisme vérifié, pas postulée d’avance.
Bornage de phrase tronqué — 59 cas, 54,1 %. Le candidat s’arrête à un deux-points alors que l’énoncé se poursuit dans une énumération qui est grammaticalement l’objet du même verbe. Ou l’inverse : une longue proposition sans verbe précède le verbe réel, et le candidat démarre trop tard. Dans tous ces cas, le bon verbe est détecté, dans la bonne phrase. C’est une question de délimitation, pas de compréhension.
Référence non unitaire — 15 cas, 13,8 %. La ligne de vérité-terrain regroupe plusieurs occurrences distinctes : énumération d’alternatives compressée, citations séparées fusionnées par des ellipses. Aucun balayage ne peut faire correspondre un candidat à une ligne qui n’est la copie exacte d’aucun passage unique.
En-tête collé refusé — 8 cas, 7,3 %. Le balayage a produit la phrase attendue, mot pour mot, avec un en-tête de section accolé devant. Le comparateur tolère cet ajout, mais pas au-delà de huit mots ni s’il contient un signe de fin de phrase. Une référence de section en contient un.
Deux propositions regroupées — 13 cas, 11,9 %. La ligne couvre une proposition de déclenchement puis une proposition d’action. Le balayage produit un candidat par proposition quand chacune porte son verbe, mais aucun candidat ne couvre la ligne entière, et la part couverte tombe sous le seuil de majorité admis ailleurs.
Aucun verbe du vocabulaire — 14 cas, 12,8 %. Tournure passive, verbe hors de la liste balayée, impératif sans sujet.
Un tiers vient de l’instrument
Trois de ces cinq catégories ne décrivent pas un échec du système.
La référence non unitaire est un artefact du corpus qui sert à juger. L’en-tête collé est un défaut étroit du comparateur, et l’énoncé avait bien été trouvé. Les deux propositions regroupées tombent sous un seuil — et un seuil est une décision de conception de la mesure : déplacez-le, le rappel bouge, le système n’a pas changé.
Soit 36 cas sur 109. Un tiers.
Restent 73 vrais échecs de relevé. Le chiffre publié sous-estime donc le système, et il le sous-estime pour des raisons qui tiennent à l’instrument.
La catégorie qui n’est pas un défaut
Les quatorze énoncés sans verbe du vocabulaire méritent d’être distingués des autres.
Le balayage est une liste fermée d’une vingtaine de formes verbales. Une phrase qui n’en emploie aucune lui est invisible par construction, pas par défaut. Ce n’est pas un bug : c’est le prix d’un choix, celui d’un mécanisme énumérable et rejouable plutôt qu’un jugement statistique.
Savoir distinguer une limite de conception d’un défaut à corriger n’est pas une compétence d’ingénierie. C’est une compétence de décision, et elle décide où va le budget.
Corriger révèle
Une estimation figure dans l’analyse : corriger le détecteur de bornage ferait passer le rappel par inclusion de 74,1 % à environ 88,1 %, soit quatorze points.
Elle est annoncée comme un majorant, pas un plancher. Et la raison invoquée est la plus intéressante du rapport : les catégories « en-tête collé » et « deux propositions regroupées » existent précisément parce qu’un premier correctif a exposé un second défaut plus fin.
L’analyse des erreurs de mesure a produit ses propres erreurs de mesure, et le sait.
Deux mesures, un seul nombre
En construisant la table de réconciliation de toutes les valeurs de rappel en circulation, une chose est apparue qu’aucune méthode ne cherchait.
Il existe une seconde mesure à 74,1 %.
Elle n’a rien à voir avec la première. Périmètre groupé sur trois paquets au lieu d’un seul. Seuil de tolérance à 0,25 au lieu de 0,5. Date différente. Deux mesures sans relation, qui tombent sur le même nombre.
Une coïncidence numérique pure. Et le seul type de collision qu’une table de périmètres attrape, parce qu’un lecteur qui rencontre deux fois « 74,1 % » dans deux documents en conclura naturellement qu’il s’agit de la même chose.
C’est l’argument le plus court que je connaisse en faveur de l’énoncé du périmètre : un chiffre peut entrer en collision avec lui-même.
Il n’y a pas d’état courant unique
La table a produit un second résultat, plus important que le premier.
Six valeurs de rappel circulent sur ce système. Toutes les six sont traçables jusqu’à leur source. Aucune n’est fausse. Et aucune n’est le rappel du système, parce que le rappel se mesure par paquet de référence, pas globalement.
Deux sont périmées, non pas concurrentes : rien dans leur définition n’a changé, seul le code mesuré a changé entre-temps. Une porte sur un autre paquet, non rejoué depuis, donc ni périmée ni actuelle avec certitude. Et deux ne sont pas candidates à l’état courant du tout : elles emploient un seuil de tolérance relâché que la production n’a jamais adopté, produites par des outils diagnostiques supprimés après usage.
Cette dernière catégorie est celle qui demande le plus de discipline, parce que ses valeurs sont plus flatteuses que la mesure de production. Un chiffre plus beau, non étiqueté, dans un document interne, finit tôt ou tard dans une présentation sans son contexte.
La question « quel est le rappel de ce système » est donc mal posée. C’est une découverte désagréable et elle est solide.
La leçon, révisée
J’avais écrit : quand un indicateur bouge, le premier réflexe est de regarder le système, et c’est presque toujours le mauvais endroit.
C’est trop simple. Parfois c’est la mesure. Parfois c’est le système. Ici c’était les deux, la même semaine, sur le même chiffre.
Savoir lequel des deux a bougé est la compétence réelle. Aucun tableau de bord ne la fournit, et aucune valeur isolée ne permet de la déduire.
Ce que je ne peux pas conclure
Le corpus couvre un seul paquet de référence. Il prouve que le comparateur mesure la bonne chose et que les défauts trouvés sont réels. Il ne prouve rien sur d’autres types de documents.
Deux mesures restent absentes du registre. Le coût unitaire réel, dont aucune composante n’existe : ni consommation électrique, ni tarif appliqué, ni matériel amorti. Et les percentiles de latence sur le chemin applicatif — la table de journalisation existe depuis le 30 août, mais aucune exécution réelle ne l’a jamais alimentée, tout passant par le harnais de test.
Une note de la série Inférence auto-hébergée. Les mesures citées figurent au registre, avec leur date. Cette note corrige une lecture publiée le 1er septembre 2026.