Blog/Retrieval és keresés
Beágyazó modellek finomhangolása: nehéz negatívok, veszteségek és kiértékelés
Beágyazások finomhangolása: mikor jobb a rerankernél, tanítópárok, nehéz negatívok, veszteségek a sentence-transformers v6-ban, Matryoshka és költség.
Balázs Csorba··frissítve ·8 perc olvasás
- Embeddings
- Fine-tuning
- RAG
- Evaluation
- Sentence Transformers

A lényeg röviden
- A visszakeresőt akkor hangolja finomra, ha a megfelelő dokumentumot egyáltalán nem találja meg; rerankert akkor vegyen fel, ha megtalálja, de túl hátra sorolja. Sok csapatnak előbb a reranker kell.
- A tanítópárok származhatnak naplókból, jegyekből vagy LLM által generált lekérdezésekből; az InPars és a Promptagator szerint a szintetikus lekérdezések szűrve működnek, a tesztfelosztásnak pedig dokumentumonként kell történnie, nem páronként.
- A nehéz negatívok adják a legerősebb jelet és a legrosszabb hibákat: rögzített modellel bányássza őket, tartson margósávot, és cross-encoderrel pontozza újra őket a hamis negatívok kiszűréséhez.
- A sentence-transformers v6-ban kezdjen a MultipleNegativesRankingLoss-szal vagy a gyorsítótáras változatával, próbálja a GISTEmbedet, ha a hamis negatívok zavarnak, és csomagolja MatryoshkaLoss-ba a veszteséget, ha kisebb dimenziókat szolgál ki.
- Előtte és utána mérje a recall@k-t és az nDCG-t egy rögzített saját lekérdezéskészleten, ellenőrizze a független forgalmat felejtés szempontjából, és számítson arra, hogy egy gyorsan iterált kis modell megver egy drága nagy futtatást.
Egy beágyazó modell finomhangolása azt jelenti, hogy egy általános visszakeresőt a saját terület lekérdezés–dokumentum párjain tanít, hogy a felhasználók kérdései az őket megválaszoló dokumentumok közelébe kerüljenek. Akkor éri meg, ha az alapmodell hasonlóságfelfogása nem egyezik az Önével: egymásra hasonlító, de mást jelentő termékkódok, szabályozási nyelv, belső szakzsargon. Nem éri meg, ha a megfelelő dokumentumot már megtalálja, csak túl hátra sorolja, mert ezt egy reranker olcsóbban javítja.
Ez a cikk a tanítási ciklusról szól, nem a modellválasztékról: a finomhangolás és az újrarangsorolás közötti döntésről, a tanítópárok forrásáról, a nehéz negatívokról, a sentence-transformers v6 veszteségfüggvényeiről, a 2026 októberében adaptálásra érdemes alapmodellekről, a Matryoshka-dimenziókról, az éles működést előrejelző kiértékelésről, a GPU-költségről és a hibamódokról. Magát az alapmodell kiválasztását a beágyazó modell kiválasztásáról szóló cikk tárgyalja.
Mikor jobb a finomhangolás a rerankernél
A finomhangolás akkor jobb a rerankernél, ha a hiba a visszakeresésben van, nem a rangsorolásban. A sentence-transformers dokumentációja egyszerűen fogalmaz: a finomhangolás „gyakran jelentősen javítja a modell teljesítményét az Ön felhasználási esetén, mert minden feladat más hasonlóságfelfogást igényel” (Sentence Transformers). A reranker együtt olvassa a lekérdezést és a dokumentumot, és páronként pontosabb, de csak azt tudja átrendezni, amit az első lépcső megtalált. Ha a válasz nincs a top 50-ben, egyetlen reranker sem menti meg.

