15,654 Stars:把10M向量从31GB压到4GB,turbovec比FAISS快3.4倍

15,654 Stars:把10M向量从31GB压到4GB,turbovec比FAISS快3.4倍

RAG 应用的时候,向量数据库的内存占用是个很现实的问题。1000万条 1536 维向量用 float32 存,要 31GB——这对大多数团队来说都不是小数目。最近有个叫 turbovec 的开源项目在这件事上拿出了真实数据:同样 1000 万向量,它只需要 4GB 内存,而且检索速度比 FAISS 快了 3.4 倍。

这个项目这两天登上了 GitHub Trending,目前 15,654 颗星、1,374 个 Fork,MIT 许可证,核心代码用 Rust 写,带 Python 绑定,发布不到半年。

它解决的是什么问题

turbovec 基于 Google Research 在 2025 年 4 月公开的 TurboQuant 算法。TurboQuant 本质上是一个数据无关(data-oblivious)的量化器,核心思路是把高精度 float32 向量压缩到 4-bit 或 2-bit 表示,然后在压缩域内直接做最近邻搜索。

传统方案(比如 FAISS 的 Product Quantization)通常需要一个独立的训练阶段来建立码本,训练数据量大了之后这个阶段耗时很长。TurboQuant 的特点在于不需要这个训练步骤——压缩参数是数学上推导出来的,和具体数据分布无关,所以直接在线压缩、在线检索,省掉了训练开销。

在压缩效果上,TurboQuant 给出的具体数字是:1000 万条 1536 维向量,从 31GB float32 压到 4GB(4-bit 量化),压缩比约 8:1。恢复到可用的检索精度后,速度反而比 FAISS IndexPQFastScan 在相同配置下快了 3.4 倍(4-bit 量化)或 23%(2-bit 量化),测试覆盖了两种 CPU 架构、每种架构 8 个不同参数单元的平均结果。

技术实现:SIMD 手动优化

turbovec 性能好的一个重要原因是 SIMD kernel 是手写的,而不是依赖编译器自动向量化。项目中针对不同 CPU 架构实现了不同的指令集优化:

  • x86 AVX-512 VNNI + vpermb:Intel/AMD 高端处理器
  • x86 AVX2:覆盖率更广的 Intel/AMD 中端处理器
  • ARM NEON SDOT/SMMLA:Apple Silicon M 系列芯片
  • Scalar fallback:其他架构兜底

这个策略意味着在主流开发环境(MacBook M 系列、Intel/AMD 服务器 CPU)上基本都能用到向量化加速。

几个实际使用场景

turbovec 支持三种使用方式,对应不同的场景:

第一种是纯 Python 快速上手,pip install 后直接用 TurboQuantIndex,适合 Notebooks、脚本和简单 RAG 流程,不需要额外的向量数据库:

from turbovec import TurboQuantIndex

index = TurboQuantIndex(dim=1536, bit_width=4)
index.add(vectors)  # shape: (n, 1536), float32
scores, indices = index.search(query, k=10)
index.sync("my_index.tv")  # 增量持久化

第二种是带外部 ID 和删改功能,用 IdMapIndex,适合实际生产环境——向量对应文档、文档可删除更新的场景:

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

第三种是混合检索——当你在用 SQL/BM25/时间窗口等外部系统做初筛后,可以把候选 ID 列表传进 search(allowlist=allowed),turbovec 会在 SIMD kernel 层面直接做过滤,不会浪费算力在不允许的向量块上。

框架集成

turbovec 提供了和主流 Agent/RAG 框架的对接层,官方文档里写明了对应的替换关系:

  • LangChain:替换 langchain_core.vectorstores.InMemoryVectorStorepip install turbovec[langchain]
  • LlamaIndex:替换 llama_index.core.vector_stores.SimpleVectorStorepip install turbovec[llama-index]
  • Haystack:替换 haystack.document_stores.in_memory.InMemoryDocumentStore
  • Agno:替换 agno.vectordb.lancedb.LanceDb

对于已经在用这些框架做 RAG 的项目来说,迁移成本很低——基本只是换一个 import。

适合谁,不适合谁

turbovec 的设计边界比较清晰:

适合

  • 内存受限环境(比如单台机器跑 RAG,16-32GB RAM)
  • 需要增量写入、避免全量重建索引的场景
  • 对检索速度有明确要求、愿意在精度上做一点交换的场景
  • 数据无法出境的隐私敏感场景(纯本地,无 managed service)

不适合

  • 需要毫秒级延迟、追求最高精度的场景——turbovec 是近似检索,精度和压缩率之间有取舍
  • 分布式向量检索场景——turbovec 目前是单节点索引,不支持跨节点分片
  • 超大规模(10 亿级向量)——单节点内存终究有限,这种规模需要 Milvus/Qdrant 这类专门的分式方案

下一步建议

如果你是 RAG 开发者、正在被向量数据库的内存账单困扰,有三条可行的路:

第一条路是直接用 Python 跑一遍 Quick Startpip install turbovec,官方 README 有完整代码),感受一下 API 设计和性能基线。项目地址:github.com/RyanCodrai/turbovec

第二条路是读一下 TurboQuant 原论文(arXiv:2504.19874),理解为什么这个量化器不需要训练阶段,这对于评估”我的数据适不适合这个方案”很关键。

第三条路是评估框架集成:如果你正在用 LangChain 或 LlamaIndex,可以翻一下官方集成文档,算一下迁移成本。如果你的场景恰好是内存敏感 + 单节点 + 需要增量更新,turbovec 大概率是目前这个细分需求下最顺手的方案。


链接汇总

评论区

0 条评论

登录后可评论。

星火·GitHub 快讯 10 阅读