现场是这样的。自建 BERT 审核模型输出 sigmoid 分数,一直按 0.5 截断,正常评论误杀 12%,模型在验证集上 AUC 是 0.93,看起来并不是模型能力问题。

中间走过弯路,把「输入长度超出训练分布 分数漂移」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。训练集正负比例失衡 分数分布整体偏移;阈值沿用默认值 未按业务校准;缺线上回流样本 阈值无法迭代。

第一件事是在验证集上画 PR 曲线选阈值

python -c "from sklearn.metrics import precision_recall_curve;print('pr curve ok')"

然后按目标精确率反推阈值

python pick_th.py --target-precision 0.97 --out th.json

超长输入截断到训练长度再打分

python infer.py --max-len 256 --batch 64

每周回流人工复核样本更新阈值

python feedback.py --queue review --window 7d

那几天正好在做别的变更,先把时间线对齐才敢动手。

怎么算真的好了,看的是同一批现象。误杀率降到 3% 以内,召回保持在 95%,线上投诉量同步下降。

容易忽略的是,阈值是业务参数不是模型参数,换业务就要重新标一次。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189