Kutatási jelentés
Mit ad hozzá egy LoRA a jó promptoláshoz?
Magyar verses stílus-adapter tanítása Qwen3.5-9B-re, közkincs korpuszon — és annak megmérése, hogy a finomhangolás mit tesz hozzá ahhoz, amit egy gondos prompt és egy determinisztikus utószűrő önmagában is tud.
A kérdés nem az, hogy „javul-e valami a LoRA-tól” — az triviálisan igen. A kérdés az, hogy megéri-e egy olcsó alternatívához képest. Ezért a LoRA valódi ellenfele nem a nyers modell, hanem a B2: ugyanaz a bázismodell, gondos few-shot prompttal és egy determinisztikus rím-rerankerrel, ami nyolc jelöltből a legszabályosabbat választja.
Formában a reranker nyert. Minden formai tengelyen — és közben harmadannyi kitalált szóval. A formát egy szótagszámláló és egy rímfüggvény olcsóbban megveszi, mint 64 perc GPU-idő.
Stílusban viszont a reranker nulla. Egy független
szerző-klasszifikátor szerint a báziságon 56,4% → 56,0% — nem mozdít.
A legtisztább összevetés a B2 vs C2: ugyanaz a reranker, ugyanaz az 50
prompt, ugyanaz a best_of=8; az egyetlen különbség az adapter.
+36 százalékpont a szerző-felismerésben, kizárólag a LoRA-tól — miközben a memorizáció-mérés szerint a modell egyetlen sort sem másol a tanítóversekből.
A mérés hat feltételt vet össze ugyanazon a rögzített promptszetten, és mindegyiket ugyanazzal a determinisztikus mérőeszközzel:
| feltétel | mit csinál |
|---|---|
| B0 | bázismodell, egyszerű prompt |
| B1 | bázismodell + gondos few-shot stílusprompt (4 példa a korpuszból) |
| B2 | B1 + determinisztikus rím-reranker (8 mintából a legjobb forma) |
| C | LoRA-adapteres modell |
| C2 | C + ugyanaz a reranker — additív-e a két hatás? |
| GOLD | maga Arany János / Petőfi Sándor, ugyanezen a mérőlécen |
A B2 a valódi ellenfél, nem a B0. A formai metrikákat egy reranker triviálisan javítja, mert pontosan azt optimalizálja, amit mérünk. Ha a LoRA nem veri a B2-t, akkor nem tett hozzá semmit — és ezt méréssel kell megmutatni, nem elhallgatni.
A mérés terjedelme. A fő futás Arany Jánosra és egyetlen modellre (Qwen3.5-9B) készült. Ez tudatos szűkítés: a méret-sweep, a célréteg-abláció és a második szerző mind többszörözné a GPU-időt anélkül, hogy az alapkérdésre másképp válaszolna. Ami kimaradt, a 10. fejezetben nevesítve van — a korpusz, a mérőeszköz és a pipeline mindkét szerzőre kész, tehát a kiterjesztés egy parancs.
📘 Kísérő anyag: a LoRA gyorstalpaló rövid, önmagában is olvasható bevezető arról, mit csinál egy LoRA-adapter és mit csinál helyette egy reranker, ennek a kísérletnek a számain végigvezetve. Azoknak készült, akik nem vették mélyen a témát; ez a dolgozat nem hivatkozik rá, és nem előfeltétele.
1. fejezetJogi alap: miért Arany és Petőfi
Az eredeti ötlet Romhányi József rímes állatverseinek stílusa volt. Ez nem valósítható meg legálisan: Romhányi 1983-ban hunyt el, a védelem a halált követő 70. év végéig tart (Szjt. 31. §), tehát 2053 végéig védett.
Ez nem formai kifogás. Kis korpuszon a LoRA nem stílust tanul, hanem memorizál — a kimenet gyakorlati eséllyel a védett szöveg reprodukciója lenne, és a modellsúlyokba égetett szöveget utólag nem lehet kivenni, csak újratréningelni. A szövegbányászati kivétel (DSM 4. cikk / Szjt. 35/A §) sem segít: az az input-oldali másolásra vonatkozik, a kimenet-oldali reprodukciót nem legalizálja.
Ezért a teljes pipeline közkincs korpuszon fut:
| szerző | elhunyt | védelem lejárt | forrás |
|---|---|---|---|
| Arany János | 1882 | 1952 végén | MEK-00597 |
| Petőfi Sándor | 1849 | 1919 végén | MEK-01006 |
A Petőfi-csomag MEK-cédulája kifejezetten „Nem jogvédett" jelölésű. A
data/corpus_manifest.json minden forrásnál rögzíti a letöltés
URL-jét, időpontját, a csomag SHA-256-ját és a cédula jogi közleményét.
Mellékhaszon: a két szerző rímtechnikája mérhetően különbözik (ld. 3.3), így az összevetésnek van egy második tengelye is.
2. fejezetA korpusz
| szerző | fájl | vers | sor | strófa | medián sor/vers | szó | visszanyerés |
|---|---|---|---|---|---|---|---|
| Arany János | 92 | 485 | 50 231 | 7 943 | 34 | 282 853 | 92,3% |
| Petőfi Sándor | 85 | 852 | 30 644 | 5 219 | 24 | 138 524 | 89,0% |
A MEK 1996–2013-as HTML-csomagjai szerencsés szerkezetűek: a verscím
<h3><a name>, a strófa egy <p>, a
sorhatár <br>. A strófahatárt tehát nem kell
találgatni — a forrásban explicit. Ez lényeges, mert a strófahatár a
rímséma egysége, nem whitespace-zaj; egy PDF-ből vagy RTF-ből ugyanez sokkal
zajosabban jönne.
Amit a nyers adaton javítani kellett
| probléma | miért számít | kezelés |
|---|---|---|
a versszöveg is <table>-ben van (tördelés miatt), ugyanúgy, mint a navigáció |
aki a táblákat egyben dobja ki, annak némán eltűnik a versek egy része: a PÁZMÁN LOVAG-ból egyetlen sor maradt 177 helyett | a navigációt KÉP/LINK szinten távolítjuk el, a táblákat kibontjuk |
a horgonyok a köteten belül nem egyediek (01 több mint 30 fájlban) |
a Toldi éneke a „GYERMEKKORI EX-LIBRIS" művet kapta szülőnek | a mű-kontextus kétlépcsős: szülő előbb saját fájlban, csoportszinten csak ha egyértelmű |
| 9 különböző „Első ének" | azonos című, különböző versek | mű-szintű megjelenítő cím (TOLDI: ELSŐ ÉNEK) |
| mű-fejléc rekordok (cím + mottó, szöveg nélkül) | 2 soros „versnek" látszanak | kind: work_header, az adatépítés kizárja |
a MEK elhallgatás-jelölői (- - - - -) |
tanítópéldába kerülve a modell megtanulná utánozni | sor-szintű szűrés |
| keltezés a vers végén | strófának számítana, elrontva a strófaszám-előírást | külön dateline mező |
| műfaji alcím a vers elején („Víg ballada") | ugyanaz | egysoros nyitóblokk → subtitles |
| „kalapos" ő/ű (ISO-8859-2 örökség) | ékezet-korrupció a tanítóadatban | 85 karakter javítva, mérve |
A visszanyerési arány (kinyert sor / a forrás
<br>+<p> alapú felső becslése) azért
került be, hogy a néma szövegvesztés kiderüljön: az első futáson ez a mutató
buktatta le a tábláktól elveszett verseket.
3. fejezetA mérőeszköz — és a validációja
A munka determinisztikus magja a src/hu_prosody.py: szótagszám,
rímkulcs, rímséma. Egyetlen modellhívás sincs benne.
Ugyanez a kód annotálja a korpuszt, állítja elő a tanító-instrukciókat, és
értékeli a generált verseket — tehát a modellnek pontosan azt kell
teljesítenie, amit mérünk.
Egy mérőeszközt viszont nem elég megírni: meg kell mutatni, hogy mér.
3.1 Szótagszám — külső igazsághoz mérve
Magyarban minden szótag magja pontosan egy magánhangzó, és a helyesírás nem ismer diftongust, tehát a magánhangzó-számlálás nem közelítés, hanem a szabály maga. Ellenőrizni viszont külső igazsághoz kell: a Toldi, a Toldi estéje és a János vitéz felező tizenkettesben íródott — ez irodalomtörténeti tény.
| mű | elvárt | sor | pontos találat | ±1 szótagon belül |
|---|---|---|---|---|
| felező tizenkettes | 12 | 4 125 | 99,7% | 99,8% |
A hibaarány 0,3% — a runbook 5%-os kapuja alatt.
3.2 Rímdetektor — kontrollcsoporthoz mérve
A magyar rím túlnyomórészt asszonánc: a magánhangzók egyeznek, a mássalhangzók lazábban. A pontozó ezt követi (utolsó magánhangzó 0,4 + coda 0,4/0,3 + megelőző szótag 0,2), és a coda egyezése kétszintű — a fonológiai osztály-egyezés (nazális↔nazális, t↔d) is számít, mert Petőfi „kezemben / verekednem" ríme nem hiba, hanem a népies rím normája.
A küszöb nem tipp: a valódi rímpozíciók és a kevert kontroll-párok (ugyanazok a sorok, más strófából) szeparációját mértük végig.
| pontozó | küszöb | Arany (1–2, 3–4) | Petőfi (2–4) | kontroll | rés |
|---|---|---|---|---|---|
| v1 additív, coda opcionális (ez fut) | 0,6 | 85,4% | 64,7% | 10,0% | +65,1% |
| v1 | 0,8 | 77,7% | 50,5% | 4,1% | +60,0% |
| v2 — coda kötelező | 0,6 | 79,2% | 57,1% | 5,6% | +62,5% |
| v3 — csak magánhangzó | 0,6 | 87,4% | 72,4% | 20,3% | +59,6% |
A v1 nyer 0,6-nál. Az ára megnevezhető: két magánhangzó-egyezés kiválthatja a coda-egyezést, így az „isten / kell" párt rímnek látja. A v2 ezt kiszűrné, de vele esne Petőfi valódi „svábság / adósságát" ríme is — a mérés szerint többet veszítenénk, mint nyernénk.
3.3 A detektor visszaadja az irodalomtörténetet
Ez a legerősebb bizonyíték arra, hogy az eszköz működik: a két szerző rímtechnikája mérésből áll elő, nem feltevésből.
| szerző | 1–2 | 1–3 | 1–4 | 2–3 | 2–4 | 3–4 | kontroll |
|---|---|---|---|---|---|---|---|
| Arany János | 86,0% | 14,4% | 11,6% | 10,5% | 21,0% | 84,8% | 10,9% |
| Petőfi Sándor | 35,6% | 15,1% | 10,9% | 10,5% | 64,7% | 34,9% | 9,9% |
Aranynál az 1–2 és a 3–4 sor rímel: páros rím (AABB 72,1%). Petőfinél a 2–4: népies félrím (ABCB 42,2%). Ugyanaz a kód, ellentétes mintázat.
3.4 Ragrím: amit nem lehet trükkel megnyerni
A magyar agglutináló, ezért az azonos toldalékú szavak automatikusan rímelnek („virágokat / dolgokat"). Ez költőileg a leggyengébb rím, és egy generatív modell fő menekülőútja. Ezért két metrika van:
rhyme_rate— rímel-e egyáltalán,rhyme_quality— rímel, és nem puszta toldalék-azonosság.
A korpuszban mérve: a rímelő párok 37,7%-a ragrím Aranynál, 25,5%-a Petőfinél.
Korlát: ez toldaléklistás közelítés, nem morfológiai elemzés, és felfelé torzít — a „minden" szót is toldalékosnak látja. Relatív összevetésre alkalmas, abszolút értékként nem.
4. fejezetAz adathalmaz
A nyers vers nem SFT-adat: abból csak nyelvi modellezés lenne, nem irányítható generálás. Instrukció→válasz párokká alakítjuk, ahol az instrukció is mérésből származik:
Írj verset Arany János modorában.
Cím: PÁZMÁN LOVAG
Forma: 9 strófa, strófánként 4 sor, rímséma AABB (páros rím), soronként 12 szótag.
Formai előírás csak akkor kerül a promptba, ha a vers tényleg tartja (rímséma ≥60%-os többség, izometria ≥70%) — különben olyan formára tanítanánk, amit a példa maga sem követ.
Az adatépítésben nincs LLM-hívás. Az eredeti terv a
témacímkézést egy qwen36-hívásra bízta volna; helyette
a verscím a téma. Ez determinisztikus, reprodukálható, és
nem terheli a prod stacket.
| szerző | train | val | test | write | continue | couplet | split-egység |
|---|---|---|---|---|---|---|---|
| Arany | 1 332 | 139 | 125 | 264 | 561 | 507 | 392 egység / 454 vers |
| Petőfi | 1 920 | 250 | 242 | 659 | 630 | 631 | 844 / 844 |
A split mű-szintű, nem vers-szintű. A Toldi tizenkét éneke tizenkét rekord, de egyetlen mű: ha a 4. ének tanításban van, a 7. pedig holdoutban, akkor a memorizáció-mérés halott — ugyanaz a történet, ugyanazok a szereplők, ugyanaz a rímkészlet.
A feladattípusok kvótásak. Kvóta nélkül egy 8 strófás versből 8 rímpár lenne, és a gradiens-lépések ~80%-át egysoros válaszok vinnék, miközben a token-tömegnek csak ~15%-át adják. A példaszám itt félrevezető mutató; ezt mérni kellett, nem megérezni.
5. fejezetA modell és a tréning
Fő vonal: Qwen3.5-9B (dense), bf16, LoRA r=32, α=64.
A hibrid architektúra csapdája
A Qwen3.5 nem klasszikus transzformer. A 2B-ben 24 rétegből
mindössze 6 klasszikus attention
(q_proj/k_proj/v_proj/o_proj); a maradék 18
Qwen3_5GatedDeltaNet lineáris figyelem, ahol a
vetítők neve in_proj_qkv / in_proj_a / in_proj_b / in_proj_z /
out_proj.
Vagyis a szakirodalomból átvett „attention-only LoRA" recept a token-keverő rétegek háromnegyedét kihagyja:
| célkészlet | modul (2B) | réteg (2B) | modul (9B — ez futott) | réteg (9B) |
|---|---|---|---|---|
attn — a bevett recept | 24 | 6 / 24 | 32 | 8 / 32 |
linattn | 90 | 18 / 24 | 120 | 24 / 32 |
mixer — a valódi „attention-only" | 114 | 24 / 24 | 152 | 32 / 32 |
A 9B-ben minden negyedik réteg klasszikus figyelem, a többi lineáris — az
arány tehát ugyanaz, mint a 2B-ben. Ezért a fő futás a mixer
készletet használja: 152 modul, 36,2 M tanítható paraméter.
Két eltérés az eredeti runbooktól
- Unsloth helyett sima PEFT + TRL. Az Unsloth a 35B MoE memóriaszorítása miatt kellett volna; egy 9B dense bf16-ban ~18 GB, ami a GB10 130 GB-jában elfér. Egy függőségi réteggel kevesebb aarch64-en.
- A konténer a meglévő, GB10-re már bepatchelt vLLM image-re épül (torch 2.11+cu130, transformers 5.6), nem külön 20 GB-os NGC PyTorch-ra.
6. fejezetTeljesítmény: amit a hardver diktált
| lelet | következmény |
|---|---|
| gradient checkpointing nélkül a NODE indul újra, nem a folyamat hal meg | a GB10 unified memóriájában a GPU-allokáció a rendszermemóriából megy, és a lineáris figyelem torch-fallbackje minden köztes rekurrens állapotot megőriz a backwardhoz. A --grad-ckpt 1 nem óvatosság, hanem követelmény: itt nincs kihez visszatérni egy OOM után |
| a tanítópéldák mediánja ~230 token, p90 ~790 | 2048-as ablaknál a számítás ~83%-a padding → max_length=1024, amibe a példák 96%-a csonkítatlanul befér |
| a BFD packing 2,6× gyorsítana (36 → 14 perc/epoch a 2B-n) | mégis kikapcsolva marad, ld. alább |
fast path is not available — a GatedDeltaNet torch-fallbackben fut |
flash-linear-attention és causal-conv1d együtt kell hozzá |
A packing-döntés
A TRL figyelmeztet: packing mellett csak flash-attention variánsokkal
garantált, hogy a csomagba fűzött példák ne lássák egymást. A GB10-en
(sm_121) nincs flash_attn
(is_flash_attn_2_available() == False). Kereszt-szennyeződés
mellett a modell egy vers tanulása közben látná az előzőt — a tanítójel
hamis lenne, és pont a memorizáció-mérést rontaná el, ami a munka fő kérdése.
2,6× sebesség egy érvénytelen méréshez nem üzlet.
Mellékes, de tanulságos: a
train_samples_per_secondmetrika packing mellett fordítva mutat (0,613 vs 0,575 — mintha a packing lassítana), mert a „sample" ott csomagot jelent, nem tanítópéldát. Az epoch-haladás az egyetlen összevethető mérce.
A causal-conv1d csapdája
A fast path figyelmeztetés feloldásához
flash-linear-attention és
causal-conv1d is kell. Utóbbi aarch64-en lefordult, importálható
(1.6.2), és a figyelmeztetés el is tűnt vele — a tréning viszont
az első lépésnél szegmentál (exit 139), a 2B-n és a 9B-n
egyaránt. A modell betöltése még sikeres.
A fordítás sikere nem jelenti, hogy a kernel sm_121-en fut. A mérés a fallback-image-dzsel készült.
A completion-maszkolás 2 tokenes eltolódása
A TRL minden példánál figyelmeztet, hogy a külön tokenizált prompt nem
pontos prefixe a prompt+completion tokenjeinek (a
<think>\n\n</think>\n\n záró újsorai összeolvadnak a
válasz elejével). Megmérve: az eltérés minden példánál pontosan 2
token, tehát a válasz első ~2 tokenje nem ad tanítójelet. A
completionök átlaga ~230 token, a hatás <1% és konzisztens — rögzített
korlát, nem hiba.
7. fejezetA mérés felépítése
Tengely A — a szándékolt hatás. Rögzített 50 prompt
szerzőnként, a holdout versek címéből és mért formai
jellemzőiből; 3 minta promptonként, T=0,8,
top_p=0,9, rögzített seed. Metrikák: strófaszám, strófaméret,
syllable_exact, scheme_match,
rhyme_rate, rhyme_quality,
distinct_2/3.
Tengely C — az ár. extraction_gap: 50 tréning-
és 50 holdout-vers első két sorát adjuk be, mohó dekódolással
folytattatjuk, és a leghosszabb közös szó-n-gramot mérjük.
A holdout ág kontroll: a bázismodell nagy eséllyel látta már a János vitézt és a Toldit a pretrainingben. Ha a memorizációt naivan mérnénk, a pretraining memorizációját írnánk a LoRA számlájára. Csak a rés (train − holdout) a mi tanításunk hozzájárulása.
GOLD referencia. Az eredeti versek ugyanezzel a mérőléccel. Enélkül a modell számai lebegnek — nem tudnánk, hogy egy 0,62-es rímarány közel van-e a lehetségeshez:
| strófaméret | szótag pontos | rímséma | rímarány | rímminőség | ebből ragrím | distinct-2 | |
|---|---|---|---|---|---|---|---|
| GOLD — Arany | 0,982 | 0,800 | 0,892 | 0,577 | 0,400 | 0,286 | 0,980 |
| GOLD — Petőfi | 1,000 | 0,809 | 0,813 | 0,624 | 0,439 | 0,282 | 0,961 |
Vagyis maga Arany János is 0,577-es „rímarányt" ér el ezen a mérőlécen — ez a feladat gyakorlati felső korlátja, nem az 1,0.
Szerző-klasszifikátor — objektív stílus-metrika LLM-bíró nélkül. TF-IDF (szó 1–2-gram + karakter 3–5-gram) + logisztikus regresszió, 7 195 tanítóblokkon a train szeletből, holdout pontosság 91,0% (többségi alaplap 59,0%). Ha ez a klasszifikátor a Petőfi-promptra generált szöveget Petőfinek osztályozza, az stílus-transzfer bizonyíték.
8. fejezetEredmények
8.1 A tréning
| paraméter | érték |
|---|---|
| modell | Qwen3.5-9B (8,99 Mrd paraméter) |
| célkészlet | mixer — 152 modul, 32/32 réteg |
| tanítható paraméter | 36,2 M (0,40%) |
| tanítópélda | 1 332 (Arany, train szelet) |
| epoch / lépés | 3 / 501 |
| tréning-idő | 63,8 perc (GB10) |
| train loss | 3,26 → 2,55 |
| eval loss | 3,04 → 2,88 (0,5 ep) → 2,84 (1,0 ep) |
8.2 A tanulás lefutása — a veszteség-optimum nem stílus-optimum
| epoch | 0,5 | 1,0 | 1,5 | 2,0 | 2,5 | 3,0 |
|---|---|---|---|---|---|---|
| validációs veszteség | 2,880 | 2,835 | 2,874 | 2,870 | 2,967 | 2,968 |
A 3 epochos végállapot tehát már túlillesztett — ezért a mérés két
adapter-ponton fut: a végállapoton (C) és a
checkpoint-166-on (1,0 epoch).
A validációs veszteség nem a feladat
A tankönyvi lépés itt az 1 epochos checkpoint választása lenne. Lemértük mindkettőt, ugyanazon az 50 prompton, ugyanazzal a maggal:
| adapter | val. veszteség | rímarány | rímminőség | szótag pontos | ismételt sor ↓ | felismerhető Aranynak |
|---|---|---|---|---|---|---|
1,0 epoch (ckpt-166) | 2,835 | 0,119 | 0,092 | 0,180 | 0,181 | 68,0% |
| 3,0 epoch (végállapot) | 2,968 | 0,177 | 0,139 | 0,203 | 0,118 | 77,3% |
A veszteség-optimum nem stílus-optimum — és nem is szűk győzelemről van szó: a „túlillesztett" adapter minden mért tengelyen jobb, a rímaránytól (+49%) a szerzőfelismerésen át (+9,3 pont) az ismétlésig (−35%).
Az ok mechanikus. A validációs veszteség azt méri, mennyire jól jósolja a modell a következő tokent Arany félretett verseiben — egy olyan feladatot, amiben a szó szerinti egyezés számít. A mi célunk viszont a modor átvétele. A kettő az első epochban együtt mozog, utána szétválik: a modell tovább tanulja a formai szabályszerűségeket (rím, sorhossz), miközben a konkrét szóválasztás jóslásában már romlik.
Ez nem memorizálás — a 8.4 szakasz kontrollcsoportos mérése zárja ki. A tanulság módszertani: ha a veszteség nem a feladatot méri, ne a veszteség alapján válassz checkpointot. Egy 50 promptos formai mérés ehhez elegendő volt, és 6 percbe került.
8.3 Tengely A — forma és stílus
| metrika | B0 nyers | B1 few-shot | C — LoRA | GOLD |
|---|---|---|---|---|
| strófaszám betartva | 0,440 | 0,567 | 0,573 | 1,000 |
| strófaméret | 0,805 | 0,802 | 0,735 | 0,982 |
| szótagszám pontos | 0,153 | 0,206 | 0,203 | 0,800 |
| rímséma egyezés | 0,064 | 0,043 | 0,087 | 0,892 |
| rímarány | 0,134 | 0,114 | 0,177 | 0,577 |
| rímminőség | 0,111 | 0,093 | 0,139 | 0,400 |
| distinct-2 | 0,832 | 0,822 | 0,828 | 0,980 |
A két beavatkozás nem ugyanazt a képességet mozgatja. A few-shot prompt a szerkezetet javítja (strófaszám 0,44 → 0,57; szótagszám 0,15 → 0,21), a rímelést viszont rontja (0,134 → 0,114). A LoRA pontosan fordítva: a rímarány +32%-kal nő a nyershez és +55%-kal a few-shothoz képest, miközben a strófaméret-tartás romlik (0,805 → 0,735).
A magyarázat mechanikus: a példák megmutatják, hogy néz ki egy vers — hány strófa, milyen hosszú sorok —, és ezt a modell le tudja másolni. A rímeléshez viszont előre kell tervezni: a sorvéget úgy kell megválasztani, hogy egy későbbi sorral csengjen. Ez nem másolható példáról; ez a súlyokban lakik.
Amiért a rím-javulást nem lehet önmagában elkönyvelni
Ugyanaz a prompt (TANULSÁG, ABCB, 8 szótag) három ágon:
| ág | kimenet (részlet) |
|---|---|
| B0 | „Nem jár a jóság útja könnyedén, / Színekkel, virágokkal borítva…" — 1 strófa a kért 2 helyett, rím nincs |
| B1 | „Nem hiába, nem hiába / A nagy munka, a fáradt szá." — a forma stimmel, a sorvég értelmetlen |
| C | „Az, hogy az anyja méhéből / Születve sose legyünk bunta." — hibátlan ABCB, 8 szótag — és egy nem létező szó |
A „bunta" tökéletesen rímel a „mondta"-ra, tehát a rím-metrika jutalmazza. Ezért kellett a szókincset külön mérni, két lépcsőben:
| feltétel | szótáron kívüli | valóban kitalált |
|---|---|---|
| B0 | 0,021 | 0,015 |
| B1 | 0,023 | 0,019 |
| C (LoRA) | 0,067 | 0,044 |
| GOLD | 0,079 | 0,000 (tautológia) |
A „szótáron kívüli" a magyar hunspell szerinti ismeretlen alak. Ez önmagában félrevezet: a LoRA 6,7%-a közel van Arany 7,9%-ához, amiből az következne, hogy a modell szépen eltanulta az archaikus szókincset. A korpusszal együtt nézve viszont kiderül, hogy ennek kétharmada nem archaizmus: ami sem a szótárban, sem Arany és Petőfi 73 ezer szóalakjában nem szerepel, az kitalált. A bázishoz képest ez közel háromszoros (0,015 → 0,044).
A pontos állítás tehát: a LoRA a rímarányt +32%-kal javítja, és ezért kitalált szavakkal fizet. A modell nem a rímelést tanulta meg, hanem azt, hogy a rím fontosabb a szónál.
Ugyanez a hibamód másképp is megjelenik: a modellágak a sorok 9–12%-át
ismétlik (a LoRA 11,8%-ot), miközben az eredeti versekben ez 0,7%. Egy
megismételt strófa „tökéletesen rímel" önmagával — ezért került be az
ismételt sor mutató is.
8.4 Tengely C — memorizáció: nincs
| feltétel | train n-gram | holdout n-gram | gap | ≥8 szó |
|---|---|---|---|---|
| B0 (bázis) | 1,48 | 1,38 | +0,10 | 0% |
| C (LoRA, 3 epoch) | 1,24 | 1,19 | +0,05 | 0% |
| C (LoRA, 1 epoch) | 1,24 | 1,22 | +0,02 | 0% |
A LoRA nem memorizált: a rés gyakorlatilag nulla — sőt kisebb, mint a bázismodellé (+0,05 vs +0,10) —, és egyetlen generálás sem ad vissza 8 szavas egybefüggő részletet a tanítókorpuszból. A runbook D7 kill-kritériuma nem teljesült.
Figyelemre méltó, hogy a 3 epochos adapter rése (+0,05) alig nagyobb az 1 epochosénál (+0,02), miközben a 8.2 szerint minden stílus- és formai mutatóban jelentősen jobb. A további két epoch stílust hozott, memorizációt gyakorlatilag nem.
A túlillesztés nem azonos a memorizációval. A validációs veszteség emelkedése azt jelzi, hogy a modell romlik az általános nyelvi feladaton — de nem úgy, hogy szó szerint megjegyzi a verseket. Kis LoRA-rangon (0,40% paraméter), 50 ezer soros korpuszon, cím-alapú generálási feladatnál a modell a stílus statisztikáját veszi fel, nem a szöveget.
E kontrollcsoport nélkül (train vs holdout, azonos protokollal) a val-loss emelkedéséből hibásan arra jutottunk volna, hogy a modell memorizál.
⚠️ Amit ez NEM bizonyít: hogy védett korpuszon is biztonságos volna. A mérés arra érvényes, amit mértünk — ez a korpuszméret, ez a rang, ez a feladattípus. A D0 döntés (közkincs korpusz) ettől függetlenül áll.
8.5 Stílus-transzfer — objektív mérés, LLM-bíró nélkül
A klasszifikátor függetlenül tanult a korpusz train szeletén (7 195 blokk), és a holdouton 91,0% pontosságot ér el (többségi alaplap 59,0%) — a metrika tehát értelmezhető. A generált szövegeket soha nem látta.
| feltétel | a klasszifikátor Aranynak ítéli |
|---|---|
| B0 (nyers) | 38,7% |
| B1 (few-shot) | 56,4% |
| C (LoRA) | 77,3% |
| C2 (LoRA + reranker) | 92,0% |
Ez árnyalja a formai metrikák szerény javulását: a LoRA a rímarányon +32%-ot hozott, a stílus egészén viszont megkétszerezte a felismerhetőséget (38,7% → 77,3%). A szókincs, a mondatszerkezet és a hangnem együtt annyira Arany-szerűvé vált, hogy egy TF-IDF-alapú osztályozó is megbízhatóan felismeri.
Érdekes mellékszál, hogy a reranker is javítja a szerző-felismerést (77,3% → 92,0%), pedig kizárólag formai pontszám alapján válogat a jelöltek közül. A kézenfekvő magyarázat az volna, hogy Arany formahű költő, tehát ami formailag jobb, az egyben Arany-szerűbb is.
Ez a magyarázat viszont hibás — a B2 ág megcáfolja. Ugyanaz a reranker a bázismodellen semmit nem javít a szerző-felismerésen (56,4% → 56,0%, ld. 8.7). A reranker tehát nem „formán keresztül stílust" választ; egyszerűen felerősíti azt, ami a jelöltek eloszlásában már benne van. A LoRA-ágon a nyolc jelölt mind Arany-szerű, így a legszabályosabb kiválasztása egyben a legjellegzetesebbet is kiemeli. A bázisági jelöltekben nincs mit kiemelni.
Egy szelektor felerősít, de nem teremt. Ez a különbségtétel a 8.7 központi állítása, és a 8.5 önmagában félrevezetett volna nélküle.
8.6 A reranker-ágak — a determinisztikus utószűrő ereje
| metrika | C (LoRA) | C2 (LoRA + best-of-8) | GOLD |
|---|---|---|---|
| strófaméret | 0,735 | 0,941 | 0,982 |
| szótagszám pontos | 0,203 | 0,471 | 0,800 |
| szótagszám ±1 | 0,562 | 0,817 | 0,974 |
| rímarány | 0,177 | 0,255 | 0,577 |
| rímminőség | 0,139 | 0,206 | 0,400 |
| kitalált szó ↓ | 0,044 | 0,041 | 0,000 |
A best-of-8 reranker minden formai metrikán javít: a szótagszám-pontosságot több mint duplázza, a strófaméret-tartást gyakorlatilag a GOLD szintjére viszi (0,941 vs 0,982). Fontos, hogy közben a kitalált szavak aránya nem nő — a reranker nem „csalással" nyer, hanem nyolc jelöltből kiválasztja azt, amelyik történetesen jól sikerült.
⚠️ Módszertani eltérés: a két reranker-ág (B2, C2) promptonként 1 mintát kap 3 helyett, mert a best-of-8 nyolcszorozza a generálási költséget. A mintaszám ezeken az ágakon 50, a többin 150 — a metrikák pontbecslése tehát zajosabb, a nagyságrendi különbségek viszont ettől nem változnak.
8.7 Megérte-e? — a döntő összevetés
Itt dől el a dolgozat kérdése. A B2 (bázismodell + few-shot + reranker) a LoRA valódi ellenfele: nem tanít semmit, csak nyolcszor kérdez és jól választ. Ha a LoRA ezt nem veri, nem tett hozzá semmit.
Formában a reranker nyer — nem is szorosan
| metrika | B1 few-shot | B2 few-shot+reranker | C LoRA | C − B2 |
|---|---|---|---|---|
| strófaszám | 0,567 | 0,700 | 0,573 | −0,127 |
| strófaméret | 0,802 | 0,938 | 0,735 | −0,203 |
| szótagszám pontos | 0,206 | 0,409 | 0,203 | −0,207 |
| rímarány | 0,114 | 0,236 | 0,177 | −0,059 |
| rímminőség | 0,093 | 0,203 | 0,139 | −0,064 |
| kitalált szó ↓ | 0,019 | 0,013 | 0,044 | +0,031 |
A LoRA minden formai tengelyen alulmarad a B2-vel szemben, és közben háromszor annyi kitalált szót gyárt. Ez a dolgozat legkényelmetlenebb eredménye, és pontosan ezért kellett a B2-t megmérni: aki csak a B0-hoz hasonlít, annak a LoRA látványosan nyer — holott a formát egy szótagszámláló és egy rímfüggvény olcsóbban megveszi.
Az ok nem meglepő, ha a mechanizmusra nézünk: a reranker pontosan azt a célfüggvényt maximalizálja, amit a táblázat mér. Nyolc jelöltből kiválasztja a legszabályosabbat. A LoRA ezzel szemben egy eloszlást tol el — nincs garanciája, hogy bármelyik konkrét minta szabályos lesz.
Stílusban viszont a reranker semmit nem ad hozzá
| feltétel | mit csinál | felismerhető Aranynak |
|---|---|---|
| B1 | few-shot | 56,4% |
| B2 | few-shot + best-of-8 | 56,0% |
| C | LoRA | 77,3% |
| C2 | LoRA + best-of-8 | 92,0% |
A reranker a stíluson nem mozdít: 56,4% → 56,0%. Nem hiba és nem zaj — következmény. A pontozónk szótagot számol és sorvégeket egyeztet; fogalma sincs arról, hogy egy szöveg Aranyra hasonlít-e. Egy szelektor csak azt tudja kiválasztani, amit mérni tud.
A legtisztább összevetés a B2 vs C2: ugyanaz a reranker,
ugyanaz az 50 prompt, ugyanaz a best_of=8, ugyanaz a mag — az
egyetlen különbség az adapter.
56,0% → 92,0%: +36 százalékpont, kizárólag a LoRA-tól.
A válasz
A dolgozat címében feltett kérdésre — mit ad hozzá egy LoRA a jó promptoláshoz? — a mérés pontos választ ad:
Nem a formát. A formát olcsóbban, megbízhatóbban és kevesebb mellékhatással megveszi egy determinisztikus utószűrő. Aki csak rímes, szabályos sorokat akar, annak a LoRA rossz vásár.
Hanem a hangot. Azt, amit a reranker definíció szerint nem tud kiválasztani, mert a célfüggvénye nem ismeri. Ez nem apró különbség: a felismerhetőség 56%-ról 92%-ra megy, miközben a memorizáció-mérés szerint a modell egyetlen sort sem másol.
És a kettő nem alternatíva: a legjobb ág minden tengelyen a C2, amelyik mindkettőt használja — ráadásul olcsóbban is fut a B2-nél, mert a LoRA-nak nem kell 15,7× hosszabb prompt.
(B2)
(C)
(C2)
9. fejezetPipeline
# --- laptop: korpusz, mérőeszköz, adathalmaz
python3 src/fetch_corpus.py # MEK-letöltés + provenance manifest
python3 src/build_corpus.py # HTML → vers-szintű JSON
python3 src/validate_prosody.py # a MÉRŐESZKÖZ validálása (ez fut előbb!)
python3 src/annotate_corpus.py # szótag / rímkulcs / rímséma annotáció
python3 src/build_dataset.py # SFT párok, mű-szintű split
python3 src/build_evalset.py # rögzített eval-szett + extraction próbák
./src/sync_spark.sh # kód + adat → spark-dev
# --- spark-dev: tréning és generálás (konténerben)
ssh spark-dev 'bash ~/lora-study/src/run_mag.sh arany Qwen/Qwen3.5-9B 3'
# vagy meglévő adapterhez, költség szerint átrendezett sorrendben:
ssh spark-dev 'RUN_ID=arany_9b_mixer_r32_e3_s1 bash ~/lora-study/src/run_rest.sh'
# --- vissza a laptopra: kiértékelés
./src/sync_back.sh # generations + futásnaplók vissza
python3 src/evaluate.py # Tengely A + C, GOLD referenciával
python3 src/author_clf.py --score # stílus-transzfer klasszifikátorral
| fájl | szerep |
|---|---|
src/config.py | források, útvonalak, rímküszöbök |
src/fetch_corpus.py | MEK-letöltés, jogi provenance |
src/build_corpus.py | HTML → vers-szintű korpusz |
src/hu_prosody.py | a determinisztikus mérőeszköz — függőség nélkül |
src/validate_prosody.py | a mérőeszköz validálása és ablációja |
src/annotate_corpus.py | prozódiai annotáció |
src/build_dataset.py | SFT párok, mű-szintű split |
src/build_evalset.py | rögzített eval-szett |
src/train_lora.py | LoRA-tréning (spark-dev, konténer) |
src/generate.py | generálás minden feltételhez + reranker |
src/run_mag.sh, run_rest.sh | a spark-dev futtatókörnyezet (idempotens) |
src/sync_spark.sh, sync_back.sh | kód/adat oda, eredmény vissza |
src/plots.py | a dolgozat ábrái |
src/evaluate.py | Tengely A + C, GOLD |
src/author_clf.py | szerző-klasszifikátor |
reports/ | minden mérés riportja |
10. fejezetNyitott pontok és további irányok
-
Célréteg-abláció (
attn8/32 réteg vsmixer32/32 vsmlp). A hibrid architektúra miatt ez itt nem szokásos hiperparaméter-hangolás, hanem arra ad választ, hogy a stílus a token-keverő vagy a feed-forward rétegekben lakik-e. - Méret-sweep (2B / 9B / 27B). Várható mintázat: a stílus-delta csökken a mérettel, a memorizáció viszont nő — nagyobb kapacitás gyorsabban memorizál.
- SAE-alapú mechanisztikus vizsgálat. A Qwen-Scope (residual stream, 32 réteg, TopK=50, 64K feature) közvetlenül megmutatná, mely feature-öket erősíti a LoRA — és ha ezek azonosíthatók, felmerül, hogy puszta steeringgel, adapter nélkül is elérhető-e a stílus. Ez erős állítás lenne: a stílus egy irány a reprezentációban, nem új paraméter. Korlát: a SAE a Base modellre készült, az viszont nem követ instrukciót, tehát a formakövetési metrikáink rajta nem értelmezhetők — külön kísérleti elrendezést igényel.
-
A ragrím-detektor morfológiai alapra helyezése (pl.
emMorph/hunmorph), hogy a
rhyme_qualityabszolút értékként is használható legyen. - Több seed. A jelen mérés egy seeddel készült; kis korpuszon a seed-variancia számottevő lehet.
Minden szám a mérési naplóból származik (data/results/,
reports/); ebben a jelentésben nincs becsült érték.
A korpusz közkincs: Arany János és Petőfi Sándor művei, Magyar Elektronikus
Könyvtár. Modell: Qwen/Qwen3.5-9B · hardver: NVIDIA GB10 (sm_121).
A pipeline, a mérőeszköz és a nyers eredmények a
docai-evals → 2026-08-14-lora-vs-reranker-hu-verse
mappájában.
Ez az anyag eredetileg egy deep learning kurzus házi feladataként készült,
2026 augusztusában; a publikáláskor csak szerkesztői változtatás történt rajta.
A rövid, üzleti olvasat a blogon:
Versel nekünk az AI, de tud-e Arany János stílusában írni?
Ez a jelentés versekről szól, a tanulsága viszont nem irodalmi. Két beavatkozás van: az egyik szabályt tanít (a determinisztikus utószűrő, ami azt választja ki, amit meg tudunk mérni), a másik eloszlást tol el (a finomhangolás). Ami mérhető és leellenőrizhető — mezőformátum, kötelező mezők, számtani egyezés —, azt olcsóbban és megbízhatóbban veszi meg egy szűrő, mint egy tanított modell. Amit nem lehet célfüggvénybe írni, arra kell a tanítás. A DocAI-ban ugyanezt a kettéválasztást használjuk a dokumentumkinyerésnél.
Ez a doboz szándékosan a szövegtörzsön kívül van: a fenti mérés nem termékdemó, és a számai attól érnek valamit, hogy nem annak készültek.
Hogyan működik a DocAI