理解
HNSW
向量世界的高速公路
深入剖析 Hierarchical Navigable Small World 算法—— 现代向量数据库的核心索引引擎,让百万级相似搜索在毫秒内完成。
什么是近似最近邻搜索?
在向量数据库中,最核心的操作是找到与查询向量最相似的 k 个向量。 暴力遍历所有向量(精确搜索)的时间复杂度是 O(n·d),在百万规模的高维数据面前慢得令人痛苦。
因此,近似最近邻(ANN, Approximate Nearest Neighbor)算法应运而生: 用少量精度换取数量级的速度提升。HNSW 是目前工业界公认表现最好的 ANN 算法之一。
"HNSW 在 ann-benchmarks.com 上几乎横扫所有数据集,以极高的召回率和极低的延迟同时领先。"
小世界网络的灵感
1967 年,社会学家 Milgram 做了一个实验:让陌生人通过熟人链把信件传递给指定目标, 平均只需 6 步。这就是著名的"六度分隔"——世界比我们想象的小。
HNSW 把同样的思想应用到向量空间:在图中,任意两个节点之间通过少数几跳就能相连, 而层级结构则提供了"长途快线"与"本地慢车"的组合。
搜索是如何进行的?
搜索过程可以用一个简单的比喻理解:乘坐高铁→地铁→步行 到达目的地。
第一步:顶层出发
从最高层的入口节点开始,节点稀疏,每一跳跨越很远的距离。
第二步:贪心靠近
在当前层,每次选择离目标最近的邻居前进,直到局部最优。
第三步:下降一层
当前层无法再靠近时,下降到更密集的下一层,继续搜索。
第四步:底层精搜
在最底层(Layer 0)找到最终的近似最近邻,返回结果。
三个核心参数
理解并调优这三个参数,就能在速度、精度、内存之间找到最佳平衡点。
# Python 示例:使用 hnswlib 构建索引 import hnswlib import numpy as np dim = 128 # 向量维度 count = 100_000 # 初始化索引 index = hnswlib.Index(space='cosine', dim=dim) index.init_index( max_elements=count, ef_construction=200, # 构建质量 M=32 # 图稠密度 ) # 添加向量 data = np.random.rand(count, dim).astype(np.float32) index.add_items(data) # 查询(可动态调整 ef) index.set_ef(64) labels, distances = index.knn_query(data[0], k=10)
为什么 HNSW 如此出色?
与其他 ANN 算法相比,HNSW 在召回率和延迟的 trade-off 上处于领先位置。
哪里在用 HNSW?
从 RAG 到推荐系统,HNSW 已成为现代 AI 基础设施的隐形脊梁。 主流向量数据库都将其作为默认或核心索引选项。
Milvus
开源向量数据库,HNSW 是其最常用的索引类型之一。
Qdrant
Rust 实现的高性能向量搜索,默认使用 HNSW。
pgvector
PostgreSQL 扩展,支持 HNSW 索引进行向量相似搜索。
Weaviate
云原生向量数据库,核心索引基于 HNSW 构建。
一句话总结
HNSW 用层级图模拟了小世界网络的快速导航特性—— 上层提供"高速公路"快速靠近目标区域,下层提供"本地街道"精细定位。 这个巧妙的设计让它在O(log n) 的时间复杂度内, 完成精度超过 99% 的近似最近邻搜索。
对于任何需要处理向量嵌入的系统——无论是 LLM、推荐引擎还是多模态搜索—— 理解 HNSW 的工作原理都是理解整个系统性能瓶颈和优化空间的关键一步。