A gyakorlatban a kettő együtt működik. Maga a BGE-M3 modellkártyája is hibrid visszakeresést és utána cross-encoder rerankert ajánl (BGE-M3), és a szokásos végállapot egy finomhangolt visszakereső, rajta egy rerankerrel. A költség szempontjából a sorrend számít: előbb vegye fel a rerankert, mérje meg, mi hiányzik még, és csak akkor tanítson, ha maradnak visszakeresési hibák. A rerankerek összevetését a cross-encoder rerankerek összehasonlítva című cikk tartalmazza.
Honnan jönnek a tanítópárok
A legjobb párok a valódiak: egy keresési lekérdezés és a dokumentum, amelyet a felhasználó megnyitott és megtartott, egy ügyfélszolgálati jegy és a cikk, amely megoldotta. Ahol ilyenek nincsenek, ott generálni kell őket. Az InPars néhány példás LLM-promptokkal dokumentumonként lekérdezéseket generál, és arról számol be, hogy a kizárólag ezen az adaton finomhangolt visszakeresők jobbak a BM25-nél (InPars); a Promptagator rövid feladatleírásból és legfeljebb nyolc példából generál feladatspecifikus lekérdezéseket, és szerint a dual encoderek 11 adathalmazon átlagosan több mint 1,2 nDCG-vel verik az MS MARCO-n tanított ColBERT v2-t (Promptagator).

