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 全面评测、上线前灰度验证

下一篇建议继续看: