阈值为什么要校准
相似度阈值决定「检索结果不够相关时是否拒答」。校准办法是收集带标注的两类查询——有答案与无答案,统计各自最高分的分布,选出让误拒与误收之和较小的切点。阈值不是一次设定就完事:换模型、加重排、用量化索引都会改变分数分布,需要重新校准,并按周期监控分布漂移。
基本信息
| 两类样本 | 有答案查询与无答案查询,各需一定数量 |
|---|---|
| 判据 | 误拒率(有答案被拒)与误收率(无答案被接) |
| 切点选择 | 两率之和最小处,再按业务偏好倾斜 |
| 复校时机 | 换模型、加重排、量化索引之后 |
典型使用场景
- 上线兜底:没有相关资料时给出「暂未收录」而不是硬答
- 客服场景:宁可拒答也不能给出错误答案时,把切点调向保守一侧
- 换模型后复校:向量空间变化导致分数整体平移,旧阈值失效
- 加重排后复校:分数来自不同模型,分布完全不同
- 定期巡检:按月对比分数分布,发现漂移及时调整
分布与切点
分布与切点
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))
样本量与可靠性
| 样本量 | 结果稳定性 | 建议 |
|---|---|---|
| 十几条 | 波动大,切点不可靠 | 只做方向性探索 |
| 上百条 | 切点基本稳定 | 可作为上线初值 |
| 上千条 | 分布估计更准 | 适合精细调优 |
| 缺无答案样本 | 无法计算误收率 | 必须补造无答案查询 |
重排上线后阈值要重新校准:分数来源变了,旧阈值不再适用,直接把重排分数套旧阈值会造成大量误拒或误收。
阈值还要与业务代价对齐:误拒的代价是用户觉得答不上来,误收的代价是给出错误答案,两者权重不同时切点应偏向代价更高的一侧。
阈值要记录在配置里并标注校准日期:线上行为差异追溯到半年前的阈值设置时,没有日期与样本口径就无法判断当时是否合理。