HNSW 索引
分层可导航小世界
一种基于图的索引,是低延迟近似最近邻搜索的首选方案 — 提供一流的速度和 Recall,但内存占用较高。
工作原理
HNSW 构建了一个多层图结构,其中每个节点代表一个向量,边根据相似度连接节点。
- 层级形成层次结构 🪜
- 上层稀疏,充当长距离快速跳转的"高速公路"。
- 下层密集,提供细粒度的局部邻域连接。
- 搜索过程(粗到细)🔍
- 从顶层的入口节点开始。
- 在当前层,贪心地走向离查询向量更近的邻居,直到无法更近。
- 然后下降一层,在该位置重复相同的贪心搜索。
- 在最底层,更仔细地搜索(使用候选列表)以精化结果。
- 为什么既快又准 ⚡ 🎯
- 快:上层可以快速跳转到正确的区域,无需遍历大部分节点。
- 准:密集的底层允许彻底探索局部邻域,保持高 Recall。
何时使用 HNSW 索引?
- ✅ 实时、低延迟应用(如对话式 AI 和实时推荐)
- ✅ 需要持续高 Recall 和最小延迟的生产系统
最佳实践:HNSW 是我们推荐的默认选择,适用于大多数生产场景。它在速度、准确度和鲁棒性之间达到了极佳的平衡。
优势
- ✨ 近对数查询时间 — 大规模数据集上通常为 O(log n)
- ✨ 在多种数据分布下保持高 Recall
- ✨ 比许多替代方案(如基于 IVF 的方法)索引更快
权衡
关键参数
调参建议:
从默认值开始,先调整 ef 以权衡 Recall 和延迟。
仅在必要时增加 ef_construction 或 m 以提高准确度 — 但预期会降低索引速度并增加内存使用。
索引时参数
| 参数 | 描述 | 调参指南 |
|---|---|---|
metric_type | 用于比较向量的相似度度量 | 根据 Embedding 模型的训练方式选择 |
m | 每个节点的最大邻居数 — 图构建过程中为每个节点创建的最大双向链接数 | • 更大的 m → ✨ 更好的 Recall 和图连通性 ⚠️ 更多内存使用,索引和搜索延迟更高 |
ef_construction | 索引时候选池大小 — 插入新向量时算法考虑的候选邻居数 | • 更大的 ef_construction → ✨ 更好的图质量和更高的 Recall ⚠️ 更长的索引构建时间(不影响查询速度) |
quantize_type | 应用的向量量化方法 默认不量化 | 详见量化 |
查询时参数
| 参数 | 描述 | 调参指南 |
|---|---|---|
ef | 查询时候选池大小 — 查询时图遍历每步探索的候选邻居数 | • 更大的 ef → ✨ 更高的 Recall ⚠️ 更高的查询延迟 |
radius | 距离(相似度)阈值,用于范围过滤 — 仅返回满足阈值的 Document | 示例: • 使用内积 MetricType.IP 时,设置 radius=0.6 仅保留分数 > 0.6 的结果 ✅ 适用于:过滤低质量匹配 🚫 不适用于:需要全部 top-k 结果时 |
is_linear | 强制使用暴力线性搜索而非索引 | 🐌 大数据集下非常慢! ✅ 仅用于:调试、小型 collection 或验证索引准确度 |
is_using_refiner | 启用精确分数精化(重新计算精确的相似度分数)— 当向量被量化时有用 | ✅ 开启:需要更高精度时 ⚠️ 因全精度重新评分会增加延迟 |