Vissza a Kutatás rovathoz

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.

Modell
Qwen3.5-9B
Adapter
LoRA r=32 · 0,40%
Korpusz
MEK, közkincs
Hardver
NVIDIA GB10
A fő eredmény

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.

56,0 % → 92,0 %

+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ételmit csinál
B0bázismodell, egyszerű prompt
B1bázismodell + gondos few-shot stílusprompt (4 példa a korpuszból)
B2B1 + determinisztikus rím-reranker (8 mintából a legjobb forma)
CLoRA-adapteres modell
C2C + ugyanaz a reranker — additív-e a két hatás?
GOLDmaga 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őelhunytvédelem lejártforrás
Arany János18821952 végénMEK-00597
Petőfi Sándor18491919 végénMEK-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ájlverssorstrófamedián
sor/vers
szóvissza­nyerés
Arany János9248550 2317 94334282 85392,3%
Petőfi Sándor8585230 6445 21924138 52489,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émamiért számítkezelé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.

elvártsorpontos találat±1 szótagon belül
felező tizenkettes124 12599,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öbArany
(1–2, 3–4)
Petőfi
(2–4)
kontrollrés
v1 additív, coda opcionális (ez fut)0,685,4%64,7%10,0%+65,1%
v10,877,7%50,5%4,1%+60,0%
v2 — coda kötelező0,679,2%57,1%5,6%+62,5%
v3 — csak magánhangzó0,687,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–21–31–42–32–43–4kontroll
Arany János86,0%14,4%11,6%10,5%21,0%84,8%10,9%
Petőfi Sándor35,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őtrainvaltestwritecontinuecoupletsplit-egység
Arany1 332139125264561507392 egység / 454 vers
Petőfi1 920250242659630631844 / 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észletmodul
(2B)
réteg
(2B)
modul
(9B — ez futott)
réteg
(9B)
attn — a bevett recept246 / 24328 / 32
linattn9018 / 2412024 / 32
mixer — a valódi „attention-only"11424 / 2415232 / 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

  1. 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.
  2. 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

leletkö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_second metrika 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ófa­méretszótag
pontos
rímsémarímarányrím­minőségebből
ragrím
distinct-2
GOLD — Arany0,9820,8000,8920,5770,4000,2860,980
GOLD — Petőfi1,0000,8090,8130,6240,4390,2820,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
modellQwen3.5-9B (8,99 Mrd paraméter)
célkészletmixer — 152 modul, 32/32 réteg
tanítható paraméter36,2 M (0,40%)
tanítópélda1 332 (Arany, train szelet)
epoch / lépés3 / 501
tréning-idő63,8 perc (GB10)
train loss3,26 → 2,55
eval loss3,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

1. ábra · Tanulási görbe
Vonaldiagram: a tanítási veszteség végig csökken 3,16-ról 2,10-re, a validációs viszont 1,0 epochnál éri el a minimumát (2,835), és onnantól monoton nő 2,968-ig. A tankönyvi szabály szerint tehát az egy epochos állapotot kellene választani.
A tanítási veszteség végig csökken (3,16 → 2,10), a validációs viszont 1,0 epochnál minimum, utána monoton nő.
epoch0,51,01,52,02,53,0
validációs veszteség2,8802,8352,8742,8702,9672,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:

adapterval.
veszteség
rímarányrím­minőségszótag
pontos
ismételt
sor ↓
felismerhető
Aranynak
1,0 epoch (ckpt-166)2,8350,1190,0920,1800,18168,0%
3,0 epoch (végállapot)2,9680,1770,1390,2030,11877,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

2. ábra · Formai metrikák feltételenként
Hat panel a formai metrikákról, feltételenként (B0 nyers, B1 few-shot, B2 few-shot + reranker, C LoRA, C2 LoRA + reranker), szaggatott GOLD-vonallal. A strófaszámban, a szótagszámban, a rímarányban és a rímminőségben a rerankeres ágak vezetnek; a kitalált szavak paneljén fordított a kép: a B2 0,013-mal a legjobb, a C 0,044-gyel a legrosszabb.
Hat metrika, öt feltétel, GOLD-vonallal. A B2 (few-shot + reranker) és a C2 (LoRA + reranker) formai fölénye szemmel is látszik.
metrikaB0 nyersB1 few-shotC — LoRAGOLD
strófaszám betartva0,4400,5670,5731,000
strófaméret0,8050,8020,7350,982
szótagszám pontos0,1530,2060,2030,800
rímséma egyezés0,0640,0430,0870,892
rímarány0,1340,1140,1770,577
rímminőség0,1110,0930,1390,400
distinct-20,8320,8220,8280,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:

