turbovec基于 TurboQuant 的 Rust 向量索引 1000 万向量 31GB → 4GB,搜索还比 FAISS 快 |ICLR 2026 论文 · Google Research 算法

4 阅读8分钟

GITHUB DAILY · 第060期

turbovec

基于 TurboQuant 的 Rust 向量索引1000 万向量 31GB → 4GB,搜索还比 FAISS 快

ICLR 2026 论文 · Google Research 算法 · MIT 开源

向量搜索RustSIMD量化压缩RAG****零训练

📦 项目速览

项目名turbovec
作者RyanCodrai
GitHubRyanCodrai/turbovec
Stars11.4k 🔥
今日增长+1,554 ⭐
协议MIT
语言Python 54.4% + Rust 45.6%
论文TurboQuant (ICLR 2026)
16×最大压缩比0训练步骤19%ARM 超越 FAISS4框架集成

😣 它能解决什么问题?

内存爆炸:向量库吃掉你整台机器

1536 维 float32,单向量 6KB。1000 万条 = 31GB。你的 Mac/笔记本直接 OOM。

训练麻烦:PQ 量化必须先跑 K-Means

传统乘积量化(PQ)需要完整数据遍历训练码本,新数据进来还得重建索引,增量更新是个噩梦。

隐私焦虑:向量数据必须上云

Pinecone、Weaviate Cloud 需要上传向量数据到云端,但企业内网文档、医疗病历、法律卷宗——这些数据不能出门。

过滤低效:搜索后过滤 = 白算

多租户隔离、权限控制、时间窗口过滤——先全量检索再过滤,大量无效计算被浪费。

✨ 核心亮点

一、TurboQuant:数据无关量化,零训练即插即用

turbovec 的灵魂来自 Google Research 的 TurboQuant 算法(ICLR 2026 论文)。传统 PQ 需要对数据跑 K-Means 聚类学习码本,而 TurboQuant 利用一个优雅的数学洞察:对任意向量施加随机旋转后,每个坐标独立服从已知的 Beta 分布。既然分布已知,最优量化方案就可以从数学推导出来——不需要从数据学习任何东西。

**六步压缩流程:**归一化(剥离向量长度)→ 随机旋转(坐标独立化)→ TQ+ 坐标校准(修正有限维度偏差)→ Lloyd-Max 量化(数学最优分桶)→ 位打包(2-bit/4-bit 紧凑存储)→ 长度重归一化(消除内积偏倚)

二、16× 压缩:31GB → 4GB,单机跑千万级向量

1536 维向量:float32 占 6,144 字节,2-bit 模式仅 384 字节(16 倍压缩),4-bit 模式 768 字节(8 倍压缩)。1000 万条 OpenAI Embedding 从 31GB 降到 4GB——一台普通笔记本就能装下。

💡 压缩不是牺牲精度:在 OpenAI d=1536/3072 上,turbovec 的 R@1 召回率比 FAISS PQ 还高 0.2-1.9 个百分点。

三、手写 SIMD 内核:ARM 比 FAISS 快 10-19%

turbovec 不是调编译器优化开关,而是手写了三大架构的搜索内核:ARM NEON、x86 AVX-512BW、x86 AVX2 回退。Apple M3 Max 上比 FAISS IndexPQFastScan 快 10-19%;Intel Xeon 8481C 上 4-bit 配置领先 1-6%。搜索时使用 nibble-split 查找表实现最大吞吐。

| 平台 | 配置 | turbovec vs FAISS | | --- | --- | --- | | Apple M3 Max | 全部 | 快 10-19% | | Xeon 8481C | 4-bit | 快 1-6% | | Xeon 8481C | 2-bit | 略慢几个百分点 |

四、SIMD 内核级过滤:不白算一个向量

这是 turbovec 与其他向量索引库的关键区别:过滤发生在 SIMD 循环内部,不是搜索后再过滤。传入 allowlist 或 slot 位掩码,内核以 32 向量块粒度短路跳过被过滤的块,堆插入前再做单槽检查。选择性白名单下,大部分 SIMD 开销直接省掉。

**适用场景:**多租户隔离(只搜某租户数据)· 权限控制(只搜有权限文档)· 时间窗口(只搜近 30 天)· 混合检索(先 SQL/BM25 再向量重排)

五、四大框架一键替换:一行 import 切换

LangChain、LlamaIndex、Haystack、Agno——四大 RAG 框架直接提供 drop-in 替换类,保持原有公共接口、持久化语义和检索器连接,改一行代码就能从内存向量库切换到 turbovec。

| 框架 | 安装命令 | 替换目标 | | --- | --- | --- | | LangChain | pip install turbovec[langchain] | InMemoryVectorStore | | LlamaIndex | pip install turbovec[llama-index] | SimpleVectorStore | | Haystack | pip install turbovec[haystack] | InMemoryDocumentStore | | Agno | pip install turbovec[agno] | LanceDb |

六、Rust 核心 + Python 绑定:安全与性能兼得

纯 Rust 内核保证内存安全与裸金属性能,通过 PyO3 + maturin 提供 Python 绑定(abi3 稳定 ABI)。核心索引结构使用 OnceLock 延迟初始化旋转矩阵、码本和 SIMD 块布局,多线程并发搜索零锁竞争。行级并行通过 rayon 展开,旋转矩阵乘法走 BLAS 后端(macOS Accelerate / Linux OpenBLAS)。

⚡ turbovec vs FAISS 深度对比

