~/reviews · TurboVec · 2026-06-08

pip install turbovec && python -c "print('hello turboquant')"

TurboVec

基于 Google Research TurboQuant 算法(ICLR 2026),Rust 写核心 + Python 绑定,一行 pip 安装。1000 万条 OpenAI 向量从 31GB 压到 4GB——压缩率 87%——ARM 上检索速度比 FAISS 快 12-20%,x86 持平或略优。零训练、零 GPU、在线添加、内核级过滤。

向量检索 TurboQuant ICLR 2026 Rust + Python MIT 比 FAISS 快

// 目录

概览 解决什么问题 算法拆解 流程架构 安装使用 性能数据 竞品对比 博主观点 参考链接

// 概览

Stars / 涨幅
7,200
今日 +1,554 · GitHub Trending AI 类 #1
Forks / Issues
700 / 10
Issue 极少 · 0 Open PR · 144 Commits
语言 / 协议
Py 55.7% / Rs 44.3%
MIT 开源 · 25 Tags · ICLR 2026 论文
压缩率
87%
1000 万 × 1536 维:float32 31GB → TurboVec 4-bit 4GB
ARM 速度
+12~20%
vs FAISS IndexPQFastScan · 手写 NEON SIMD 内核
框架集成
4+
LangChain · LlamaIndex · Haystack · Agno 原生支持

// 向量检索的两个老问题

每天跑 GitHub AI 日报,看过的向量数据库项目两只手数不过来。FAISS、Milvus、Qdrant、Chroma、LanceDB……各有各的用武之地。但今天这个不太一样。

RyanCodrai/turbovec,今日 Trending 涨幅最高的 AI 项目,+1,554 Star。我点进去看了十分钟就决定写它——不是因为 Star 多,是这个方案的想法确实够狠。

说人话:RAG 系统的向量存储一直有两个老问题。第一,内存吃不消。1000 万文档 × 1536 维 × float32 得 61GB,算上索引开销大概 31GB。32GB 内存的机器直接爆了。第二,每次加新数据得重建索引。传统乘积量化(PQ)得先拿一批数据训练码本,后面来了新数据要么扔掉旧的重新训,要么忍受质量下降。对于每天都在变的数据集,这个流程根本扛不住。

TurboVec 两刀都砍了。压缩到 4GB 靠的是数据无关量化——不需要看数据长什么样,数学上就能算出来最优分桶。在线添加靠的是同样的原理——来了新向量直接量化塞进去,不用回头看旧数据。

// TurboQuant 算法:五步把 31GB 变成 4GB

我不是做数学的,但这个算法思路确实漂亮。分五步走:

第一步:归一化。 把每个向量的长度(模长)去掉,存成一个标量。所有向量变成单位球面上的点。这一步把"方向"和"长度"解耦了。

第二步:随机旋转。 所有向量乘同一个随机正交矩阵。转完之后,每个坐标在高维下近似独立,都乖乖服从 Beta 分布,跟你原始数据长什么样没关系。这一步是整个"数据无关"的数学基础——ICLR 2026 论文的核心贡献。

第三步:校准(TQ+)。 有限维度下坐标不会完全服从理论分布,所以第一次加数据时,给每个坐标拟合偏移和缩放两个数,把实际分布映射到理论分布。校准结果冻住,后面不再改。低维场景下 R@1 能提升 1.4 个百分点。

第四步:Lloyd-Max 标量量化。 坐标分布已知,最优分桶方式直接从公式算。2-bit 是 4 个桶,4-bit 是 16 个桶。不需要训练,不需要迭代,一条公式出结果。做法很干净。

第五步:位打包 + 长度重归一化。 量化完的整数紧密打包成字节,1536 维 float32(6144 字节)→ 4-bit 后 768 字节 → 2-bit 更狠,384 字节。量化会导致内积被低估,TurboVec 在编码时算好修正系数塞进去,搜索时零额外开销乘回去,内积估计是无偏的。这个技巧来自 RaBitQ(SIGMOD 2024),放到 TurboQuant 的框架里刚好互补。

整个过程不需要看数据、不需要 GPU、不需要训练。所有坐标共享同样的量化器,因为旋转后它们服从同一个分布。这比传统 PQ 那种"先采样、训码本、再量化"的流程不知道清爽多少。


