100 GRPO-steg gjorde en 350M-modell mye bedre på JSON og YAML
Løfter 100 GRPO-steg med rundt 500 eksempler en 350M-modell fra 22,6 til 29,7 prosent på IFStruct, en benchmark som kun måler om utdataen er gyldig og følger skjemaet.
Strukturert utdata er den oppgaven flest gir en språkmodell i praksis, og samtidig den som sjeldnest måles for seg selv. De fleste benchmarker folder det inn i bredere resonnerings- eller uthentingsscore, selv om det å returnere gyldig, parsebar JSON i riktig form ofte er det eneste som avgjør om modellen i det hele tatt kan kobles til noe nedstrøms. IFStruct fra Liquid AI måler nettopp det, og en gjennomgang på Hugging Face-bloggen viser hvor billig det er å flytte tallet.
Utgangspunktet er LFM2.5-350M servert lokalt med llama.cpp på en MacBook Pro med M5 Max og 36 GB delt minne. Over 2 000 IFStruct-eksempler består basismodellen 452, altså 22,6 prosent. Fordelingen er skjev: YAML går bra med 27,2 prosent, JSON dårlig med 18,0 prosent, og oppgaver som skal returnere en bar liste ligger nede på 16,6 prosent mot 28,5 prosent for de som pakker svaret i en nøkkel.
Treningen er tre belønningsfunksjoner på skalaen 0 til 1, vektet i forholdet 1,0, 0,5 og 2,0. Den første sjekker om utdataen lar seg parse og er i den formen som ble bedt om, med full uttelling for riktig form og 0,2 for parsebar men feil form. Den andre teller om objektet har riktig antall toppnivåfelt, med lineær nedtrapping når det bommer. Den tredje, og tyngst vektede, validerer mot radens JSON Schema og teller hvert brudd. Selve kjøringen er dimensjonert for en gratis Colab- eller Kaggle-GPU, og LoRA-adapteren slås til slutt sammen med basisvektene til ett selvstendig sjekkpunkt som kan konverteres til GGUF.
Fordelingen etter trening er like interessant som totalen. JSON nesten dobler seg, mens YAML står stille på 27,5 prosent. Bare lister går fra 16,6 til 29,7 prosent og møter dermed nøkkelpakkede svar på samme nivå. Med andre ord: belønningssignalet rettet opp de svakeste formene i stedet for å løfte alt jevnt.
Forfatteren presiserer at dette ikke er pipelinen Liquid AI brukte for å trene sin egen RL-modell, og at målet ikke er å reprodusere den publiserte IFStruct-scoren. Poenget er at et billig, oppgavespesifikt belønningssignal kan gjøre en liten modell vesentlig mer pålitelig på form, og tette mye av avstanden til modeller flere ganger så store.
Hva bør du gjøre?
- Skriv belønningsfunksjonen mot det du faktisk krever nedstrøms. Skjemavalidering vektet tyngst er det som flyttet tallene her, ikke generell formatbelønning.
- Mål per format før du trener. Gevinsten lå nesten helt i JSON og bare lister, og et samletall ville skjult hvor jobben måtte gjøres.
KI-kuratert — innholdet er generert av KI-agenter basert på originalkilden.