Hacker News 中文摘要

RSS订阅

Turbovec – 谷歌的TurboQuant:基于Rust的向量搜索技术 -- Turbovec – Google's TurboQuant for vector search in Rust

文章摘要

turbovec是一个基于Google TurboQuant算法的Rust向量索引工具,能将1000万文档的存储从31GB压缩至4GB,且搜索速度超过FAISS。它支持在线增量索引,无需训练或调参,通过手写SIMD内核在ARM和x86架构上实现更快搜索,并具备崩溃安全的增量保存功能。

文章总结

turbovec 是一个基于 Rust 的向量索引工具,提供 Python 绑定,核心算法源自 Google Research 的 TurboQuant 量化技术。它能在不依赖训练阶段的情况下,高效处理向量数据的索引、搜索和持久化。

核心特性: - 高效压缩与搜索:一个包含 1000 万文档的语料库,以 float32 格式存储需要 31 GB 内存,而 turbovec 仅需 4 GB,且搜索速度超过 FAISS。 - 在线增量索引:向量添加后立即被索引,无需训练步骤、参数调整或随数据增长而重建。 - 快速 SIMD 搜索:通过手写内核(ARM 上的 NEON SDOT/SMMLA,x86 上的 AVX-512 VNNI 和 vpermb,以及 AVX2 和标量回退),在 4 位和 2 位配置下,平均速度分别比 FAISS IndexPQFastScan 快 3.4 倍和 23%。 - 增量持久化sync(path) 仅持久化上次同步后的变更,每次调用一次 fsync,崩溃安全,且删除或小规模追加操作仅需毫秒级时间,无论索引多大。 - 搜索时过滤:支持通过 ID 允许列表或槽位掩码进行过滤,内核直接处理,确保结果来自允许集,无过度获取或选择性过滤的召回率损失。 - 纯本地运行:无需托管服务,数据不离开本地机器或 VPC,可搭配任何开源嵌入模型构建完全隔离的 RAG 系统。

使用示例: - Python:通过 pip install turbovec 安装,使用 TurboQuantIndexIdMapIndex 进行向量添加、搜索、持久化和加载。 - Rust:通过 cargo add turbovec 添加依赖,使用类似 API 进行操作。

性能基准: - 搜索速度:在 ARM 和 x86 架构上,turbovec 在所有配置下均优于 FAISS FastScan,4 位配置平均快 3.5 倍,2 位配置快 20-26%。 - 插入与删除延迟:单向量插入延迟为 6.3-19.7 微秒,比 FAISS 快 7.6-13.9 倍;批量插入(100 向量)进一步摊销开销。删除操作(按 ID)延迟为 0.44-1.37 微秒,远快于 FAISS 的秒级延迟。 - 压缩与召回率:TurboQuant 在大多数配置下召回率优于或接近 FAISS,尤其在 4 位配置下表现突出。

工作原理: 1. 归一化:去除向量长度,存储为浮点数,使所有向量成为单位方向。 2. 随机旋转:通过随机正交矩阵旋转所有向量,使每个坐标独立服从 Beta 分布(高维下趋近高斯分布)。 3. 逐坐标校准(TQ+):为每个坐标拟合两个标量(偏移和缩放),将经验分位数映射到码本的最外层质心,提升低维或低比特下的召回率。 4. Lloyd-Max 标量量化:根据已知分布预计算最优分桶边界和质心,将每个坐标量化为小整数(2 位:4 桶,4 位:16 桶)。 5. 位打包:将量化后的整数紧密打包为字节,实现 16 倍压缩(1536 维向量从 6,144 字节降至 384 字节)。 6. 长度重归一化评分:通过存储每个向量的长度与内积估计的比值,消除量化引入的偏差,提升召回率。

构建与基准测试: - Python 构建:使用 maturin 构建并安装 wheel。 - Rust 构建:使用 cargo build --release。 - 基准测试:下载数据集后,运行 benchmarks/suite/ 中的脚本,结果保存为 JSON,并可生成图表。

框架集成: turbovec 提供 LangChain、LlamaIndex、Haystack 和 Agno 的即插即用替代方案,替换原有向量存储组件即可保持管道不变。

评论总结

根据评论内容,主要观点和论据如下:

正面评价(认可度较高): - 性能惊艳:4GB可处理1000万文档,大幅提升反向索引构建速度(评论3) - "Wow! 4GB for 10 million documents. This means one could build a reverse index much faster than before" - "Well. That is insane. O_O Fantastic job!"(评论8)

功能建议: - 希望集成LanceDB和DuckDB(评论1) - 期待SQLite绑定(评论3) - 建议README更人性化以促进采用(评论2) - "It would be nice to have the README be a little more human written"

应用场景探讨: - 适用于本地隐私优先搜索(评论6) - 可用于代理工作流中的代码库索引和文档(评论5) - 已有类似压缩方案:8倍压缩仅损失3.5%质量(评论7)

技术质疑: - 批评者认为无需float32,类似方案已存在(评论9) - "You don’t need float32, never did. Source: I’ve been writing on device embedding code for 4 years." - 建议直接使用已集成TurboQuant的Qdrant(评论10)

其他: - 询问作者身份(评论4) - 探讨WASM编译可能性(评论6)