Contexte et objectifs
Le benchmark IFStruct mesure la capacité d’un LLM à produire des sorties respectant un schéma JSON ou YAML. Le modèle de référence LiquidAI/LFM2.5-350M atteint 21,1 % de conformité sur 2000 échantillons. L’objectif du notebook est de montrer qu’un fine‑tuning de 100 étapes GRPO sur un petit jeu de 500 prompts peut dépasser ce score tout en restant utilisable sur du matériel grand public.
Pipeline d’entraînement
Le processus s’exécute sur un GPU disponible dans un environnement Colab gratuit. Le modèle de base, 350 M paramètres, possède une architecture hybride attention / convolution. Un adaptateur LoRA est ajouté, entraînant ≈ 6 M paramètres, soit 1,66 % du modèle total. La configuration LoRA cible les modules q_proj, k_proj, v_proj, out_proj, in_proj, w1, w2, w3 :
lora_config = LoraConfig(
r=16,
lora_alpha=32,
bias="none",
task_type="CAUSAL_LM",
target_modules=[
"q_proj", "k_proj", "v_proj", "out_proj", "in_proj",
"w1", "w2", "w3",
],
)Les données d’entraînement proviennent du jeu Nemotron‑RL‑instruction_following-structured_outputs. Pour réduire l’écart avec IFStruct, 40 % des prompts reçoivent l’instruction « return the output inside a fenced code block », et 20 % sont transformés en tâches à tableau de niveau supérieur afin d’entraîner la production de listes nues.
Trois fonctions de récompense, normalisées entre 0 et 1, guident l’optimisation :
- json_format_reward : 1,0 si le format demandé (fenced ou raw) est respecté, 0,2 si le format est parseable mais incorrect, 0 sinon.
- field_count_reward : 1,0 pour un nombre exact de champs, décroissance linéaire en fonction de l’écart.
- schema_validation_reward : validation complète du schéma JSON, crédit partiel selon la couverture des clés requises.
La somme pondérée de ces scores constitue le signal de récompense utilisé pendant les 100 étapes GRPO.
Évaluation et résultats
L’évaluation s’effectue localement sur un MacBook Pro M5 Max (36 GB mémoire unifiée) via llama.cpp. Le serveur est lancé avec la version BF16 GGUF :
llama-server \
-hf LiquidAI/LFM2.5-350M-GGUF:BF16 \
-c 32768 \
-np 4 \
-ngl 99 \
--alias LiquidAI/LFM2.5-350M \
--host 127.0.0.1 \
--port 8080Le benchmark de 2000 entrées indique 452 réponses valides (22,6 %), légèrement supérieure à la référence 21,1 %. La latence moyenne est de 1453 ms. La répartition par format montre 18,0 % de succès en JSON et 27,2 % en YAML, reflétant l’impact de l’instruction de bloc de code sur la conformité.
Limites et perspectives
Le gain de 1,5 point de pourcentage provient d’un jeu d’entraînement très restreint (≈ 500 exemples) et d’une optimisation spécifique aux récompenses de format. Le modèle reste sensible aux erreurs récurrentes : champs manquants (7228 occurrences), comptage d’items erroné (738), et types incompatibles (540). Ces défauts indiquent que le fine‑tuning améliore la conformité globale mais ne résout pas les lacunes structurelles fondamentales. Une exploration future pourrait augmenter le nombre d’étapes GRPO, diversifier les schémas d’entraînement et tester des architectures de décodage plus robustes pour réduire les violations de type.