首页/AI/RAG 与向量库速查/阈值校准实践

阈值校准实践

阈值校准按数据说话:收集带标注的「有答案/无答案」查询,统计其最高分分布,选使误拒与误收之和较小的切点;上线后按周监控分布漂移。

RAG 与向量库速查AI更新于 2026-10-13

阈值为什么要校准

相似度阈值决定「检索结果不够相关时是否拒答」。校准办法是收集带标注的两类查询——有答案与无答案,统计各自最高分的分布,选出让误拒与误收之和较小的切点。阈值不是一次设定就完事:换模型、加重排、用量化索引都会改变分数分布,需要重新校准,并按周期监控分布漂移。

基本信息

两类样本有答案查询与无答案查询,各需一定数量
判据误拒率(有答案被拒)与误收率(无答案被接)
切点选择两率之和最小处,再按业务偏好倾斜
复校时机换模型、加重排、量化索引之后

典型使用场景

  • 上线兜底:没有相关资料时给出「暂未收录」而不是硬答
  • 客服场景:宁可拒答也不能给出错误答案时,把切点调向保守一侧
  • 换模型后复校:向量空间变化导致分数整体平移,旧阈值失效
  • 加重排后复校:分数来自不同模型,分布完全不同
  • 定期巡检:按月对比分数分布,发现漂移及时调整

分布与切点

分布与切点
import numpy as np

pos = np.array([top_score(q) for q in answerable])      # 有答案查询
neg = np.array([top_score(q) for q in unanswerable])    # 无答案查询
for t in np.linspace(0, 1, 21):                          # 扫描候选切点
    fnr = (pos < t).mean()     # 误拒:有答案却被拒
    fpr = (neg >= t).mean()    # 误收:无答案却被接收
    print(round(t, 2), round(fnr, 3), round(fpr, 3))

样本量与可靠性

样本量结果稳定性建议
十几条波动大,切点不可靠只做方向性探索
上百条切点基本稳定可作为上线初值
上千条分布估计更准适合精细调优
缺无答案样本无法计算误收率必须补造无答案查询
重排上线后阈值要重新校准:分数来源变了,旧阈值不再适用,直接把重排分数套旧阈值会造成大量误拒或误收。
阈值还要与业务代价对齐:误拒的代价是用户觉得答不上来,误收的代价是给出错误答案,两者权重不同时切点应偏向代价更高的一侧。
阈值要记录在配置里并标注校准日期:线上行为差异追溯到半年前的阈值设置时,没有日期与样本口径就无法判断当时是否合理。

易错点

  • 用少量样本(十几条)定阈值,上线后误判率波动大
  • 校准一次后不再复核,数据分布变化后失效
  • 没有无答案样本,误收率无法度量,拒答形同虚设
  • 重排上线沿用旧阈值,误拒率突然升高却找不到原因

数据来源与参考

  • scikit-learn 官方文档(ROC 与阈值选择)
  • RAGAS 官方文档(无答案集评测)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