HNSW (Hierarchical Navigable Small World · 分层可导航小世界)
一句话
让向量检索从「遍历 100 万条」变成「跳 20 步就找到」。 Milvus 这么快,HNSW 是核心原因。
核心直觉
想象找「和苹果最像的水果」:
- 暴力检索:把库里的每个水果(100 万个)都和苹果比一次 → 太慢
- HNSW:先在一个「粗地图」上跳到大方向(水果区)→ 再在「细地图」上精准定位(红皮水果区)→ 在少数候选里找最像的
HNSW 就是构建这张分层跳表的数据结构——上层粗略、下层精细,越接近目标越慢下来看。
为什么重要
没有 HNSW,向量检索就是 O(n) 遍历——100 万条文档 = 100 万次距离计算。有了 HNSW,只需要 ~20 步就能找到近似最近邻(ANN)。这个差距是从「不可用」到「可用」的质变。
关键参数
| 参数 | 含义 | 调大效果 |
|---|---|---|
M | 每个节点的连接数 | 精度↑ 内存↑ |
efConstruction | 建索引时的搜索宽度 | 精度↑ 建索引慢 |
ef | 查询时的搜索宽度 | 精度↑ 查询慢 |
小结
你不用手动调 HNSW 参数——Milvus 有默认值,大多数场景够用。但你需要知道:向量检索这么快,不是因为 Embedding 模型聪明,而是因为 HNSW 这个数据结构聪明。这是工程优化胜过算法优化的经典案例。