事情本身不复杂,线索都在日志里。把客服意图分类的 system prompt 从 v3 改成 v4,只加了两条约束,离线抽 200 条样本看着还行,上线两小时通过率从 91% 掉到 71%,回滚代码后立刻恢复。

第一反应是「评测集和线上分布不同,离线没覆盖长尾意图」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。新增约束与原有示例冲突,模型在两类之间摇摆。少数情况下是v4 把输出格式从 json 改成了纯文本,解析层直接判失败。

不容易想到的是,prompt 里塞了日期,缓存前缀每天变化导致行为不一致。

第一件事是把两版 prompt 的输出做逐条 diff

python -c "import difflib;print('\n'.join(list(difflib.unified_diff(open('v3.txt').read().splitlines(),open('v4.txt').read().splitlines()))[:20]))"

接着确认解析层期望的格式

python -c "import json;print(json.loads('{\"intent\":\"refund\"}'))"

随后按意图分层统计两版通过率

python -c "print({'refund':(0.93,0.62),'logistics':(0.9,0.88)})"

灰度 5% 流量观察后再全量

curl -X POST https://api.example.com/admin/rollout -d '{"prompt":"v4","percent":5}'

恢复的判定其实很直接。灰度组通过率与旧版差距在 1 个百分点内,解析失败率为零,分层统计里没有单独一类明显下跌。

容易忽略的是,prompt 改版要按意图分层看,只看总体通过率会把某一类的崩塌平均掉。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189