Egy nyilvános, költséghatékony útmutató bemutatja, hogyan lehet egy kis nyelvi modellt jelentősen megbízhatóbbá tenni strukturált kimenetek előállításában. A bemutatott eljárás során a LiquidAI/LFM2.5-350M modellt finomhangolják Group Relative Policy Optimization (GRPO) módszerrel a TRL könyvtár használatával, és az eredményeket az IFStruct benchmarkon értékelik. A teljes futtatás körülbelül 500 mintát és 100 tanítási lépést igényel, így elvégezhető ingyenes Colab vagy Kaggle GPU-n; a pipeline elérhető a GitHubon.
Miért fontos ez?
A strukturált kimenet (például JSON vagy YAML, a megadott sémának megfelelő, parseolható válaszok) az egyik leggyakoribb gyakorlati feladat, amelynél a modell hasznosságát gyakran az dönti el, mennyire képes visszaadni a kért formátumot és struktúrát. Sok benchmark azonban ezt a képességet szélesebb feladatosztályokba olvasztja; az IFStruct célja kifejezetten a sémakompatibilitás mérésére szolgáló vizsgálat.
Kiinduló pont: alapmodell értékelése
Mielőtt a finomhangolást elvégezték volna, a szerzők helyben, llama.cpp-val szolgáltatva értékelték a LiquidAI/LFM2.5-350M modellt BF16 GGUF változatban. A teljes IFStruct futtatás 2000 mintán a következő eredményt adta:
- Összesen: 452/2000 pass (22.6%)
- JSON: 180/1000 pass (18.0%)
- YAML: 272/1000 pass (27.2%)
- Átlagos késleltetés: 1453 ms
Részletes bontásban az egyes tesztcsoportoknál továbbá láthatók az egyes entitástípusokra vonatkozó passzarányok és a leggyakoribb hibaüzenetek (pl. required field missing, wrong item count, type mismatch). Ez a helyi mérés közel áll az IFStruct blogban közölt 21.1%-os értékhez, ezért ezt használták bázisként a további összehasonlításhoz.
GRPO finomhangolás — mik a lépések?
A teljes, futtatható pipeline a kísérő jegyzetfüzetben található; az alábbiakban a releváns elemek összefoglalása.
Tréningadat
A tréninghez az nvidia/Nemotron-RL-instruction_following-structured_outputs adathalmazt használják, amely minden prompthoz célséma (JSON Schema) és várt top-szintű mezőszám párost tartalmaz. A tanításhoz körülbelül 500 mintát használtak.
A Nemotron eloszlás és az IFStruct különbségeinek csökkentése érdekében a promptokat kiegészítették:
- 40% kap egy „helyezd a kimenetet keretes kódblokkba” utasítást, hogy a modell megtanulja követni a formátum-instrukciót.
- egy diszjunkt 20% top-level tömb feladattá van konvertálva (a séma tömbbe csomagolva, kötelező elemszámmal), hogy a bare-list kimenetet és az elemszámnak való megfelelést is tanítsák.
Modell és LoRA
A LiquidAI/LFM2.5-350M modellhez egy LoRA adaptert kapcsoltak. A specifikus LFM architektúra miatt célozták meg a modell LFM-specifikus modulneveit (pl. q_proj, k_proj, v_proj, out_proj, in_proj, w1, w2, w3). A LoRA konfiguráció r=16, lora_alpha=32, bias="none" paraméterekkel nagyjából 6M tanulható paramétert hozott létre, ami a modell ~1.66%-a.
Jutalomfüggvények
Három, [0,1] skálán értékelő jutalomfüggvényt definiáltak, amelyek minden generált kimenetet pontoznak a szerkezeti megfelelés szempontjából:
- json_format_reward: parseolhatóság és a kért forma (fenced vs. raw) figyelembevétele (1.0 teljes, 0.2 rossz, de parse-olható forma, 0.0 parseolhatatlan).
- field_count_reward: a top-szintű mezők számának egyezése (1.0 pontos találat, az eltérés lineárisan csökkenti a pontot).
- schema_validation_reward: a JSON Schema szerinti validáció; megszámolja a megsértett korlátozásokat és a kötelező kulcsok meglétét feltételezi a részleges kredithez.
A három jutalmat súlyozva kombinálták reward_weights=[1.0, 0.5, 2.0] értékekkel (json_format, field_count, schema_validation sorrendben).
Tanítási futtatás
A GRPO konfigurációt 100 max_steps-szel hajtották végre, num_generations=8, per_device_train_batch_size=4, gradient_accumulation_steps=8, steps_per_generation=2, max_completion_length=1024, temperature=1.1, beta=0.01 és egyéb paraméterekkel. A beállítás a szabad 16 GB-os GPU-kategóriára van méretezve. A jegyzetfüzet szerint a futás során mindhárom jutalomal komponens emelkedett, a KL a referenciamodell felé a warmup után eltávolodott a nullától, és a levágott kimenetek aránya alacsony maradt.
Egyesítés és mentés
A LoRA adaptert végül visszaolvasztották a bázis súlyokba és egyetlen checkpointként mentették, amelyből GGUF formátumra konvertálható a servinghez.
Értékelés GRPO utáni modellen
A merge és GGUF konverzió után a finomhangolt modell (lfm25-350m-grpo-structured-output) helyi szerveren futott, majd az IFStructot újra lefuttatták ugyanazon a 2000 mintás teszten. Az eredmény:
- Összesen: 594/2000 pass (29.7%)
- JSON: 319/1000 pass (31.9%)
- YAML: 275/1000 pass (27.5%)
- Átlagos késleltetés: 1518 ms
Részletes bontásban több tesztcsoportnál javulás látható (például clinical_trial 19.2% → 29.8%, log_parser_examples 29.2% → 45.8%, support_ticket_batch 37.0% → 49.3%, event_ticket_booking 45.8% → 57.9% stb.), míg néhány csoportnál a változás kisebb vagy marginális.
Összehasonlítás — előtte/utána
Az összehasonlítás azonos szolgáltatási környezeten mutatja a változást:
- Összesen: 22.6% → 29.7% (+7.1)
- JSON: 18.0% → 31.9% (+13.9)
- YAML: 27.2% → 27.5% (+0.3)
- Wrapper key: 28.5% → 29.7% (+1.2)
- Bare list: 16.6% → 29.7% (+13.1)
A legnagyobb javulás ott jelentkezik, ahol a tréning célozta a modell viselkedését: a JSON passzarány közel 14 százalékponttal nőtt, míg a YAML gyakorlatilag változatlan maradt. A finomhangolt 350M modell még mindig elmarad a Qwen3.5-2B 33.15%-os eredményétől, de a light-weight, task-specifikus finomhangolás jelentősen csökkenti a különbséget nagyobb modellekkel szemben.
Következtetés
Egy rövid GRPO futtatás, körülbelül 500 mintával és 100 tréninglépéssel, a LiquidAI/LFM2.5-350M modellt az IFStruct benchmarkon 22.6%-ról 29.7%-ra javította. A tanulság: egy olcsó, feladatspecifikus, szerkezeti jutalomjelet használó finomhangolás jelentősen megbízhatóbbá teheti a kis modelleket a kért formátum betartásában, és bezárhatja a különbséget nagyobb modellekhez képest. A reprodukáláshoz és további kísérletekhez a szerzők az IFStruct v1.0 blogját, a Liquid4All/ifstruct benchmark repót és a LiquidAI/ifstruct-v1.0 adatállományt ajánlják.
Műszaki megjegyzések (összefoglaló parancsok)
A helyi szerver indítására és az értékelésre a jegyzetfüzet példa parancsokkal szolgál (llama-server indítása BF16 GGUF modellel, ifstruct-eval futtatása uv eszközzel), a merged modell GGUF-formátumba konvertálásához a llama.cpp konvertere használatos.
A teljes kód és futtatható notebook a szerzők GitHub repójában található.



