随着 AI Agent 大量涌现,"我们的 Agent 比 XX 强 20%"的宣称满天飞。但这 20% 是怎么测出来的?本文系统梳理主流 Agent 评测基准,帮你建立科学的 Agent 能力评估体系。
一、Agent 评测为何比 LLM 评测难得多
1.1 LLM 评测的相对简单性
传统 LLM 评测(MMLU、HumanEval 等)有一个核心前提:单轮、有标准答案。
标准 LLM 评测流程:
输入问题 → 模型输出 → 对比标准答案 → 得分
这很简单,也容易出现问题:
- 数据污染:评测数据集被包含在训练数据中
- 刷榜现象:模型针对特定评测集过拟合
- 脱离实用:高 MMLU 分数 ≠ 真实使用体验好
1.2 Agent 评测的独特挑战
Agent 评测面临更复杂的挑战:
挑战 1:过程依赖 Agent 完成任务需要多步骤决策,最终结果相同但路径可能截然不同。只看最终结果会丢失大量信息。
任务:查询某公司的最新财报
Agent A 路径(优质):
→ 确认公司全名 → 找到官方财报链接 → 解析关键数据 → 汇总回答
Agent B 路径(低质):
→ 直接搜索 → 获取到过期数据 → 胡乱拼凑 → 碰巧给出相似答案
两个 Agent 最终答案可能得分相同,但可靠性天差地别。
挑战 2:工具使用的不确定性
Agent 可以调用搜索、代码执行、数据库查询等工具。同一问题,工具调用策略不同,执行路径完全不同。
挑战 3:环境交互的副作用
Agent 可能修改文件、发送邮件、执行代码——评测时如何构建可重复的沙箱环境?
挑战 4:长任务的累积误差
10 步骤的任务,每步 90% 准确率,整体成功率仅 35%(0.9^10)。如何区分"能力问题"和"运气问题"?
二、主流 Agent 评测基准全景
2.1 通用能力评测
GAIA (General AI Assistants)
发布方:Meta AI、HuggingFace 核心理念:评测 AI 助手解决真实世界问题的能力,而非学术题目
GAIA 的题目来自真实场景,需要 Agent 综合运用:
- 网页搜索
- 文件处理(PDF、Excel、图片)
- 代码执行
- 多步骤推理
GAIA 题目示例(Level 2 难度):
"找出 2023 年诺贝尔物理学奖得主在其获奖研究中,
引用次数最高的论文,并告诉我该论文的第三作者
在哪所大学取得的博士学位?"
解题需要:
1. 搜索 2023 年诺贝尔物理学奖得主
2. 搜索其主要研究论文
3. 查找引用数据
4. 找到第三作者信息
5. 查询该作者的学历背景
GAIA 难度分级:
| 级别 | 描述 | 人类正确率 | 顶级 AI 正确率 |
|---|---|---|---|
| Level 1 | 单步或简单两步任务 | 97% | ~65-75% |
| Level 2 | 需要 3-7 步的中等任务 | 85% | ~35-50% |
| Level 3 | 需要 7+ 步的复杂任务 | 62% | ~10-20% |
SWE-bench (Software Engineering Benchmark)
核心能力:评测 Agent 解决真实 GitHub Issue 的能力
# SWE-bench 的评测逻辑(简化)
def evaluate_swe_agent(agent, issue):
"""
给 Agent 一个真实的 GitHub Issue
让它修复代码,然后运行测试用例验证
"""
# 提供 GitHub Issue 描述和代码库
result = agent.solve_issue(
repo=issue.repo,
issue_description=issue.body,
failing_tests=issue.failing_tests
)
# 评测标准:修复后所有测试用例通过
return run_tests(result.patch, issue.test_suite)
SWE-bench Verified 是更难的版本,只保留经人工验证确实可以被解决的 Issue。
2024-2026 年主要 AI 系统的 SWE-bench 成绩:
| 系统 | 发布时间 | SWE-bench 成绩 |
|---|---|---|
| GPT-4(无 Agent) | 2023 | ~1.7% |
| Devin(第一代) | 2024.03 | 13.8% |
| Claude 3.5 Sonnet + SWE-agent | 2024.06 | 49% |
| 顶级 Agent 系统 | 2025 | 60-70% |
2.2 工具使用评测
ToolBench
评测 Agent 能否正确使用 16,000+ 真实 API 工具:
ToolBench 评测维度:
1. 工具选择准确率:是否选择了最合适的工具
2. 参数填写正确率:API 参数是否正确
3. 错误处理能力:工具报错后能否恢复
4. 多工具协作:能否串联多个工具完成复杂任务
API-Bank
专注于金融和电商 API 的调用准确率评测。
2.3 代码生成与执行评测
HumanEval+
HumanEval 的增强版,增加了:
- 更多边界条件测试
- 对生成代码的安全性检查
- 代码可读性评分
BigCodeBench
2024 年推出,覆盖更多编程语言和复杂度:
- 1,140 个高难度编程任务
- 要求调用真实的第三方库
- 评测代码的功能正确性和运行效率
2.4 多步骤规划评测
WebArena
在真实浏览器环境中,让 Agent 完成网页操作任务:
# WebArena 任务示例
WEBARENA_TASKS = [
{
"task": "在 Reddit 上搜索关于 Python 异步编程的帖子,
找到点赞数最高的帖子,并回复一条技术见解",
"required_actions": ["search", "navigate", "read", "submit"],
"success_criterion": "reply_posted and_content_relevant"
},
{
"task": "在 GitLab 中找到包含 'authentication' 关键字的最新 issue,
并添加 'security' 标签",
"required_actions": ["search", "filter", "read", "tag"],
"success_criterion": "label_added"
}
]
OSWorld
评测 Agent 操作完整操作系统的能力(Windows/Linux/Mac):
- 369 个真实计算机任务
- 包括文件管理、应用程序操作、系统配置等
- 提供截图作为视觉输入
三、评测指标体系深度解析
3.1 任务完成率 vs. 部分完成率
def calculate_completion_metrics(results: list) -> dict:
"""
完成率指标的多维度计算
"""
metrics = {
"exact_success": 0, # 完全完成(最严格)
"partial_score": [], # 部分完成得分
"step_accuracy": [], # 步骤级准确率
"efficiency_score": [], # 完成效率(用多少步完成)
}
for result in results:
# 严格成功率
if result["fully_completed"]:
metrics["exact_success"] += 1
# 部分得分(多少目标子任务被完成)
subtask_score = (
result["completed_subtasks"] /
result["total_subtasks"]
)
metrics["partial_score"].append(subtask_score)
# 步骤准确率(每一步是否做了正确的事)
if result["step_results"]:
step_acc = sum(result["step_results"]) / len(result["step_results"])
metrics["step_accuracy"].append(step_acc)
# 效率得分(最优步骤数/实际步骤数)
if result["steps_taken"] > 0:
efficiency = result["optimal_steps"] / result["steps_taken"]
metrics["efficiency_score"].append(min(efficiency, 1.0))
n = len(results)
return {
"exact_success_rate": metrics["exact_success"] / n,
"avg_partial_score": sum(metrics["partial_score"]) / n,
"avg_step_accuracy": sum(metrics["step_accuracy"]) / len(metrics["step_accuracy"]) if metrics["step_accuracy"] else None,
"avg_efficiency": sum(metrics["efficiency_score"]) / len(metrics["efficiency_score"]) if metrics["efficiency_score"] else None,
}
3.2 错误分析框架
单纯的成功率不足以指导改进,需要对失败模式进行分类:
class AgentFailureAnalyzer:
FAILURE_CATEGORIES = {
"planning": [
"goal_misunderstood", # 误解任务目标
"wrong_strategy", # 策略选择错误
"infinite_loop", # 陷入循环
],
"tool_use": [
"wrong_tool_selected", # 工具选择错误
"wrong_parameters", # 参数填写错误
"tool_error_not_handled", # 未处理工具报错
],
"knowledge": [
"factual_error", # 事实性错误
"outdated_information", # 使用过时信息
"hallucination", # 产生幻觉
],
"execution": [
"context_lost", # 丢失上下文
"early_termination", # 提前终止
"output_format_error", # 输出格式错误
]
}
def analyze_failures(self, failed_runs: list) -> dict:
failure_stats = {cat: {sub: 0 for sub in subs}
for cat, subs in self.FAILURE_CATEGORIES.items()}
for run in failed_runs:
# 使用 LLM 分析失败原因(或人工标注)
failure_type = self._classify_failure(run)
for cat, subs in self.FAILURE_CATEGORIES.items():
if failure_type in subs:
failure_stats[cat][failure_type] += 1
return failure_stats
四、自建 Agent 评测框架
4.1 评测环境设计
from abc import ABC, abstractmethod
from typing import List, Dict, Any
import asyncio
class AgentEvalEnvironment(ABC):
"""
Agent 评测环境的抽象基类
确保评测可重复、隔离、安全
"""
@abstractmethod
async def setup(self) -> None:
"""初始化评测环境(数据库、文件系统等)"""
pass
@abstractmethod
async def teardown(self) -> None:
"""清理评测环境,恢复初始状态"""
pass
@abstractmethod
async def check_success(self, task: dict) -> bool:
"""检查任务是否成功完成"""
pass
class SandboxedFileSystemEnv(AgentEvalEnvironment):
"""
基于 Docker 容器的隔离文件系统环境
"""
def __init__(self, initial_state: dict):
self.initial_state = initial_state
self.container = None
async def setup(self) -> None:
# 启动隔离的 Docker 容器
import docker
client = docker.from_env()
self.container = client.containers.run(
"ubuntu:22.04",
detach=True,
remove=True,
mem_limit="512m",
network_disabled=True, # 禁用网络(根据任务需要配置)
)
# 初始化文件系统状态
for path, content in self.initial_state.get("files", {}).items():
self._write_file(path, content)
async def teardown(self) -> None:
if self.container:
self.container.stop()
4.2 评测任务标准格式
from dataclasses import dataclass, field
from typing import List, Optional, Dict, Any
@dataclass
class AgentEvalTask:
"""
标准化的 Agent 评测任务格式
"""
# 基础信息
task_id: str
category: str # "coding", "research", "file_management", etc.
difficulty: str # "easy", "medium", "hard"
# 任务描述
instruction: str # 给 Agent 的任务描述
context: Optional[str] = None # 额外上下文
# 环境配置
initial_state: Dict[str, Any] = field(default_factory=dict)
available_tools: List[str] = field(default_factory=list)
# 评测标准
success_criteria: List[dict] = field(default_factory=list)
expected_steps: Optional[int] = None # 期望步骤数(用于效率评分)
max_steps: int = 20 # 最多允许的步骤数
# 评分权重
weights: Dict[str, float] = field(default_factory=lambda: {
"task_completion": 0.6,
"efficiency": 0.2,
"process_quality": 0.2,
})
# 示例任务
EXAMPLE_TASK = AgentEvalTask(
task_id="code_debug_001",
category="coding",
difficulty="medium",
instruction="""以下 Python 函数有一个 bug,请找到并修复它:
```python
def calculate_average(numbers):
total = sum(numbers)
return total / len(numbers)
测试用例:calculate_average([]) 应该返回 0,但现在会抛出异常。""", available_tools=["code_editor", "python_runner"], success_criteria=[ {"type": "test_pass", "test": "calculate_average([]) == 0"}, {"type": "test_pass", "test": "calculate_average([1,2,3]) == 2.0"}, ], expected_steps=3, max_steps=10, )
### 4.3 批量评测执行器
```python
class AgentBenchmarkRunner:
def __init__(self, agent, task_suite: List[AgentEvalTask]):
self.agent = agent
self.tasks = task_suite
async def run_benchmark(self, max_concurrent: int = 5) -> dict:
"""并发执行所有评测任务"""
semaphore = asyncio.Semaphore(max_concurrent)
async def run_single_task(task):
async with semaphore:
env = self._create_environment(task)
await env.setup()
try:
result = await self._execute_task(task, env)
return result
finally:
await env.teardown()
# 并发执行所有任务
results = await asyncio.gather(*[
run_single_task(task) for task in self.tasks
])
return self._aggregate_results(results)
def _aggregate_results(self, results: list) -> dict:
"""聚合评测结果"""
by_category = {}
by_difficulty = {}
for result in results:
# 按类别聚合
cat = result["category"]
by_category.setdefault(cat, []).append(result["score"])
# 按难度聚合
diff = result["difficulty"]
by_difficulty.setdefault(diff, []).append(result["score"])
return {
"overall": {
"exact_success_rate": sum(r["success"] for r in results) / len(results),
"avg_score": sum(r["score"] for r in results) / len(results),
},
"by_category": {
cat: {"avg_score": sum(scores)/len(scores), "count": len(scores)}
for cat, scores in by_category.items()
},
"by_difficulty": {
diff: {"avg_score": sum(scores)/len(scores), "count": len(scores)}
for diff, scores in by_difficulty.items()
}
}
五、如何解读 Benchmark 结果
5.1 不要只看总分
❌ 错误的解读方式:
"我们的 Agent 在 GAIA 上得了 55 分,比 A 产品的 50 分高"
✅ 正确的解读方式:
"我们的 Agent 在 GAIA Level 1 任务上得了 78 分(+8 vs A),
但 Level 3 任务只有 18 分(-5 vs A)。
在工具使用类任务上优势明显(+15),但多步骤规划类任务偏弱(-8)"
5.2 关注数据污染风险
def check_data_contamination(
training_data: list,
benchmark_examples: list,
similarity_threshold: float = 0.8
) -> dict:
"""
检查训练数据与评测集的重叠度
"""
from sklearn.metrics.pairwise import cosine_similarity
contaminated = []
for bench_example in benchmark_examples:
bench_embedding = embed(bench_example["question"])
for train_item in training_data:
train_embedding = embed(train_item["text"])
similarity = cosine_similarity([bench_embedding], [train_embedding])[0][0]
if similarity > similarity_threshold:
contaminated.append({
"benchmark_id": bench_example["id"],
"train_item_id": train_item["id"],
"similarity": float(similarity)
})
return {
"contamination_rate": len(contaminated) / len(benchmark_examples),
"contaminated_examples": contaminated
}
5.3 建立场景专项基准
通用 Benchmark 往往无法反映你的具体业务场景。建议每个 AI 应用团队建立自己的专项评测集:
# 企业内部 Agent 评测最佳实践
class InternalAgentBenchmark:
"""
针对企业特定场景的内部评测基准
"""
def build_dataset(self):
return [
# 1. 从真实用户请求中采样(去除 PII)
*self._sample_from_production(n=200),
# 2. 手工设计边界案例
*self._create_edge_cases(),
# 3. 从失败案例中学习
*self._sample_from_failures(n=50),
# 4. 对手场景(竞品能处理而我方不能)
*self._competitive_scenarios(),
]
六、2026 年 Agent 评测趋势
- 动态评测集:定期更新题目,防止数据污染和刷榜
- 对话式评测:不只评最终结果,评整个多轮对话质量
- 红队评测标准化:安全和对齐能力的标准化评测方法
- 现实世界任务:从受控 Benchmark 转向真实生产环境任务
- 人机协作评测:评测 Agent 与人类协作的效率提升
七、总结
Agent 评测是一个快速演进的领域,没有完美的单一基准。务实的做法是:
- 公开 Benchmark:用 GAIA、SWE-bench、WebArena 跟踪行业横向对比
- 内部 Benchmark:针对自己的业务场景定制专项评测集
- 失败分析:深入分析失败模式,而非只看成功率数字
- 定期更新:随着业务发展和 Agent 能力提升,持续迭代评测集
好的评测体系是产品持续进化的基础设施,值得投入专门的工程资源建设。