项目详情

turbovec

10M 文档 31GB 压到 4GB,搜索比 FAISS 还快的向量索引

GitHub 地址 MIT Rust + Python TurboQuant SIMD

更新于 2026-07-25 · 基于 Google Research TurboQuant (ICLR 2026)

← 返回汇总
项目速览

一句话定位

无训练阶段的向量索引,16× 压缩、搜索快过 FAISS

Rust 向量索引 + Python 绑定,基于 Google Research 的 TurboQuant 算法——data-oblivious 量化器,近最优失真,无单独训练阶段。在线 ingest:加向量即索引,无 train、无参数调优、无重建。手写 NEON/AVX-512BW SIMD 内核。纯本地无托管服务,数据不出机器/VPC。适合内存/延迟/隐私敏感的 RAG 场景,尤其气隙部署。

项目速览

核心数据

14.3k
GitHub Stars
16×
压缩比(2-bit)
10–19%
ARM 快于 FAISS
2.7×
失真 vs Shannon 下界

数据截至 2026-07-25。10M 文档 d=1536:float32 31GB → turbovec 4GB。

为什么存在

向量检索的三个痛点

内存吃紧

float32 存 10M 文档 d=1536 要 31GB。大语料 RAG 内存成本爆炸,中小机器跑不动。

训练麻烦

传统 PQ(如 FAISS)需训练码本,语料增长要重建索引,运维复杂、延迟高。

隐私与延迟

托管向量服务要把数据发云端,气隙/合规场景不可接受;网络往返又加延迟。

核心理念

Data-oblivious:数据无关的量化

旋转之后,分布可知,码本可算

TurboQuant 的核心洞察:每个向量是高维超球面上的一个方向。施加随机旋转后,每个坐标独立服从已知分布(Beta,高维收敛到 Gaussian)——与输入数据无关。既然分布已知,最优分桶可从数学直接算出,无需从数据训练码本。这带来:无 train 步骤、语料增长无需重建、近最优失真(Shannon 下界的 2.7×)。

算法原理

编码六步

1
归一化
剥离长度,存单个 float。每向量变成单位方向。
2
随机旋转
乘同一随机正交矩阵。旋转后坐标服从 Beta 分布,高维收敛到 N(0,1/d)——对任意输入成立。
3
逐坐标校准(TQ+)
首 add 时拟合每坐标 shift+scale 两标量,映射经验 5/95% 分位到标准 Beta。冻结后复用——无重训。漂移最严重的单元 recall +1.4pp。
4
Lloyd-Max 标量量化
分布已知 → 预算最优分桶。2-bit 4 桶、4-bit 16 桶。边界与质心从数学算,非从数据。
5
Bit-pack
每坐标成小整数,紧凑打包。d=1536:6144B (FP32) → 384B (2-bit),16× 压缩。
6
长度归一化评分
标量量化系统性低估内积。编码时存 ‖v‖/⟨u,x̂⟩,搜索时乘回——估计器从有偏变无偏,零额外存储、零额外查询成本。
SIMD 搜索

手写内核,多架构覆盖

搜索时过滤

Allowlist 内核直通

传 id allowlist(或 slot bitmask)给 search(),内核直接尊重——总是从允许集返回最多 k 个结果。

Recall 对比

vs FAISS IndexPQ(LUT256, nbits=8)

数据集bitR@1 对比
OpenAI d=1536 / d=30722-bit & 4-bitTurboQuant 领先 0.2–1.9pp;k=8 均达 1.0(k=4 已 ≥0.997)
GloVe d=200(低维难题)4-bitTurboQuant 领先 0.9pp
GloVe d=2002-bit基本打平(差 0.1pp 内),k≈16 起紧贴 FAISS

100K 向量,k=64。FAISS PQ 子量化器数按 TurboQuant 比特率配(2-bit m=d/4,4-bit m=d/2)。注:选 FAISS IndexPQ 而非论文里的 u8-LUT PQ——FAISS 用更高精度 LUT + k-means++ 训练,是更强的基线。

架构

双语言 API + 框架集成

两种索引类型
  • TurboQuantIndex:基础索引,slot 索引
  • IdMapIndex:稳定外部 ID(uint64),O(1) 按 id 删除,删除后 ID 不变
双语言绑定
  • Python:pip install turbovec,maturin 构建
  • Rust:cargo add turbovec,原生 crate
  • 持久化:.tv / .tvim 文件格式

框架 drop-in 替换(同 public surface、同持久化语义、同 retriever/pipeline 接线):

LangChain LlamaIndex Haystack Agno
快速上手

五行 Python 跑起来

# Python
pip install turbovec

from turbovec import TurboQuantIndex
index = TurboQuantIndex(dim=1536, bit_width=4)
index.add(vectors)          # 在线 ingest,无 train
index.add(more_vectors)     # 语料增长无需重建
scores, indices = index.search(query, k=10)
index.write("my_index.tv")
loaded = TurboQuantIndex.load("my_index.tv")

# Rust
cargo add turbovec
use turbovec::TurboQuantIndex;
let mut index = TurboQuantIndex::new(1536, 4)?;
index.add(&vectors);
let results = index.search(&queries, 10);

# 混合检索:外部系统筛候选 → dense rerank
allowed = np.array(db.execute("SELECT id FROM docs WHERE tenant=?", (t,)).fetchall(), dtype=np.uint64)
scores, ids = idx.search(query, k=10, allowlist=allowed)
技术栈

Rust 核心 + maturin 桥接

适用场景

适合谁用

风险提示

需要权衡

学术溯源

站在三篇论文肩上

理论扎实:失真因子 2.7× 于 Shannon 信息论下界,长度归一化消除 Lloyd-Max 码本对内积估计器的残余偏差。

潜力评估

未来空间

14.3k Stars 说明「无训练 + 16× 压缩 + 纯本地」的组合击中真实痛点。TurboQuant 论文背书(ICLR 2026)+ 工程化到位(双语言、四框架 drop-in、混合检索 allowlist)构成扎实基座。若能补齐 ANN 图索引路径、扩展分布式,有机会在隐私/边缘 RAG 赛道切开 FAISS/LanceDB 的份额。当下定位精准:内存/延迟/隐私敏感场景的最佳选择之一。


上一个
Chat2DB
下一个
Speech To Speech
1 / 16