// TurboQuant 量化流水线

📐
归一化去长度 · 单位球面
🔄
随机旋转坐标独立 · Beta 分布
📏
TQ+ 校准偏移+缩放 · 一次冻住
📦
Lloyd-Max公式分桶 · 零训练
位打包紧密压缩 · SIMD 检索
五步全流程数据无关 · 无训练 · 在线增量 · 数学逼近香农下界(~2.7x)

// 安装使用

装这东西就一行:

# 基础安装 pip install turbovec # 框架集成(按需选) pip install turbovec[langchain] # LangChain pip install turbovec[llama-index] # LlamaIndex pip install turbovec[haystack] # Haystack pip install turbovec[agno] # Agno

基本用法——建索引、加向量、搜、存盘、加载,一气呵成:

from turbovec import TurboQuantIndex # 1536 维(OpenAI 默认),4-bit 量化 index = TurboQuantIndex(dim=1536, bit_width=4) # 加向量,想加多少加多少,不用重建索引 index.add(vectors) index.add(more_vectors) # 搜 top 10 scores, indices = index.search(query, k=10) # 存盘 / 加载 index.write("my_index.tq") loaded = TurboQuantIndex.load("my_index.tq")

带自定义 ID 的版本适合关联数据库,支持 O(1) 删除:

from turbovec import IdMapIndex import numpy as np index = IdMapIndex(dim=1536, bit_width=4) index.add_with_ids(vectors, np.array([1001, 1002, 1003], dtype=np.uint64)) scores, ids = index.search(query, k=10) # O(1) 删除 index.remove(1002)

搜索时过滤是我觉得最实用的功能。多租户 RAG 场景下,先在 SQL 里查出某个租户的文档 ID,然后在内核级直接过滤,不先拉大量结果再筛:

# 先跑 SQL 查出某个租户的文档 ID tenant_ids = np.array([1, 5, 10, 15, 20], dtype=np.uint64) # 在 SIMD 核心里直接过滤,零性能损耗 scores, ids = idx.search(query, k=5, allowlist=tenant_ids)

过滤逻辑在 SIMD 内核的 32 向量块粒度执行。允许的候选集越小,跳过的块越多,速度越快。不是那种"先搜 100 个再筛"的假过滤。


// 性能数据

基准测试环境:10 万向量、1000 条查询、k=64,跑 5 次取中位数。

召回率对比(vs FAISS IndexPQ)

d=1536 4-bit
R@1 +1.2pp vs FAISS
d=3072 4-bit
R@1 +3.4pp vs FAISS
d=1536 2-bit
R@1 +0.4pp vs FAISS
d=200 4-bit
R@1 +0.3pp vs FAISS
d=200 2-bit
R@1 -1.2pp vs FAISS(低维短板)

搜索速度对比

ARM (M3 Max)
比 FAISS FastScan 快 12-20%
x86 4-bit (SPR)
比 FAISS 快 1-6%
x86 2-bit (SPR)
与 FAISS 持平(±2%)

内存占用

float32 1000 万
~31 GB
TurboVec 4-bit
~4 GB(省 87%)
TurboVec 2-bit
~2 GB(省 93%)

// 竞品对比

方案 核心优势 核心短板 适合场景
TurboVec 零训练 + 极低内存 + ARM 速度领先 + MIT 项目新 · 单人维护 · 无分布式 · 低维 2-bit 弱 中小规模 · 内存敏感 · 在线增量
FAISS Meta 出品 · 生态最完善 · GPU 支持 · 十亿级 需训练码本 · 增量添加要重建 · 内存占用高 大规模离线 · GPU 加速 · 需要各种索引类型
Milvus 分布式 · 全套企业功能 · 云原生 重(K8s/Pulsar/MinIO)· 学习曲线陡 企业级 · 十亿级 · 需要高可用
Qdrant Rust 原生 · 过滤强 · API 简洁 内存占用比 TurboVec 高 · 非压缩专长 需要丰富过滤 · 中等规模
LanceDB 列式存储 · 数据湖搭配 搜索性能不如专用向量库 · 生态年轻 数据湖场景 · 多模态数据
Chroma 最简单上手 · 原型友好 性能弱 · 无量化压缩 · 生产扛不住 原型开发 · 小数据集

