LLM-as-a-Judge
大模型当裁判用另一个 LLM 自动打分——便宜但有偏差。
详解
LLM-as-a-Judge 是用一个强大语言模型自动评价另一个模型的输出质量,专门解决「开放式回答没有唯一标准答案」的评估难题。传统精确匹配只能判断关键词是否存在,无法评价清晰度、完整性和推理逻辑;人工评测可以做到,但成本高且难规模化。LLM-as-Judge 让裁判模型读取问题和候选输出,按评分细则给分,速度快、成本低,通常比关键词匹配更接近人工判断,但不能当成绝对真相。必须了解的三个主要偏差:位置偏差(倾向给排第一的候选更高分)、冗长偏差(更长回答往往得高分)、自我偏好偏差(裁判模型可能系统性偏爱同家族模型的输出)。缓解策略:在评分 Prompt 中给出详细细则、随机打乱候选顺序、裁判模型与被评模型隔离。
一个类比
像找一个博学的朋友帮你批改作文:他不是标准答案,但他能判断逻辑是否清晰、论据是否充分、有没有说废话。这比只看「有没有写到关键词」准确多了。但要注意:如果这个朋友就是作文的作者,他批自己的文章就会偏心;如果他习惯给长文章高分,短小精悍的反而吃亏。
举个例子
import anthropic
client = anthropic.Anthropic()
def llm_judge(question: str, answer: str) -> dict:
"""用 Claude 评分另一个回答,返回 1-5 分和理由"""
judge_prompt = f"""你是一个严格的评审员。请对下面的问答打分。
问题:{question}
回答:{answer}
评分标准(每项 1 分,共 5 分):
1. 回答了问题的核心
2. 信息准确,没有明显错误
3. 解释清晰,易于理解
4. 给出了具体示例或代码
5. 没有不必要的冗余内容
请先给出总分(1-5 的整数),再用一句话说明扣分原因(若满分则说明理由)。
格式:分数: X\n理由: ..."""
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=128,
messages=[{"role": "user", "content": judge_prompt}]
)
text = resp.content[0].text.strip()
# 简单解析
lines = text.split("\n")
score_line = next((l for l in lines if l.startswith("分数")), "分数: 0")
reason_line = next((l for l in lines if l.startswith("理由")), "理由: 无")
return {"score": int(score_line.split(":")[1].strip()), "reason": reason_line.split(":")[1].strip()}
# 测试
result = llm_judge(
question="什么是上下文窗口?",
answer="上下文窗口是模型一次能处理的最大 token 数量。"
)
print(f"得分:{result['score']}/5")
print(f"理由:{result['reason']}")PYTHON 示例
相关概念
- → Evaluation / Eval· 评估
- → Self-Critique / Self-Refine· 自我批评与修正