Le quatrième article se terminait sur un aveu et une promesse. L'aveu : le correcteur de lecture qui faisait tomber le mur des 60 ne touchait pas à l'abstention, et le modèle restait mauvais, hors de son curriculum, pour la chose la plus élémentaire qui soit, se taire quand aucun outil ne convient. La promesse : c'était le chantier suivant.
Le voici, avec son résultat et son raté. Sur un juge neuf de cent cas, protocole gelé par un commit public antérieur à la moindre génération, une porte qui ne fait que lire l'état interne récupère seize des vingt abstentions que le modèle manque, pour un seul appel correct détruit. Le test de McNemar donne p = 3,1 × 10⁻⁵, et la mesure se réplique sur un second modèle, 18 sur 19, p = 7,6 × 10⁻⁶. Rien n'a été entraîné. Le chantier entier a coûté moins de quatre heures de GPU loué, dont zéro pour la partie découverte : tout venait d'états déjà payés par les articles précédents.
Et avant cette confirmation, il y en a eu une autre qui a échoué. D'un cas. Nous la publions aussi, parce que c'est elle qui a appris le plus.
Commençons par le fait qui rend ce chantier intéressant, et qui n'a rien à voir avec notre porte. Sur notre banc de tool-calling, un modèle doit parfois ne rien appeler du tout : la question relève de la connaissance générale, ou l'utilisateur demande explicitement de ne rien faire. Nous mesurons cette catégorie depuis le premier article.
Aucun modèle brut n'y arrive. Jamais. Quatre générations de checkpoints RWKV, quatre tailles allant de 1,5 à 13,3 milliards de paramètres, et le même zéro sur dix-sept. Le transformer de contrôle fait 4 sur 17. Multiplier les paramètres par neuf ne déplace pas ce chiffre d'un pouce, alors que la sélection d'outil, elle, progresse nettement avec la taille depuis la génération G1i.
Le state-tuning, lui, l'installe en un epoch et pour cinquante centimes : 16 ou 17 sur 17. C'était déjà le constat du deuxième article, et il s'est vérifié à chaque génération depuis. Mais cette réussite a une frontière que le troisième nous a appris à chercher : sur des cas neufs, écrits dans un autre style, la disposition retombe de moitié. Sept sur dix-sept, puis neuf sur dix-sept, puis dix sur trente sur le juge de cet article. Le modèle a appris à se taire là où on le lui a montré, pas ailleurs.
Deux faits, donc, et ils tirent dans des directions opposées. L'abstention ne s'hérite pas du pré-entraînement, à aucune échelle. Et elle s'installe mal, parce qu'elle s'installe localement. C'est exactement le genre de situation où il vaut la peine d'aller regarder à l'intérieur avant de fabriquer plus de données.
La méthode du quatrième article s'applique telle quelle. Au moment où le modèle doit décider, on prend son état interne et on demande à un classifieur trivial si « aucun outil ne convient » y est séparable de « un outil convient ».
Réponse : oui, à 0,95 - 0,99 d'aire sous la courbe, y compris sur les jeux où le comportement se trompe une fois sur deux. Même diagnostic qu'au papier précédent, un cran plus bas : ce n'est pas une lacune de représentation, c'est une lacune de lecture. Le modèle sait qu'il ne faut rien appeler ; il l'écrit quand même.
La direction que nous lisons ne demande aucune donnée nouvelle. Nous reprenons les centroïdes du correcteur de l'article précédent, calculés une fois pour toutes sur le corpus d'entraînement : un centroïde pour chacun des 231 outils, plus un centroïde « aucun outil ». La direction d'abstention est la différence entre ce dernier et la moyenne des 231 autres. Aucun juge n'intervient dans sa construction, et c'est ce qui la rend intéressante : elle sort du corpus, pas de l'examen.
Une remarque en passant, qui vaut peut-être plus que le reste pour qui sonde des activations. Le correcteur de noms du papier 4 lisait le mieux à la couche 27 sur le 7,2B. L'abstention, elle, se lit dès la couche 15. La décision de se taire est prise plus tôt que le choix du nom, ce qui est cohérent avec l'intuition mais que nous n'aurions pas parié.
Une leçon coûteuse du papier 4 sert ici de garde-fou. Nous y avions essayé un sélecteur qui choisit toujours, y compris l'option « aucun outil » traitée comme une 232ᵉ classe. Résultat : l'abstention s'effondrait de 16 sur 17 à 1 sur 17. Un centroïde parmi 232 ne modélise pas l'absence ; il faut une direction binaire dédiée.
La porte de cet article est donc volontairement asymétrique. Elle ne fait qu'une chose : forcer le silence quand la direction le dit. Elle n'invente jamais un appel, ne change jamais l'outil choisi, et ne peut pas casser une abstention que le modèle tenait déjà. Cette asymétrie n'est pas cosmétique, elle rend le test statistique unilatéral : les paires discordantes ne peuvent aller que dans un sens, ce qui interdit de gagner par compensation.
La première version de la porte fonctionnait, et elle était fausse. Le score d'une requête y était exprimé en écarts-types de la distribution des scores du lot évalué. Sur nos deux juges d'alors, elle rendait cinq points sans casser un seul appel correct. Un résultat propre, reproductible, et un piège.
Il s'est révélé quand nous avons voulu densifier le juge en cas d'abstention. Les points gagnés fondent à mesure que la part d'abstentions augmente : trois points quand elles font 21 % du juge, un point à 35 %, zéro à 50 %.
Le mécanisme est limpide une fois vu. Un seuil relatif au lot mesure la position d'une requête parmi ses voisines, pas sa nature. Quand les abstentions deviennent majoritaires, la moyenne du lot monte, le seuil monte avec elle, et la porte cesse de déclencher précisément sur ce qu'elle devait attraper.
Le remède tient en un mot : centrer par le corpus au lieu du lot. Le score d'une requête ne dépend alors d'aucune autre requête, la décision se prend une par une, et l'aire sous la courbe ne bouge pas. C'est une bonne nouvelle au-delà de notre cas, parce que c'est la version déployable : un service en production ne voit pas ses requêtes par paquets représentatifs.
Nous en tirons une règle que nous appliquerons ailleurs : d'une distribution à l'autre, on transporte une direction, pas une valeur. La direction d'abstention traverse quatre juges et deux tailles de modèle sans faiblir. Le seuil, lui, ne traverse rien tant qu'on ne l'a pas exprimé dans des unités qui ne dépendent pas de ce qui l'entoure.
Deuxième piège, découvert en essayant de calibrer proprement. Notre premier jeu de calibration était celui où le modèle réussit tout : 17 abstentions sur 17. Séparation parfaite entre les deux classes, donc aucune frontière à trouver, seulement un trou, et le milieu d'un trou est arbitraire. Résultat : deux couches sur trois ne déclenchaient plus jamais.
Il fallait donc un jeu de calibration où le modèle échoue. D'où la structure définitive du protocole : le juge est scindé en deux moitiés tirées d'avance, une moitié de calibration, où le seuil se cale sur de vraies erreurs, et une moitié de verdict, qui ne sert qu'une fois. La moitié de calibration est étiquetée et visible ; c'est ce détail qui va sauver la suite.
Tout étant gelé par un commit public, nous avons fabriqué un juge neuf de cent cas et joué la confirmation. Elle a échoué.
Cinq abstentions récupérées sur six récupérables, p = 0,0625 pour une barre à 0,05. Pas de mauvaise surprise sur le comportement de la porte, au contraire : 83 % du récupérable, exactement ce qu'elle faisait partout ailleurs. Ce qui manquait, c'était la matière. Six erreurs à récolter, là où le calcul de puissance en supposait douze.
La cause est une erreur de méthode que nous n'avions pas vue venir. La puissance avait été estimée par ré-échantillonnage des anciens juges, ce qui revient à supposer que des cas neufs seraient aussi difficiles que les anciens. Ils ne l'étaient pas : 24 % d'échec d'abstention, contre 47 et 59 % sur les juges précédents. Nous avions, sans le vouloir, écrit un examen facile.
Un critère pré-enregistré sert exactement à ça. Sans lui, un résultat à 83 % du récupérable se raconte très bien. Avec lui, c'est un échec, et il est publié comme tel.
Le réflexe aurait été d'agrandir le juge. C'est le mauvais.
En regardant quelles questions font échouer les modèles, la réponse saute aux yeux : sur cinquante cas d'abstention, vingt-trois étaient tenus par les deux modèles testés. Salutations, remerciements, bavardage, demandes trop vagues pour être exécutées. Du remplissage. Ces cas ne mesurent rien, et ils coûtent de la puissance en diluant l'examen.
Les familles qui font réellement trébucher un modèle state-tuné, elles, se laissent identifier proprement : le travail sur un texte déjà fourni dans le tour, de loin la plus dure, où le modèle part chercher un outil de lecture alors que le texte est sous ses yeux ; les questions sur le tour précédent ; l'hypothétique, « si je te demandais d'effacer tout » ; la rétractation et l'interdiction explicite d'agir ; la lecture de syntaxe, du genre « ça veut dire quoi, /15 * ».
Le juge suivant garde ces familles et jette le reste. Même taille, cent cas, même règle de porte au caractère près. Les erreurs récoltables passent de six à vingt.
Et pour que la leçon ne dépende plus de notre vigilance, elle est devenue mécanique. Le protocole comporte désormais un verrou de puissance : après la génération, avant que la moitié de verdict ne soit scorée, on compte les erreurs récoltables sur la moitié de calibration, qui est visible de droit. Sous le seuil fixé d'avance, on ne score pas, on le dit, on durcit le juge, et la cartouche n'est pas grillée. Sur la seconde tentative, ce compte valait dix-sept pour un seuil à douze. Feu vert.
| 7,2B (modèle principal) | 2,9B (réplication) | |
|---|---|---|
| abstentions tenues sans aide | 10/30 | 11/30 |
| erreurs récupérables | 20 | 19 |
| récupérées par la porte | 16 (80 %) | 18 (95 %) |
| McNemar exact | p = 3,1 × 10⁻⁵ | p = 7,6 × 10⁻⁶ |
| appels corrects détruits (sur 20) | 1 | 2 |
| abstention finale | 26/30 | 29/30 |
Un seul scoring, la règle de la porte inchangée entre les deux tentatives, et un second modèle qui réplique sans que rien n'ait été calibré sur lui.
Une question fait tomber les deux modèles : « ne garde pas ça en mémoire, c'est de la réflexion à voix haute ». La requête parle de mémorisation, et ni la génération ni l'état ne distinguent parler d'une action de la demander. Ce n'est pas un seuil à ajuster, c'est une frontière de sens, et elle nous paraît plus intéressante que le résultat lui-même.
Le coût de la porte a la même signature. L'appel qu'elle détruit chez les deux modèles est « qu'est-ce que tu m'as promis et qui n'est pas tenu ? », une question sur un état interne, qu'elle prend pour de la conversation. Sur le juge précédent, c'étaient les questions de date. Toujours le même motif : ce qui ressemble à une conversation mais appelle une lecture d'état.
Un lecteur de notre banc posera la question suivante, et il aura raison : nos juges tournent sur le bloc système d'origine, les schémas JSON complets des quarante outils du retriever, alors que nous avons adopté en juillet le catalogue officiel G1x, trois fois plus court et à score égal. Le trou d'abstention serait-il un artefact du prompt long plutôt qu'un fait sur le modèle ?
Rejouer la moitié de verdict dans l'autre format serait exactement la faute que tout ce protocole interdit. Mais la moitié de calibration, elle, est visible de droit : nous l'avons rejouée, une seule variable changée, le bloc système, qui passe de 20 600 à 8 500 caractères.
| 30 abstentions de calibration, 7,2B tuné | schémas complets | catalogue officiel G1x |
|---|---|---|
| abstentions tenues | 13/30 | 13/30 |
| erreurs récoltables | 17 | 17 |
| cas d'appel corrects (sur 20) | 16/20 | 17/20 |
Le même chiffre, deux fois. Deux cas seulement sont tenus en G1x et pas en JSON complet, deux dans l'autre sens, McNemar p = 1,0 : l'identité des cas bouge un peu, le taux ne bouge pas. Diviser le préfill par deux et demi ne change rien à la capacité du modèle à se taire. Le trou est un fait sur le modèle, pas sur notre harnais.
Le lot de référence du centrage est notre corpus d'entraînement, pas du trafic réel : la tenue en production n'est pas établie, seulement rendue plausible par le fait que la décision est désormais indépendante du lot. Les 231 outils sont les nôtres. La règle a traversé un changement de distribution, quatre juges, et un changement de taille, 2,9 contre 7,2 milliards, mais pas un changement de lignée de modèle. Le juge de confirmation contient 60 % d'abstentions par construction, donc ses scores globaux ne se comparent à aucun de nos chiffres publiés sur 82 cas ; seul l'effet de la porte se compare. Et comme depuis le début, tout ceci vit dans le runtime natif : le format GGUF ne donne pas accès aux états internes.
Le coût marginal est le même qu'au papier précédent, c'est-à-dire presque rien. L'état existe déjà à la fin du préfill ; la porte ajoute un produit scalaire contre une seule direction, avant même la shortlist. Elle se combine avec le correcteur de noms sans conflit, puisqu'elle décide en amont et ne peut que forcer le silence.
Pour qui fait tourner un petit modèle en local, l'enchaînement des deux derniers articles dessine une même stratégie : plutôt que de fabriquer des données pour corriger un comportement, aller voir si l'information est déjà dans l'état, et si oui, la lire. Deux fois sur deux, elle y était.
La suite fait l'objet d'un sixième article : le résidu venait d'un trou dans les données d'entraînement, la première prédiction pré-enregistrée de la série le répare aux deux échelles, et sur le même juge, la lecture bat l'enseignement au coût.
Le banc public contient le protocole de la porte, les corpus de centroïdes, les scripts de figures et les résultats bruts : rwkv-toolcaller-bench, miroir Forgejo. Les deux pré-enregistrements, celui de la tentative ratée et celui de la confirmation, sont horodatés par des commits antérieurs aux runs, avec leurs empreintes. Les juges restent privés pour rester des instruments ; leur protocole de construction, lui, est publié, y compris la règle de densité et le verrou de puissance.
Un mot sur la reproductibilité, d'ailleurs, qui concerne toute la communauté RWKV et pas seulement nous : les checkpoints de base sur lesquels reposent tous les chiffres de cette série ont été supprimés du dépôt Hugging Face pendant l'écriture de cet article, à l'occasion d'une nouvelle publication. Les scripts qui les tiraient depuis la branche courante sont morts du jour au lendemain. Hugging Face conserve l'historique : il suffit d'épingler la révision, ce que nous avons fait sur tous nos scripts, en vérifiant que le fichier ainsi obtenu correspond bien à l'empreinte de nos mesures publiées. Si vous rejouez de vieux résultats RWKV et qu'ils échouent sur un fichier introuvable, c'est probablement ça.
Un trou dans le protocole ? Une explication concurrente ? Écrivez-nous : contact@scarletwolf.ai. C'est à ça que sert la publication.