Mennyire tud magyarul egy helyi AI?

· minusat · 8 perc olvasás

Frissítés: egy alaposabb, 13 feladatos teszt után a brAInharbor alapmodellje a qwen3.5:35b-a3b lett, a gemma4:26b pedig a kisebb gépekre ajánlott változat. A részletek a második bejegyzésben vannak.

Miért kérdés ez egyáltalán?

Egyre több kisvállalkozás íratna mesterséges intelligenciával leveleket, válaszokat és összefoglalókat, de nem szívesen küldi el az ügyfelei adatait egy külföldi felhőszolgáltatásnak. Kézenfekvő megoldás egy nyílt modell, amely a saját gépen fut: az adat nem hagyja el az irodát, és nincs havidíj.

Csakhogy a nagy felhős modellek jól írnak magyarul, a kicsik viszont kitalált szavakat, rossz ragokat, idegen betűket adnak. Arra voltam kíváncsi, hogy egy otthon is elérhető gépen futó modell tud-e annyira magyarul, hogy a szövegét egy ügyfélnek is el lehessen küldeni.

A gép: egy RTX 5070 videokártya 12 GB memóriával és 32 GB RAM. A rövid válasz: a gemma4:26b jó beállításokkal használható és gyors, de nem hibátlan. Ami ügyfélhez megy, azt egy embernek el kell olvasnia.

Az alábbiakban leírom, hogyan teszteltem, mi meglepett, és melyik beállítás lett végül az alapértelmezett a brAInharbor nevű csomagban.

Hogyan teszteltem

Eleinte a csevegőfelületen próbálgattam a modelleket, de egy-egy válaszból nem lehet következtetni: ugyanaz a modell egyszer hibátlan levelet ír, máskor kitalál egy szót. Ezért írtam egy kis Python-szkriptet, amely minden modellnek pontosan ugyanazokat a feladatokat adja, többször is.

Hat feladat van benne, olyanok, amilyeneket egy kis iroda tényleg kérne:

Minden feladat háromszor fut, így egy beállítás 18 választ ad. A szkript méri az időt, és minden választ automatikusan ellenőriz:

Az ismert hibák listájára azért van szükség, mert a helyesírás-ellenőrző nem lát mindent. A „késedelmééről” például létező szóalak, csak értelmetlen. A „ki kell végezni” is helyes, csak éppen kivégzést jelent, nem azt, hogy valamit el kell végezni. Ezeket csak olvasás közben lehet észrevenni.

A futások megismételhetők: azonos beállítással és véletlenmaggal (seed) a modell pontosan ugyanazt válaszolja. Így egy prompt módosítása után látszik, hogy a változás tényleg a módosítástól jön, nem a véletlentől.

A kisebb modell nem elég: 12b kontra 26b

Két modellt hasonlítottam össze a Google Gemma 4 családjából. A gemma4:12b kényelmesen elfér a 12 GB-os kártyán, és nagyon gyors: körülbelül 130 tokent ír másodpercenként. A gemma4:26b nagyobb, és nem fér el teljesen a videokártya memóriájában. Mégis használhatóan gyors, mert úgynevezett mixture-of-experts modell: minden szóhoz a paramétereinek csak kis részét, nagyjából 4 milliárdot használja. Így másodpercenként 45–70 tokent ír, ami bőven gyorsabb, mint ahogy olvasunk.

Az első benyomás csalt. Néhány kézi próba után a 12b majdnem hibátlannak tűnt, és már azt terveztem, hogy ez lesz az alapértelmezett. A szkriptes futások mást mutattak:

A tanulság: egy-két próba alapján nem szabad modellt választani, mert a hibák véletlenszerűen jönnek elő.

A gondolkodás ötször lassabb, és nem jobb

A Gemma 4 modellek tudnak „gondolkodni”: válasz előtt végiggondolják, hogyan oldják meg a feladatot, és ezt le is írják. Matematikában vagy többlépéses feladatokban ez segíthet. Egy rövid levélnél viszont mást mutattak a számok:

GondolkodássalGondolkodás nélkül
Válaszidő (medián)kb. 17 mpkb. 3,3 mp
A kimenet mekkora része gondolkodás85–95%0%
Magyar hibákugyanannyiugyanannyi

A modell tehát a munkája nagy részét olyan szövegre fordította, amelyet senki sem olvas el, a végeredmény pedig nem lett jobb. Ezért a brAInharborban a gondolkodás alapból ki van kapcsolva. Aki bonyolultabb feladatot ad, a csevegés beállításaiban visszakapcsolhatja.

A pontosabb változat sem lett jobb

A helyben futtatott modelleket tömörítve (kvantálva) szokás letölteni. Az alapértelmezett q4 változat nagyjából 4 biten tárolja a modell súlyait, a q8 8 biten. A q8 kétszer akkora, és a várakozás az, hogy kevesebbet hibázik. Úgy gondoltam, a magyar ragozási hibák egy része talán a tömörítésből jön.

A 18 válasz alapján nem így van:

Ez kis minta, és nem bizonyítja, hogy a q8 általában rosszabb. Azt viszont igen, hogy ezen a gépen nem éri meg a dupla méretet és a lassabb válaszokat. Maradt a q4.

