本节摘要:第 5.3 节给了门控基线(confidence < 0.5 转人工、高风险放行要 p > 0.9),本节给出这些数字的推导方法:阈值是混淆代价函数的解,不是拍出来的。三步:列出两种错误(错放/错拦)各自的代价;在回归集上扫阈值,画"阈值 × 自动化比例 × 期望损失"曲线;选业务能承受的工作点。代价不对称的场景(护栏:错放不可逆、错拦只是打扰)得到不对称阈值——拦 0.3、放 0.9、中间人工的三段式。本节末尾附 9.4 持续监控:周度校准体检的节奏与漂移处置。
阅读完本节,你应当能够:
以三个场景为例(数值按你的业务填):
| 场景 | 错放(该拦没拦 / 该转人工没转) | 错拦(误打扰 / 多走人工) | 阈值倾向 |
|---|---|---|---|
| 命令护栏 | 删库/泄密,不可逆(≈ $50,000) | 一次确认弹窗(≈ $0.5) | 极不对称:低阈拦 + 高阈放 | |
| 垃圾过滤 | 用户看到垃圾(≈ $0.1) | 正常邮件进垃圾箱(≈ $5) | 拦截阈值偏高 | |
| 工单路由 | 转错组再转一次(≈ $0.3) | 同左 | 对称:0.5~0.6 即可自动 |
期望损失(一个阈值 t 下的总代价):
L(t) = 错放数(t) × C_错放 + 错拦数(t) × C_错拦
错放数、错拦数从回归集数出来——它们是 t 的函数。
def sweep_threshold(pairs, c_fp, c_fn, steps=21): """pairs: 回归集 (预测概率, 真实标签);c_fp: 错放代价;c_fn: 错拦代价。""" best = None for i in range(steps): t = 0.5 + i * (0.5 / (steps - 1)) # 只扫 0.5~1.0(<0.5 侧对称处理) fp = sum(1 for p, y in pairs if p > t and y == 0) # 错放 fn = sum(1 for p, y in pairs if p <= t and y == 1) # 错拦 auto = sum(1 for p, _ in pairs if p > t) / len(pairs) loss = fp * c_fp + fn * c_fn if best is None or loss < best["loss"]: best = {"t": round(t, 2), "loss": loss, "auto_rate": auto} return best
在回归集上跑出来的三件事,构成给业务方的决策材料:
t=0.80 → 自动化率 62%,期望损失 $41/千次 t=0.90 → 自动化率 48%,期望损失 $23/千次 ← L 最小 t=0.95 → 自动化率 35%,期望损失 $29/千次
💡 工作点不一定取 L 最小:合规或品牌约束常要求"错放率绝对上限"(如 <0.1%)——先按硬约束筛可行区间,再在区间内取 L 最小。曲线给选项,约束定取舍。
三段式的由来:L(t) 在代价极不对称时(护栏),最小值常落在"高自动化"区,但右尾(错放)的方差极大——一次删库就摧毁全部节省。所以护栏不取单点 t,而是三段(第 7.3 节):低阈拦(吃掉明显危险)、高阈自动放(吃掉明显安全)、中间带人工(把右尾方差卖回给确定性)。中间带的宽度就是你能承受的人工确认量。
上线不是终点——校准随输入分布漂移:用户构成变化、攻击者开始针对、内容风格演进。周度节奏:
仪表盘核心三线:ECE(周)· 自动化率(日)· 抽检错误率(周) 告警阈值:ECE > 0.15 或单桶 |Δ命中率| > 0.2 或错误率 > 回归集基线 1.5 倍
评测体系完成:回归集管判断、ECE 管概率、代价函数管阈值。最后一章面对那些更根本的问题——Jev 到底不擅长什么、"零幻觉"的批评该怎么看、什么时候根本不该选它。