LLM-as-a-Judge Evaluation(LLM评审评估)
约 2001 字大约 7 分钟
2026-09-15
用 LLM 充当裁判(LLM as a Judge)
📌 原文地址:https://docs.spring.io/java-ai/reference/guides/llm-as-judge.html 📌 原文版本:Java AI 2.0.1
LLM-as-a-Judge(让 LLM 当裁判)是一种用一个大语言模型评估另一个大语言模型输出的技术。它常用于自动化评估 AI 应用质量,递归优化 AI 输出。本指南将介绍 Java AI 中如何用 SelfRefineEvaluationAdvisor 实现"边生成、边评估、边改进"的循环。
白话解读
把"裁判"想成一个挑剔的质检员:你的主 AI 写了一稿,质检员看完打分;如果不及格,让 AI 重写一稿,再打分……直到通过为止。
一、为什么需要"AI 裁判"
传统评估 AI 输出的方法要么太贵、要么不准:
| 评估方式 | 优点 | 缺点 |
|---|---|---|
| 人工评估 | 最准确 | 慢、贵、不可规模化 |
| 硬编码规则 | 快速、可解释 | 难以覆盖语言风格的细微差别 |
| 指标(BLEU/ROUGE) | 客观、可复现 | 只能比对参考答案,无法判断"是否正确" |
| LLM 当裁判 | 接近人类判断、可规模化 | 偶尔犯"自我偏好"错误 |
适用场景
- 生成内容质量参差不齐:希望 AI 自动重写不满意的部分
- 没有标准答案:开放性问答、创意写作
- 批量评估:跑几百个测试用例,需要自动打分
二、核心思路:自反思循环
Self-Refine(自我反思) 是一种让 LLM 自己评价自己输出、然后迭代改进的模式:
生成初稿 → 让 AI 评估 → 不合格?
├─ 否:返回结果
└─ 是:把评估意见反馈给 AI → 重写 → 再评估
└─ 循环 N 次Java AI 把这个模式封装成了 SelfRefineEvaluationAdvisor,你只需要关心"评估标准",循环由 Advisor 自动完成。
三、SelfRefineEvaluationAdvisor 完整实现
下面我们来看 Java AI 内部的 SelfRefineEvaluationAdvisor 源码(简化版),了解它的工作原理:
3.1 类签名
public class SelfRefineEvaluationAdvisor implements CallAdvisor {
// 默认最大重试次数:3
public static final int DEFAULT_MAX_REPEAT_ATTEMPTS = 3;
// 默认及格分数:3.0(满分 5 分)
public static final double DEFAULT_SUCCESS_RATING = 3.0;
private final ChatClient.Builder chatClientBuilder;
private final EvaluationRequest evaluationRequest;
private final int maxRepeatAttempts;
private final double successRating;
// ...
}3.2 默认评估提示词
Advisor 内置了一段默认的"裁判提示词"(已翻译为中文):
public static final String DEFAULT_EVALUATION_PROMPT_TEMPLATE = """
你是一个严格的 AI 输出质量评估员。请按以下标准对 AI 的回复打分(1-4 分):
- 1 分:完全答非所问、有事实错误、严重的语气或安全问题
- 2 分:部分回答正确,但有明显遗漏或表达不清
- 3 分:基本回答了用户问题,但缺少深度、细节或例子
- 4 分:回答准确、完整、表达清晰、可直接使用
【用户原始问题】
{question}
【AI 生成的回复】
{answer}
请输出严格的 JSON 格式:
{
"rating": <1-4 的整数>,
"feedback": "<不超过 50 字的改进建议,仅在 rating < 4 时填写>"
}
""";评分标准
评分是 1-4 整数分。successRating 默认 3.0,意味着 3 分以上就算通过。
3.3 评估请求与响应
/**
* 评估请求:把"用户问题 + AI 回答"打包交给裁判模型。
*/
public record EvaluationRequest(String question, String answer) {}
/**
* 评估响应:裁判模型返回的结构化结果。
*/
public record EvaluationResponse(int rating, String feedback) {}3.4 核心循环逻辑
@Override
public ChatClientResponse adviseCall(ChatClientRequest request,
CallAdvisorChain chain) {
// 第一步:让主链生成初稿
ChatClientResponse response = chain.nextCall(request);
// 第二步:循环评估 + 重写
for (int attempt = 1; attempt <= maxRepeatAttempts; attempt++) {
String question = request.context().get(QUESTION_KEY);
String answer = response.chatResponse().getResult().getOutput().getText();
// 调用裁判模型打分
EvaluationResponse eval = evaluate(question, answer);
// 打分合格 → 直接返回
if (eval.rating() >= successRating) {
return response;
}
// 不合格 → 把"反馈意见"塞进上下文,让主链重写
request = request.mutate()
.context(REPEAT_FEEDBACK, eval.feedback())
.build();
response = chain.nextCall(request);
}
// 达到最大重试次数仍未达标:返回最后一次结果(带警告)
return response;
}关键点
- 递归顾问:
SelfRefineEvaluationAdvisor是CallAdvisor,所以会拦截整个调用链,可以反复触发"主链 + 评估" - 配置灵活:
maxRepeatAttempts和successRating都可以自定义 - 结构化输出:用 JSON 让裁判模型返回分数+反馈,避免解析自由文本
四、接入 ChatClient
只需要两步:构造 Advisor,注入默认 Advisor 列表。
@Configuration
public class ChatConfig {
@Bean
public SelfRefineEvaluationAdvisor selfRefineAdvisor(ChatClient.Builder builder) {
return new SelfRefineEvaluationAdvisor(builder);
}
@Bean
public ChatClient refinedChatClient(ChatClient.Builder builder,
SelfRefineEvaluationAdvisor advisor) {
return builder
.defaultAdvisors(advisor) // 关键:把自反思 Advisor 接入
.build();
}
}调用方无感知——你正常问问题,Advisor 自动评估 + 重写。
五、自定义评估标准
你可以覆盖默认的评估提示词,让"裁判"按你的业务标准打分:
@Bean
public SelfRefineEvaluationAdvisor customRefineAdvisor(ChatClient.Builder builder) {
String customPrompt = """
你是一个企业级客服回复质检员。请评估 AI 回复:
- 是否礼貌?
- 是否解决了客户问题?
- 是否遵守品牌话术?
【客户问题】{question}
【AI 回复】{answer}
输出 JSON:{"rating": 1-4, "feedback": "改进建议"}
""";
return new SelfRefineEvaluationAdvisor(
builder,
customPrompt, // 自定义提示词
5, // 最多重试 5 次
4.0 // 必须 4 分以上才算通过
);
}业务定制
评估标准越具体,裁判打分越准。建议把你的"质检清单"写进提示词里,比如:是否包含免责声明、是否引导下一步动作、是否提到具体数字等。
六、最佳实践
6.1 选择合适的裁判模型
| 场景 | 推荐裁判模型 | 理由 |
|---|---|---|
| 英文内容评估 | GPT-4o / Claude 4 Sonnet | 评分最稳定 |
| 中文内容评估 | Claude 4 Sonnet / Qwen-Max | 中文表达理解更到位 |
| 简单评估(是/否类) | GPT-4o-mini / Claude Haiku | 便宜够用 |
| 复杂评估(多维度) | GPT-4o / Claude Opus | 思考更细 |
避免"自我偏好"
不要用主模型当自己的裁判。同一模型既当运动员又当裁判,容易给出虚高分数。建议主模型 + 裁判模型来自不同供应商。
6.2 控制重试次数
重试太多既费钱又可能"越改越差"(评分不稳定):
| 业务场景 | 推荐 maxRepeatAttempts |
|---|---|
| 实时对话 | 1-2(用户等不起) |
| 离线批量处理 | 3-5(追求质量) |
| 高质量报告生成 | 5-10(成本可接受) |
6.3 监控评分分布
上线后建议记录每次评估的分数,看分布是否合理:
@Component
public class EvaluationMetrics {
private final MeterRegistry registry;
public void record(int rating, boolean passed) {
registry.counter("ai.eval.rating." + rating).increment();
registry.counter("ai.eval." + (passed ? "passed" : "failed")).increment();
}
}数据驱动调优
如果发现 80% 的回答都打 4 分,裁判标准可能太松;如果 50% 都打 1 分,可能是模型本身或提示词有问题。
七、进阶用法:与 RAG / Tool 配合
SelfRefineEvaluationAdvisor 可以和其他 Advisor 组合:
ChatClient client = builder
.defaultAdvisors(
new QuestionRewriteAdvisor(), // 先重写用户问题
new RetrievalAugmentationAdvisor(), // 再检索增强
new SelfRefineEvaluationAdvisor() // 最后自反思
)
.build();执行顺序:从左到右依次调用,反思阶段会"重新走一遍"前面所有 Advisor,但带上反馈意见。
八、局限与替代方案
已知局限
- 多轮对话评估:当前实现只评估"最后一轮回答",对话历史质量未覆盖
- 幻觉检测:裁判模型本身也会幻觉,可能漏判或误判
- 速度成本:每次反思都要多一次 LLM 调用,延迟和成本翻倍
替代方案:
- 传统规则 + LLM 混合:先用正则、关键词过滤明显不合格的内容,只对存疑样本调用 LLM 裁判
- 人机协作:低分样本自动转人工复核
- A/B 测试:不同提示词的回复直接对比用户反馈
九、小结
一句话总结
LLM-as-a-Judge = 用 AI 评估 AI,Java AI 的 SelfRefineEvaluationAdvisor 帮你把"生成 → 评估 → 重写"的递归循环封装成一个开箱即用的 Advisor。
适用场景:内容质量参差不齐、需要批量评估、追求高质量输出的 AI 应用。下一步建议把它接入你的 RAG 系统,看检索结果质量是否能自动提升。