Zvec Logo

IVF + RaBitQ 量化索引

将 IVF 的聚类分区与 RaBitQ 量化结合,在减少扫描范围的同时压缩向量数据,适合内存受限的大规模近似向量检索。

IVF-RaBitQ 将 IVF 的聚类分区与 RaBitQ 量化结合起来:IVF 先缩小需要扫描的候选范围,RaBitQ 再以紧凑的二进制编码估算候选距离,从而同时降低查询计算量和索引内存占用。

平台要求:IVF-RaBitQ 目前仅支持 Linux x86_64,CPU 需要支持 AVX2 或 AVX512。Zvec 会自动选择最佳运行时。

工作原理

索引构建阶段 ⚙️

  1. 训练 IVF 质心:系统从训练数据中生成 nlist 个聚类质心。sample_count 可限制训练样本数,避免在超大数据集上使用全部向量训练。
  2. 分配倒排列表:每个向量被分配到最近的质心,并写入该质心对应的倒排列表。
  3. RaBitQ 编码:系统对向量执行随机旋转,并围绕所属质心对向量进行量化。每个维度至少使用 1 位二进制编码;当 total_bits 大于 1 时,额外位用于提高距离估计精度。
  4. 按批次组织编码:同一倒排列表内的量化编码按批次布局,以便查询时并行计算。

查询阶段 🔍

  1. 选择倒排列表:系统先比较查询向量与所有质心,仅选择距离最近的 nprobe 个倒排列表。
  2. 预处理查询向量:查询向量经过与建库阶段一致的旋转,并生成批量距离估计所需的查询状态。
  3. 批量估算距离:系统先使用 1 位编码快速估算候选距离和误差下界,淘汰不可能进入 Top-K 的候选;再对保留下来的候选使用额外量化位提高估算精度。
  4. 可选精确精化:启用 is_using_refiner 后,系统扩大候选集,并使用原始 FP32 向量重新计算分数。

何时使用 IVF-RaBitQ?

  • ✅ 数据集规模很大,希望同时减少候选扫描量和向量内存占用
  • ✅ 数据具有一定的聚类结构,适合通过 IVF 缩小搜索范围
  • ✅ 可以接受离线聚类训练,并愿意针对 Recall 与延迟调节 nlistnprobe
  • ✅ 工作负载运行在支持 AVX2 或 AVX512 的 Linux x86_64 服务器上

最佳实践:先使用默认的 total_bits=7,主要通过 nprobe 调节查询时的 Recall 与延迟。只有在索引内存仍然过高且可以接受一定精度损失时,才降低 total_bits

对于相同的 RaBitQ 编码,IVF-RaBitQ 通常比 HNSW-RaBitQ 使用更少的结构性内存,但对聚类质量和查询参数更敏感。如果更关注低延迟和高 Recall,且可以承担图结构内存,可优先考虑 HNSW-RaBitQ;如果更关注大规模数据下的内存效率,可优先评估 IVF-RaBitQ。

优势

  1. 双重缩减查询开销 — IVF 只扫描部分倒排列表,RaBitQ 再通过紧凑编码和位运算加速列表内距离估计
  2. 内存效率高total_bits=1 时,单看量化向量载荷,理论上可缩小到 FP32 的约 1/32;实际索引还包含质心、文档 ID、对齐及其他元数据
  3. 支持误差界剪枝 — 先使用低成本估算和下界过滤候选,仅对有机会进入 Top-K 的候选执行更精细的计算

权衡

  1. ⚠️ 平台受限 — 仅支持 Linux x86_64,需要 AVX2 或 AVX512
  2. ⚠️ 构建开销较大 — 需要训练质心、执行随机旋转并生成量化编码
  3. ⚠️ 参数敏感nlistnprobe 需要根据数据规模、分布、Recall 目标及延迟预算进行验证
  4. ⚠️ 数据限制 — 仅支持 FP32 稠密向量、64–4095 维,以及 L2IPCOSINE 距离度量

关键参数

索引构建参数

参数默认值描述调参指南
metric_typeMetricType.IP用于比较向量的相似度度量;支持 L2IPCOSINE根据 Embedding 模型的训练方式选择
nlist1024聚类数(倒排列表数) — 构建时将向量空间划分成的聚类数量可从 nlistN\sqrt{N} 开始实验,其中 N 为向量数。更大的值会形成更小、更细的列表,但增加训练、质心比较及元数据开销。nlist 必须大于 0,并应确保训练样本数足以形成所需聚类
total_bits7RaBitQ 每维总量化位数 — 取值范围为 19更大的值通常能提高距离估计精度和 Recall,但占用更多内存;1 表示仅使用基础二进制编码
sample_count0训练样本数0 表示使用全部向量训练聚类质心超大数据集可设置一个小于总向量数的正整数,以减少训练时间和峰值内存;不得小于 0

Node.js 使用 camelCase 参数名:metricTypenListtotalBitssampleCount

索引查询参数

参数默认值描述调参指南
nprobe10查询时搜索的倒排列表数 — 系统选择距离查询向量最近的列表进行扫描更大的值通常带来更高 Recall 和更高延迟。超过实际列表数时会按实际列表数处理;该值必须大于 0
radius0.0距离(相似度)阈值,用于范围过滤仅返回满足阈值的 Document;如果必须获得完整 Top-K,请避免设置过严的阈值
is_linearFalse强制使用暴力线性检索,而不使用 IVF-RaBitQ 索引仅用于调试、小型 Collection 或验证索引结果;大数据集下开销很高
is_using_refinerFalse使用原始 FP32 向量对量化检索候选重新计算精确分数需要更高精度时启用,但会增加候选读取和精确距离计算开销
scale_factor10.0启用 Refiner 时的候选扩展倍数更大的值为精化阶段提供更多候选,通常有利于 Recall,但会增加延迟;仅在 is_using_refiner=True 时生效

Node.js 中 nproberadius 名称不变,其余参数使用 isLinearisUsingRefinerscaleFactor

本页目录