提示词A/B测试:别再拍脑袋改Prompt,用数据说话
提示词优化不能靠感觉。本文讲如何设计提示词A/B测试:定义指标、构造测试集、控制变量、显著性判断,附完整实验流程。
“我觉得新版本提示词更好用。“——这是 AI 团队里最常见也最不可靠的一句话。提示词的改动,凭感觉判断几乎必然出错:你看到的几个例子上变好了,可能在整体上反而变差了。 要让提示词优化摆脱玄学,唯一的办法是——做 A/B 测试。
一、先定义”好”是什么
在测试之前,必须把目标量化。不同任务的指标不同:
| 任务类型 | 核心指标 |
|---|---|
| 分类/抽取 | 准确率、F1、格式合规率 |
| 问答 | 事实正确率、引用准确率、拒答率 |
| 生成 | 人工/模型打分、长度合规、不重复率 |
| Agent | 任务完成率、步数、工具调用正确率 |
关键原则:一次只盯一到两个主指标,否则容易顾此失彼。
二、构造有代表性的测试集
这是整件事里最费功夫、也最重要的部分。
- 规模:至少 50~100 条,太小噪声会掩盖真实差异。
- 分布:覆盖高频问题(占 70%)、边界问题、长尾问题、以及”应当拒答”的问题。
- 标准答案:能自动判定的用规则或模型判;不能的,人工标注或双人交叉评审。
- 冻结版本:测试集一经确定就固定下来,所有实验都跑同一套,否则无法比较。
三、控制变量
提示词实验最常见的错误是同时改了好几处,然后不知道到底是哪处起了作用。
- 若目标是”看整体效果”,可以整体替换,但要做多轮。
- 若目标是”找到哪句话有用”,则每轮只改一个变量:只加一句约束、只换一个例子、只调一次语气。
推荐”消融实验”思路:在基线 A 的基础上,逐个叠加改进项,观察每一步的增量。
四、判断显著差异
不要看到 52% 对 48% 就下结论。样本量小时,这点差异完全可能是随机波动。
from scipy.stats import chi2_contingency
# A: 100次中52次正确, B: 100次中58次正确
table = [[52, 48], [58, 42]]
chi2, p, _, _ = chi2_contingency(table)
print("p值:", round(p, 3)) # p < 0.05 才认为差异显著
若 p 大于等于 0.05,说明差异不显著,需要更多样本才能判断。
五、一个可复用的实验流程
def ab_test(prompt_a, prompt_b, testset, model):
res = {"A": 0, "B": 0}
for q, gold in testset:
for name, prompt in [("A", prompt_a), ("B", prompt_b)]:
out = call_model(model, prompt, q)
if is_correct(out, gold):
res[name] += 1
return res, {k: v / len(testset) for k, v in res.items()}
跑完之后再抽样人工复核——尤其是在两个版本接近时,人工能发现自动指标看不到的质量差异(比如措辞、语气、边界处理)。
六、四个执行纪律
1. 先立基线。 没有基线,任何”更好”都是空话。
2. 记录一切。 每次实验的提示词版本、模型版本、温度、测试集版本、结果,全部归档。否则你会在同一个坑里反复来回。
3. 警惕过拟合测试集。 反复在同一套题上调优,会”刷分”。定期用新数据验证。
4. 上线后持续监控。 测试环境的小胜,未必等于线上大胜。真实流量是最终裁判。
结语
提示词工程正在从”手艺”变成”工程”。A/B 测试是其中最基本的方法论:定义指标、构造测试集、控制变量、判断显著性。 当你开始用数据而不是感觉来决策,提示词优化的迭代速度和可信度都会上一个大台阶。