Mire jó a rendszerprompt, és hol a határa

A legnagyobb javulást nem a modellválasztás hozta, hanem a magyar nyelvű rendszerprompt, vagyis az az állandó utasítás, amelyet a modell minden beszélgetés elején megkap. Nélküle a 26b is rosszul ragozott, és angol szavakat, néha kínai írásjeleket kevert a szövegbe. Egy rövid magyar utasítás és alacsonyabb hőmérséklet (0,3, vagyis kevesebb véletlenszerűség) sokat segített.

Utána több változatot is kipróbáltam, és mindegyik tanított valamit:

A tanulság: egy kis modellnél a prompt minden módosítása újrakeveri a hibákat. Egy hibát meg lehet szüntetni, de a helyette érkező újakat csak több futás után látni. Egy ponton abba kell hagyni a csiszolást, és a maradék hibákat máshogy kezelni.

A végleges rendszerprompt:

Mindig kizárólag helyes, természetes magyar nyelven válaszolj, idegen szavak és más írásrendszerek betűi nélkül. Kivételt csak a bevett rövidítések és szakszavak jelentenek (például GDPR, e-mail). Írj rövid, egyszerű mondatokat, és kerüld a tükörfordításokat (például „meg fog történni”).

Csak akkor írj levelet tárggyal, megszólítással és elköszönéssel, ha levelet vagy e-mailt kérnek tőled. Hivatalos levélben magázódj; ha a feladat tegeződést kér, tegeződj.

Példa egy jó hivatalos levél stílusára: [egy háromsoros értesítés egy rendelés késéséről]

A rejtett 6000 token az Open WebUI-ban

A modellt a felhasználók az Open WebUI csevegőfelületén keresztül érik el. Ott feltűnt valami furcsa: egy „Helló! Mennyi 1x1?” kérdésre a modell több másodpercig hallgatott, mielőtt válaszolni kezdett, és a statisztika szerint több mint 6000 tokent kapott bemenetként.

Kiderült, hogy az Open WebUI új, alapértelmezett (natív) függvényhívási módja minden üzenethez mellékeli a beépített eszközei leírását, hogy a modell maga dönthessen a használatukról. Egy nagy felhős modellnek ez alig számít, egy helyi gépen viszont minden token idő:

Natív mód (alapértelmezett)Régi (legacy) mód
Bemeneti tokenek6028293
Idő a válasz első szaváig7,2 mp0,4 mp

A régi módban az Open WebUI maga keres a feltöltött dokumentumokban, és csak a találatokat adja a modellnek. Kipróbáltam egy feltöltött PDF-fel is: a válasz magyarul jött, forrásmegjelöléssel. A brAInharbor ezért a régi módot állítja be alapértelmezettnek, a modell kontextusablakát pedig 16 ezer tokenre emeli, hogy a dokumentumrészletek is elférjenek.

Egy másik apróság: ha az Open WebUI a saját rendszerüzenetét küldi (például dokumentumkeresésnél), az Ollama elhagyja a modellbe épített magyar rendszerpromptot. Ezért a prompt két helyen is szerepel, és egy automatikus ellenőrzés figyeli, hogy a két példány ne térjen el egymástól.

Ami megmaradt: az ember nem spórolható meg

A végső beállítás (gemma4:26b, q4, gondolkodás nélkül, 0,3-es hőmérséklet, a fenti prompt) gyors, és a válaszai többségében nincs hiba. Néhány visszatérő hiba azonban minden prompttal megmaradt, ezek a modell saját gyengeségei:

Ezek apróságnak tűnnek, de egy ügyfélnek küldött levélben rossz benyomást keltenek. Ezért a helyes hozzáállás az, hogy a helyi modell piszkozatot ír, mint egy ügyes, de még betanítás alatt álló kolléga. Időt spórol, de amit kiküldünk, azt egy embernek el kell olvasnia.

Két irányban lehet továbblépni:

Próbáld ki

Minden, amiről itt szó volt, benne van a brAInharbor első kiadásában (v0.1.0). Ez egy nyílt forrású csomag, amely egyetlen linuxos gépre telepíti az Ollamát, az Open WebUI-t és a Caddy webszervert, a fenti magyar beállításokkal és HTTPS-sel. Van benne mentés és visszaállítás is, amelyet egy üres gépen is kipróbáltam.

git clone https://github.com/brainharbor/brainharbor.git
cd brainharbor
cp .env.example .env    # DOMAIN és WEBUI_SECRET_KEY beállítása
scripts/preflight.sh    # ellenőrzi a gépet
docker compose up -d
scripts/pull-models.sh  # letölti a modelleket

A tesztcsomag is benne van (tests/hu/). Ha más modellt vagy más promptot próbálnál ki, ugyanazokkal a feladatokkal és ellenőrzésekkel mérheted meg, például:

python3 tests/hu/run.py --models gemma4:26b,gemma4:12b --runs 3

Ha találsz egy modellt, amely jobban ír magyarul ezen a méretben, vagy egy hibát, amelyet a lista nem ismer, szívesen hallok róla.