相似度、分数与阈值
本节目标
本节解决三个常见误判:“分数高就是相关”“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 与业务相关性
三层问题必须分别回答:
- Exact kNN:按定义计算所有已授权候选的真实近邻;
- ANN recall:近似索引是否找回 exact top-k;
- 业务 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—延迟/成本曲线,在收益趋缓处选择预算。
阈值要对应一个决策
阈值不是装饰参数,而是决定“返回、扩搜、转人工或无结果”。选择步骤:
- 定义错误成本:弱相关结果和拒答哪个更贵;
- 在独立 validation query/qrels 上收集分数与标签;
- 按语言、意图、长度、租户和时间分层;
- 比较 coverage、precision、recall 与下游任务成功率;
- 冻结模型/索引/阈值版本,在 test 集只评一次;
- 上线监控分布漂移和 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、相关原文数和最终任务,而不是只看“结果看起来不重复”。
不可比分数如何融合
三种安全起点:
- 分别排序后 RRF:只依赖 rank,便于建立强基线;
- 在 validation 集校准/归一化后线性融合:保存方法与参数;
- 训练 learning-to-rank:需要足量、无泄漏且可代表线上分布的数据。
逐 query min-max 会受极端值和候选窗口影响;固定 z-score 又会随分布漂移。任何分数处理都要与 BM25-only、dense-only、RRF 比较,不能因为数学更复杂就默认更优。
常见错误与排查
- 距离排序方向反了:用两条手算向量做单元测试;
- 零向量产生 NaN:输入门禁拒绝零/非有限向量;
- 更换模型沿用旧阈值:按新空间重新校准;
- 只测平均分数:改测 qrels 指标与分层错误;
- top-k 后才做 ACL:硬过滤移到评分前;
- 去重导致多跳证据丢失:报告原文与证据覆盖;
- ANN 质量当业务质量:同时保留 exact ground truth 与人工 qrels。
练习
- 手算 与 的 dot、cosine 和 L2,并写出三者排序方向;
- 为 50 条 query 记录 dense 分数、二元 relevance 和语言,选择“返回/拒答”阈值;
- 比较 top-k 为 5、10、20、50 时的 Recall、p95 和 reranker 成本;
- 给同分文档加入稳定 tie-break,证明重复运行结果一致;
- 分别报告 ANN Recall@10 和业务 nDCG@10,解释为何它们可能反向变化。
掌握检查
- 每个 score 的 metric、方向、归一化和空间 revision 明确。
- 相似度不被解释为相关概率。
- Exact、ANN recall 与业务 relevance 分别验证。
- 阈值对应明确行动,并用独立数据校准。
- 各阶段候选预算名称与成本清楚。
- 去重、多样化和 tie-break 有回归测试。
下一步:稀疏、稠密与混合检索。
参考资料
- pgvector: Querying
- Qdrant: Search
- Muennighoff et al., MTEB
来源获取日期:2026-07-22。返回 语义搜索目录。