ágkimenet (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ételszótáron kívülivalóban kitalált
B00,0210,015
B10,0230,019
C (LoRA)0,0670,044
GOLD0,0790,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

3. ábra · Memorizáció — train vs holdout
Oszloppárok a leghosszabb közös szó-n-gramról a tanított és a félretett verseken: a bázismodellnél 1,48 és 1,38 (rés +0,10), a háromepochos LoRA-nál 1,24 és 1,19 (+0,05), az egyepochosnál 1,24 és 1,22 (+0,02). A nyolcszavas kill-küszöböt egyik ág sem közelíti meg.
A leghosszabb közös szó-n-gram a tanított és a félretett verseknél. Ha a LoRA memorizálna, a két oszlop szétnyílna.
feltételtrain n-gramholdout n-gramgap≥8 szó
B0 (bázis)1,481,38+0,100%
C (LoRA, 3 epoch)1,241,19+0,050%
C (LoRA, 1 epoch)1,241,22+0,020%

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étela 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

metrikaC (LoRA)C2 (LoRA + best-of-8)GOLD
strófaméret0,7350,9410,982
szótagszám pontos0,2030,4710,800
szótagszám ±10,5620,8170,974
rímarány0,1770,2550,577
rímminőség0,1390,2060,400
kitalált szó ↓0,0440,0410,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

metrikaB1
few-shot
B2
few-shot+reranker
C
LoRA
C − B2
strófaszám0,5670,7000,573−0,127
strófaméret0,8020,9380,735−0,203
szótagszám pontos0,2060,4090,203−0,207
rímarány0,1140,2360,177−0,059
rímminőség0,0930,2030,139−0,064
kitalált szó ↓0,0190,0130,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ételmit csinálfelismerhető Aranynak
B1few-shot56,4%
B2few-shot + best-of-856,0%
CLoRA77,3%
C2LoRA + best-of-892,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.

Reranker egyedül
(B2)
formaerős
stílusnem mozdít
inferencia26,8 s
LoRA egyedül
(C)
formagyenge
stíluserős
inferencia2,6 s
Együtt
(C2)
formalegjobb
stíluslegjobb
inferencia18,5 s

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ájlszerep
src/config.pyforrások, útvonalak, rímküszöbök
src/fetch_corpus.pyMEK-letöltés, jogi provenance
src/build_corpus.pyHTML → vers-szintű korpusz
src/hu_prosody.pya determinisztikus mérőeszköz — függőség nélkül
src/validate_prosody.pya mérőeszköz validálása és ablációja
src/annotate_corpus.pyprozódiai annotáció
src/build_dataset.pySFT párok, mű-szintű split
src/build_evalset.pyrögzített eval-szett
src/train_lora.pyLoRA-tréning (spark-dev, konténer)
src/generate.pygenerálás minden feltételhez + reranker
src/run_mag.sh, run_rest.sha spark-dev futtatókörnyezet (idempotens)
src/sync_spark.sh, sync_back.shkód/adat oda, eredmény vissza
src/plots.pya dolgozat ábrái
src/evaluate.pyTengely A + C, GOLD
src/author_clf.pyszerző-klasszifikátor
reports/minden mérés riportja

10. fejezetNyitott pontok és további irányok

  1. Célréteg-abláció (attn 8/32 réteg vs mixer 32/32 vs mlp). 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.
  2. 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.
  3. 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.
  4. A ragrím-detektor morfológiai alapra helyezése (pl. emMorph/hunmorph), hogy a rhyme_quality abszolút értékként is használható legyen.
  5. 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?

Mit jelent ez a DocAI-ban

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