LLM-as-Judge 的 6 种偏置与防御
用 LLM 当判官评估另一个 LLM 的输出,是 prompt 工程的常用做法。但判官本身有 6 种偏置,不防御就会得到假数据。
一句话讲清楚
LLM-as-Judge 不可靠的根本原因,是判官模型的 6 种系统性偏置。识别 + 防御 > 换更强的判官模型。
6 种偏置速查表
| 偏置 | 表现 | 一句话防御 |
|---|---|---|
| 位置偏置 | 第一个答案总得分高 | 跑两次交换顺序 |
| 长度偏置 | 长答案总得分高 | 控制长度 / 加长度惩罚 |
| 自我偏置 | GPT-4 评 GPT-4 给高分 | 换不同模型当判官 |
| 风格偏置 | 流畅 > 准确 | 隐藏作者信息盲评 |
| 锚定偏置 | 第一个 token 影响后续 | 让判官先生成理由再打分 |
| 复杂性偏置 | 复杂答案看起来更专业 | 强制简洁答案加分 |
每种偏置详解 + 防御代码
1. 位置偏置
表现:把同一对答案交换位置,A/B 评分可能差 20%。
原因:模型对"第一个出现的答案"有注意力优势。
防御:
defposition_bias_defense(judge_llm,question,answer_a,answer_b):# 跑两次,交换顺序score_1=judge(judge_llm,question,answer_a,answer_b)score_2=judge(judge_llm,question,answer_b,answer_a)# 取平均,且两次胜者一致才算有效ifscore_1.winner==score_2.winner:returnscore_1.winnerreturn"TIE"# 两次不一致则平局成本:2x 推理。
2. 长度偏置
表现:长答案(即使废话多)总得分高。
数据:研究显示,长度偏置在 LLM-as-Judge 中可使评分偏差 15-30%。
防御:
deflength_bias_defense(judge_prompt):returnjudge_prompt+""" 【长度规则】 - 不要因为答案长就加分 - 信息密度比长度重要 - 如果答案简洁且完整,应给高分 """或在评分公式里加惩罚:
deflength_penalty_score(answer,base_score,ideal_length=200):length=len(answer)penalty=max(0,(length-ideal_length)/ideal_length*0.2)returnbase_score*(1-penalty)3. 自我偏置
表现:GPT-4 评 GPT-4 答案,平均比评 Claude 答案高 10-15%。
数据:GPT-4 vs Claude 的对比实验中,GPT-4 评 GPT-4 胜率 65%,但人类评审胜率只有 50%。
防御:
# 选判官的核心原则:判官 ≠ 生成# GPT-4 生成 → Claude 评# Claude 生成 → GPT-4 评# 或者多判官投票judges=["gpt-4","claude-opus","gemini-pro"]results=[judge(j,sample)forjinjudges]final_score=majority_vote(results)反直觉:用最强的模型当判官,反而会放大自我偏置。不如用 3 个中等模型投票。
4. 风格偏置
表现:模型偏好"看起来像专业人士写"的答案,但这个答案可能是错的。
防御:
defstyle_bias_defense(judge_prompt):returnjudge_prompt+""" 【风格规则】 - 不要被写作风格、修辞、文采影响 - 重点评估:事实准确性 > 逻辑严谨性 > 完整性 - 即使答案粗糙,只要事实正确也应给高分 """实战技巧:让两个答案去掉格式(去掉 bullet、加粗等)后再评分,屏蔽风格影响。
5. 锚定偏置
表现:判官看了第一个 token 后,后续评分被"锚定"。
数据:实验显示,判官先看到"这个答案是对的"再评分,比先看到"这个答案是错的"再评分,分数高 25%。
防御:
# ❌ 错的:先打分再写理由prompt_bad="给答案打分:{score}/10,然后解释"# ✅ 对的:先生成理由再打分prompt_good="""先分析这个答案的优点和缺点(3-5 条),然后基于分析给出分数。 {question} {answer} # 输出格式 优点:<1-3 条> 缺点:<1-3 条> 分数:<0-10> """机制:先评估内容再打分,避免"快速打分"被首印象锚定。
6. 复杂性偏置
表现:答案里包含复杂句式、专业术语、长推理,看起来更专业 → 得分高。
数据:包含 “however”、“furthermore”、“consequently” 等词的答案,平均得分比简单句高 12%。
防御:
defcomplexity_bias_defense(judge_prompt):returnjudge_prompt+""" 【反复杂性偏置规则】 - 用复杂词汇 ≠ 答案更好 - 简单清晰的答案应被鼓励 - 如果答案简洁且完整,应给予额外加分 """一份生产可用的判官 Prompt
JUDGE_PROMPT="""你是评估助手。你的任务是评估两个答案的质量。 【问题】 {question} 【答案 A】 {answer_a} 【答案 B】 {answer_b} 【评估维度】(按重要性排序) 1. 事实准确性(最重要) 2. 完整性 3. 简洁性 4. 风格 【严格规则】 - 不要被答案长度影响(反长度偏置) - 不要偏向第一个或第二个答案(反位置偏置) - 不要被写作风格、文采影响(反风格偏置) - 不要因为答案复杂就加分(反复杂性偏置) 【输出格式】 优点: - A: <1-3 条> - B: <1-3 条> 缺点: - A: <1-3 条> - B: <1-3 条> 分数:A=X/10, B=Y/10 胜者:A / B / TIE """关键点:把"反偏置规则"直接写进 prompt。
进阶:多判官投票 + 反偏置组合拳
classRobustJudge:def__init__(self):self.judges=["gpt-4","claude-opus","gemini-pro"]defjudge(self,question,answer_a,answer_b):votes=[]forjudge_modelinself.judges:# 1. 反位置偏置:交换顺序跑两次score_1=self.single_judge(judge_model,question,answer_a,answer_b)score_2=self.single_judge(judge_model,question,answer_b,answer_a)# 2. 取两次一致的结果ifscore_1.winner==score_2.winner:votes.append(score_1.winner)else:votes.append("TIE")# 3. 多判官投票returnmajority_vote(votes)什么时候 LLM-as-Judge 不够用?
直接换人工:
- 评估维度是主观体验(用户满意度、文案美感)
- 答案需要领域专家才能判断(医学、法律、金融)
- 评估用于合规审计(不能错)
判官 + 人工结合:
小规模 + 高价值 = 人工 大规模 + 低价值 = LLM-as-Judge 判官有歧义时 = 转人工一句话总结
LLM-as-Judge 的可靠性 = 反偏置设计 × 多判官投票 × 人工校准。
把反偏置规则写进 prompt,比换更强的判官模型有效 10 倍。
