Il y a une semaine, nous avions publié qu'une génération récente de checkpoints RWKV était moins bonne que la précédente en appel d'outils. Le chiffre semblait solide : 29 contre 38 sur notre banc de 82 cas, dominé dans toutes les catégories, p = 0,012 en test apparié. Nous en avions tiré une leçon générale sur le progrès des modèles généralistes, qui ne serait pas monotone quand on regarde une capacité étroite.
La conclusion était fausse, et c'est notre propre protocole qui l'a produite.
Ce billet raconte comment on l'a découvert, ce que la correction a coûté, et ce qu'elle a révélé ensuite. C'est le troisième d'une série : le premier documentait un entraînement à 0,53 $ atteignant la parité avec un modèle cloud, le second cartographiait le plafond de ce petit modèle et le franchissait en changeant sa taille.
Nous avions partagé nos mesures brutes sur le Discord de RWKV, à la demande de Peng Bo, le créateur de l'architecture. 6 checkpoints, sans entraînement, dans notre protocole publié. Sa réponse tenait en trois mots : that's strange.
Puis un conseil. Notre gabarit de prompt force le modèle à produire du JSON dès le marqueur de réponse, et selon lui ça pouvait pénaliser les modèles récents, entraînés sur d'autres formats. Il a proposé une méthode pour vérifier : laisser le modèle produire des complétions libres depuis des amorces nues, et lire les formats d'appel de fonction qui en sortent. Le modèle raconte lui-même sur quoi il a été entraîné.
Nous l'avons fait. 24 complétions par checkpoint, température 1, aucun contexte. Un des checkpoints reconstruit spontanément des balises <tool_call> avec des rôles de conversation ; un autre produit des appels au format d'un grand fournisseur d'API, avec un chemin pour les appels multiples. Ni l'un ni l'autre ne ressemble à ce qu'on leur imposait.
Ces formats étaient d'ailleurs déclarés en clair dans le code d'un dépôt de l'écosystème, que nous n'avions pas lu. 3 checkpoints, 3 gabarits, et nous évaluions les trois avec celui qui convenait au plus ancien.
Nous avons réévalué chaque checkpoint dans son propre format, avec les réglages de décodage que l'écosystème recommande.
Les deux checkpoints récents gagnent 6 et 9 points. Le plus ancien, celui à qui notre format convenait déjà, en perd 3. C'est ce dernier chiffre qui fait tout le travail : sans lui, impossible de savoir si le gain vient du format ou des nouveaux réglages de décodage. Il vient du format.
Le classement s'en trouve changé. Le checkpoint que nous donnions pour une régression était au niveau de son prédécesseur ; celui de la génération suivante, que nous donnions pour équivalent, est nettement devant une fois interrogé correctement. La progression existait, notre protocole la cachait.
Nous avons publié la correction dans les deux articles précédents, avec sa date et son mécanisme, et nous l'avons annoncée dans le fil avant que quiconque ne la relève. Quand la mesure et la conclusion divergent, c'est la conclusion qui cède.
Il serait commode de tout mettre sur le dos du format. Les données ne le permettent pas.
Sur ces checkpoints bruts, quel que soit le gabarit, l'abstention reste à 0/17. Aucun modèle non entraîné n'a jamais marqué un point sur cette catégorie, sur aucun essai, en 12 jours de mesures. Le multi-étapes reste à 0/2 lui aussi. Ce que le format réparait, c'était la syntaxe : les sorties illisibles passent de 16 à 1 sur un checkpoint, de 26 à 2 sur l'autre. Le jugement, lui, ne bouge pas d'un point.
C'est la frontière que cette campagne a fini par dessiner, et elle sépare deux choses qu'on a l'habitude de confondre.
Le premier article montrait qu'un entraînement de 0,53 $, touchant 0,2 % des paramètres, faisait passer l'abstention de 0/17 à 17/17 en un seul epoch. Le second montrait que 135 exemples construits exactement contre 7 confusions de noms d'outils n'en corrigeaient aucune : les mauvaises réponses se déplaçaient vers d'autres mauvaises réponses.
Cette semaine, deux mesures de plus sont venues du même côté.
Nous avons évalué un hybride distillé, un transformer converti en architecture récurrente, dont le modèle enseignant se trouve être notre modèle de comparaison. Le avant et le après étaient donc exacts, sur le même juge.
L'enseignant sait parfaitement se taire, 17/17. L'élève distillé tombe à 4/17, et à 0/17 dans l'autre configuration testée. Interrogé sur une question qu'aucun outil ne peut traiter, il appelle une fonction de concaténation de texte et y fourre une explication sur les protocoles réseau. Sa capacité de contenu, en revanche, traverse plutôt bien : 17 arguments corrects sur 22, 14 sélections simples sur 18. Des scores respectables.
L'auteur de cet hybride avait posé sa prédiction avant la mesure : son jeu de distillation contient peu d'appels d'outils, tout est entraîné sur un objectif de divergence pure, et selon lui la distillation d'appel d'outils exige un entraînement où le modèle produit lui-même ses réponses. La mesure lui donne raison et précise où : ce qui ne traverse pas, c'est le réflexe.
La seconde mesure vient de l'autre bout. Faire raisonner le modèle avant l'appel dégradait tout, l'abstention chutant de 17/17 à 9/17 parce qu'il s'argumente lui-même vers l'action. Nous avons donc entraîné un état sur 2 920 exemples contenant un bloc de raisonnement, dont 425 où le raisonnement conclut explicitement qu'aucun outil ne convient. Visé droit sur le mécanisme observé.
Ça récupère du terrain, de 58 à 61. Ça reste 10 points sous la simple question directe, et l'abstention plafonne à 11/17 malgré les 425 refus raisonnés. Sur cette tâche, faire réfléchir le modèle avant qu'il décide coûte plus que ça ne rapporte.
Quatre mesures, quatre directions différentes, le même résultat. Un entraînement bon marché installe des dispositions et ne corrige pas les correspondances fines. Une distillation transporte les correspondances et perd les dispositions. Savoir ne rien faire ne se transmet pas comme une connaissance ; ça s'installe.
En chemin, deux choses qu'on ne cherchait pas.
La longueur du prompt nous coûtait cher. Notre bloc système contenait les schémas JSON complets des 40 outils présélectionnés, soit 34 000 caractères avant même la question de l'utilisateur. Remplacé par une ligne par outil, sur un modèle brut, le score passe de 28 à 48. Vingt points sans rien réentraîner. Mais la conclusion facile serait trompeuse : supprimer entièrement les descriptions coûte 9 points, dont l'essentiel en abstention. Ce n'est pas la longueur en soi, c'est la structure. Le modèle a besoin de savoir ce que font ses outils pour décider de ne pas les appeler.
Et nos entraînements gaspillaient du temps. Sur le dernier, nous avons évalué le point de sauvegarde du premier epoch en plus du modèle final : score identique. Les 2 epochs suivants n'ont rien apporté. Nous entraînions en 3 epochs par habitude, sans l'avoir jamais vérifié.
Un banc d'essai mesure deux choses à la fois : le modèle, et la manière dont on l'interroge. Tant qu'on évalue son propre modèle, entraîné sur son propre format, les deux se confondent sans dommage. Dès qu'on évalue un modèle qu'on n'a pas entraîné, l'écart entre les deux devient l'essentiel de ce qu'on mesure, et on ne le voit pas, parce que ça ressemble à un résultat.
Le garde-fou n'est pas compliqué : il faut un contrôle. Un modèle dont on sait qu'il convient au protocole en place, mesuré dans les deux conditions. S'il gagne autant que les autres, le changement de protocole explique tout. S'il perd, comme le nôtre a perdu ses 3 points, alors le gain des autres est réel. Sans ce contrôle, notre correction n'aurait été qu'une seconde conclusion aussi fragile que la première.
Le reste tient de l'hygiène : publier les générations brutes pour que quelqu'un puisse recompter, publier les chiffres qui dérangent parce que ce sont ceux qui informent, et se corriger avant qu'on vous corrige.
Ces trois derniers jours, ce banc a servi à autre chose qu'à nous. Nous avons mesuré des checkpoints que personne n'avait évalués sur cette tâche, dont un publié le matin même, à la demande de son auteur. Nous avons signalé un artefact de corpus, une grammaire de balises de jeu de rôle mémorisée mot pour mot qui remonte quand on gratte le modèle à vide, et l'auteur l'a reproduite lui-même en poussant plus loin que nous. Un contributeur va rejouer notre juge sur ses propres modèles distillés.
C'est un rôle modeste : mesurer proprement ce que d'autres construisent. Construire est plus gratifiant, mesurer honnêtement l'est moins, et c'est probablement pour ça qu'il reste de la place.
Tout est dans le dépôt du banc (miroir sur Forgejo) : le juge de 82 cas, les schémas d'outils, les générations brutes de chacune des 25 mesures de cette série, les sondes de format, les états entraînés avec leurs empreintes, les recettes de pod, et les scripts qui régénèrent les figures depuis les résultats commités. La campagne entière a coûté environ 35 $ de GPU loué.
Un trou dans le protocole ? Écrivez-nous : contact@scarletwolf.ai. Le précédent est arrivé dans un message de trois mots.