In this piece
Compress RAG Vectors to 2 Bits: Is Data-Oblivious Quantization Ready for Production?
The short answer: yes, 2-bit TurboQuant stores each vector's quantized codes in one-sixteenth of the bytes used by float32. Total index memory is not automatically 16x smaller because norms, identifiers, graph structures, metadata and optional full-precision vectors still consume space. TurboVec, an open-source Rust index, reports fitting its 10 million document example into about 4 GB instead of about 31 GB. Qdrant has also shipped TurboQuant since version 1.18.
TurboQuant is peer-reviewed ICLR 2026 research, and production implementations now exist. TurboVec reached its first stable 1.0 release on 18 August 2026, with a stable forward-compatible on-disk format, but maintenance remains concentrated around its creator. Treat its FAISS benchmark wins as hardware-specific, author-reported results, then prove total memory, recall and latency on your own corpus before you swap a live vector store.
Designing a self-hosted or air-gapped RAG stack?
Plan a Retrieval Architecture ReviewWhy RAG memory becomes the bottleneck
Retrieval-augmented generation stores one embedding per chunk, and low-latency search often keeps vector data in RAM. The arithmetic is unforgiving. A 1536-dimensional vector in float32 uses 6,144 bytes, so ten million such vectors need about 61.4 GB in decimal units before index overhead. At 2 bits per dimension, the raw codes use 384 bytes each, or about 3.84 GB for ten million. That is the exact 16x code compression. The end-to-end index ratio will be lower once its other structures are counted.
Memory can dominate retrieval cost. It influences whether an index fits one node or needs a cluster, whether it can share a host with a model, and whether an on-premise box is practical. Compressing raw vector codes 16x can change the hardware plan, but only a resident-memory measurement reveals the bill.
What is data-oblivious quantization?
Data-oblivious quantization compresses vectors using a fixed recipe that does not learn anything from your dataset. There is no codebook trained on a sample, no calibration pass, and no per-dataset parameters to fit, store or refit when the data drifts.
That differs from trained product quantization, available in FAISS IVF-PQ and many vector databases. PQ learns codebooks by running k-means over a representative sample. New vectors can use an existing codebook, but material distribution drift may reduce quality enough to justify training a new codebook and rebuilding the index. Plain TurboQuant removes that training lifecycle. Enhanced implementations can add small calibration steps to improve recall on real embedding distributions.
How TurboQuant compresses without training
TurboQuant comes from the ICLR 2026 paper "TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate" by Amir Zandieh, Majid Daliri, Majid Hadian and Vahab Mirrokni at Google and NYU, and Google Research describes it in a public write-up. The core idea is one geometric trick used twice.
- Rotate. Apply a random orthogonal rotation to every vector. A rotation preserves distances and inner products, so it changes nothing about the search result. What it changes is the coordinate distribution: after a random rotation, each coordinate of a high-dimensional vector follows a known, concentrated distribution that depends only on the dimension, not on your data.
- Quantize per coordinate. Because that distribution is known in advance, you can precompute the optimal scalar quantizer for it once, from theory, and reuse the same universal codebook for every coordinate of every vector. In high dimensions the rotated coordinates are close to independent, so treating them one at a time is near-optimal rather than a shortcut.
The paper adds a second stage that quantizes the residual with a 1-bit Quantized Johnson-Lindenstrauss transform, producing an unbiased inner-product estimate. The authors show the distortion sits close to the information-theoretic lower bound, within a small constant factor of about 2.7, across bit-widths. In nearest-neighbor search the method outperforms product quantization on recall while cutting indexing time to near zero, because there is nothing to train.
The practical payoff is the part that survives all the theory: no training sample, no calibration, no codebook to persist or refit. You rotate and quantize, and you can do it the moment a vector arrives.
What does TurboQuant actually beat?
The method was independently implemented in Qdrant, which published a detailed evaluation against the quantizers teams already use. The comparison is what matters commercially, because it is measured at fixed storage budgets.
| Storage class | Bit-width | Compression | Result versus incumbent |
|---|---|---|---|
| Half of scalar quantization | 4-bit | 8x | Competitive with scalar quantization at half the storage; beats it on 3 of 10 datasets, by up to 4.6 points on one. |
| Binary quantization budget | 2-bit | 16x | Beats 2-bit binary quantization by 9 to 24 points on every tested dataset. |
| Extreme budget | 1-bit | 32x | Beats vanilla 1-bit binary quantization by 9 to 21 points on every tested dataset. |
The pattern is consistent. At the aggressive budgets where teams normally accept a large recall hit, a training-free rotation-based quantizer holds recall far better than binary quantization, and at 4-bit it trades blows with a data-tuned scalar quantizer while using half the space. Qdrant also layered on engineering extras: per-vector length renormalization, per-coordinate anisotropy compensation and SIMD acceleration. Those additions are mildly data-aware, which is worth noting when someone calls the whole pipeline strictly oblivious.
Qdrant ships this extended implementation in version 1.18, including its standard Docker image and cloud product. Its official documentation exposes 4-, 2-, 1.5- and 1-bit options, while recommending that teams test recall on their own data and reindex when enabling the feature.
What is TurboVec, and what does it claim?
TurboVec is an open-source Rust vector index with Python bindings, MIT licensed, built directly on TurboQuant. It packages the quantizer into a searchable index you can drop into a Python retrieval stack. Its headline claims:
| Claim | Reported detail | What to verify yourself |
|---|---|---|
| 16x code compression | A 1536-dimensional vector goes from 6,144 bytes in float32 to 384 bytes of 2-bit codes. The repository separately reports about 4 GB instead of 31 GB for its 10M-document example. | Do not apply 16x to the whole index. Measure codes, norms, IDs, metadata, index structures and retained capacity. |
| Beats FAISS on ARM | On an 8-vCPU Google Axion instance, the current suite reports about 3.5x average speed at 4-bit and 26% at 2-bit versus FAISS FastScan. | Benchmark on your target CPU; ARM and x86 kernels differ. |
| Beats FAISS on x86 | On an 8-vCPU Intel Xeon Platinum 8481C, it reports about 3.4x average speed at 4-bit and 20% at 2-bit. | Confirm on your instance type under your query concurrency. |
| Recall usually matches or wins | Calibrated TQ+ beats FAISS at recall@1 in three of four OpenAI benchmark cells by 0.9 to 2.9 points, trails one by 0.7, and leads on GloVe at recall@1 while FAISS can lead deeper at 2-bit. | These are author-run 100K-vector tests. Recall depends on your embeddings, corpus and reranking. |
| Online ingest | Plain TurboQuant needs no train step. TurboVec's optional TQ+ path fits two scalars per coordinate from a representative sample before adding vectors. | Choose and document whether you use uncalibrated TurboQuant or TQ+, then test ingest and drift. |
| Filter by ID at search time | Pass an allowlist of IDs; blocks with no allowed slots are skipped, so tenant and permission filters stay cheap. | Validate that filtered recall holds when allowlists are small and sparse. |
| Drop-in for frameworks | Replacements for LangChain, LlamaIndex, Haystack and Agno vector stores. | Check API coverage for metadata, deletes and hybrid search your app relies on. |
The scoring kernels use NEON SDOT or SMMLA on ARM and AVX-512 VNNI or vpermb on modern x86, with AVX2 and scalar fallbacks. Those implementation details help explain the CPU results without implying that every processor will reproduce them. Because TurboVec is local software, you can pair it with a local embedding model and keep the retrieval stack behind your own network boundary.
Where data-oblivious compression helps, and where it hurts
Quantization is a lossy compression of a lossy signal. Embeddings already approximate meaning, and quantizing them approximates the approximation. That is fine for retrieval, which only needs the right neighbors to rank near the top, but it sets the honest expectations for a decision.
| Option | Memory | Operational weight | Best fit |
|---|---|---|---|
| Float32 flat index | Largest, about 4 bytes per dimension | Trivial, exact search | Small corpora, quality-sensitive retrieval, a baseline to measure against |
| TurboQuant 2-bit (Qdrant or TurboVec) | 16x smaller raw codes | No PQ training; implementation-specific calibration and reindex behavior | Large corpora, memory-bound nodes and self-hosted deployments |
| Trained product quantization (FAISS IVF-PQ and database implementations) | Configurable, often strong recall per byte | Needs a training sample; major drift can justify retraining and reindexing | Stable corpora with a good training sample or an existing platform |
| Managed vector service | Provider dependent | Lower infrastructure effort; processing boundary depends on provider and deployment model | Teams that accept the provider's data-processing terms and operating model |
Two caveats decide most real deployments. First, aggressive quantization loses some recall, so production RAG typically retrieves more candidates than it needs and reranks the top set, either with the full-precision vectors kept on slower storage or with a cross-encoder. Budget for that step. Second, the compression ratio is fixed, but your actual footprint includes index structure, identifiers, metadata and any full-precision copy you keep for reranking. Measure the total, not the vector bytes alone.
Does this actually make your RAG cheaper?
A compression ratio is not a saving until it removes something you pay for. Price the change against the full retrieval bill:
monthly benefit = removed memory or nodes + smaller instance tier + avoided managed-DB fees - added rerank compute - engineering and operations cost
Raw vector codes that are sixteen times smaller create value only when they help the complete index cross a threshold: an index that now fits one node instead of a cluster, a corpus that fits in RAM instead of spilling to disk, a retrieval service that co-locates on a GPU host you already run, or a workload you can bring in-house instead of paying a per-vector managed fee. If your corpus already fits comfortably and search is not memory-bound, the win is smaller and a mature, supported vector store may be the safer choice. For the wider own-versus-rent decision, work through our local models versus APIs break-even analysis, and if you are still choosing a retrieval strategy at all, compare RAG against fine-tuning and long context first.
The air-gapped and EU data-residency angle
The most interesting property for regulated teams is not the memory number. It is deployment control. A self-hosted index and local embedding model can keep the retrieval path inside your network. Plain TurboQuant needs no dataset calibration; enhanced implementations may calibrate locally, which does not itself require sending a sample to a third party.
That matters when personal or confidential data feeds retrieval. An embedding is not automatically anonymous, and it may remain personal data when it relates to an identifiable person. The EDPB's Opinion 28/2024 requires anonymity to be assessed case by case. Self-hosting can simplify processor and transfer architecture, but it does not by itself establish GDPR compliance. For the surrounding controls, see our guides on EU data residency for AI apps and enforcing RAG permissions across SharePoint, Confluence and Drive.
A 10-day evaluation before you swap a vector store
- Freeze a baseline. Build a float32 flat index on a representative slice and record exact recall on a labeled query set. This is the number every compressed option is measured against.
- Reproduce the footprint. Load your real embeddings at their true dimension and count, and measure resident memory including index overhead and identifiers, not just vector bytes.
- Run three lanes. Compare your current store, TurboVec at 2-bit and 4-bit, and one trained product-quantization configuration on the same hardware.
- Measure recall with reranking. Report recall@k before and after your intended oversample-and-rerank step, because that is what production actually serves.
- Load test search. Measure p50 and p95 query latency and throughput at your real concurrency, on your target CPU, with filters applied.
- Test ingest and growth. Add a large batch, delete, and add again; confirm memory, latency and recall stay stable without a retraining or reindex step.
- Audit the dependency. TurboVec 1.0 commits to forward compatibility for its v7 on-disk format, but older files need conversion and files predating v5 need rebuilding. Review that migration path, its concentrated maintenance, security policy and your ability to operate or fork it.
- Decide on economics. Convert the measured footprint into instance tiers or node counts, subtract added rerank cost and the engineering time to own a nonstandard index, and compare cost per successful query.
Questions to ask before you adopt it
- What is the measured recall@k on our corpus and query set, after reranking, at 2-bit and 4-bit?
- What is the true resident memory including index structure, IDs and any full-precision copy kept for reranking?
- Does the index support the deletes, updates, metadata filters and hybrid search our application needs?
- How does filtered search behave when allowlists are small, for tenant isolation and permissions?
- What are latency and throughput on our production CPU, not the benchmark machine?
- What is the library's release maturity, test coverage, license and maintenance situation, and can we fork it?
- Can we fall back to our existing vector store without rebuilding the retrieval service?
Sources and claim boundaries
The algorithm, two-stage residual method and near-optimal distortion result come from the ICLR 2026 paper and the Google Research write-up. Fixed-budget recall comparisons and Qdrant 1.18 behavior come from Qdrant's evaluation and official documentation. TurboVec's compression, benchmark, TQ+ and feature claims come from its public repository and changelog. Wavect did not reproduce vendor or maintainer benchmarks. Facts and project status were rechecked on 2 September 2026.
Frequently Asked Questions
What does data-oblivious quantization mean?
How does TurboVec fit 10 million documents in 4 GB?
Does quantizing embeddings hurt retrieval quality?
Is TurboVec production-ready?
How is TurboQuant different from FAISS product quantization?
Can I run this fully offline for GDPR or air-gapped use?
Final thoughts
Data-oblivious quantization is a genuine shift in how RAG memory works. A random rotation makes every coordinate predictable, a universal codebook does the rest, and the training step required by product quantization disappears. The recall results at aggressive storage budgets are strong enough to take seriously.
TurboVec 1.0 and Qdrant 1.18 now turn the research into deployable software. Raw 2-bit codes are genuinely 16x smaller than float32, but the complete index ratio must be measured. Pilot, audit and benchmark on your own corpus before carrying production traffic. Buy the retrieval outcome that lowers cost per successful query, not the largest compression headline.
Want a decision-grade retrieval benchmark on your own corpus?
Scope a RAG Evaluation Pilot