调优指南:HNSW 的 M、ef_construction、ef_search 到底在调什么
向量检索用 HNSW,很多人只知道“调大 M 和 ef 会更准但更慢”。这句话没错,但不够用来做决策。把三个参数拆开看,各自控制的是不同的东西。
M 控制图的连通度。 每个节点最多连 M 条边。M 越大,图越密,检索时能走的路径越多,召回越高,但内存占用和构建时间也越高。M 太小,图会变得“稀疏”,检索容易走进死胡同。经验起点是 16,数据维度高、分布复杂可以到 32 或 48,但不要盲目往上堆,内存会先扛不住。
ef_construction 控制建图时的候选集大小。 建图时每个节点要找多少个候选邻居。调大它,图的质量更好,但构建更慢。它不影响查询时的内存,只影响索引构建成本。如果索引是离线构建、查询频繁,这个参数可以给得慷慨一点。
ef_search 控制查询时的候选集大小。 这是运行时参数,调大它,召回更高,但延迟上升。它可以在查询时动态调整,适合按场景做分级:普通搜索用低 ef_search,精确检索用高值。
一个实用调参顺序:先固定 M=16、ef_construction=200,用评估集测不同 ef_search 下的召回和延迟曲线,找到满足召回要求的拐点;再尝试调大 M 看召回有没有明显提升,如果没有,说明瓶颈不在连通度;最后才动 ef_construction,因为它只影响构建。
还有一个容易踩的坑:过滤条件。带 metadata filter 的查询,如果过滤后候选集很小,HNSW 的图遍历可能找不到足够多的有效邻居,召回会骤降。这时候要么调大 ef_search,要么用支持过滤感知的索引实现,别指望默认参数能兜住。
- 点赞
- 收藏
- 关注作者
评论(0)