HNSW-RaBitQ 索引
HNSW + RaBitQ 量化
一种先进的基于图的索引,将 HNSW 图结构与 RaBitQ 量化算法相结合 — 在保持一流搜索质量的同时大幅降低内存使用。
平台要求:HNSW-RaBitQ 目前仅支持 x86_64 平台,且需要 AVX2 或更高指令集。不支持 ARM 架构。
工作原理
HNSW-RaBitQ 结合两项技术实现高 Recall 和低内存占用:
- HNSW 图用于导航 🪜
- 与标准 HNSW 索引相同的多层图结构 — 上层稀疏用于快速远距离跳转,下层密集用于细粒度局部搜索。
- RaBitQ 用于距离估计 🔍
- RaBitQ 先对向量进行随机旋转,然后将其转换为二进制编码(0 和 1)。这种方法允许系统通过高效的位运算来估计距离,与处理全精度数值相比,显著降低了内存使用和计算成本。
何时使用 HNSW-RaBitQ?
- ✅ 需要快速搜索、高 Recall 且内存预算可控的生产系统
- ✅ 超大规模高维数据集 — 十亿级 1536+ 维向量在 FP32 格式下会消耗 TB 级内存
- ✅ 运行在支持 AVX2/AVX-512 的 x86_64 服务器上的工作负载
最佳实践:当你希望获得 HNSW 级别的搜索质量而无需承担高内存开销时,使用 HNSW-RaBitQ。
total_bits 参数控制精度-内存的权衡。根据论文,在特定数据集上,7 位可达约 99% Recall,5 位约 95%,4 位约 90%。最低可使用 1 位以最大化压缩,但会降低 Recall。
优势
- ✨ 大幅降低内存 — 量化后的向量最多比 FP32 小 32 倍,减少活跃索引大小
- ✨ 高效距离估计 — RaBitQ 支持基于位运算的高效相似度计算
- ✨ 无需重排序即可获得出色 Recall — 图构建使用原始向量,保持图质量;RaBitQ 提供渐近最优的误差界,确保排序可靠
权衡
- ⚠️ 仅支持 x86_64 — 需要 AVX2 或 AVX-512;不支持 ARM
- ⚠️ 训练开销 — 索引构建前需要 KMeans 训练步骤,增加构建时间
- ⚠️ 维度限制 — 仅支持 64 到 4095 维之间的向量
关键参数
调参建议:
从默认值开始(total_bits=7,num_clusters=16)。先调整查询时的 ef 来权衡 Recall 和延迟。仅在需要进一步降低内存且可接受稍低 Recall 时减小 total_bits。
索引时参数
| 参数 | 描述 | 调参指南 |
|---|---|---|
metric_type | 用于比较向量的相似度度量 | 根据 Embedding 模型的训练方式选择 |
m | 每个节点的最大邻居数 — 图构建过程中为每个节点创建的最大双向链接数 | • 更大的 m → ✨ 更好的 Recall 和图连通性 ⚠️ 更多内存使用,索引和搜索延迟更高 |
ef_construction | 索引时候选池大小 — 插入新向量时算法考虑的候选邻居数 | • 更大的 ef_construction → ✨ 更好的图质量和更高的 Recall ⚠️ 更长的索引构建时间(不影响查询速度) |
total_bits | RaBitQ 每维量化位数 — 控制二进制编码精度 | 控制精度-内存权衡。 更低的值节省更多内存但降低精度 |
num_clusters | KMeans 聚类数 — 在 RaBitQ 训练阶段用于划分向量空间 | • 更多聚类可捕获更精细的分布模式 • 更高的值可略微提升 Recall |
sample_count | 训练样本数 — KMeans 训练采样的向量数量(0 = 使用全部向量) | 默认为 0。在超大数据集上设置较小的值(如 5,000,000)可加速训练并减少内存使用 |
查询时参数
| 参数 | 描述 | 调参指南 |
|---|---|---|
ef | 查询时候选池大小 — 查询时图遍历每步探索的候选邻居数 | • 更大的 ef → ✨ 更高的 Recall ⚠️ 更高的查询延迟 |
radius | 距离(相似度)阈值,用于范围过滤 — 仅返回满足阈值的 Document | 示例: • 使用内积 MetricType.IP 时,设置 radius=0.6 仅保留分数 > 0.6 的结果 ✅ 适用于:过滤低质量匹配 🚫 不适用于:需要全部 top-k 结果时 |
is_linear | 强制使用暴力线性搜索而非索引 | 🐌 大数据集下非常慢! ✅ 仅用于:调试、小型 collection 或验证索引准确度 |
is_using_refiner | 启用精确分数精化 — 量化搜索后对候选结果重新计算精确 FP32 距离 | ✅ 开启:需要最高精度时 ⚠️ 因全精度重新评分会增加延迟 |