Agent 训练实战 / 05
Agent 评测:怎么衡量你训练出来的 Agent 到底行不行
你训练了一个 Agent 模型,RL Reward 曲线看起来在涨,Loss 也在降——但它真的变强了吗?
Agent 评测和普通语言模型评测完全不是一回事。语言模型评测的是“输出的文本好不好”,Agent 评测的是“任务完成了没有、完成得高不高效、过程合不合理”。你不能只看最终输出,还要看执行轨迹;不能只在固定数据集上跑,还要在真实环境里测。
本篇讲 Agent 评测的指标体系、评测环境搭建,以及那些让你的评测结果“看起来好但实际不行”的常见陷阱。
为什么 Agent 评测特别难
先说清楚为什么这件事难,理解了难点才能设计好评测方案。
难点 1:结果正确不代表过程合理
一个 Agent 查天气用了 3 次工具调用最终给出了正确答案,另一个 Agent 只用了 1 次。两个都“完成了任务”,但效率差 3 倍。如果你只看任务完成率,这两个 Agent 的评测分数一样。
难点 2:同一个任务可以有多条正确路径
让 Agent “帮我了解一下北京到上海的高铁信息”,它可以先查班次再查价格,也可以先查价格再查班次,也可以一次查询全部信息。没有唯一的标准答案,无法用简单的字符串匹配来评判。
难点 3:环境不确定性
Agent 调用工具的返回结果可能随时间变化(API 数据更新)、随环境变化(沙箱状态不同)。今天跑通的测试用例,明天可能因为 API 返回变了就失败——但这不是模型的问题。
难点 4:评测成本高
每跑一个测试用例,Agent 要真的执行多步工具调用。一个 500 条的评测集,Agent 平均每条跑 8 步,就是 4000 次工具调用。如果工具涉及代码执行或 API 请求,评测一次可能要几个小时。
指标体系:看什么数字
Agent 评测不能只看一个数字。你需要一套多维度的指标体系,从不同角度评估 Agent 的能力。
第一层:任务完成指标
这是最基础的——Agent 到底有没有完成任务。
| 指标 | 定义 | 适用场景 |
|---|---|---|
| 任务完成率 (Pass Rate) | 完全正确完成的任务占比 | 所有场景 |
| 部分完成率 (Partial Score) | 按任务子目标计分,完成一部分也有分 | 复杂多目标任务 |
| Pass@k | 生成 k 条轨迹,至少一条成功的概率 | 评估模型的能力上限 |
Pass Rate vs Pass@k 的区别:
Pass Rate (Pass@1):每个任务只跑一次,成功就算 pass
→ 衡量的是"用户实际体验"——用户只会用一次,要么成功要么失败
Pass@k (k=5):每个任务跑 5 次,至少一次成功就算 pass
→ 衡量的是"模型有没有这个能力"——能力有但不稳定也会被发现
实际意义:
Pass@1 = 60%,Pass@5 = 85%
→ 说明模型有能力完成 85% 的任务,但稳定性不够,只有 60% 能一次做对
→ RL 训练应该聚焦提升稳定性,而不是覆盖更多任务
第二层:效率指标
任务完成了,但完成得好不好?
| 指标 | 定义 | 为什么重要 |
|---|---|---|
| 平均步骤数 | 完成任务平均需要多少步工具调用 | 步骤多 = 延迟高 + 成本高 |
| 冗余步骤率 | 对最终结果没有贡献的步骤占比 | 直接衡量无效操作 |
| 首次成功率 | 第一次工具调用就成功(无需重试)的比例 | 衡量工具调用准确性 |
| Token 消耗 | 完成任务消耗的总 token 数 | 直接影响推理成本 |
效率指标在企业场景中非常重要——每多一步工具调用就多一份延迟和成本。一个完成率 80% 但平均 5 步的 Agent,可能比完成率 85% 但平均 12 步的更适合生产环境。
第三层:鲁棒性指标
正常情况下能跑通,异常情况呢?
| 指标 | 定义 | 测试方法 |
|---|---|---|
| 错误恢复率 | 工具报错后能正确恢复并最终完成任务的比例 | 注入工具错误(超时、参数错、空返回) |
| 指令扰动稳定性 | 同一任务用不同措辞描述,完成率的方差 | 对每个任务准备 3-5 种不同表述 |
| 上下文长度鲁棒性 | 轨迹变长后(8K/16K/32K)完成率的变化 | 测试不同长度的任务 |
| 工具缺失处理 | 需要的工具不在 tool list 中时,能否合理拒绝 | 故意隐藏某些工具 |
鲁棒性测试示例——错误注入:
正常流程:
User: 查北京天气 → Agent: get_weather(北京) → 返回:晴,25°C → Agent: 北京今天晴...
注入错误:
User: 查北京天气 → Agent: get_weather(北京) → 返回:{"error": "API timeout"}
好的 Agent:识别错误 → 重试一次 → 成功获取结果 → 回复
差的 Agent:把错误信息当结果 → "北京今天 API timeout"
更差的:陷入无限重试循环
第四层:安全指标
Agent 能执行操作,安全必须单独评测。
| 指标 | 定义 | 测试方法 |
|---|---|---|
| 危险操作拒绝率 | 收到危险指令时正确拒绝的比例 | 构造危险操作指令集 |
| Prompt 注入抵抗率 | 工具返回中嵌入恶意指令时不执行的比例 | 在工具返回中注入攻击文本 |
| 权限越界率 | 尝试调用没有权限的工具或访问越权数据的比例 | 设置权限边界后测试 |
| 确认率 | 执行不可逆操作前主动确认的比例 | 给出删除文件、修改数据库等指令 |
评测环境搭建
有了指标,还需要一个靠谱的评测环境。
评测环境的基本要求
必须满足:
├── 可复现 同一个模型跑两次,结果一致(或方差可控)
├── 隔离性 不同测试用例之间不互相影响
├── 可重置 每个用例执行前环境恢复到初始状态
├── 可观测 记录完整的执行轨迹,便于分析
└── 成本可控 评测不能比训练还贵
三种评测环境方案
方案 1:静态数据集 + 规则判断
适用:工具调用有确定性输出的场景
做法:
├── 预先录制好每种工具调用的标准返回值
├── Agent 调工具时,匹配参数 → 返回预录结果
├── 最终结果用规则匹配判断(精确匹配 / 关键词包含 / 正则)
└── 快、便宜、可复现
局限:
├── 不支持探索性行为(Agent 走了一条没预录的路径就卡住了)
├── 无法测试错误恢复(预录数据里没有错误情况)
└── 结果判断的规则容易遗漏 edge case
方案 2:沙箱环境 + 自动验证
适用:代码 Agent、数据库 Agent 等可以搭真实沙箱的场景
做法:
├── 为每个测试用例准备一个 Docker 容器 / 虚拟环境
├── Agent 在沙箱中真实执行操作
├── 用自动化测试验证结果(单元测试、SQL 查询验证等)
└── 最接近真实效果,结果最可靠
局限:
├── 搭建和维护成本高
├── 执行速度慢(每个用例可能要几分钟)
└── 沙箱环境和真实环境可能有差异
方案 3:LLM-as-Judge
适用:结果无法用规则自动判断的场景(开放式回复、复杂分析等)
做法:
├── Agent 执行完毕后,把完整轨迹 + 最终结果提交给 Judge 模型
├── Judge 模型根据预定义的评分标准打分
├── 通常用比被评测模型更强的模型做 Judge(GPT-4、Claude 等)
└── 灵活,能处理开放式结果
局限:
├── Judge 模型本身有偏差(偏好更长的回复、偏好某种格式)
├── 评测成本 = Agent 执行成本 + Judge 模型调用成本
└── 不同 Judge 模型给出的评分可能不一致
实践建议:三种方案不是互斥的,通常混合使用。
推荐的混合方案:
├── 核心功能评测(占 60%) → 沙箱环境 + 自动验证
│ 确定性结果,最可靠
├── 开放式能力评测(占 25%)→ LLM-as-Judge
│ 灵活处理开放式结果
└── 快速回归测试(占 15%) → 静态数据集 + 规则
跑得快,适合 CI/CD 集成
评测集的构建
评测集的质量直接决定评测结果的可信度。
评测集构建原则:
├── 任务覆盖:每种支持的工具类型至少 20 条测试用例
├── 难度分布:简单 30% / 中等 50% / 困难 20%
├── 长度分布:1-3 步任务 / 4-8 步任务 / 8+ 步任务各占一定比例
├── 负面用例:包含"不需要调工具"和"应该拒绝"的场景
└── 独立性:评测集不能和训练集有重叠
特别注意数据泄露:如果你的 Agent 轨迹数据是强模型生成的,而评测集也是类似方式生成的,两者可能有分布重叠——模型在训练集里“见过类似的题”,评测分数虚高。
防泄露的做法:
- 评测集由不同的人 / 不同的方法构建
- 评测集发布后冻结,不随训练数据更新
- 定期引入新的评测用例,检查模型是否只是“记住了答案”
主流 Benchmark 参考
不需要从零搭评测体系——已经有一些成熟的 Agent Benchmark 可以直接用或参考。
| Benchmark | 场景 | 评测方式 | 核心指标 |
|---|---|---|---|
| SWE-bench | 代码修复 | 沙箱 + 单元测试 | 修复通过率 |
| WebArena | 网页操作 | 模拟浏览器环境 | 任务完成率 |
| ToolBench | 工具调用 | API 沙箱 | 调用正确率 + 任务完成率 |
| GAIA | 通用 Agent | 混合环境 | 任务完成率(分级别) |
| AgentBench | 多场景 Agent | 多种沙箱 | 综合得分 |
| HumanEval | 代码生成 | 执行 + 测试 | Pass@k |
选择建议:
你的 Agent 类型 → 优先用什么 Benchmark
代码 Agent → SWE-bench(最权威)+ HumanEval(基础能力)
Web Agent → WebArena
工具调用 Agent → ToolBench + 自建评测集(ToolBench 工具覆盖可能不够)
通用 Agent → GAIA + AgentBench
但不要只跑公开 Benchmark——公开 Benchmark 的任务分布和你的真实业务分布大概率不一样。公开 Benchmark 用来对标业界水平,自建评测集用来评估真实业务表现。两者缺一不可。
评测陷阱:看起来好但实际不行
陷阱 1:只看完成率,忽视效率
模型 A:完成率 82%,平均 6 步完成
模型 B:完成率 85%,平均 14 步完成
如果只看完成率,会选 B。
但 B 的推理成本是 A 的 2 倍多,延迟也更高。
生产环境中 A 可能是更好的选择。
解决:报告完成率时必须同时报告平均步骤数和 Token 消耗。计算一个综合效率分:
效率得分 = 完成率 × (基准步骤数 / 实际步骤数)
陷阱 2:评测集太简单
如果评测集里 80% 是简单任务(1-2 步就能完成),模型的完成率看起来很高,但一到复杂场景就拉胯。
检查方法:
把评测集按难度分层,分别看每层的完成率
简单(1-3 步):95% ← 这个高不意外
中等(4-8 步):65% ← 这才是真实水平
困难(8+ 步):30% ← 复杂场景差很远
如果只看总体:78%(被简单任务拉高了)
陷阱 3:评测环境和生产环境不一致
评测时用的是模拟 API,返回格式整洁、永不超时、参数校验宽松。生产环境的 API 返回可能有噪声、会超时、参数格式要求严格。
评测环境 vs 生产环境的常见差异:
├── API 返回格式 评测环境统一 JSON,生产有 XML、纯文本、HTML 混杂
├── 延迟和超时 评测环境秒回,生产可能 10 秒超时
├── 错误率 评测环境 0% 错误,生产 5-15% 的调用会失败
├── 数据新鲜度 评测环境数据固定,生产数据实时变化
└── 并发和限流 评测环境无限流,生产有 QPS 限制
解决:在评测环境中注入真实的噪声——随机 5% 的工具调用返回超时,随机 3% 返回格式异常。看模型在有噪声的环境中表现如何。
陷阱 4:LLM-as-Judge 的系统性偏差
用强模型做 Judge 很方便,但 Judge 模型有自己的偏好:
已知的 Judge 偏差:
├── 长度偏好 更长的回复倾向于得更高分
├── 格式偏好 有 markdown 格式的回复得分更高
├── 自我偏好 如果 Judge 是 GPT-4,它可能给 GPT-4 生成的内容更高分
└── 位置偏好 在 A/B 对比中,第一个选项可能被偏好
缓解方法:
- 多个 Judge 模型交叉打分,取平均
- 对 A/B 对比做位置随机化(交换 A/B 顺序各跑一次)
- 控制回复长度后再比较(或在评分标准中明确说明简洁更好)
- 关键评测点用人工抽检校准 Judge 的准确度
陷阱 5:训练集和评测集分布泄露
这不是说两者有完全相同的样本——而是分布层面的泄露。
泄露场景:
├── 训练数据和评测数据都是 GPT-4 生成的 → 任务类型和表述风格相似
├── 训练数据从某个来源爬取,评测数据从同一来源的不同页面爬取
├── 评测集发布后被人放进了训练集(公开 Benchmark 的老问题)
└── 模型在 pretrain 阶段就见过评测数据(对公开 Benchmark 尤其严重)
检测方法:
├── 用模型没见过的全新任务测一次,对比分数差异
├── 检查评测集中的高分样本,和训练集做相似度比对
└── 定期更新评测集,只用新样本
评测流程:串成一条线
把上面的内容串起来,一套完整的 Agent 评测流程:
阶段 1:训练中的快速评测(每 500-1000 步)
├── 用静态数据集跑 50-100 条核心任务
├── 看任务完成率和工具调用格式正确率
├── 同时跑通用 benchmark 的子集(MT-Bench 等)检测能力偏移
└── 目标:快速发现训练方向是否正确,10 分钟内出结果
阶段 2:checkpoint 评测(每个候选模型)
├── 沙箱环境跑完整评测集(300-500 条)
├── 计算全部四层指标(完成率 + 效率 + 鲁棒性 + 安全)
├── 分难度层级看完成率
├── 跑公开 Benchmark 对标业界水平
└── 目标:全面评估模型能力,几小时出结果
阶段 3:上线前灰度评测
├── 在生产环境的灰度流量上跑
├── 监控真实用户任务的完成率和用户反馈
├── 对比新模型和旧模型的 A/B 指标
├── 重点关注 edge case 和安全问题
└── 目标:验证评测结果是否和真实表现一致
小结
- Agent 评测不是看一个完成率就够的——需要四层指标:完成(Pass Rate/Pass@k)、效率(步骤数/Token 消耗)、鲁棒性(错误恢复/指令扰动)、安全(拒绝率/注入抵抗)
- 评测环境推荐混合方案:沙箱自动验证为主,LLM-as-Judge 处理开放式结果,静态数据集做快速回归
- 警惕五大陷阱:只看完成率、评测集太简单、环境不一致、Judge 偏差、分布泄露——每个都会让你对模型能力产生错误判断
- 公开 Benchmark 用来对标业界,自建评测集用来评估业务——两者缺一不可
- 评测贯穿训练全周期:训练中快速检查、checkpoint 全面评测、上线前灰度验证
下一篇建议继续看: