拓冰建站拓冰建站
首页 / 资讯中心 / 正文

turbovec:基于 TurboQuant 的 Rust 向量索引——无训练在线量化,比 FAISS 更快更省

turbovec基于 TurboQuant 的 Rust 向量索引——无训练在线量化比 FAISS 更快更省核心观点这个项目的本质不是又一个向量数据库而是把 2025 年 4 月 Google Research 发布的 TurboQuant 算法已被 ICLR 2026 收录工程化落地解决了 FAISS 长期存在的两个结构性痛点必须离线训练码本和增量更新代价极高。10M 文档语料从 31 GBfloat32压到 4 GB搜索速度在 4-bit 下比 FAISS IndexPQFastScan 平均快 3.4×——这不是调参优化是量化算法范式的切换。技术机制真正关键的那一步FAISS 的 PQ乘积量化需要先对训练集跑 k-means聚类产生码本索引才能工作。这意味着数据到来之前必须有一批代表性样本且随着数据分布漂移码本会逐渐失准定期重训是常规运维动作。TurboQuant 的关键创新是一个数学事实对任意高维向量做随机正交旋转后各坐标近似服从 Beta 分布且维度越高近似越紧。这个性质与输入数据的分布无关——你用 OpenAI、Cohere 还是 BGE 的 Embedding 模型都无所谓。既然旋转后的分布可以用数学预先描述就能预计算 Lloyd-Max 最优标量量化桶彻底跳过训练步骤。整个量化流程是归一化剥离模长存为 float32只量化方向向量随机旋转固定随机正交矩阵旋转使坐标独立且服从 Beta 分布TQ 校准首次add时用极少量数据拟合偏移/缩放低维 Embedding 可提升约 1.4 pp 召回率Lloyd-Max 量化2-bit 4 桶4-bit 16 桶MSE 失真仅为 Shannon 下界的约 2.7 倍位压缩1536 维从 6144 字节压缩到 384 字节16× 压缩比长度重归一化补偿量化失真将内积估计从有偏变为无偏这个机制真正巧妙之处在于它把数据相关的训练变成了数学可证明的旋转不变性从而把索引从离线批处理范式变成了在线流式范式。历史脉络与对比产品量化PQ2010 年Jégou 等是向量搜索领域 15 年来的事实标准FAISS 把它工程化到极致。PQ 的优势是成熟稳定、GPU 支持完善、生态庞大缺点是维度FAISS IndexPQturbovec (TurboQuant)训练必须k-means 数分钟无需增量 add支持但删除需整体重打包100K 规模单次删除耗时 0.19–1.02 秒O(1) swap-and-pop单次 0.44–1.22 µs搜索速度基准4-bit 平均 3.4×2-bit 平均 20%过滤搜索需 over-fetch 后裁剪SIMD 核内直接短路无允许的块GPU支持不支持生态成熟新已接入 LangChain/LlamaIndex/Haystack/Agno这次相比 FAISS 牺牲的东西是GPU 加速TurboVec 目前纯 CPU、超大规模场景亿级向量仍推荐 GPU 方案、以及低维 Embedding 下 2-bit 的稳定性GloVe d200 时 2-bit 弱于 FAISS因为低维 Beta 假设近似误差更大。关键数据搜索速度100K 向量1K queriesk64中位数 5 次ARMGCP Axion4-bit 均快 3.4–3.7×2-bit 均快 22–29%x86Sapphire Rapids4-bit 均快 3.2–3.5×2-bit 快 5–32%召回率100K 向量k64对比 FAISS IndexPQ LUT256 nbits8 float32 LUTd1536 / d3072 高维TQ 在 R1 上多数配置优于 FAISS 0.9–2.9 ppk≥8 时双方均接近 1.0d200GloVe4-bit 1.9 pp2-bit TQ 校准后 R1 微优0.572 vs 0.564更深 k 处 FAISS 有小幅优势插入延迟单向量 addn16.3–19.7 µs比 FAISS 快 7.6–13.9×删除延迟O(1) swap-and-pop0.44–1.22 µsFAISS 同等操作 0.19–1.02 秒log scale 量级差代码示例Python 基础用法from turbovec import TurboQuantIndex index TurboQuantIndex(dim1536, bit_width4) index.add(vectors) # numpy float32 (n, dim) scores, indices index.search(query, k10) # 增量持久化只写变化部分crash-safe index.sync(my_index.tv)带稳定 ID 增量删除import numpy as np from turbovec import IdMapIndex index IdMapIndex(dim1536, bit_width4) index.add_with_ids(vectors, np.array([1001, 1002, 1003], dtypenp.uint64)) index.remove(1002) # O(1) scores, ids index.search(query, k10) index.sync(my_index.tvim)混合检索过滤搜索# Stage 1SQL 等系统产出候选集 allowed np.array(db.execute(SELECT id FROM docs WHERE tenant?, (t,)).fetchall(), dtypenp.uint64) # Stage 2在候选集内做向量重排SIMD 核内直接短路无关块 scores, ids idx.search(query, k10, allowlistallowed)Rust 端use turbovec::TurboQuantIndex; let mut index TurboQuantIndex::new(1536, 4).unwrap(); index.add(vectors); let results index.search(queries, 10);交叉验证信源一arXiv 2504.19874TurboQuant 原论文Google Research2025-04-28ICLR 2026论文独立于 turbovec 项目从理论上证明了>
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门