提示词回归测试:改一个字,老 case 全量重跑
你的第一套 evals——以及一个"加了规则却白加"的真实教训
这是全课的分水岭。
在这一节之前,你改提示词的依据是"感觉这样更好";从这一节起,你有分数。而分数会告诉你一些让人不舒服的真相——比如这次实测里:我在提示词里认真加了 127 字的边界规则,分数一分没涨,成本涨了 43%。
如果没有评测集,我会以为自己变强了,然后把这个"改进"发上线。
写代码的人都懂:改完跑测试。没测试的重构叫"祈祷式开发"。
提示词是给模型的代码,凭什么不用测?评测集就是提示词的单元测试——改一个字,20 条老 case 全量重跑,分数说话。
场景:客服工单分类
任务很典型:把用户消息分到 5 类(退款/物流/商品咨询/投诉/其他)+ 判断紧急度。
评测集:20 条真实感消息 + 人工标注的标准答案,其中 5 条是故意放的边界样本:
| 边界样本 | 难在哪 |
|---|---|
| "发错货了,我要退!" | 物流问题导致的退款,主诉是退 |
| "?" | 极短无意义 |
| "东西不错就是发货慢了点,下次注意" | 有抱怨但不紧急 |
| "我要投诉快递员态度差,还要退款" | 双意图,该以谁为主 |
| "在吗" | 寒暄 |
评测集的质量决定评测的价值:全是简单样本的评测集,永远给你 100 分,毫无用处。边界样本才是分数的来源。
三版提示词,一次跑分
- v1 朴素(84 字):就说清任务和输出格式
- v2 加规则(273 字):加了 5 条带优先级的分类规则 + 紧急度判定标准
- v3 加边界(400 字):在 v2 基础上,针对上面那 5 类边界情况逐条写了处理规则
真实跑分:
版本 分类 紧急度 全对 提示词长度 总token
v1_朴素 14/20 17/20 12/20 84 1231
v2_加规则 18/20 18/20 16/20 273 3587
v3_加边界 18/20 18/20 16/20 400 5127
结论:v2_加规则 最优(全对 16/20),比 v1 提升 +20 个百分点
代价:提示词长了 189 字,总 token 多 2356
三个必须看懂的结论
① v1 → v2:加规则真的有用(+20 个百分点)。 看 v1 的错例就懂了:
✗ 「我买的鞋子小了,能换个大一码吗?」 应=退款 实=商品咨询
✗ 「买大了能否补差价换小的」 应=退款 实=商品咨询
✗ 「下单三天了还没发货,什么情况」 应=物流/不急 实=物流/紧急
模型不是笨,是不知道你们家的规矩:"换货算不算退款类"、"等三天算不算紧急"——这些是业务定义,不写清楚它只能猜。
② v2 → v3:精心加的 127 字边界规则,分数纹丝不动。 两版的错例一模一样(4 条完全相同)。也就是说:我针对边界写的规则,一条都没起作用,但每次调用都要多付这 127 字的钱。
这就是没有评测集时最容易发生的自我欺骗:我花了 20 分钟精心打磨规则,主观上确信"这版更严谨"。分数说:没有。
③ 剩下的 4 条错例,提示词可能治不了。 比如"你们家产品是正品吗?我怀疑是假货"——标注为紧急,模型判不紧急。这类标注本身可争议的样本,说明:要么你的标注标准要更明确(重新定义"紧急"),要么这就是当前方案的天花板(该上 AP3 的结构化约束或 AP5 的模型判分了)。
评测集怎么建(50 条起步法)
- 从真实数据里捞:上线前从竞品/论坛/客服记录里找;上线后直接用真实用户输入(AP5 讲回流);
- 必须含边界:一半正常样本、一半边界(混合意图、极短、反讽、超长、脏数据);
- 标注要写标准:不是凭感觉标,而是先写一页"什么算紧急"的定义,再按定义标——否则你的分数在测标注者的心情;
- 50 条起步:太少(10 条)分数抖动大,一条错就是 10 个百分点;太多(500 条)每次跑分太贵太慢。50-100 条是甜区,跑一次几毛钱、一分钟出结果。
🔧 动手做:给你的产品建第一套 evals(20 分钟)
- 跑本节代码
prompt_regression.py,看三版跑分(你的数字可能略有不同,模型有随机性)。 - 换成你的场景:把
CASES换成你毕业方向里的 20 条真实样本 + 标准答案;把PROMPTS换成你的提示词。 - 跑基线(你现在用的那版提示词),记下分数——这是你的锚点。
- 改一版试试:加一条你觉得能提分的规则,重跑。分数动了吗?动了多少?成本涨了多少?
- 把这个脚本存进你的项目(比如
evals/run.py),从今天起:改提示词 → 跑一遍 → 看分数 → 再决定要不要留。
✅ 做到这里你应该有:一套属于你的评测集 + 一个基线分数 + 至少一次"改动前后对比"的记录。
为什么:这一节是全课主线的落地。有了它,你后面每一章的改进都能被验证——AP3 的 schema 约束提了多少分?AP4 的 RAG 让幻觉降了多少?没有分数,一切改进都是玄学。而且它会像本节这样,定期打你的脸——这正是它的价值。
反复用同一套 20 条调提示词,调到 20/20 时,你可能只是把这 20 条背下来了。两个防御:① 留一份"从不用来调优"的保留集(比如另外 20 条,只在准备上线时跑一次);② 定期换血,把线上真实的失败样本补进评测集(AP5 的回流机制)。这和机器学习里的训练集/测试集是同一个道理——在自己出的题上考满分,不算本事。
我的 AI 功能是:【描述任务和输出格式】。请帮我设计一套 30 条的评测集:1) 15 条典型样本 + 15 条边界样本(混合意图/极短/反讽/超长/脏数据各若干);2) 每条给出输入和标准答案;3) 先写一页「标注标准」说明什么情况算什么类别,避免我自己标得前后不一。
回归测试三句话:评测集是提示词的单元测试、边界样本才产生分数、改动必须看"提升多少 vs 代价多少";还有一个反直觉的实测教训:加了 127 字规则,分数纹丝不动。
下一节把这套方法用到底:A/B 跑分——同一套评测集、两版提示词,不看感觉只看数据,顺便讲清"分差多少才算真的赢"。
🔎 来源与核验· 2 条,点开核对
