先这样答
精确检索和近似检索的取舍,主要看数据量和延迟 SLA。精确检索会暴力扫描全部向量,结果完美,但数据量变大后,延迟会线性增长。千万级以下的数据,通常可以考虑精确检索。
数据量继续增大时,可以使用近似检索。常见方案有 HNSW 和 IVF。它们可以把查询延迟降到亚线性,但要接受一定的召回率损失。召回率可以在 95 到 99 之间调节,具体取值要看业务对结果质量和延迟的要求。
我的默认选择是:百万级以上优先考虑 HNSW 或 IVF。HNSW 的召回率高,但内存占用大。IVF 更省内存,但需要先训练聚类。在线使用 HNSW 时,可以调大 efSearch 来换取更高召回率。如果 SLA 更严格,就需要控制查询延迟,并接受相应的召回率变化。
面试官会怎么追问
-
「为什么千万级以下还可以用精确检索?」 精确检索直接暴力扫描向量,结果没有近似误差。千万级以下时,扫描带来的延迟仍可能满足业务要求。数据量继续增大后,延迟会按线性趋势增长,就要结合 SLA 重新选择。
-
「HNSW 和 IVF 应该怎么选?」 HNSW 的召回率高,但内存占用大。IVF 更省内存,但需要训练聚类。两者都能提供亚线性延迟,具体选择要看内存限制、数据量和延迟 SLA。
-
「HNSW 的召回率不够时,你会怎么调?」 可以调大 efSearch。这个参数会用更高的查询成本换取更高召回率。线上可以根据延迟 SLA 调整它,不能只追求召回率而忽略延迟。
回答的坑
-
不要把近似检索说成结果完全正确,它需要用召回率损失换取更低延迟。
-
不要只说 HNSW 或 IVF 的名称,要同时说明 HNSW 占内存大、IVF 需要训练聚类。
同系列的题
—— 本题完 ——