A szintetikus adat csak szűrés után működik. Dobja ki azokat a lekérdezéseket, amelyekre a darab nem ad választ, a közel azonosakat, a rossz nyelvűeket, és azokat a kérdéseket, amelyek egész kifejezéseket másolnak a darabból, mert ezek a felszíni szavak egyeztetésére tanítják a modellt a jelentés helyett. Nincs publikált szám arra, hány pár kell; a gyakorlatban területenként néhány ezer tiszta pár szokásos kiindulópont, és a minőség fontosabb a mennyiségnél.
A tanító-, validációs és tesztkészletet dokumentumonként vagy lekérdezésklaszterenként ossza fel, soha ne páronként. Ha ugyanarról a darabról szóló két generált lekérdezés a felosztás két oldalára kerül, a teszt a bemagolást méri. Az első kísérlet előtt fagyassza be a tesztkészletet, és hangolás közben ne nézzen bele; erre a validációs készlet való.
Nehéz negatívok
Az olyan kontrasztív veszteségek, mint a MultipleNegativesRankingLoss, a batch minden más pozitív példáját negatívnak tekintik. Ezek a batchen belüli negatívok többnyire könnyűek, így a modell a durva különbségeket gyorsan, a finomakat lassan tanulja meg. A nehéz negatívok, vagyis a relevánsnak látszó, de nem releváns dokumentumok hordozzák a legerősebb jelet. A RocketQA alkotta meg azt a receptet, amelyet a legtöbb finomhangolás ma is átvesz, batchek közötti negatívokkal és zajszűrt nehéz negatívokkal, mert a címkézetlen pozitívok egyébként megmérgezik a tanítást (RocketQA).
A sentence-transformers ma már tartalmazza az eszközöket. A mine_hard_negatives() beágyazza a párokat, minden lekérdezéshez megkeresi a legközelebbi dokumentumokat, cross-encoderrel újrapontozhatja a jelölteket, és a range_min, range_max, valamint egy abszolút vagy relatív margó által kijelölt sávon belül választ negatívokat (nehéz negatívok). Hagyja ki a legfelső néhány találatot, mert ezek a legvalószínűbb hamis negatívok, és tartson margót a pozitív pontszáma alatt. Az alapmodell rögzített másolatával bányásszon, ne a tanított modellel, különben a negatívok elmozdulnak Ön alatt.
Bányászás után hasznos józansági ellenőrzés kézzel elolvasni húsz véletlenszerű hármast. Ha több negatív valójában megválaszolja a lekérdezést, emelje a range_min értékét vagy szűkítse a margót; ha a negatívok nyilvánvalóan függetlenek, túl könnyűek, és a sáv túl széles. Itt tíz perc olvasás megspórol egy olyan tanítási futást, amely rossz határt tanít a modellnek.
Veszteségfüggvény választása a sentence-transformers v6-ban
Lekérdezés–dokumentum párokhoz a dokumentált lehetőségek a MultipleNegativesRankingLoss, annak gyorsítótáras változata, a MegaBatchMarginLoss és a két GISTEmbed-veszteség; a MatryoshkaLoss, a Matryoshka2dLoss és az AdaptiveLayerLoss bármelyiket becsomagolja (veszteségáttekintő). A tanítási áttekintő saját példája egy epochot, 16-os batchméretet, 2e-5 tanulási rátát és duplikátummentes batch-mintavételezőt használ, mert a batchen belüli negatívokra épülő veszteségek romlanak, ha egy batch kétszer tartalmazza ugyanazt a szöveget (Sentence Transformers).
| Veszteség | Bemenet | Igény | Mikor | Buktató |
|---|---|---|---|---|
| MultipleNegativesRankingLoss | párok vagy hármasok | nagy batch segít | alapértelmezett kezdés | a batchen belüli duplikátum hamis negatív lesz |
| CachedMultipleNegativesRankingLoss | párok vagy hármasok | gradiens-gyorsítótár | nagy effektív batch kis GPU-n | kicsit lassabb; Matryoshka2d-vel nem |
| GISTEmbedLoss | párok vagy hármasok | vezetőmodell | sok hamis negatív | tanítási többletteher |
| CachedGISTEmbedLoss | párok vagy hármasok | vezetőmodell, gyorsítótár | GIST nagy batchekkel | a mini_batch_size-t a memóriához kell igazítani |
| MatryoshkaLoss | más veszteséget burkol | dimenziók listája | csonkított vektorok kiszolgálása | minden kiszolgált dimenziót mérni kell |
A CachedMultipleNegativesRankingLoss gradiens-gyorsítótárazással jóval nagyobb batcheket ér el többletmemória nélkül, kis sebességveszteség árán (veszteségek), a GradCache technikára építve (GradCache). A GISTEmbedLoss egy vezetőmodellt kap, és azzal dobja el azokat a batchen belüli negatívokat, amelyeket a vezetőmodell túl hasonlónak ítél a pozitívhoz, ami közvetlenül a hamis negatívokat kezeli (GISTEmbed). Egy korlátozást érdemes ismerni: a Matryoshka2dLoss nem tudja becsomagolni a gyorsítótáras, hook-alapú veszteségeket.
# Sketch for sentence-transformers v6: mine negatives with a fixed model, train with a cached loss
from sentence_transformers import SentenceTransformer, SentenceTransformerTrainer, SentenceTransformerTrainingArguments
from sentence_transformers.cross_encoder import CrossEncoder
from sentence_transformers.sentence_transformer.losses import CachedMultipleNegativesRankingLoss, MatryoshkaLoss
from sentence_transformers.util import mine_hard_negatives
base = SentenceTransformer("BAAI/bge-m3")
miner = SentenceTransformer("BAAI/bge-m3") # fixed copy, never the model being trained
train = mine_hard_negatives(
pairs_train, miner, cross_encoder=CrossEncoder("BAAI/bge-reranker-v2-m3"),
range_min=10, range_max=50, relative_margin=0.05, num_negatives=3, output_format="triplet",
)
loss = MatryoshkaLoss(base, CachedMultipleNegativesRankingLoss(base, mini_batch_size=32),
matryoshka_dims=[1024, 512, 256])
args = SentenceTransformerTrainingArguments(
output_dir="out/bge-m3-domain", num_train_epochs=1, per_device_train_batch_size=128,
learning_rate=2e-5, warmup_ratio=0.1, bf16=True, batch_sampler="no_duplicates",
)
SentenceTransformerTrainer(model=base, args=args, train_dataset=train, loss=loss).train()2026-ban adaptálásra érdemes alapmodellek
2026 októberében három nyílt család fedi le a legtöbb igényt. A BGE-M3 MIT licencű, egyetlen modellből végez sűrű, ritka és többvektoros visszakeresést, 8192 tokenes bemenetet kezel, és több mint 100 nyelvet fed le (BGE-M3). A Qwen3-Embedding 0.6B, 4B és 8B méretben érhető el Apache-2.0 alatt, 32K kontextussal, instrukciófüggő bemenettel és Matryoshka-dimenziókkal; a saját tanítása LoRA-t és háromlépcsős folyamatot használt, amelyben az LLM tanítóadatot is szintetizált (Qwen). Az EmbeddingGemma 2 egy 740M-es multimodális modell, 768-tól 128 dimenzióig terjedő Matryoshka-csonkítással és Apache-2.0 súlyokkal (Google).
Az első kört általában a kisebb modell nyeri. Egy 0.6B-s modell egy GPU-n órák alatt tanul, így egy 8B-s futás idejében tíz kísérletet futtathat az adatokkal és a negatívokkal, a javulás nagy része pedig az adatminőségből jön, nem a paraméterszámból. Az MMTEB-tanulmány a 560M paraméteres multilingual-e5-large-instructot nevezte meg a többnyelvű benchmarkjának legjobb nyilvánosan elérhető modelljeként (MMTEB); ez a tanulmány pillanatképére vonatkozik, de megmutatja, meddig juthat egy közepes méretű modell.
Matryoshka: egyszer tanítani, kisebben kiszolgálni
A MatryoshkaLoss a beágyazás csonkított szeleteire alkalmazza az alapveszteséget, így az első 512, 256 vagy 128 dimenzió önmagában is használható marad. A könyvtár saját kísérletében egy Matryoshkával tanított modell a beágyazási méret 8,3 százalékánál megőrizte teljes teljesítménye 98,37 százalékát, szemben egy hagyományos modell 96,46 százalékával (Matryoshka). Ez a kiszolgáláskor számít, ahol a kisebb vektor kevesebb memóriát és gyorsabb keresést jelent; a kvantálás és a csonkítás kombinálható, ahogy a beágyazás-kvantálás bináris és Matryoshka módszerekkel című cikk leírja.
A megkötés a kiértékelés: a Matryoshka csak akkor térül meg, ha a kiszolgált szelet ugyanaz, amelyet megmért. A recallt minden telepíteni tervezett dimenzión mérje, ne csak teljes méretben.
Az éles működést előrejelző kiértékelés
A recall@k-t, az nDCG@10-et és az MRR-t a befagyasztott tesztkészletén mérje tanítás előtt és után, azon a k-n, amelyet ténylegesen visszakeres. A nyilvános benchmarkok itt eleve gyenge helyettesítők: az MMTEB több mint 500 feladatot ölel fel több mint 250 nyelven, angol benchmarkja pedig zero-shot célú, és kizárja az olyan adathalmazokat, mint az MS MARCO, amelyeket gyakran használnak finomhangolásra (MMTEB). Egy finomhangolás egyszerre emelheti a területi pontszámot és csökkentheti a ranglistás pontszámot, és csak az első számít.
Ezután futtassa újra a teljes RAG-kiértékelést, ne csak a visszakeresést, mert a jobb recall is adhat rosszabb válaszokat, ha az új legjobb darabok hosszabbak vagy zajosabbak. A összevetést kezelje bizonyossági szinttel ellátott döntésként: a jev-decide skillemben az alacsony bizonyosságú döntés emberhez kerül, ahelyett hogy végrehajtódna, és egy olyan finomhangolás, amely a validációs készlet zajánál kisebb különbséggel nyer, ebbe a kategóriába tartozik. A teljes válaszokhoz szükséges kiértékelési adatok generálását a szintetikus tesztadatok RAG-kiértékeléshez című cikk írja le.
Költség GPU-órákban
A számítás rövid. 2026 októberében egy A100 80GB igény szerinti bérlése óránként kb. 1,79 dollár a RunPodnál (RunPod) és 2,79 dollár a Lambdánál (Lambda). Egy kártyán hatórás futás így kb. 11–17 dollár, egy 7–8B-s modellen 24 órás LoRA-futás kb. 43–67 dollár; ezek óradíjakból számolt becslések, nem benchmarkok. A kis modellek teljes finomhangolása elfér egy kártyán; a 7–8B-s modellekhez általában LoRA és gradiens-gyorsítótár kell.
Nem a GPU a drága, hanem az iterációs ciklus. Három nap gyors futtatás egy 0.5B-s modellen, mindegyikben egyetlen dolgot változtatva az adatokon vagy a negatívokon, általában jobb eredményt ad, mint egy hősies futás egy 8B-s modellen, amelyet nem engedhet meg magának többször.
Buktatók: felejtés és nyelvek
A katasztrofális felejtés a sűrű visszakeresésben dokumentált jelenség, nem feltevés. Az ANCE-Tele az iteratív bányászó–tanító ciklusok instabilitását arra vezette vissza, hogy a modellek a negatívok különböző csoportjait megtanulják, majd elfelejtik (ANCE-Tele), egy 2025-ös tanulmány pedig azt találta, hogy az időbeli lekérdezésekre hangolt rendszerek a hétköznapi lekérdezéseken veszítenek pontosságukból (időbeli IR). Tartsa alacsonyan a tanulási rátát, először egy epochot tanítson, keverjen vissza néhány általános párt, és a területi készlet mellett teszteljen egy mintát független lekérdezésekből is.
Ellenőrzőlista az index cseréje előtt
- Rögzítsen alapállapotot, és naplózza a recall@k, nDCG@10 és MRR értékeket egy befagyasztott tesztkészleten.
- Győződjön meg róla, hogy visszakeresési hibáról van szó, nem rangsorolási gondról, amelyet egy reranker megoldana.
- Nyelvenként építsen szűrt párokat, és dokumentumonként ossza fel őket.
- Rögzített modellel és cross-encoder szűrővel bányásszon negatívokat.
- Kezdjen MNRL-lel vagy a gyorsítótáras változatával, 2e-5-tel és egy epochhal.
- Értékeljen ki minden kiszolgálni tervezett Matryoshka-dimenziót.
- Ellenőrizze a független lekérdezéseket felejtés szempontjából, majd futtassa újra a teljes RAG-kiértékelést.
- Csak akkor ágyazza be újra a korpuszt és cserélje az indexet, ha a fentiek mind teljesültek.
Ha a visszakeresése elvéti a szakterületi kérdéseket, és tudni szeretné, hogy a finomhangolás vagy egy reranker az olcsóbb megoldás, nézze meg a MI-mérnöki munkámat.
Források
- Sentence Transformers: training overview
- Sentence Transformers: loss overview
- Sentence Transformers: hard negative mining
- RocketQA (arXiv 2010.08191)
- InPars (arXiv 2202.05144)
- Promptagator (arXiv 2209.11755)
- Qwen blog: Qwen3-Embedding (Jun 2025)
- BAAI/bge-m3 model card
- Google: EmbeddingGemma docs (Oct 2026)
- Sentence Transformers: Matryoshka embeddings
- MMTEB (arXiv 2502.13595)
- ANCE-Tele (arXiv 2210.17167)
Gyakori kérdések
Mikor hangoljak finomra egy beágyazó modellt reranker helyett?
Akkor, ha a releváns dokumentum egyáltalán nincs a visszakeresett jelöltek között, ami általában azt jelenti, hogy az alapmodell hasonlóságfelfogása nem illik a területéhez. Ha a megfelelő dokumentumot megtalálja, de hátra sorolja, egy cross-encoder reranker olcsóbb, és gyakran elég. Bármilyen tanítás előtt mérje meg, melyik esetről van szó.
Honnan szerezzek tanítóadatot beágyazások finomhangolásához?
Ahol van, használjon valódi lekérdezés–dokumentum párokat keresési naplókból vagy ügyfélszolgálati jegyekből, ahol nincs, ott darabonként generáltasson lekérdezéseket egy LLM-mel, kiszűrve a megválaszolhatatlanokat és a duplikátumokat. A tanító-, validációs és tesztkészletet dokumentumonként vagy lekérdezésklaszterenként ossza fel, hogy a tesztkészlet ne szivárogjon.
Mik a nehéz negatívok, és miért fontosak?
A nehéz negatívok olyan dokumentumok, amelyek hasonlítanak a lekérdezésre, de nem válaszolják meg. Finom különbségekre tanítják a modellt, amire a batchen belüli negatívok önmagukban nem képesek. A kockázat a hamis negatív, vagyis olyan dokumentum, amely mégis megválaszolja a kérdést, csak nincs felcímkézve, ezért margóval bányásszon, és cross-encoderrel pontozzon újra.
Melyik veszteségfüggvényt használjam a sentence-transformersben?
Lekérdezés–dokumentum párokhoz kezdjen a MultipleNegativesRankingLoss-szal és duplikátummentes batch-mintavételezővel. Korlátozott memóriánál nagyobb effektív batchhez használja a gyorsítótáras változatot, gyakori hamis negatívoknál a GISTEmbedLoss-t, és burokként a MatryoshkaLoss-t, ha csonkított beágyazásokat szolgál majd ki.
Mennyibe kerül egy beágyazó modell finomhangolása?
2026 októberében egy A100 80GB óránként kb. 1,79–2,79 dollárba kerül a szokásos GPU-felhőkben. Ezzel számolva egy hatórás futás nagyjából 11–17 dollár, egy 24 órás LoRA-futás egy 7–8B-s modellen kb. 43–67 dollár; a kis modellek általában rövidebb idő alatt tanulnak.