Přestaňte hrabat se s RAG, který nic nenajde. Multi-vector embeddingy si vycvičíte za víkend a za pár stovek korun

Hledáte v interní dokumentaci přes sémantické vyhledávání a dostanete nesouvisející šum? Nejste sami. Většina firemních RAG pipeline stojí na jediném vektoru o 768 rozměrech, do kterého se celý dokument rtuťově zkomprimuje. Pak se divíme, že model nechápe, kde končí rozvaděč a začíná tarifa. Řešení existuje už pár let a jmenuje se multi-vector embedding — přístup ColBERT, kde má každý token vlastní vektor. A díky knihovně Sentence Transformers ho dnes vyladíte na domácí grafické kartě za víkend. Zatímco svět sleduje, jak trailer na Godzillu Minus Zero teases Kinga Ghidorahu, v ML komunitě se mluví o něčem jiném: IBM uvolnilo model Granite PatchTST-FM-r2 s komerční licencí a fine-tuning malých modelů (viz nedávný experiment s 350M modelem a sto kroky GRPO) prakticky zabíjí argument "proč platit za API gigantů". Tři hlavy Ghidorahu, tři tisíce tokenových vektorů — v tomhle článku bude jedno, co z toho je dražší.
Proč jeden vektor nestačí a co vlastně dělá multi-vector
Klasické dense embeddingy (MiniLM, bge, E5) stlačí celou větu nebo dokument do jednoho bodu ve vektorovém prostoru. Je to rychlé a úsporné, ale je to komprese bezztrátová jen na papíře. Když se zeptáte "jak nastavit přetlakování v rozvodné skříni", model musí celou vaši otázku zhmotnit do jednoho vektoru a stejně tak celou stránku manuálu. Detaily se v té svačině ztrácejí.
ColBERT (Contextualized Late Interaction over BERT) jde jinou cestou. Každý token v dokumentu i v dotazu dostane vlastní vektor. Skóre relevance se pak počítá operací MaxSim: každý token dotazu najde svůj nejlepší soupeřící token v dokumentu a výsledky se sečtou. Jemnost je úplně jiná — model vidí, že slovo "přetlakování" v dotazu přesně odpovídá "přetlakování" v dokumentu, a nemusí to slepovat do jednoho průměru.
Čísla mluví jasně. ColBERTv2 dosahuje na benchmarku MS MARCO MRR@10 zhruba 0,397, zatímco BM25 (klasika z Elasticsearch) se zastavuje kolem 0,184. To není vylepšení o pár procent, to je úplně jiná liga. Ten samý princip navíc skvěle funguje pro češtinu, kde skloňování rozmele single-vector modely častěji, než bychom chtěli přiznat.
Daří se to zaplatí. Kde single-vector dokument potřebuje 768 čísel, multi-vector jich chce tisíce — za každý token. Praktická implikace: index pro milion dokumentů se měří v desítkách až stovkách gigabajtů, pokud nez výslovně sáhnete po kompresi. Řešení existují (PLAID, kvantizace reziduí, downsampling tokenů), ale o výkon za úložiště tu jde doopravdy. Před tréninkem si tedy spočítejte, kolik dat budete indexovat a jestli váš SSD projekto vydrží.
Sentence Transformers: švýcarský nůž, který dnes umí víc, než si myslíte
Když někdo řekne "sentence-transformers", většina lidí si vybaví starý model MiniLM z roku 2019 a zmrazený API wrapper. To je velká chyba. Knihovna prošla masivním vývojem a verze 3.x je dnes plnohodnotný tréninkový framework postavený na HuggingFace Transformers a Trainer API. Najdete ji na HuggingFace, stejně jako stovky předtrénovaných checkpointů.
Co všechno v ní dnes najdete:
- Trainer API s podporou checkpointů, logování do TensorBoardu a early stopping
- Loss funkce pro každý scénář: MultipleNegativesRankingLoss, CachedMultipleNegativesRankingLoss, CosineSimilarityLoss, TripletLoss
- MatryoshkaLoss — trénujete jeden model a dimenze si pak řežete na míru (768, 512, 256, 64) bez dalšího tréninku
- AdaptiveLayerLoss — model se naučí fungovat i s menším počtem vrstev
- PEFT/LoRA integrace — ladíte jen procenta parametrů, zbytek zůstává zmražený
- CrossEncoder a SparseEncoder třídy — rerankery i learn-to-rank sparse modely ve stejném API
CachedMultipleNegativesRankingLoss je tichý hrdina celé knihovny. Standardní contrastive loss žere GPU paměť kvůli negativům v batchi — větší batch, víc negativů, lepší model. Cache verze si negativy ukládá v nízko-rozměrné reprezentaci, takže na jedné RTX 4090 utáhnete batch 2048 párů, což by běžným lossem vyžadovalo A100 a k tomu modlitbu. Pro multi-vector modely, které mají per token vektory, je to doslova záchrana.
Pro ty, kdo nechtějí trénovat vůbec nic: stačí `pip install sentence-transformers` a načíst hotový ColBERT checkpoint jako `ColBERT("answerai-colbert-small-v1")`. Třicet tři milionů parametrů, výkon srovnatelný s modely desetkrát většími. Ale to už se blížíme k návodu.
Chcete ušetřit na energiích?
Zjistěte, kolik můžete ušetřit sdílením elektřiny z FVE nebo optimalizací bateriového úložiště.
Spočítat úsporu →Trénink krok za krokem: od prázdného adresáře k vlastnímu modelu
Nejprve instalace. Všechno běží standardně přes pip:
```bash pip install "sentence-transformers>=3.3" datasets peft ```
Data potřebujete ve formátu trojic: (anchor, pozitivní dokument, negativní dokument). Pro češtinu jsou nejlepší startovní body SBER-SQuAD (sberquad na HuggingFace), SNLI-CS nebo FEVER-CS. Pro domény jako energetika, právo nebo medicína ale budete chtít vlastní páry — klidně vygenerované větším modelem, jen je nezapomeňte ručně zkontrolovat. Sbírek dobrých negativů se při tréninku embeddings nikdy neopylíte.
Minimální tréninkový skript pro ColBERT-style model:
```python from sentence_transformers import SentenceTransformerTrainer, SentenceTransformerTrainingArguments from sentence_transformers.losses import CachedMultipleNegativesRankingLoss from datasets import load_dataset
model = SentenceTransformer("answerai-colbert-small-v1") train = load_dataset("sberquad", split="train")
loss = CachedMultipleNegativesRankingLoss(model, mini_batch_size=32)
args = SentenceTransformerTrainingArguments( output_dir="colbert-cs", num_train_epochs=2, per_device_train_batch_size=256, learning_rate=2e-5, warmup_ratio=0.1, bf16=True, )
trainer = SentenceTransformerTrainer(model=model, args=args, train_dataset=train, loss=loss) trainer.train() trainer.save_model("colbert-cs-final") ```
Všimněte si `per_device_train_batch_size=256`. U Cached loss si můžete dovolit velké batche i na konzumer GPU, a právě velký batch s tisíci negativy dělá z průměrného modelu dobrý model. U běžných dense embeddingů platí podobné pravidlo: víc negativů > víc epoch. Dvě epoky s 256 negativy porazí deset epok s batchem 16.
Před tréninkem nezapomeňte evaluátor. Třída `InformationRetrievalEvaluator` vám spočítá Recall@10, MRR a NDCG na vašich datech bez nutnosti cokoliv ručně počítat. Bez ní létáte naslepo — a embeddings modely umí překvapivě elegantně přefitovat trénovací data, takže tréninková loss klesá a reálná kvalita stojí na místě.
Pro úsporu paměti můžete přidat LoRA přes parametr `model_peft` nebo promítat výstupy na nižší dimenze pomocí MatryoshkaLoss. Kombinace LoRA + Matryoshka + bf16 se vešla na kartu s 12 GB VRAM a ještě tam zbylo místo na kávu.
Hardware a peníze: kolik vás to skutečně bude stát
Dobrá zpráva: trénink embedding modelů je nejlevnější forma hlubokého učení, jaká existuje. Není to trénink LLaMA. Modely mají 33M až 560M parametrů a jednotlivé kroky jsou krátké.
Reálné cenové scénáře:
- Vlastní RTX 3060 12 GB (bazarově 8–10 tisíc Kč): pohodlně utáhne Cached loss s mini-batchi, trénink na 100 tisících párů zvládne za noc
- Vlastní RTX 4090 24 GB: kdokoliv kdo ji má, ví, že jde o doodle na trénink všeho; embedding model 100–300M parametrů jí odevzdá za pár hodin
- Pronájem na RunPod nebo Vast.ai: RTX 4090 stojí 0,35–0,70 USD/hod, A100 80 GB kolem 1,50–1,90 USD/hod
- Google Colab free tier: pro experimenty na malých modelech zcela postačuje, jen vás to občas vykopne
Počítejme konkrétně. Fine-tuning answerai-colbert-small (33M parametrů) na 100 tisících dvojicách, batch 256, dvě epoky — to je zhruba 800 kroků. Na RTX 4090 čtyři až šest hodin. Na pronájmu za 0,50 USD/hod vyjde trénink na tři dolary, tedy zhruba 75 Kč. To je cena dvou velkých bran z pražské kavárny. Za srovnání: měsíc volání embedding API pro milion dotazů denně vás vyjde řádově na tisíce až desítky tisíc korun měsíčně, navíc s cizím modelem, který jednoho dne tiše nahradí a vaše indexy zhatí.
Kdyby někdo tvrdil, že potřebujete H100, klidně mu ukažte tento odstavec. H100 potřebujete na trénink základních modelů, ne na doladění 300 milionů parametrů.
Úskalí, o kterých se v tutoriálech nepíše
První past: tvrdé negativy. Random negativy z korpusu jsou pro model triviálně snadné — naučí se je odmítat za pár set kroků a pak se přestane učit. Skutečný posun přinesou hard negatives: dokumenty, které si model sám omylem vybere jako relevantní. Chcete-li je získat, použijte stávající model, vyhledejte pro každý dotaz top-50 dokumentů a jako negativy vezměte ty, co vyskočily, ale nejsou správná odpověď. ANCE a podobné přístupy dělají přesně toto.
Druhá past: evaluace na trénovacích datech. MTEB leaderboard je skvělý benchmark, ale dneska je tam mnoho modelů přefitovaných na testovací sady. Model s 70 body na MTEB může ve vaší české doméně prohrát s modelem, který má na leaderboardu o deset bodů míň. Jediná relevantní evaluace je na vašich datech a s vašimi dotazy. Udělejte si padesát ručně ověřených query-document párů a měřte na nich. Vážně. Berte to jako jedinou pravdu.
Třetí past: velikost indexu. Multi-vector index pro 100 tisíc dokumentů s průměrně 200 tokeny a 96-dimenzionálními vektory v float32 znamená kolem 7,7 GB dat. S kvantizací na int8 klesnete na ~2 GB, s PLAID kompresí ještě níž. Ale pokud plánujete miliony dokumentů, navrhujte infrastrukturu s tímto vědomím od začátku — pozdější přestavba bolí.
Čtvrtá past, specifická pro češtinu: diakritika a tokenizace. Modely trénované primárně na angličtině mají ořezaný tokenizér pro české znaky a rozsekávají slova na nesmysly. Vždy kontrolujte, jaký tokenizer váš base model používá, a zda má v vocab rozumné pokrytí české morfologie. Modely jako multilingual-E5 nebo bge-m3 jsou tady bezpečná volba jako základ pro fine-tuning.
Kde to v praxi zaplavete: od RAG po energetiku
Nejviditelnější nasazení je RAG pro firemní dokumentaci — technické manuály, smlouvy, vnitřní wiki. Multi-vector retrieval tady dává největší smysl tam, kde otázky cílí na specifické pojmy, čísla a kódy, které single-vector modely rády ztrácejí. Doplňte to CrossEncoder rerankerem (Sentence Transformers má třídu `CrossEncoder` a hotové modely bge-reranker) a máte pipeline, která drží krok s komerčními řešeními.
Méně zjevné, ale lukrativnější je nasazení v energetice. Představte si platformu, kde sdílení elektřiny generuje tisíce časových řad z měření — výroba z FVE, spotřeba domácností, stav baterií. Semantické vyhledávání nad anomaly reporty, tarifní dokumentací a vzorci smluv je přesně úkol pro embedding modely doladěné na doménový slovník. Platforma pro sdílení elektřiny takového používá stále víc — ať už jde o IoT monitoring, kde embedding pomáhá kategorizovat alarmy a incidenty, nebo o spotové ceny elektřiny, kde chcete rychle najít srovnatelné historické situace podle textového popisu tržních podmínek. Pro firmy, které do toho vstupují, je relevantní stránka pro firmy — a právě firmám se takový vlastní embedding model nejvíc vyplatí, protože mají citlivá data, která nemohou posílat do cizího API.
Podobných doménových use-caseů jsou stovky: právní kanceláře hledají precedensy, e-shopy párují produkty s dotazy plnými slangů, pojišťovny třídí hlášení škod. Vždy jde o totéž — obecný model nezná váš slang a žádný prompt engineering to nezachrání. Jen fine-tuning. Více o využití AI v řízených sítích najdete na SmartEnergyShare.info, praktické návody a kalkulace zas na ShareElectric.cz. A jestli vás zajímá legislativní stránka sdílení energie z pohledu obcí, mrkněte na Electric-Share.cz.
Závěr: embeddingy jsou nový vlastní hardware
Předpovídám bez ptaní: za dva roky si bude průměrná firma s AI ambicemi provozovat vlastní embedding model stejně přirozeně, jako si dnes provozuje vlastní e-mailový server. Zatímco velké jazykové modely zůstanou oborem pro ty s miliónovými rozpočty, embeddingy o 300 milionech parametrů jsou naprosto v moci jednotlivce s grafickou kartou a sto dolary na účtu u RunPod. Trend fine-tuning malých, specializovaných modelů — jestli GRPO pro structured outputs, IBM Granite pro časové řady, nebo ColBERT pro vyhledávání — je nejdůležitější posun v AI za poslední rok a většina lidí si toho ještě nevšimla.
Takže úkol na tento vínek: stáhněte si answerai-colbert-small, natáhněte na něj sto párů ze své domény, spusťte CachedMultipleNegativesRankingLoss a změřte Recall@10 proti svému současnému řešení. Pokud nevyhraje, dejte mi vědět v komentářích — rád se nechám jinak přesvědčit. Pokud vyhraje, máte důvod k oslavě a zároveň problém s indexováním. Vítejte v klubu.
Zdroje
- Sentence Transformers — oficiální dokumentace
- HuggingFace Blog: How to Train Sentence Transformers Models
- ColBERTv2: Effective and Efficient Retrieval via Lightweight Late Interaction (arXiv)
- MTEB Leaderboard na HuggingFace
- Root.cz — zpravodajství z AI světa v češtině
Obchodujete s batteriovými úložišti nebo hledáte partnera pro flexibilitu a day trading elektřiny? SmartEnergyShare nabízí kompletní řešení pro BESS projekty od 50 do 250 kW — obchodování flexibility, SVR služby a IoT monitoring. Zjistěte víc →
Další články na toto téma najdete na: Share-Electric.cz Zapomeňte na OpenAI. Takhle si na Macu natrénujete vlastn... Vice o run ai