What holds
Released query clients
| file | base model / licence | MiB | quality vs the model's own fp32 index |
|---|---|---|---|
| harrier-0.6b Q3_K, generic English text | microsoft/harrier-oss-v1-0.6b · MIT | 235 | SciFact 98.9 % · NFCorpus 99.3 % · ArguAna 101 % · SciDocs 99.2 % |
| harrier-0.6b Q2_K, SciDocs synthetic queries | MIT | 192 | SciDocs 94.5 % (2.6-bit files do not generalise: 98 % on SciFact, 93 % on SciDocs) |
| Qwen3-Embedding-0.6B Q4_K_M + q4_0 table, English imatrix | Qwen/Qwen3-Embedding-0.6B · Apache-2.0 | 340 | SciFact 100.0 % · NFCorpus 99.4 % · ArguAna 100.1 % · SciDocs 99.3 % |
| Qwen3-Embedding-0.6B Q4_K_M + q4_0 table, Czech imatrix | Apache-2.0 | 340 | Czech legal index 98.7 % (every ≤ 3-bit file of this model fails: 80–93 %) |
Every client is a query encoder for exactly one document encoder and its settings; same dimension does not mean same space. Model cards list the compatibility, the sha256 and the recipe. harrier · Qwen3-Embedding
Verify it on your own index
- Import your corpus and your existing document vectors; nothing is re-encoded.
- Generate synthetic queries for held-out documents (no real queries needed).
- Quantize with
llama-quantize --imatrixusing text in your corpus language, or with our GPTQ exporter. - Verify: nDCG@10, cosine to the fp32 query vector, top-10 overlap, paired bootstrap; keep the smallest file that passes.
Five commands, in the README. If you run it, send the table; that is the most useful thing you can send.
Vector-quantised runtime preview
Below llama.cpp's smallest format we run a 1.8–2.1-bit container with its own WebGPU runtime: 119.5 MiB at 97.6 % of fp32 on SciFact, 103 ms p50 / 113 ms p95 per query on an integrated GPU, 77 % of the process memory of the llama.cpp path. Format and runtime carry over to jina and Qwen3-Embedding; quality below 2.2 bits on Czech does not yet (83 % / 64 %).
Numbers, caveats and the paired comparison with BitNet-270m: vq_results.md. A live demo with the VQ clients runs at lab.thinletter.io by invitation. Pilots: we measure your index first; the numbers are yours either way.
How it is measured
Every claim has a pre-registered prediction and a kill rule, every comparison changes one thing at a time at the same calibration budget, and differences are paired bootstrap intervals over queries (10 000 draws). Negative results are kept: the 2.6-bit reference number did not generalise beyond SciFact, two-sided rotation has no stable effect on the scalar grid, and "generic text is enough at 3.4 bits" turned out to hold for one model, not the recipe. A paired interval does not contain the variance of the calibration draw (~0.01 nDCG) nor between-machine variation (±0.006); read differences under 0.01 as ties.