这个坑值得记一笔。两版提示词各跑 50 条样本,A 版通过率 78%、B 版 84%,团队据此全量切到 B,上线后一周通过率反而比 A 低 3 个点。
刚开始盯着「只看通过率没看失败样本的类型分布」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。50 条样本的置信区间宽度超过 10 个百分点;两版用的样本集不同,难度不可比;实验期间模型版本或解码参数发生变化。
算当前样本量下的置信区间
python -c "import math;p=0.84;n=50;print(p-1.96*math.sqrt(p*(1-p)/n), p+1.96*math.sqrt(p*(1-p)/n))"
然后按最小可检测差异估算所需样本
python -c "import math;d=0.05;p=0.8;print(math.ceil(16*p*(1-p)/d**2))"
两版共用同一批样本并固定随机种子
python ab_test.py --prompts prompts/a.txt prompts/b.txt --set fixed_eval.jsonl --seed 42
剩下的就是按失败类型分层比较差异
python fail_breakdown.py --a run_a.jsonl --b run_b.jsonl --group-by reason
改完先别撤,确认这几项。样本扩到 800 条后两版通过率差异缩小到 1.2 个点且不显著,团队没有全量切换,改为继续观察特定失败类型。
小样本上的百分比差异大多是噪声,做提示词实验先算置信区间再谈结论,样本要同源同难度。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
