背景问题:为什么传统评测不够用了
大模型应用上线后,最难处理的问题不是「能不能回答」,而是「回答是否符合业务期望」。对 RAG 系统来说,答案可能语义正确但没有引用证据;对 Agent 来说,最终结果可能正确,但中间工具调用越权、漏参或绕过审批;对内容生成来说,文本看起来流畅,却可能不符合品牌语气、事实约束或合规边界。
传统评测方法主要有三类:
- 规则检查:例如字符串包含、JSON Schema、正则、字段枚举。
- 参考答案相似度:例如 BLEU、ROUGE、Embedding 相似度。
- 人工评审:由标注员或业务专家按标准打分。
它们都重要,但各有缺口。规则检查太硬,难以判断开放式答案;相似度指标容易把「语义正确但表达不同」的答案误判为差;人工评审可靠但成本高、周期长,无法覆盖每次模型升级、Prompt 修改、知识库更新和工具链变更。
LLM-as-a-Judge 的价值就在这里:用另一个大模型作为评审器,根据明确的 Rubric、输入、候选输出、参考答案或证据材料,给出结构化评分、错误类别和简短理由。它不是为了取代所有人工评审,而是把人工评审的标准工程化,让评测可以进入 CI、灰度发布和线上监控。
核心原理:Judge 不是「再问一次模型」
很多团队第一次使用 LLM-as-a-Judge,会直接写一个很宽泛的 Prompt:
请判断下面回答好不好,给出 1 到 5 分。
这种方式很容易产生看似合理、实际不可复现的分数。真正可落地的 Judge 需要拆成四层。
1. 明确评价对象
Judge 不能只看到候选答案。根据任务不同,它至少需要看到以下信息的一部分:
- 用户原始问题
- 系统指令或业务约束
- 候选答案
- 参考答案或黄金标签
- RAG 检索到的证据片段
- Agent 工具调用轨迹
- 允许调用的工具清单
- 输出格式约束
如果 Judge 没有看到证据,它就只能判断「像不像对」;如果 Judge 没有看到工具轨迹,它就无法判断 Agent 是否绕过流程;如果 Judge 没有看到业务约束,它就可能把「文笔好」误判为「业务正确」。
2. 把 Rubric 写成可执行标准
Rubric 不应只是「准确、完整、自然」这种抽象词,而要写成可观察条件。例如 RAG 回答可以拆成:
| 维度 | 说明 |
|---|---|
| Faithfulness | 答案中的关键事实是否能被给定证据支持 |
| Relevance | 答案是否直接回应用户问题 |
| Completeness | 是否覆盖问题中的所有必要条件 |
| Citation Quality | 引用是否指向真正支撑结论的片段 |
| Refusal Correctness | 当证据不足或请求越权时,是否正确拒答或转人工 |
Agent 任务可以拆成:
| 维度 | 说明 |
|---|---|
| Tool Selection | 是否选择了正确工具 |
| Argument Accuracy | 工具参数是否完整、类型正确、没有幻造 |
| Execution Order | 是否按必要顺序执行 |
| Permission Boundary | 是否遵守权限和审批边界 |
| Final Answer Consistency | 最终答案是否忠实反映工具结果 |
Rubric 越接近业务验收标准,Judge 分数越容易被工程团队信任。
3. 选择评分模式
常见评分模式有三种:
- 单点评分:适合判断一个输出是否达标,如 0/1、通过/失败,或 1-5 分。适合线上监控和回归测试,但对评分标尺要求高。
- 两两对比:适合比较两个模型、两个 Prompt 或两个检索策略。比绝对分数更稳定,适合版本选择,但容易出现位置偏差,因此要交换候选顺序再评一次。
- 分项评分:适合复杂任务,同时给出事实性、相关性、格式合规、工具调用准确性等。能帮助定位问题,但成本更高,也更需要结构化输出约束。
4. 让输出结构化
生产环境不要只接收自然语言解释。推荐让 Judge 输出固定 JSON,便于统计、告警、回放和人工复核。
{
"pass": true,
"score": 0.86,
"dimensions": {
"faithfulness": 0.9,
"relevance": 0.8,
"completeness": 0.85,
"format": 1.0
},
"error_type": "minor_omission",
"reason": "回答覆盖了主要事实,但遗漏了一个限制条件。",
"needs_human_review": false
}
结构化输出的重点不是「好看」,而是让评测结果能进入数据表、仪表盘、发布门禁和抽检流程。
工程落地:从离线评测到线上闭环
第一步:建立最小黄金集
不要一开始追求上万样本。先建立一个小而稳定的黄金集,覆盖核心场景:
- 高频真实问题
- 高价值业务路径
- 过去出过错的样本
- 安全、合规、拒答边界
- RAG 检索失败样本
- Agent 工具调用失败样本
- 多轮上下文依赖样本
每条样本至少包含输入、期望行为、必要证据、人工标签或验收标准。黄金集不是训练集,而是版本发布的「回归刹车」。
第二步:定义评测矩阵
一次评测不要只跑一个总分。建议建立矩阵:
| 维度 | 目标 | 常见实现 |
|---|---|---|
| 格式合规 | 输出能否被系统解析 | JSON Schema、正则、字段枚举 |
| 事实一致性 | 是否被证据支持 | LLM Judge + 引用片段 |
| 任务完成度 | 是否解决用户问题 | Rubric 单点评分 |
| 版本优劣 | 新版本是否优于旧版本 | Pairwise Judge |
| 工具调用 | 工具名和参数是否正确 | 规则检查 + LLM Judge |
| 安全合规 | 是否触发越权、泄露、错误承诺 | 规则库 + Judge + 人工抽检 |
这样做的好处是:当总分下降时,可以知道是检索问题、生成问题、工具问题,还是格式问题。
第三步:把 Judge 接入 CI 和灰度
推荐把评测分成三道门。
提交前门禁:开发修改 Prompt、检索参数、工具描述或模型版本后,先跑小型黄金集。只要关键样本失败,就不能合并。
发布前门禁:上线前跑完整评测集,包括旧版本对比、新版本绝对分、失败样本清单、人工抽检样本。
线上观察:对生产流量抽样,异步运行 Judge,记录分数、错误类别、业务线、模型版本、Prompt 版本、知识库版本和工具版本。
线上 Judge 不应阻塞主请求。它更适合作为异步质量监控、告警和样本挖掘工具。
第四步:加入人工复核
LLM Judge 本身也会犯错。生产环境中,建议建立三类人工复核队列:
- 低置信度样本:Judge 分数接近阈值,例如 0.75-0.85
- 高风险样本:涉及法律、医疗、金融、隐私、交易和权限
- 分歧样本:多个 Judge 或多次评分结果不一致
人工复核结果应回写到评测系统,用于修订 Rubric、补充 few-shot 示例、扩充黄金集,而不是只做一次性验收。
常见误区
误区一:只看平均分
平均分会掩盖关键失败。一个 RAG 系统平均分 0.9,但如果在「证据不足时拒答」的样本上失败,就可能造成严重业务风险。发布门禁应同时看平均分、分位数、关键场景通过率和 P0 样本失败数。
误区二:Judge 和被评模型使用同一模型
同模型或同系列模型可能存在偏好重叠。它可能更喜欢自己家族的表达方式,也可能对某些错误不敏感。更稳妥的做法是使用更强或不同系列的 Judge,并保留人工抽检。
误区三:Rubric 过宽
「回答是否高质量」不是一个好的生产指标。好的 Rubric 应能指导不同评审者给出接近结论。例如:
回答必须引用至少一个能直接支持核心结论的证据片段;如果证据中没有答案,必须明确说明无法从材料判断。
误区四:忽略位置偏差和风格偏差
两两对比时,候选答案的位置可能影响 Judge 判断;开放式评分时,表达更流畅、更自信、更长的答案也可能获得不合理优势。解决方法包括候选顺序交换、答案匿名化、长度约束、分项评分和风格无关的 Rubric。
误区五:把 Judge 分数直接当作训练目标
如果团队长期只优化某个固定 Judge 分数,系统可能学会迎合 Judge,而不是变得更符合用户和业务目标。这属于典型的指标被「游戏化」。Judge 应作为质量信号之一,而不是唯一目标函数。
上线检查清单
数据与样本
- 黄金集覆盖核心业务路径、失败路径和拒答路径
- 每条样本包含输入、期望行为、证据或参考答案
- 样本按业务场景、风险等级、语言、渠道打标签
- 新增线上失败样本能回流到评测集
Judge 设计
- Rubric 写成可观察条件
- 输出使用结构化 JSON
- 评分维度拆分,不只输出总分
- 两两对比任务做候选顺序交换
- 设置低置信度和高风险人工复核规则
发布门禁
- 新旧版本做同集对比
- P0 样本不得失败
- 关键维度有最低阈值
- 保留失败样本明细
- 记录模型、Prompt、知识库、工具版本
线上监控
- Judge 异步运行,不阻塞主链路
- 按版本、业务线、渠道统计分数
- 对分数突降、错误类型突增、拒答异常设置告警
- 对高风险流量设置人工抽检比例
- 定期校准 Judge 与人工评审的一致性
一个可执行的评测配置示例
下面是一个简化配置,用于 RAG 回答评测。真实项目中可以把它拆成多个 Judge,分别检查事实性、引用质量和拒答正确性。
judge_name: rag_answer_quality_v1
judge_model: strong-independent-judge-model
input_fields:
- user_question
- retrieved_context
- candidate_answer
output_schema:
pass: boolean
score: number
dimensions:
faithfulness: number
relevance: number
completeness: number
citation_quality: number
error_type: string
needs_human_review: boolean
rubric:
faithfulness:
1.0: "所有关键事实都能被 retrieved_context 直接支持"
0.5: "主要结论被支持,但存在轻微信息外推或遗漏"
0.0: "核心结论无法由证据支持或与证据冲突"
relevance:
1.0: "直接回答用户问题"
0.5: "部分相关,但绕开了关键约束"
0.0: "没有回答问题"
thresholds:
pass_score: 0.8
human_review_band: [0.7, 0.85]
release_gate:
p0_failures_allowed: 0
min_average_score: 0.86
min_faithfulness_score: 0.9
这个配置的重点不是字段名称,而是把评测逻辑从「某个人的经验判断」转成可版本化、可回放、可审计的工程资产。
适用场景
LLM-as-a-Judge 特别适合以下场景:
- RAG 问答:检查答案是否被证据支持、是否引用正确
- Agent 工具调用:检查工具选择、参数、执行顺序和最终答案一致性
- 模型升级评估:比较新旧模型在真实业务样本上的差异
- Prompt 回归测试:避免一次小改动破坏历史稳定样本
- 内容生成质检:评估品牌语气、结构完整性和合规表达
- 客服与知识库系统:对线上样本做异步抽检和错误聚类
不适合只依赖 LLM-as-a-Judge 的场景包括:强监管业务的最终合规判断、需要精确计算的数值评测、必须严格可解释的审计结论,以及模型本身知识不足的专业领域。
参考资料
- OpenAI:Working with evals — https://developers.openai.com/api/docs/guides/evals
- OpenAI:Graders — https://developers.openai.com/api/docs/guides/graders
- LangSmith:How to define an LLM-as-a-judge evaluator — https://docs.langchain.com/langsmith/llm-as-judge
- Ragas:List of available metrics — https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/
- Arize Phoenix:Evaluation / LLM Evals — https://arize.com/docs/phoenix/evaluation/llm-evals
- G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment — https://arxiv.org/abs/2303.16634
- Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena — https://arxiv.org/abs/2306.05685
- Judging the Judges: A Systematic Study of Position Bias in LLM-as-a-Judge — https://arxiv.org/abs/2406.07791
- Judging the Judges: A Systematic Evaluation of Bias Mitigation Strategies in LLM-as-a-Judge Pipelines — https://arxiv.org/abs/2604.23178
- Benchmarking LLM-as-a-Judge for Long-Form Output Evaluation — https://arxiv.org/abs/2606.01629