Recherche en IA · Benchmarks de sortie structurée
LFM2.5-350M gagne 14 points sur le JSON. Le YAML ne bouge presque pas
Une session GRPO de 100 étapes a fait passer LFM2.5-350M de 22,6 % à 29,7 % sur le benchmark de schémas IFStruct. Le JSON a gagné 14 points, le YAML 0,3, et le principal mode d'échec n'a pratiquement pas bougé.
Emmanuel Fabrice Omgbwa Yasse Assisté par IA
2026-09-17 · 5 min de lecture

Le bond de 7 points, et les 70 % qui échouent toujours
L'exécution de référence servait le LFM2.5-350M de LiquidAI via llama.cpp en BF16 et le confrontait aux 2 000 items de test d'IFStruct. Il en a réussi 452, soit 22,6 %, avec une latence moyenne de 1 453 ms. Le blog de publication d'IFStruct rapporte 21,1 % pour le même modèle, un écart assez faible pour que le notebook réutilise le chiffre local comme référence fixe : tous les chiffres à partir de ce point proviennent d'une pile de service identique, de sorte que la comparaison mesure l'entraînement plutôt que l'infrastructure.
Puis sont venues 100 étapes de GRPO sur environ 500 échantillons d'entraînement. Le checkpoint fusionné a réussi 594 items sur 2 000, soit 29,7 %, à 1 518 ms. C'est un gain de 7,1 points, et le modèle affiné renvoie toujours quelque chose que l'évaluateur rejette environ sept fois sur dix.
Le décompte des erreurs montre où se situent ces échecs. Les deux exécutions sont dominées par un même reproche : « required field missing », enregistré 7 228 fois sur le modèle de base et 7 331 fois après l'entraînement. Les nombres d'items incorrects sont passés de 738 à 890, les incompatibilités de type de 540 à 555. Deux types d'erreurs disparaissent toutefois. L'exécution de base enregistrait 317 blocs de code non fermés et 170 blocs de code manquants ; aucun des deux n'apparaît dans le décompte du modèle affiné, ce qui est le résultat que la conception du prompt visait à produire.
Pourquoi la conformité de schéma mérite son propre tableau de scores
La sortie structurée est l'une des choses les plus fréquemment demandées à un modèle de langage, et l'une des moins mesurées pour elle-même. La plupart des suites intègrent la validité dans un score plus large de raisonnement ou d'extraction, si bien qu'un modèle qui produit la bonne réponse dans une forme non analysable peut obtenir le même score qu'un modèle qui n'a jamais trouvé la réponse. IFStruct mesure la forme. Le benchmark teste si la sortie est valide, analysable et conforme au schéma demandé, la question qui détermine si un modèle peut être branché à un système en aval.
Le harnais et le jeu de données sont ouverts : le code se trouve dans le dépôt Liquid4All/ifstruct, et la version 1.0 du jeu de données est publiée sous LiquidAI/ifstruct-v1.0. La source précise explicitement que ce notebook n'est pas le pipeline derrière le modèle RL du blog IFStruct, et qu'il ne cherche pas à reproduire le score publié. C'est une démonstration qu'un affinage étroit et spécifique à une tâche peut rapprocher un petit modèle des performances d'un modèle bien plus grand.
Six millions de paramètres entraînables sur un GPU gratuit
L'ensemble tient sur un GPU Colab ou Kaggle de 16 Go en offre gratuite. Les données d'entraînement proviennent de nvidia/Nemotron-RL-instruction_following-structured_outputs, un jeu qui associe à chaque prompt un JSON Schema cible et un nombre de champs attendu ; environ 500 échantillons ont été utilisés. L'adaptateur est un LoRA de rang 16 avec alpha 32, et comme LFM2.5 repose sur une architecture hybride d'attention et de convolution, il cible des noms de modules propres à cette conception : q_proj, k_proj, v_proj, out_proj, in_proj, w1, w2, w3. Cela entraîne environ 6 millions de paramètres, soit près de 1,66 % du modèle.
La distribution de Nemotron ne correspond pas à celle d'IFStruct, aussi les prompts ont-ils d'abord été modifiés. Quarante pour cent se sont vu ajouter une instruction de bloc de code délimité. Une autre tranche de 20 %, sans recoupement avec ce groupe, a été réécrite en tâches de tableau de premier niveau avec un nombre d'items requis. C'est de cette seconde modification que proviennent plus tard les résultats sur les listes nues.
Trois fonctions de récompense notent chaque complétion sur une échelle de 0 à 1. json_format_reward accorde le crédit entier pour la forme demandée, 0,2 pour une réponse analysable dans une forme incorrecte, et rien pour une sortie non analysable. field_count_reward accorde 1,0 pour un nombre exact de champs de premier niveau et décroît linéairement à mesure que le compte s'écarte. schema_validation_reward compte les violations de contraintes et conditionne le crédit partiel au nombre de clés requises présentes. Elles se combinent en une somme pondérée de 1,0, 0,5 et 2,0, ce qui donne deux fois plus de poids à la validité du schéma qu'au format seul. L'entraînement se fait à une température de 1,1 avec une pénalité KL de 0,01 par rapport au modèle de référence.
Le budget de 16 Go façonne aussi d'autres choix. Les complétions sont plafonnées à 1 024 tokens, ce qui n'est pas généreux pour du JSON imbriqué, et l'auteur rapporte que la fraction de complétions tronquées est restée proche de zéro tout au long de l'exécution.
Les régressions cachées dans la moyenne
| Groupe IFStruct | Base | Affiné GRPO | Variation |
|---|---|---|---|
| Global | 22,6 % | 29,7 % | +7,1 |
| JSON | 18,0 % | 31,9 % | +13,9 |
| YAML | 27,2 % | 27,5 % | +0,3 |
| Clé d'enveloppe | 28,5 % | 29,7 % | +1,2 |
| Liste nue | 16,6 % | 29,7 % | +13,1 |
Ventilés par format demandé, les taux de réussite en JSON ont presque doublé tandis que le YAML stagnait. Ventilés par structure de premier niveau, les listes nues sont passées de 16,6 % à 29,7 % et les objets à clé d'enveloppe ont progressé de 28,5 % à 29,7 %. Ce schéma suit directement l'augmentation des prompts, puisque la sortie en liste nue est exactement ce que 20 % des prompts d'entraînement ont été réécrits pour enseigner.
| Type d'entité | Base | Affiné GRPO | Variation |
|---|---|---|---|
| Scène de scénario | 17,4 % | 37,0 % | +19,6 |
| Exemples d'analyseur de logs | 29,2 % | 45,8 % | +16,6 |
| Lot de tickets de support | 37,0 % | 49,3 % | +12,3 |
| Réservation de billets d'événement | 45,8 % | 57,9 % | +12,1 |
| Segment de transcription d'entretien | 26,2 % | 16,2 % | -10,0 |
| Test d'appareil photo | 7,2 % | 6,0 % | -1,2 |
Les résultats par entité oscillent davantage dans les deux sens. Les tests d'appareil photo sont passés de six réussites à cinq sur 83 items, et les segments de transcription d'entretien ont chuté de dix points. Les cinq types d'entités les plus faibles sont les mêmes cinq avant et après l'entraînement, simplement réordonnés : recipe, gpu_review, camera_review, customer_email_thread et conference_schedule occupent le bas des deux exécutions. Recipe a plus que doublé, de 4,3 % à 10,0 %, et termine toujours près du plancher. Quoi que le signal de récompense ait enseigné, il n'a pas enseigné les tâches qui étaient déjà les plus difficiles.
La comparaison qui compte est celle que fait la source. Le modèle affiné de 350M se situe en dessous de Qwen3.5-2B, à 33,15 %, un modèle plusieurs fois plus grand. Combler l'essentiel d'un tel écart avec 6 millions de paramètres entraînables et 100 étapes, voilà l'argument. La réserve se tient juste à côté. IFStruct récompense la forme, et la forme est ce qu'un signal de récompense étroit peut acheter. Les 7 331 champs requis manquants de l'exécution affinée n'ont jamais été la cible.
- Source : LFM2.5-350M gained 14 points on JSON. YAML barely budged — 2026-09-03
L'essentiel de la tech en 3 minutes chaque matin
Un email, chaque jour ouvré, avec ce qui compte vraiment en IA et en tech.