1000万文档塞进4GB内存,还比FAISS搜得快:turbovec 是怎么做到的
内容提要
turbovec 是 Google TurboQuant 论文的 Rust 工程实现,可将千万条向量从 31GB 压缩至 4GB,搜索速度超过 FAISS。它无需训练,通过随机旋转使坐标分布可预测,再逐坐标量化,支持在线添加、按 ID 删除和内核内过滤,适合本地 RAG。
延伸解读
数据无关量化的工程意义
turbovec 的核心优势在于数据无关:无需训练码本,添加新向量时直接索引,避免了传统量化方法因数据变化而重训的麻烦。这简化了在线摄入流程,对于文档频繁增删的 RAG 系统,能显著降低维护成本。
精度与速度的实测表现
在 OpenAI 1536 维和 3072 维数据集上,TurboQuant 的 R@1 召回率比 FAISS 高 0.2–1.9 个百分点;在 GloVe 200 维低维场景,4-bit 领先 0.9 个百分点,2-bit 基本持平。速度上,ARM 平台比 FAISS IndexPQFastScan 快 10–19%,x86 4-bit 也略有领先。
内核内过滤的实用价值
turbovec 将过滤直接集成到 SIMD 内核,支持 allowlist 参数。当候选集较小时,能跳过无关块的打分,提升混合检索效率。返回结果严格限定在允许集合内,不会用无关项填充,适合与 SQL、权限系统等结合的精排场景。
适用边界与限制
turbovec 是单机顺序索引,并非分布式向量数据库。它适合数据敏感、内存有限、需要本地低延迟检索的场景,如纯本地 RAG。若需分片、跨机房、高可用,则需考虑其他系统。它只处理向量存储检索,不依赖特定嵌入模型。
Q&A
turbovec 是什么?它和 Google 的 TurboQuant 论文有什么关系?
turbovec 是 Google Research 论文 TurboQuant 的 Rust 工程实现,作者 Ryan Codrai 开发,并提供了 Python 绑定。它实现了 TurboQuant 算法,该论文已被 ICLR 2026 接收。
turbovec 如何把 1000 万条向量从 31GB 压缩到 4GB?
turbovec 通过数据无关的量化方法实现压缩:先归一化向量并存储模长,然后对所有向量施加同一个随机正交矩阵进行随机旋转,使每个坐标服从已知分布;接着用 TQ+ 逐坐标校准,再用 Lloyd-Max 算法预先计算最优分桶,最后将每个坐标量化为 2-bit 或 4-bit 整数并位打包。1536 维向量从 6144 字节压缩到 384 字节,实现 16 倍压缩。
turbovec 为什么不需要训练?数据无关是什么意思?
数据无关意味着 turbovec 不需要像传统乘积量化那样先拿数据训练码本。它的核心洞察是:给所有向量乘上同一个随机正交矩阵后,每个坐标都会服从一个已知分布,且与原始数据形态无关。因此分桶边界可以用纯数学提前算好,无需看数据。校准步骤只在第一次 add 时拟合两个标量,之后冻结复用,加新向量也不用重建索引。
turbovec 的搜索速度比 FAISS 快多少?在哪些硬件上测试过?
在 ARM(Apple M3 Max)上,turbovec 比 FAISS 的 IndexPQFastScan 快 10–19%;在 x86 上,4-bit 配置也略有领先。它手写了 SIMD 内核:ARM 上使用 NEON,x86 上使用 AVX-512BW,并带 AVX2 兜底。搜索时不解压数据库中的每条向量,而是将查询旋转到同一空间直接对码本打分。
turbovec 支持哪些实用功能?比如在线添加、删除和过滤?
turbovec 支持在线摄入(add 后直接可搜,无需重建索引),通过 IdMapIndex 支持按外部 ID 删除(O(1) 复杂度,删除后 ID 稳定),还支持内核内过滤:搜索时可传入 allowlist,过滤在 32 向量为一块的粒度上进行,整块无允许 slot 则短路跳过,块内不允许的 slot 在堆插入时丢弃,从而节省 SIMD 开销。
turbovec 适合哪些场景?它有什么局限性?
turbovec 适合纯本地场景:数据不能交给第三方、内存有限、需要低延迟检索,或在 SQL、权限、时间窗口的候选集里做向量精排。它不需要 embedding 模型,任何向量来源(图像特征、音频指纹、推荐向量等)都可以用。局限性是它目前是单机的顺序索引,不是分布式向量数据库,不适合需要分片、跨机房、高可用的超大规模场景。