记录一下那天晚上的排查过程。A/B 两个模型用 LLM-as-judge 对比,A 放前面时胜率 62%,把顺序换一下再跑,A 的胜率只剩 38%,同一批样本两次结论完全相反。

刚开始盯着「temperature 没设 0,两次采样本身有波动」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。judge 模型对首个回答有偏好,倾向给前面的更高分。少数情况下是提示词要求成对比较,没有给评分细则。

少数情况下是judge 与被测模型同源,风格偏好被放大。

动手时先把两个顺序各跑一遍对比胜率

python -c "print(round((0.62+0.38)/2,3))"

接着改成逐条绝对评分再比较总分

python -c "print('score each answer 1-5 independently')"

然后把 judge 的 temperature 固定为 0

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d @judge_t0.json

等前面都确认过,再换一个不同家族的模型做 judge 复核

python -c "print('judge swap: claude-3-5-sonnet')"

改完先别撤,确认这几项。换序后两次胜率都在 50% 上下,绝对评分下两模型均分差 0.12 分,结论从「A 明显更好」改成「基本持平」。

成对比较一定会引入位置偏差,要么两个顺序都跑取平均,要么直接改成绝对评分,只跑一次就下结论很容易反向。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189