| 维度 | turbovec | FAISS | | --- | --- | --- | | 核心语言 | Rust | C++ | | 量化方式 | TurboQuant(数据无关) | PQ/OPQ/SQ(需训练) | | 训练需求 | ❌ 零训练 | ✅ 通常需要 | | 增量添加 | ✅ 直接 add | 可能需重建 | | 搜索时过滤 | SIMD 内核级 | 搜索后过滤 | | ARM 性能 | 快 10-19% | 基准线 | | GPU 支持 | 仅 CPU SIMD | ✅ FAISS-GPU | | 部署模型 | 嵌入式库 | 嵌入式库 |

🎯 实战场景

场景一:个人知识库 — 笔记本跑千万级 RAG

你有 500 万条笔记的 embedding(OpenAI text-embedding-3-small,d=1536)。float32 存储 10GB,笔记本内存不够。换成 turbovec 4-bit 模式:1.3GB,轻松装下。

from turbovec import TurboQuantIndeximport numpy as npindex = TurboQuantIndex(dim=1536, bit_width=4)# 分批加载 embeddingfor batch in load_embeddings("notes/"):  index.add(batch)scores, indices = index.search(query_vec, k=10)index.write("notes_index.tv") # 持久化到磁盘

场景二:混合检索 — BM25 + 向量重排

先用 Elasticsearch BM25 检索候选文档 ID,再用 turbovec 在候选集内做稠密重排。allowlist 过滤在 SIMD 内核内执行,不浪费任何计算。

from turbovec import IdMapIndeximport numpy as npidx = IdMapIndex(dim=1536, bit_width=4)idx.add_with_ids(vectors, doc_ids)# 阶段1:BM25 检索候选 IDallowed = es.search("AI Agent 安全", top=1000)# 阶段2:在候选集内向量重排scores, ids = idx.search(query, k=10,  allowlist=np.array(allowed, dtype=np.uint64))

场景三:企业内网问答 — 气隙环境 RAG

企业合规要求文档数据不得离开内网。turbovec 纯本地运行,配合开源嵌入模型(如 bge-large),构建完全气隙的 RAG 栈——零外部 API 调用,零数据泄露风险。

# 搭配 LangChain 使用(一行替换)from turbovec.integrations.langchain import TurbovecStorevectorstore = TurbovecStore(  embedding=local_embedding_model,  bit_width=4# 8× 压缩,召回几乎无损)# 后续用法与 LangChain 原生 VectorStore 完全一致retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

🚀 上手指南

Step 1:安装

# Python(一行搞定)pip install turbovec# 带框架集成pip install turbovec[langchain]# Rust 项目cargo add turbovec

Step 2:创建索引 & 添加向量

from turbovec import TurboQuantIndex# dim 必须是 8 的倍数,bit_width 支持 2/3/4index = TurboQuantIndex(dim=1536, bit_width=4)# 直接添加,无需训练!index.add(first_batch)index.add(second_batch) # 增量添加,不用重建

Step 3:搜索 & 持久化

# 搜索 Top-Kscores, indices = index.search(query, k=10)# 持久化到磁盘index.write("my_index.tv")# 下次直接加载loaded = TurboQuantIndex.load("my_index.tv")

| 操作 | Python | Rust | | --- | --- | --- | | 创建索引 | TurboQuantIndex(dim, bit_width) | TurboQuantIndex::new(dim, bits) | | 添加向量 | index.add(vectors) | index.add(&vectors) | | 搜索 | index.search(query, k) | index.search(&q, k) | | 带 ID 映射 | IdMapIndex + add_with_ids | IdMapIndex::new + add_with_ids | | 过滤搜索 | search(q, k, allowlist=ids) | search_with_mask(&q, k, mask) | | 删除向量 | IdMapIndex.remove(id) | IdMapIndex::remove(id) | | 持久化 | write(path) / load(path) | write(path) / load(path) |

🤔 适合你吗?

| ✅ 适合用 | | --- | | 本地 RAG 索引开始吃内存,想从 31GB 降到 4GB | | 知识库放个人电脑/NAS/内网,不希望数据上云 | | 需要租户/权限/时间窗口等搜索过滤条件 | | 用 LangChain/LlamaIndex 但想换更轻的本地向量存储 | | 增量数据频繁添加,不想每次重建索引 |

| ❌ 不太适合 | | --- | | 数据量很小(几万条以下,压缩收益不明显) | | 已用成熟向量数据库且运维成本可接受 | | 需要 GPU 加速(turbovec 仅 CPU SIMD) | | 需要超大规模(>1亿向量)分布式部署 | | 需要完整 RAG 平台(文档解析/增量同步/权限等) |

⚠️ 诚实说明:turbovec 是向量索引库,不是完整的向量数据库。它不处理文档切分、增量同步、权限管理、查询改写等上层逻辑。维度必须是 8 的倍数;TQ+ 校准首次 add 后锁定,后续数据分布偏移时需手动重建;Windows 下 BLAS 支持不完善。生产使用前请务必用自己的 embedding 跑一遍召回基准。

📝 今日总结

1️⃣ turbovec 基于 Google Research 的 TurboQuant 算法(ICLR 2026),数据无关量化,零训练即插即用

2️⃣ 16 倍压缩(2-bit)或 8 倍压缩(4-bit),千万向量从 31GB 降到 4GB

3️⃣ 手写 NEON/AVX-512BW/AVX2 内核,ARM 上比 FAISS 快 10-19%

4️⃣ SIMD 内核级过滤,混合检索和权限场景不浪费计算

5️⃣ LangChain/LlamaIndex/Haystack/Agno 四大框架一键替换

6️⃣ Rust 核心安全高效 + Python 绑定易用,MIT 协议完全免费

💬 你在用什么向量索引方案?

FAISS?Milvus?Qdrant?还是直接全放内存?如果换成 turbovec,你的知识库能省多少 GB?欢迎评论区聊聊 👇

GITHUB DAILY · 每天一个值得深读的开源项目

第060期 · 2026.06.14 · turbovec