Agent 评测方法论
概述
Agent 评测是 Agent 工程中最被低估的环节。没有系统化的评测,你无法区分"感觉变好了"和"确实变好了"。Agent 的非确定性本质意味着单次测试毫无意义——你需要统计显著的、多维度的、可重复的评测体系。
本指南涵盖评测的核心挑战、多维评分量表、LLM-as-Judge 方法论、偏差缓解技术、测试集设计以及持续评测工作流。
何时使用
- 创建新 Agent 后需要验证质量
- 修改 Agent 提示词后需要回归测试
- 比较两个提示变体的效果
- 建立 Agent 质量的持续监控体系
- 排查 Agent 输出质量下降的原因
核心挑战
Agent 评测与传统软件测试有根本性差异:
1. 非确定性
同一输入可能产生不同输出,且多个不同输出都可能是"正确"的。
输入:"优化这个函数的性能"
输出 A:使用缓存策略 → 合理 ✓
输出 B:使用算法优化 → 合理 ✓
输出 C:使用并行计算 → 合理 ✓
传统测试思维:只有一个"正确答案"
Agent 测试思维:多个有效路径,需要评估每个路径的质量
2. 多有效路径
不同的执行策略可能都达到目标,但在效率、可维护性、安全性等维度上各有优劣。
3. 复合质量维度
Agent 输出的"好坏"不是一维的。一个回答可能在准确性上完美,但在可读性上糟糕;可能在深度上优秀,但在效率上低下。
多维评分量表
五维评分体系
| 维度 | 权重 | 说明 |
|---|---|---|
| 指令遵循(Instruction Following) | 0.30 | Agent 是否准确执行了用户的请求 |
| 输出完整性(Output Completeness) | 0.25 | 输出是否覆盖了所有必要的方面 |
| 工具效率(Tool Efficiency) | 0.20 | 是否用最少的工具调用完成了任务 |
| 推理质量(Reasoning Quality) | 0.15 | 推理过程是否合理、有逻辑 |
| 响应连贯性(Response Coherence) | 0.10 | 输出格式、语言、结构是否一致 |
综合得分计算
综合得分 = Σ(维度得分 × 权重)
示例:
指令遵循:4/5 × 0.30 = 1.20
输出完整性:3/5 × 0.25 = 0.75
工具效率:5/5 × 0.20 = 1.00
推理质量:4/5 × 0.15 = 0.60
响应连贯性:4/5 × 0.10 = 0.40
综合得分 = 3.95 / 5.00 = 79%
单维度评分量表示例(指令遵循)
| 分值 | 级别 | 特征 | 示例 |
|---|---|---|---|
| 5 | 完美 | 完全按指令执行,无遗漏、无偏离 | 用户要求 TDD,Agent 严格执行红-绿-重构循环 |
| 4 | 良好 | 基本按指令执行,有微小偏离 | 执行了 TDD 但跳过了一次红色步骤 |
| 3 | 可接受 | 大致方向正确,但有明显遗漏 | 做了测试但没有遵循红-绿-重构顺序 |
| 2 | 不足 | 部分执行指令,关键步骤缺失 | 先写代码后补测试 |
| 1 | 失败 | 完全忽略或误解指令 | 没有写任何测试 |
权重调整指导
根据 Agent 的类型调整维度权重:
| Agent 类型 | 指令遵循 | 完整性 | 工具效率 | 推理质量 | 连贯性 |
|---|---|---|---|---|---|
| 代码生成 Agent | 0.25 | 0.30 | 0.15 | 0.20 | 0.10 |
| 代码评审 Agent | 0.20 | 0.25 | 0.10 | 0.35 | 0.10 |
| 调试 Agent | 0.30 | 0.20 | 0.25 | 0.20 | 0.05 |
| 规划 Agent | 0.20 | 0.30 | 0.05 | 0.30 | 0.15 |
评测方法论:LLM-as-Judge
使用另一个 LLM(通常是更强的模型)来评估 Agent 的输出质量。
方法一:直接评分(Direct Scoring)
让 Judge 模型对 Agent 的输出按评分量表打分。
## 评分任务
请评估以下 Agent 输出的质量。
### 用户原始请求
{user_request}
### Agent 输出
{agent_output}
### 评分量表
对以下 5 个维度分别打分(1-5 分):
1. **指令遵循**:Agent 是否准确执行了用户的请求?
- 5 分:完全按指令执行,无遗漏
- 3 分:大致方向正确,有明显遗漏
- 1 分:完全忽略或误解指令
2. **输出完整性**:[量表定义...]
3. **工具效率**:[量表定义...]
4. **推理质量**:[量表定义...]
5. **响应连贯性**:[量表定义...]
### 输出格式
```json
{
"instruction_following": { "score": N, "justification": "..." },
"completeness": { "score": N, "justification": "..." },
"tool_efficiency": { "score": N, "justification": "..." },
"reasoning_quality": { "score": N, "justification": "..." },
"coherence": { "score": N, "justification": "..." },
"overall_score": N.NN,
"summary": "一句话总结"
}
优点: 实现简单、可自动化、可与历史数据对比
缺点: 对量表定义的质量高度敏感、绝对分数跨任务不可比
方法二:配对比较(Pairwise Comparison)
让 Judge 对比两个 Agent 输出(或同一 Agent 的两个版本),判断哪个更好。
## 配对比较任务
以下是同一用户请求的两个 Agent 回答。请判断哪个更好。
### 用户请求
{user_request}
### 回答 A
{output_a}
### 回答 B
{output_b}
### 评比维度
对以下每个维度,判断 A 更好、B 更好、还是平局:
1. 指令遵循
2. 输出完整性
3. 工具效率
4. 推理质量
5. 响应连贯性
### 输出格式
```json
{
"dimensions": {
"instruction_following": { "winner": "A/B/tie", "reason": "..." },
"completeness": { "winner": "A/B/tie", "reason": "..." },
...
},
"overall_winner": "A/B/tie",
"confidence": "high/medium/low",
"key_differentiator": "决定胜负的关键因素"
}
优点: 更符合人类判断习惯、对量表定义不太敏感、结果更稳定
缺点: 只能比较相对优劣、无法给出绝对分数、需要成对生成
关键技巧: 为消除位置偏差,每次对比需要运行两次,交换 A 和 B 的顺序。只有两次结果一致时才计入有效判定。
偏差缓解
LLM-as-Judge 存在多种系统性偏差,必须在评测设计中主动缓解:
1. 位置偏差(Position Bias)
表现: Judge 倾向于给排在前面(或后面)的回答更高分。
缓解方法:
- 配对比较时交换 A/B 顺序运行两次
- 只有两次结果一致的判定才有效
- 不一致时标记为"需人工审核"
2. 长度偏差(Verbosity Bias)
表现: Judge 倾向于给更长的回答更高分,即使更短的回答质量更好。
缓解方法:
- 在评分标准中明确"简洁性是加分项,冗余是扣分项"
- 增加独立的"效率"维度
- 在量表中给出"过于冗长"的负面示例
3. 自我增强偏差(Self-Enhancement Bias)
表现: 使用同一模型做 Judge 时,倾向于给与自己风格相似的输出更高分。
缓解方法:
- Judge 模型与被评测 Agent 使用不同模型
- 如果必须用同一模型,增加多次采样取平均值
- 引入人工评测作为校准锚点
4. 详细偏差(Detail Bias)
表现: Judge 倾向于给包含更多技术细节的回答更高分,即使这些细节与任务无关。
缓解方法:
- 在评分标准中加入"相关性"维度
- 明确"与任务无关的细节是扣分项"
5. 权威偏差(Authority Bias)
表现: Judge 倾向于给使用更多专业术语或引用的回答更高分。
缓解方法:
- 评分标准聚焦"是否解决了用户问题"而非"看起来是否专业"
- 加入"可操作性"维度——用户能否直接按建议执行
测试集设计
复杂度分层
将测试用例按复杂度分层,确保每层都有足够的覆盖:
| 层级 | 描述 | 占比 | 示例 |
|---|---|---|---|
| L1 - 基础 | 单步任务,明确指令 | 30% | "给这个函数添加类型注解" |
| L2 - 标准 | 多步任务,需要规划 | 40% | "重构这个模块,提取公共逻辑" |
| L3 - 复杂 | 跨文件任务,需要上下文理解 | 20% | "实现用户认证流程" |
| L4 - 极端 | 边缘情况,歧义指令,矛盾约束 | 10% | "在不改变 API 的前提下修复性能问题" |
代表性采样原则
- 场景覆盖:确保每个 Agent 声称支持的场景都有测试用例
- 输入多样性:包含不同编程语言、框架、项目规模的用例
- 边缘情况:包含模糊指令、不完整信息、矛盾需求的用例
- 基线用例:包含已知正确答案的用例,用于校准评分
测试集规模指导
| 评测目的 | 最小样本量 | 建议样本量 | 说明 |
|---|---|---|---|
| 快速验证 | 10 | 20 | 新 Agent 的第一轮检查 |
| 版本对比 | 30 | 50 | A/B 测试两个提示变体 |
| 正式发布 | 50 | 100 | 产品级别的质量保证 |
| 持续监控 | 10/周 | 20/周 | 检测质量退化 |
评分量表生成
为每个评测维度生成精确的评分量表是评测质量的关键。
量表设计流程
1. 定义维度名称和权重
2. 编写各级别的文字描述
3. 为每个级别编写 2-3 个具体示例
4. 标注边缘情况的处理方式
5. 让 2-3 人独立使用量表评分同一样本
6. 计算评分者间一致性(Cohen's κ)
7. 根据不一致点修订量表定义
量表模板
## 维度:[维度名称]
**定义**:[一句话定义该维度衡量的内容]
**权重**:[0.00 - 1.00]
| 分值 | 级别 | 描述 | 典型特征 | 示例 | 边缘处理 |
|------|------|------|----------|------|----------|
| 5 | 卓越 | [描述] | [特征] | [示例] | [边缘] |
| 4 | 良好 | [描述] | [特征] | [示例] | [边缘] |
| 3 | 可接受 | [描述] | [特征] | [示例] | [边缘] |
| 2 | 不足 | [描述] | [特征] | [示例] | [边缘] |
| 1 | 失败 | [描述] | [特征] | [示例] | [边缘] |
评测工作流
工作流 1:测试新 Agent
新建 Agent
↓
准备测试集(L1-L4 各层级)
↓
运行 Agent 处理全部测试用例(每个用例运行 3 次)
↓
LLM-as-Judge 对每次输出评分
↓
统计各维度平均分和标准差
↓
标准差 > 1.0 的维度 → 提示词需要加强约束
平均分 < 3.0 的维度 → 提示词需要重写该部分
全维度 > 4.0 → 通过,可以部署
工作流 2:比较提示变体(A/B Test)
原始提示(A)和改进提示(B)
↓
使用相同测试集运行两个版本
↓
配对比较(Position-swapped)
↓
统计各维度的胜/负/平比例
↓
对整体胜率做显著性检验(Fisher's Exact Test)
↓
p < 0.05 → 差异显著,采纳胜出版本
p >= 0.05 → 差异不显著,需要更多样本或更大改动
工作流 3:回归测试
修改 Agent 的提示词或工具配置
↓
运行"回归测试集"(20-30 个历史上稳定通过的用例)
↓
与上一版本的评分对比
↓
任何维度下降 > 0.5 分 → 回归,需要修复
所有维度波动 < 0.3 分 → 无回归,可以合并
工作流 4:持续质量监控
每周从生产日志中采样 10-20 个真实交互
↓
LLM-as-Judge 自动评分
↓
生成周报:各维度趋势图
↓
任何维度连续 2 周下降 → 触发调查
评测指标参考
核心指标
| 指标 | 计算方式 | 用途 | 目标值 |
|---|---|---|---|
| 精确率(Precision) | TP / (TP + FP) | 衡量输出中"正确"内容的比例 | > 0.85 |
| 召回率(Recall) | TP / (TP + FN) | 衡量应覆盖内容的覆盖率 | > 0.80 |
| F1 Score | 2 × P × R / (P + R) | 精确率和召回率的调和平均 | > 0.82 |
一致性指标
| 指标 | 计算方式 | 用途 | 目标值 |
|---|---|---|---|
| Cohen's Kappa (κ) | (P_o - P_e) / (1 - P_e) | 衡量两个评分者之间的一致性 | > 0.60 |
| Spearman's ρ | 基于排名的相关系数 | 衡量评分排序的一致性 | > 0.70 |
| Krippendorff's α | 基于分歧的一致性 | 多评分者一致性 | > 0.67 |
指标解读
Cohen's κ 解读:
0.81 - 1.00 几乎完美一致
0.61 - 0.80 高度一致
0.41 - 0.60 中等一致
0.21 - 0.40 一般一致
0.00 - 0.20 轻微一致
< 0.00 低于随机一致
κ < 0.60 意味着评分量表需要修订——
要么定义不够清晰,要么维度本身不够可判定。
反模式
1. 单次测试下结论
# 反模式
运行 Agent 1 次 → 看结果 → "效果不错,上线"
# 正确做法
运行 Agent 30+ 次 → 统计平均分和标准差 → 显著性检验 → 决策
问题: Agent 输出是非确定性的,单次结果的方差极大,无法代表整体质量。
2. 只看整体分数
# 反模式
"综合得分 4.2,不错!"
# 正确做法
"指令遵循 4.8,但工具效率只有 2.5——Agent 在频繁做不必要的文件读取"
问题: 综合分数掩盖了维度间的差异。一个 Agent 可能在 4 个维度上满分,但在 1 个关键维度上完全失败。
3. 用自己做 Judge
# 反模式
自己写的 Agent → 自己评判质量 → "确认偏差"导致高估
# 正确做法
让不了解 Agent 设计细节的人来评测,或使用 LLM-as-Judge 做盲评
4. 测试集不更新
# 反模式
创建一次测试集 → 用同一个测试集评测所有版本 → Agent "过拟合"测试集
# 正确做法
每次迭代补充 10-20% 的新用例,淘汰过时的旧用例
5. 忽略偏差控制
# 反模式
配对比较时 A 总在 B 前面 → 位置偏差导致 A 系统性偏高
# 正确做法
每次比较双向运行,只取一致结果
6. 评分量表定义模糊
# 反模式
"3 分 = 一般"——什么是"一般"?
# 正确做法
"3 分 = Agent 完成了主要任务,但遗漏了 1-2 个次要需求,
例如:完成了功能实现但忘记添加错误处理"
总结
Agent 评测的核心原则:
- 统计思维 — 单次结果无意义,需要足够的样本量和显著性检验
- 多维度评估 — 综合分数掩盖问题,逐维度分析才能定位瓶颈
- 偏差意识 — 每种评测方法都有系统性偏差,必须主动缓解
- 持续迭代 — 评测不是一次性的,需要随 Agent 演进持续更新
- 量表即文档 — 精确的评分量表是团队对"什么是好输出"的共识文档
- 数据驱动 — 用评测数据指导提示优化,而非凭感觉调整