分片结果合并前,先问每个分片返回的是什么。若它返回同一距离定义下的精确Top-K,合并不是近似问题;若分片内部已经漏召回,协调器排得再认真,也只能处理手里那批候选。
原理示意,非真实系统截图或性能测量。
精确Top-K为什么够用
固定距离升序、文档ID升序作为全序。假设一个全局前K的点在所属分片排到K名之后,那么该分片至少有K个点排在它前面。这K个点在全局也都排在它前面,与“全局前K”矛盾。所以每片取精确Top-K,再合并,足够得到全局Top-K。
成立条件不能省:分片覆盖完整、度量一致、ID与并列顺序一致。余弦相似度直接与平方L2混排,或者每片使用不同量化标尺,都不符合前提。内图中的四个距离是教学输入,不是一次检索测量。
from heapq import nsmallest def exact_top(shards, k): if k < 0: raise ValueError("negative k") local = [nsmallest(k, rows) for rows in shards] return nsmallest(k, (x for rows in local for x in rows)) shards = [[(1,"A"),(4,"D")],[(2,"B"),(3,"C")]] assert exact_top(shards, 2) == [(1,"A"),(2,"B")] assert exact_top(shards, 0) == [] skewed = [[(i,str(i)) for i in range(20)],[(100,"Z")]] assert exact_top(skewed, 5) == nsmallest(5, sum(skewed, [])) print("PASS exact merge, skewed shards and k=0")ANN损失要记在哪一层
HNSW、CAGRA等近似搜索可能在局部搜索阶段就没走到某个真正近邻。超额召回与增大探索深度可以改变这个概率,但不是数学上的无损保证。cuVS CAGRA文档也把它定义为近似图检索;精确结果需要精确基线。
重打分能纠正“已召回候选”的近似距离,无法补出从未进入候选集的点。不能把“对候选精确排序”写成“全库精确召回”。
缺片是另一类问题。一个分片不可用,从健康分片多拿几倍候选,不会把故障片上的文档变出来。此时应返回覆盖范围或missing_shards,由业务决定是否接受不完整结果。
该怎样验证一个分布式实现
先用Faiss所述的统一度量建立全库精确金标,再分别统计局部ANN漏召回、量化重排变化、超时缺片。网络字节、延迟与Recall应在相同数据和查询分布下比较。
本文Python示例本地通过,仅验证精确合并命题的几个有限例子。没有运行HNSW集群,没有“召回损失5%—15%”或“1ms合并百万候选”的成绩。要给“无损”盖章,先看前提,不看协调器名字里有没有Merge。
本地示例使用Python 3.9.6;保存完整Python块为demo.py后可用python3 demo.py复现。示例只验证文中限定的逻辑,不代表已接入数据库或模型。