// 博主观点

TurboVec 是那种「想法干净、实现利落」的项目。它不试图做一个全家桶,就盯着向量量化这一件事做到极致。聊几个我觉得值得说的事。

第一,这个方案打中了 RAG 最真实的痛点。 不是"我们要支持十亿级向量"这种大词,而是"内存不够用了"和"数据天天长重建索引太烦了"。这两个问题每个做 RAG 的人都会遇到,TurboVec 给了一个很直接的解法。1000 万条数据从 31GB 变成 4GB,搜索还更快——这个结果本身已经足够说明问题了。

第二,ARM 上的性能优势不是运气。 手写 NEON SIMD 内核、x86 上 AVX-512BW 精准选路——这些不是调调编译选项能出来的效果。而且 ARM 正是 Mac 笔记本和边缘设备的主力平台,这块 FAISS 的优化远不如 x86。TurboVec 在 ARM 上比 FAISS 快 12-20%,对 Mac 用户来说是个实打实的甜点。

第三,数据无关这件事的价值被低估了。 传统 PQ 需要"先采集一批有代表性的数据 → 训码本 → 建索引"这个流程。如果你的数据分布跟我训码本时的不一样,量化质量就会掉。TurboVec 反其道而行——它假设"转完之后坐标都服从 Beta 分布",然后从数学上求最优解。不需要代表性数据,不需要重训,增量数据和存量数据享受同样的量化质量。

但我也确实有几个顾虑。 项目只有 144 个 commit、25 个 tag(但没有正式的 GitHub Release),维护者只有 RyanCodrai 一个人。Bus Factor = 1,这意味着作者去休假代码就没人管了。低维 2-bit 场景下比 FAISS 差 1.2 个百分点——如果你还在用老式词向量(普遍 200-300 维),TurboVec 的增益有限。没有分布式也是硬伤,十亿级以上场景还是得找 Milvus 或 Qdrant。

还有一个隐忧:Meta 不是傻子。 TurboQuant 的论文是公开的(ICLR 2026),如果 FAISS 团队觉得这条路靠谱,把类似的东西做到 FAISS 里只是时间问题。TurboVec 的时间窗口有多长,取决于它能跑多快。

但就现在来说——如果你在用 LangChain 或 LlamaIndex 搭 RAG,把向量存储从 InMemory 换成 TurboVec 基本是零迁移成本。省下的内存可以干别的,或者在更便宜的机器上跑更大的数据集。对于资源敏感的场景,这 87% 的内存节省不是什么锦上添花,是能不能跑起来的区别。

综合评分
8.5
/ 10 — 数据无关量化的开源最佳实践
✅ 87% 内存压缩(1000 万 × 1536 维:31GB → 4GB)
✅ ARM 搜索速度比 FAISS FastScan 快 12-20%
✅ 零训练、零 GPU、一行 pip install
✅ 在线增量添加,无需重建索引
✅ 内核级搜索过滤(多租户 RAG 天然适配)
✅ ICLR 2026 论文背书,数学逼近香农下界
✅ 主流 RAG 框架原生集成(LangChain/LlamaIndex/Haystack/Agno)
✅ MIT 协议,Rust 核心 + Python 绑定
❌ 单人维护(Bus Factor = 1),项目太新(144 Commits)
❌ 无分布式支持,十亿级以上得换方案
❌ 低维 2-bit 场景比 FAISS 差(GloVe d=200:R@1 -1.2pp)
❌ 无正式 GitHub Release,只有 Git Tags
❌ FAISS 团队可能跟进类似方案,时间窗口不确定
❌ 大规模用户反馈尚缺(Issue 仅 10 个)

🔗 GitHub: RyanCodrai/turbovec

🔗 PyPI: turbovec

🔗 TurboQuant 论文(ICLR 2026)

🔗 RaBitQ 论文(长度重归一化参考)

🔗 FAISS(竞品参考)

🔗 Milvus(竞品参考)

🔗 联系作者:Ryan Codrai / GitHub Profile