相似度、分数与阈值

本节目标

本节解决三个常见误判:“分数高就是相关”“0.8 是通用阈值”“top-k 越大越好”。学完后,你应能确认分数方向和空间契约,用 qrels 选择候选预算/阈值,并把 exact、ANN、业务相关性分开评测。

三种常见向量量

对向量 x 与 y:

  • dot product:,通常越大排序越前,同时受方向和模长影响;
  • cosine similarity:,比较方向,非零向量上越大越相似;
  • Euclidean/L2 distance:,距离越小越近。

若 x、y 都是单位向量,则 dot 等于 cosine,且平方 L2 与 cosine 有单调关系。但数据库可能返回 similarity、distance、负距离或经过变换的 relevance score;字段名、操作符和排序方向必须按锁定产品版本核验。

项目脚本内部把三种量统一为“越大越优”:Euclidean 使用负距离。真实系统不一定这样设计。

分数不是相关概率

Cosine 0.82 只描述某模型空间中的几何关系,不表示“82% 相关”。其含义会随以下因素变化:

  • 模型、revision、query/document 角色;
  • 语料领域、语言和文本长度;
  • 归一化、量化和 metric;
  • exact/ANN 与候选参数;
  • 过滤后的候选分布;
  • query 类型和 hard-negative 密度。

因此不能跨模型比较“平均 cosine 更高”,也不能把公开教程中的 0.7/0.8 阈值当默认。模型迁移时先比较排名与业务指标,再分析各自分数分布。

Exact、ANN 与业务相关性

三层问题必须分别回答:

  1. Exact kNN:按定义计算所有已授权候选的真实近邻;
  2. ANN recall:近似索引是否找回 exact top-k;
  3. 业务 relevance:返回文档是否被 qrels 判断为解决信息需求。

ANN Recall@k 达到 1 只说明近似索引没有漏掉 exact 邻居;若 Embedding 把错误主题排在前面,业务 nDCG 仍会很差。反之,ANN 与 exact top-k 略有差异也不必然伤害业务指标。

Top-k 是候选预算

第一阶段 top-k 决定后续组件“有机会看到什么”。增加 k 通常提高覆盖机会,也会增加:

  • 数据库、网络和序列化成本;
  • Reranker/LLM 的延迟和费用;
  • 近重复文档与噪声;
  • 权限、过时内容和提示注入的暴露面。

分别定义每路召回 window、融合 rank window、融合后候选数、reranker 输入数和最终证据数。不要都叫 top-k。用本地 query 集画 Recall@k—延迟/成本曲线,在收益趋缓处选择预算。

阈值要对应一个决策

阈值不是装饰参数,而是决定“返回、扩搜、转人工或无结果”。选择步骤:

  1. 定义错误成本:弱相关结果和拒答哪个更贵;
  2. 在独立 validation query/qrels 上收集分数与标签;
  3. 按语言、意图、长度、租户和时间分层;
  4. 比较 coverage、precision、recall 与下游任务成功率;
  5. 冻结模型/索引/阈值版本,在 test 集只评一次;
  6. 上线监控分布漂移和 no-result rate。

阈值只能用于与其校准环境兼容的通道。BM25、dense、reranker 原始分数不能共用一个门槛。

排名稳定与平局

相同分数必须有稳定次级键,例如 document_id;否则分页、缓存和回归 diff 会抖动。浮点值不要依赖完全相等做业务判断,但确定性 toy fixture 可以用稳定 ID 演示 tie break。

RRF 使用 rank,因此通道内平局如何排序会传递到融合结果。应记录 score、rank、tie-break 规则、索引 revision 和过滤条件。

去重与多样性

同一原文相邻 chunk 可能占满候选。可选策略包括:

  • 每个 canonical document 限制若干 chunk;
  • 精确 hash/近重复聚类;
  • 先保留最高分,再按来源或章节扩展;
  • 用 MMR 或其他多样化规则平衡相关性与重复。

这些规则不保证永远更好:多跳问题可能确实需要同一文档多个段落。评测 evidence coverage、相关原文数和最终任务,而不是只看“结果看起来不重复”。

不可比分数如何融合

三种安全起点:

  1. 分别排序后 RRF:只依赖 rank,便于建立强基线;
  2. 在 validation 集校准/归一化后线性融合:保存方法与参数;
  3. 训练 learning-to-rank:需要足量、无泄漏且可代表线上分布的数据。

逐 query min-max 会受极端值和候选窗口影响;固定 z-score 又会随分布漂移。任何分数处理都要与 BM25-only、dense-only、RRF 比较,不能因为数学更复杂就默认更优。

常见错误与排查

  • 距离排序方向反了:用两条手算向量做单元测试;
  • 零向量产生 NaN:输入门禁拒绝零/非有限向量;
  • 更换模型沿用旧阈值:按新空间重新校准;
  • 只测平均分数:改测 qrels 指标与分层错误;
  • top-k 后才做 ACL:硬过滤移到评分前;
  • 去重导致多跳证据丢失:报告原文与证据覆盖;
  • ANN 质量当业务质量:同时保留 exact ground truth 与人工 qrels。

练习

  1. 手算 与 的 dot、cosine 和 L2,并写出三者排序方向;
  2. 为 50 条 query 记录 dense 分数、二元 relevance 和语言,选择“返回/拒答”阈值;
  3. 比较 top-k 为 5、10、20、50 时的 Recall、p95 和 reranker 成本;
  4. 给同分文档加入稳定 tie-break,证明重复运行结果一致;
  5. 分别报告 ANN Recall@10 和业务 nDCG@10,解释为何它们可能反向变化。

掌握检查

  • 每个 score 的 metric、方向、归一化和空间 revision 明确。
  • 相似度不被解释为相关概率。
  • Exact、ANN recall 与业务 relevance 分别验证。
  • 阈值对应明确行动,并用独立数据校准。
  • 各阶段候选预算名称与成本清楚。
  • 去重、多样化和 tie-break 有回归测试。

下一步:稀疏、稠密与混合检索。

参考资料

来源获取日期:2026-07-22。返回 语义搜索目录。