ThinEmbed: komprimované dotazové enkodéry
Dotazová strana embedding modelu zkomprimovaná do malého souboru, který běží v prohlížeči přes WebGPU. Index dokumentů zůstává přesně takový, jaký je; mění se jen dotazový enkodér. Každé číslo níže srovnává komprimovaného klienta s modelem v plné přesnosti na týchž dotazech, proti vlastnímu fp32 indexu modelu.
Velikost, kvalita a rychlost v prohlížeči
harrier-0.6b na SciFact, testovací split, 300 dotazů; nDCG@10 proti vlastnímu fp32 indexu modelu. Jeden notebook v klidu, integrovaná GPU Intel, headless Chrome; latence na dotaz; špičková paměť všech procesů Chrome. Řádky ThinEmbed jsou vydané soubory.
| dotazový enkodér | soubor | nDCG@10 | p50 | p95 | načtení | špičková paměť |
|---|---|---|---|---|---|---|
| harrier-0.6b, plná přesnost (reference, v prohlížeči neběží) | 1 143 MiB (fp16) | 0,7559 | – | – | – | – |
| Q3_K, formát llama.cpp, wllama na WebGPU | 235,1 MiB | 0,7481 | 444 ms | 754 ms | 4,2 s | 2 080 MiB |
| IQ2_M, formát llama.cpp, wllama na WebGPU | 199,3 MiB | 0,7387 | 508 ms | 1 012 ms | 5,2 s | 1 983 MiB |
| Q2_K, formát llama.cpp, wllama na WebGPU | 192,4 MiB | 0,7413 | 405 ms | 680 ms | 4,7 s | 2 124 MiB |
| Q2_K, formát llama.cpp, wllama na CPU (WebAssembly, 8 vláken) | 192,4 MiB | 0,7425 | 1 669 ms | 3 363 ms | 4,4 s | 1 228 MiB |
| ThinEmbed, 2,10 bitu na váhu, WebGPU | 119,5 MiB | 0,7375 | 103 ms | 113 ms | 2,4 s | 1 592 MiB |
| ThinEmbed, 1,83 bitu na váhu, WebGPU | 105,3 MiB | 0,7109 | 102 ms | 112 ms | 2,5 s | 1 501 MiB |
Soubory Q3_K a Q2_K jsou naše exporty GPTQ do formátů llama.cpp; vlastní kvantizér llama.cpp při této velikosti dosáhne stejné kvality. Jedno zařízení, jeden model, jeden korpus: diskrétní GPU a telefony změřené nejsou. Zdroj: vq_results.md §2.
Nejmenší soubory proti jiným přístupům
harrier-0.6b na SciFact, testovací split, 300 dotazů, fp32 0,7559. Nativně: llama.cpp na CPU. Prohlížeč: náš WebGPU runtime. Simulace: torch simulace kvantovaných vah.
| dotazový enkodér | soubor | nDCG@10 | měřeno |
|---|---|---|---|
| Q3_K, náš export GPTQ, kalibrace generickou angličtinou (vydaný) | 235,1 MiB | 0,7475 | nativně |
| IQ2_M, kvantizér llama.cpp, doménová imatrix | 199,3 MiB | 0,7418 | nativně |
| Q2_K, náš export GPTQ, kalibrace korpusem SciFact | 192,4 MiB | 0,7440 | nativně |
| IQ2_XS, nejmenší formát llama.cpp, doménová imatrix | 177,5 MiB | 0,7097 | nativně |
| BitNet-embedding-270m, ternární, trénovaný Microsoftem (jiný model s vlastním indexem) | 140 MiB | 0,7350 | nativně |
| ThinEmbed, 2,10 bitu na váhu (vydaný) | 119,5 MiB | 0,7375 | prohlížeč; simulace 0,7380 |
| ThinEmbed, 1,83 bitu na váhu (vydaný) | 105,3 MiB | 0,7109 | prohlížeč = simulace |
| ThinEmbed, 1,58 bitu na váhu (nevydaný) | ~91 MiB | 0,7074 | simulace; ±0,03 mezi seedy rotace |
Párově proti BitNet-270m na 2,12 bitu na váhu: SciFact +0,007 [−0,014; +0,028] a NFCorpus −0,005 [−0,020; +0,009], oboje nerozlišitelné; ArguAna +0,044 [+0,023; +0,065]. Zdroje: vq_results.md §1, karta modelu ThinEmbed-harrier-0.6b.
Čeština: WebFAQ-cs
Qwen3-Embedding-0.6B na WebFAQ-cs (PaDaS-Lab/webfaq-retrieval, CC BY 4.0): 71 529 pasáží, 7 231 lidsky hodnocených testovacích otázek; nDCG@10 proti vlastnímu fp32 indexu modelu.
| dotazový enkodér | soubor | nDCG@10 | kosinus k fp32 | překryv top-10 | p50 |
|---|---|---|---|---|---|
| Qwen3-Embedding-0.6B, plná přesnost (reference) | – | 0,7308 | – | – | – |
| ThinEmbed, 3,57 bitu na váhu (2-d kódové knihy) a celá tabulka tokenů (vydaný) | 237,0 MiB | 0,7072 | 0,946 | 0,755 | 112 ms |
Řádek ThinEmbed: torch simulace souboru na celém testovacím splitu. V prohlížeči (integrovaná GPU Intel) soubor reprodukuje simulaci na prvních 50 otázkách na čtvrté desetinné místo (0,6393 proti 0,6393); p95 130 ms, načtení 2,5 s. Kalibrace na 3 000 trénovacích otázkách WebFAQ-cs, jeden seed. Vydané skalární české soubory jsou místo toho měřené na indexu rozhodnutí Nejvyššího soudu (viz vydané soubory). Zdroj: karta modelu ThinEmbed-Qwen3-Embedding-0.6B-vq.
Vydané soubory
Každý soubor je dotazový enkodér pro právě jeden dokumentový enkodér a jeho nastavení; index se nemění. Kvalita v % vlastního fp32 nDCG@10 modelu, testovací splity, pokud není uvedeno jinak.
| repozitář | základní model · licence | soubory | měřeno |
|---|---|---|---|
| ThinEmbed-harrier-0.6b | microsoft/harrier-oss-v1-0.6b · MIT | Q3_K, kalibrace generickou angličtinou, 235,1 MiB | SciFact 98,9 · NFCorpus 99,3 · ArguAna 101,3 · SciDocs 99,2 % |
| ThinEmbed-harrier-0.6b | MIT | Q2_K, syntetické dotazy SciDocs, 192,4 MiB | SciDocs 94,5 % |
| ThinEmbed-harrier-0.6b | MIT | Q2_K, kalibrace generickou angličtinou, 192,4 MiB | SciFact 96,4 · SciDocs 90,1 % |
| ThinEmbed-harrier-0.6b-vq | MIT | 2,10 / 1,83 bitu na váhu, soubory SciDocs 127,0 / 112,8 MiB, soubory SciFact 119,5 / 105,3 MiB | SciDocs 94,7 / 91,3 % · SciFact 97,6 / 94,0 % (prohlížeč) |
| ThinEmbed-harrier-0.6b-vq | MIT | varianty s prompt K/V, 2,10 / 1,83 bitu na váhu, SciDocs 129,1 / 114,9 MiB, SciFact 121,6 / 107,3 MiB | SciDocs 96,6 / 93,8 % · SciFact, všech 1 109 dotazů, 98,1 / 95,8 % (s uloženými klíči a hodnotami promptu) |
| ThinEmbed-Qwen3-Embedding-0.6B-vq | Qwen/Qwen3-Embedding-0.6B · Apache-2.0 | 3,57 bitu na váhu, čeština, 237,0 MiB | WebFAQ-cs 96,8 % (ověřeno v prohlížeči) |
| ThinEmbed-Qwen3-Embedding-0.6B | Apache-2.0 | Q4_K_M / Q5_K_M, anglická kalibrace, 339,9 / 385,4 MiB | SciFact 100,0 / 99,8 · NFCorpus 99,4 / 100,1 · ArguAna 100,1 / 100,1 · SciDocs 99,3 / 100,1 % |
| ThinEmbed-Qwen3-Embedding-0.6B | Apache-2.0 | Q4_K_M / Q5_K_M, česká kalibrace, 339,9 / 385,4 MiB | index Nejvyššího soudu 98,7 / 99,5 % |
| ThinEmbed-bge-m3 | BAAI/bge-m3 · MIT | Q4_K_M / Q3_K, česká kalibrace, 354,6 / 320,6 MiB | index Nejvyššího soudu 99,2 / 98,3 % · SciFact 99,6 / 100,0 % |
Index rozhodnutí Nejvyššího soudu: 55 071 segmentů, 1 137 syntetických dotazů; data nejsou veřejná. Karta modelu každého repozitáře uvádí kompatibilitu, recept a sha256 každého souboru. Zdroje: karty modelů v docs/release repozitáře.
Jak se měřilo
Testovací split a vlastní fp32 index modelu, nativně v llama.cpp nebo v prohlížeči. Každý běh je předem registrovaný s predikcí a pravidlem pro ukončení, srovnání mění jednu věc a rozdíly jsou párové bootstrapové intervaly přes dotazy (10 000 tahů), čtené proti rozptylu kalibračního tahu (zhruba 0,01 nDCG@10) a mezi stroji (±0,006).
- Kolem 235 MiB dosáhne vlastní kvantizér llama.cpp s imatrix stejné kvality jako náš export GPTQ. Skalární soubory nejsou lepší než tento základ zdarma.
- Klíče a hodnoty dotazového promptu uložené v plné přesnosti (2 MB) a kalibrace s nimi na místě přidaly zhruba 0,010 nDCG@10 na 1,8 bitu na váhu na SciFact a na českém právním indexu (tři seedy), na 2,1 ani 1,6 bitu nic. Tyto soubory jsou vydané jako varianty s prompt K/V.
- Větší kódová kniha pro nejpoužívanější neurony nepomohla: −0,0085 kosinu k fp32 proti párovému náhodnému rozdělení, nDCG@10 v šumu (tři seedy).
- Qwen3-Embedding-0.6B na 2,1 bitu na váhu je na češtině nestabilní: 65,6 % fp32 na jednom stroji a 80,6 % na druhém ze stejné konfigurace a seedu. Na 3,1 bitu se oba stroje shodnou na 0,002.
Rychlý start
V prohlížeči s balíčkem npm @moravian/thinembed-vq. Vyžaduje WebGPU se shader-f16 (Chrome, Edge); bez CPU fallbacku.
import { loadVqwClient } from 'https://moravian.ai/vqweb/vqweb.js'; // or: npm install @moravian/thinembed-vq
const client = await loadVqwClient(
'https://huggingface.co/moravianai/ThinEmbed-Qwen3-Embedding-0.6B-vq/resolve/main/qwen3-0.6b-vq3.5d2-webfaq_q-vocfull.vqw');
const q = await client.embed('Kolik stojí parkování v centru Prahy?'); // Float32Array(1024), L2-normalised
// score = dot(q, d) against your Qwen/Qwen3-Embedding-0.6B document vectors
Změření klienta na vlastním indexu s balíčkem PyPI thinembed; vektory dokumentů, které už máte, se nikdy nepřepočítávají:
pip install "thinembed[torch]"
eq import --name mycorpus --docs corpus.jsonl --doc-emb index.f32 --doc-ids ids.json --teacher qwen3-0.6b --language cs
eq synth --dataset mycorpus --lang Czech --n-per-doc 2 --as-calib # synthetic queries + calibration text
eq cache --dataset mycorpus --teacher qwen3-0.6b # fp32 query vectors of the unchanged model
eq compile --model model-f16.gguf --types Q4_K_M Q3_K --calib data/calib/mycorpus_synth_q.txt --table q4_0
eq eval --dataset mycorpus --teacher qwen3-0.6b --clients models/*.gguf --bin llama-embedding --rule
eq compare results/perq/mycorpus_<a>.npz results/perq/mycorpus_<b>.npz # paired bootstrap, same queries
Odkazy
- Kód, technická zpráva a ověřovací recept: github.com/rosecky/embedding-quantization-public (Apache-2.0)
- Technická zpráva: technical_report.md · výsledky vektorové kvantizace: vq_results.md
- npm: @moravian/thinembed-vq · zdroj balíčku a README
- PyPI: thinembed · README balíčku
- Vydané soubory: huggingface.co/moravianai
- Demo v prohlížeči: moravian.ai/demo
Kód pod Apache-2.0. Soubory klientů pod licencí svého základního modelu (MIT nebo Apache-2.0). Korpusy dema SciDocs (BEIR, CC BY 4.0) a WebFAQ-cs (CC BY 4.0).