本文介绍 SonnetDB 向量召回率评估的准备方法,重点是建立真实精确基线,避免把相同查询调用或示意曲线当成基准结果。
先固定同一候选集合
对每个查询,固定数据快照、向量维度、度量、k、TAG 和时间条件,以及删除、替换与权限范围。精确基线应遍历同一可见候选集合,计算距离并按统一规则取 top-k;ANN 结果必须使用相同候选身份进行比对。
对时序数据,身份可能需要包含 series、时间和字段,不能只用一个 block 内的局部位置混合不同 block。距离并列时应先规定等距结果的处理办法,再计算交集,避免把等价结果误计为漏召回。
Recall@k 的分母需要说明
当每个查询确实存在至少 k 个有效候选时,可用 ANN top-k 与精确 top-k 的交集数量除以 k。若有效候选少于 k,建议按实际精确结果数量计算并明确说明,或把这种查询单独报告;精确结果为空时不应静默除零或写成满分。
汇总时保留逐查询数据,并说明采用查询均值还是加权汇总。返回了 k 条不意味着与精确 top-k 一致,召回率也不等于嵌入模型的业务相关性。
相同调用不能同时证明精确与 ANN
当前 measurement KNN 会根据索引度量、相关删除状态以及索引可用性选择执行路径。索引候选不足时存在有条件的精确补扫。因此,相同的 index.Search 或 knn 查询调用不能仅靠两行注释分别标记为"精确基线"和"ANN"。
评估工具应使用已确认的独立精确实现或可验证的精确执行路径,并记录实际 ANN 是否命中、是否发生回退。小数据集或候选限制覆盖全部数据时,结果可能看起来完全一致;这不证明一般数据规模下的 ANN 召回率。
构建与查询参数分别记录
当前公共 VectorIndexHnswOptions 默认 M=16、EfConstruction=200、EfSearch=50,可指定 Seed。这是该公共入口的默认值,不代表所有 SQL、文档索引与段索引入口都采用相同设置。构建时的候选参数和查询时的候选参数负责不同阶段,报告应记录实际入口、最终生效值和随机种子。
调参应固定其他条件,分别报告构建时间、索引大小、查询延迟分布及 Recall@k;保留冷/热缓存、并发量、硬件、运行版本和查询集合。是否改善以及改善多少由实测决定,不从参数大小推导固定增益,也不把一次随机向量测试作为生产验收。
本文删除原稿中未经证据支持的 50 万向量延迟表、固定召回率、统一 ef 默认值和不完整 SQL。封面是评估流程概念图,原参数曲线已替换,不表示实际运行结果。本文依据 2026-10-20 当前源码审阅;本轮未运行数据库、真实模型或性能基准。