项目 PPT 图
1000万条文档的向量索引,原本占31GB内存
turbovec 只用4GB,搜索速度还比 FAISS 快 20%
🧠 一、小白入门:turbovec 是什么?
如果你做过 RAG(检索增强生成)或者向量搜索,一定遇到过这个问题:
向量太大了。
一个1536维的OpenAI嵌入,用 float32 存储需要6KB。
1000万条文档 →60GB内存。
这还没算索引结构、查询时的开销。跑在单机上基本不可能。
turbovec 解决了这个问题。
它基于 Google Research 在 ICLR 2026 发表的TurboQuant 算法——一种不依赖数据分布的量化器,数学上逼近信息论的下界,而且不需要训练。
🌟 一句话理解
turbovec = 把 float32 向量压缩到2~4 比特/维,
内存降到原来的1/8 到 1/16,
搜索速度比 FAISS 还快 12~20%。
📊 直观对比
| 指标 | float32 | turbovec 4-bit | turbovec 2-bit |
|---|---|---|---|
| 1536维向量大小 | 6 KB | 768 字节 | 384 字节 |
| 1000万条内存占用 | ~60 GB | ~7.7 GB | ~3.8 GB |
| 压缩比 | 1x | 8x | 16x |
| 召回率(R@1) | 100% | ~93–97% | ~87–93% |
你以为压缩就要牺牲速度?
在 ARM 芯片上,turbovec 比 FAISS快 12–20%
在 x86 上,4-bit 配置比 FAISS 快 1–6%
🛠️ 二、安装与使用:3 行代码上手
Python 安装
pipinstallturbovec基础用法
fromturbovecimportTurboQuantIndex# 创建索引:1536维,4-bit量化index=TurboQuantIndex(dim=1536,bit_width=4)# 添加向量(numpy数组,shape: n×dim)index.add(vectors)index.add(more_vectors)# 搜索:返回 (分数, 索引位置)scores,indices=index.search(query_vector,k=10)# 保存与加载index.write("my_index.tq")loaded=TurboQuantIndex.load("my_index.tq")需要稳定 ID(支持删除)?
importnumpyasnpfromturbovecimportIdMapIndex index=IdMapIndex(dim=1536,bit_width=4)# 带着你的外部ID添加index.add_with_ids(vectors,np.array([1001,1002,1003],dtype=np.uint64))# 搜索返回你的IDscores,ids=index.search(query,k=10)# 按ID删除(O(1))index.remove(1002)# 保存/加载index.write("my_index.tvim")loaded=IdMapIndex.load("my_index.tvim")🔥 核心特性:过滤搜索
先让另一个系统(SQL、BM25、权限系统)筛选出候选ID集合,然后在这个集合内做向量搜索:
# 第一阶段:外部系统筛选出允许的IDallowed=np.array(db.execute("SELECT id FROM docs WHERE tenant=?",(tenant,)).fetchall(),dtype=np.uint64)# 第二阶段:只在允许集合内做密集重排序scores,ids=idx.search(query,k=10,allowlist=allowed)性能优势:过滤逻辑打在SIMD 内核内部——32个向量一块,如果整块都不在允许集合中,直接跳过,不花任何计算成本。
输出长度精确为min(k, len(allowed)),不会补垃圾结果。
🚀 三、高阶原理:turbovec 为什么能做到?
🧠 TurboQuant 的核心直觉
每个向量可以看作高维球面上的一个方向(长度单独存)。
TurboQuant 做了一个聪明的转换:
1. 归一化
去掉长度(norm),只保留方向。长度单独存为一个 float32。
2. 随机旋转
用一个固定的随机正交矩阵乘所有向量。
旋转之后,每一维独立服从相同的分布(Beta分布,高维下逼近高斯)——与原始数据无关。
这就是“data-oblivious”(不依赖数据)的来源。
3. 每维校准(TQ+,可选)
理论分布是渐近的。对于有限维度(尤其是低维),用前几条数据算一个每维的偏移和缩放,把实际分布“拉”回理论分布。
校准一次就冻结,后续添加不再重新训练。
召回率提升:最多+1.4 个百分点(2-bit 低维场景)。
4. Lloyd-Max 标量量化
既然分布已知,就可以离线预计算最优的量化桶边界和中心值(2-bit → 4个桶,4-bit → 16个桶)。
这些桶从数学算出来,不是从数据学出来的。
5. 比特打包
每个坐标变成小整数(0–3 或 0–15),紧密打包进字节。
1536维 → 384字节(2-bit)或 768字节(4-bit)。
6. 长度重归一化(RaBitQ 技巧)
量化会让向量的“长度”被低估。
turbovec 在编码时额外存一个标量修正因子,搜索时乘回去,把有偏的估计变成无偏。
零额外存储成本,零查询时间成本。
🔬 搜索时发生了什么?
- 查询向量旋转一次(与数据库向量相同)
- SIMD 内核直接对着量化后的码本打分,不解压任何数据库向量
- 使用 nibble-split 查找表 + u16累加器(借鉴 FAISS FastScan 的 pack 布局)
📈 结果
| 场景 | 效果 |
|---|---|
| ARM (Apple M3 Max) | 比 FAISS FastScan 快 12–20% |
| x86 (Intel Xeon) | 4-bit 比 FAISS 快 1–6%;2-bit 与 FAISS 持平或略慢 2–4% |
| 召回率 (d=1536) | 4-bit R@1 ≈ 96–97%;2-bit R@1 ≈ 88–92% |
| 压缩比 | 最高16:1 |
🔗 框架集成
turbovec 提供即插即用的替换,不需要改 pipeline:
# LangChainpipinstallturbovec[langchain]# 替换:langchain_core.vectorstores.InMemoryVectorStore → turbovec# LlamaIndexpipinstallturbovec[llama-index]# 替换:llama_index.core.vector_stores.SimpleVectorStore → turbovec# Haystackpipinstallturbovec[haystack]# 替换:haystack.document_stores.in_memory.InMemoryDocumentStore → turbovec# Agnopipinstallturbovec[agno]# 替换:agno.vectordb.lancedb.LanceDb → turbovec📦 Rust 也能用
cargoaddturbovecuseturbovec::TurboQuantIndex;letmutindex=TurboQuantIndex::new(1536,4);index.add(&vectors);letresults=index.search(&queries,10);index.write("index.tv")?;🧪 实测数据
搜索速度对比(ARM M3 Max,单线程)
| 配置 | FAISS (QPS) | turbovec (QPS) | 提升 |
|---|---|---|---|
| d=1536, 2-bit | ~12,000 | ~14,500 | +21% |
| d=1536, 4-bit | ~10,000 | ~11,500 | +15% |
| d=3072, 2-bit | ~6,500 | ~7,300 | +12% |
| d=3072, 4-bit | ~5,800 | ~6,600 | +14% |
多线程下趋势一致,turbovec 全面领先。
召回率(d=1536,4-bit,k=64)
| k | FAISS R@k | turbovec R@k | 差 |
|---|---|---|---|
| 1 | 93.8% | 96.7% | +2.9% |
| 4 | 98.1% | 98.8% | +0.7% |
| 8 | 99.0% | 99.4% | +0.4% |
| 16 | 99.5% | 99.7% | +0.2% |
压缩对比
turbovec 逼近 Shannon 信息论下界,比标准 PQ 更接近理论极限。
✅ 总结:turbovec 适合谁?
| 场景 | 为什么选 turbovec |
|---|---|
| RAG 本地部署 | 内存敏感,隐私要求高,不能上云 |
| 边缘设备 / 移动端 | ARM 上速度比 FAISS 快 20%,省内存 |
| 实时向量检索 | 过滤搜索在内核层做,不额外开销 |
| 不想碰训练环节 | 零训练,在线 ingest 直接可用 |
| 已有 FAISS 代码 | 替换 import 即可,不需要重写 pipeline |
📦 立即开始
pipinstallturbovecfromturbovecimportTurboQuantIndex index=TurboQuantIndex(dim=1536,bit_width=4)index.add(your_embeddings)scores,indices=index.search(query,k=10)📄论文:TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate (ICLR 2026)
📁GitHub:github.com/RyanCodrai/turbovec
📚文档:docs/api.md
turbovec—— Google 级的向量压缩,跑在你的笔记本上。
MIT 协议,Rust 内核,Python 绑定。开源,自托管,不进云。