报错是这么冒出来的。用大模型做 A/B 评测,同两条回答交换顺序再评一次,胜者竟然跟着位置变,第一位置的胜率比第二高 17 个百分点,评测结论因此不可信。

中间走过弯路,把「单次评分没有做顺序交换」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。裁判模型存在明显的位置偏好。少数情况下是评分模板里先出现的回答更容易被引用。

另外,两条回答长度差异大,长的更容易被判好。

动手时先对同一组样本做双向交换评测

python judge.py --pairs pairs.jsonl --swap --out swapped.jsonl

再往下统计位置带来的胜率差

python -c "import json;r=[json.loads(l) for l in open('swapped.jsonl')];print(sum(1 for x in r if x['winner']=='first')/len(r))"

然后在模板里要求先各自打分再比较

python -c "print('先分别给出 1-5 分和理由,再判断哪条更好')"

只在两次结论一致时计入胜场

python -c "print('if a_wins_in_both: win += 1')"

恢复的判定其实很直接。交换顺序后的胜率差从 17 个百分点降到 3 个百分点以内,结论在两次评测中保持一致。

补一句。裁判偏差不靠调提示词就能消掉,交换位置跑两遍取交集是最省事的做法。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189