外观
Exact 与 HNSW 双路径为什么有必要?
标准回答
我保留 Exact 和 HNSW 两条路径,是为了让近似检索有可对照的质量基线。Exact 在给定向量和距离度量下计算精确近邻;HNSW 用近似搜索降低某些规模下的查询成本,但可能损失部分近邻结果。
因此我不会因为建了 HNSW 索引就默认所有查询都切过去。EachOf 的设计是看召回质量和延迟是否满足准入条件,不满足时保留 Exact 路径。对照时需要固定数据快照、Embedding 模型、过滤条件和 Top-K,否则无法判断差异究竟来自索引还是其他变量。
权限过滤尤其值得关注。一个不加过滤的查询可能返回很多近邻,但限定到某个项目后,有效候选可能变少。我要比较的是最终允许返回的结果集合,而不是只展示一个不带业务约束的搜索耗时。
这个设计也有成本。大数据量下 Exact 可能很慢,回退不能作为无限容量的保险。当前双路径说明我保留了验证与退化选择,并不代表已经证明在任意规模上都能低延迟运行。
关键机制
- 比较时固定数据快照、向量模型、过滤条件和 Top-K;召回损失与用户相关性评估是不同指标。
- HNSW 的构建和查询参数影响索引成本、内存、延迟与召回;过滤后候选不足也要覆盖。
- 大规模回退 Exact 可能显著增加成本,需要控制并发和退化行为,不能把回退当成无代价保险。
通俗例子
某查询带严格项目权限过滤,ANN 产生的有效候选很少。应比较最终可见集合与 Exact 基线,而不只测未加过滤的查询速度。
追问与回答
小数据为什么还需要 HNSW?
小数据不一定需要,Exact 可能更简单,也足够快。我保留 HNSW 是为了在数据增长时能够对照评估,而不是为了让每个请求都使用近似检索。索引构建、内存和参数调优都有成本,在现有规模没有收益时,坚持 Exact 是合理选择。
自动回退怎样触发?
这里要区分两件事:一种是离线评估不达标,就不允许某组查询配置启用 ANN;另一种是线上单次请求出现候选不足等情况,再尝试 Exact。项目材料明确的是质量与延迟准入和回退路径,具体属于哪一层、阈值多少,要以实现为准。我不会把“保留回退”直接说成已经实现了逐请求质量判断,因为在线并不能免费知道一次 ANN 漏掉了什么。
易混淆点
材料未给出具体准入阈值和大规模压测结果,不要虚构“低于某毫秒”或“百万级已经验证”。
参考资料
内容来源
- Android 技术札记 · 原条目
eachof-ann