AI Agent的考场——但你以为考的是智商,其实考的是别的东西
Agent Benchmarking是用标准化测试集评估AI Agent在推理、工具调用、任务规划、多步协作等维度表现的方法论体系。和传统LLM benchmark(MMLU、HumanEval)不同,Agent基准测试不只看答案对不对,还看过程对不对。
LLM评测很简单:给输入,比输出,算准确率。Agent评测为什么难?
VAKRA(2026年4月由IBM Research发布)是当前最前沿的Agent基准之一,它的核心理念是:不只看成功率,还要分析失败模式。
1. 🔴 Tool Misuse(工具误用)
- 选错了工具:用计算器去翻译
- 参数填错了:搜索"cat"写成了搜索"cats"然后手动过滤
- 遗漏了关键步骤:搜到了结果但忘了保存
2. 🟠 Planning Failure(规划失败)
- 路径不优:绕了3倍远的路完成任务
- 循环卡死:反复执行同一操作出不来
- 过早放弃:试了一次失败就说"做不到"
3. 🟡 Context Loss(上下文丢失)
- 忘了前面的对话:"用户说要红色,怎么选了蓝色?"
- 信息溢出:长对话后开始胡编前面的细节
- 工具结果误读:把错误码当正常结果继续
4. 🟢 Grounding Error(接地错误)
- 编造不存在的工具:"让我调用get_weather_api_v2"
- 幻觉式推理:"根据我的计算..."(其实没算)
- 自我矛盾:前一步说A,后一步说B
5. 🔵 Safety Violation(安全违规)
- 越权操作:删除了不该删除的文件
- 信息泄露:把系统prompt暴露给用户
- 无限循环:没有正确处理边界条件
| 基准名称 | 发布方 | 聚焦领域 | 任务数 | 评估维度 |
|----------|--------|----------|--------|----------|
| VAKRA | IBM Research | 推理+工具+故障 | 500+ | 成功率+故障分类 |
| AgentBench | 清华 | 多环境通用 | 200+ | 8个操作系统环境 |
| WebArena | CMU | 网页交互 | 812 | 端到端成功率 |
| ToolBench | 中科院 | 工具调用 | 16000+ | Pass Rate / Win Rate |
| SWE-bench | Princeton | 软件工程 | 2294 | PR解决率 |
| GAIA | Meta | 通用助手 | 165 | 3级难度递进 |
| OSWorld | HKU | 操作系统 | 369 | 真实环境端到端 |
# openclaw agent config: agent-evaluator
name: agent-evaluator
model: auto # 自动选择最佳模型
skills:
- name: task-runner
description: "执行评测任务并记录完整轨迹"
tools:
- run_agent_task
- capture_trace
- name: failure-analyzer
description: "分析Agent失败模式(参考VAKRA分类)"
tools:
- trace_parser
- failure_classifier
- name: report-generator
description: "生成评测报告"
tools:
- report_builder
- metric_calculator
cron:
- schedule: "0 3 * * *"
task: "每日Agent评测:运行标准测试集,分析故障模式,生成报告"
import openclaw
import json
from datetime import datetime
class AgentBenchmark:
"""OpenClaw Agent 基准测试框架"""
FAILURE_MODES = {
"tool_misuse": "工具误用",
"planning_failure": "规划失败",
"context_loss": "上下文丢失",
"grounding_error": "接地错误",
"safety_violation": "安全违规"
}
def __init__(self, agent_name: str):
self.agent = openclaw.Agent(agent_name)
self.results = []
def run_task(self, task: dict) -> dict:
"""执行单个评测任务"""
trace = self.agent.run_with_trace(
instruction=task["instruction"],
tools=task["available_tools"],
timeout=task.get("timeout", 120)
)
result = {
"task_id": task["id"],
"success": trace.success,
"steps": len(trace.steps),
"tools_used": [s.tool for s in trace.steps if s.tool],
"duration_ms": trace.duration_ms,
"failure_mode": self._classify_failure(trace),
"trace_hash": trace.hash # 可复现
}
self.results.append(result)
return result
def _classify_failure(self, trace) -> str:
"""参考VAKRA方法分析故障模式"""
if trace.success:
return None
# 检查安全违规
if trace.has_safety_violation:
return "safety_violation"
# 检查工具误用
for step in trace.steps:
if step.error and "tool" in step.error.lower():
return "tool_misuse"
# 检查规划失败(循环/过早放弃)
if trace.has_loop or trace.early_termination:
return "planning_failure"
# 检查上下文丢失
if trace.context_consistency_score < 0.5:
return "context_loss"
return "grounding_error"
def generate_report(self) -> str:
"""生成评测报告"""
total = len(self.results)
success = sum(1 for r in self.results if r["success"])
failure_modes = {}
for r in self.results:
if r["failure_mode"]:
fm = self.FAILURE_MODES.get(r["failure_mode"], r["failure_mode"])
failure_modes[fm] = failure_modes.get(fm, 0) + 1
report = f"""## Agent评测报告
**时间**: {datetime.now().strftime('%Y-%m-%d %H:%M')}
**Agent**: {self.agent.name}
**任务总数**: {total}
**成功率**: {success/total*100:.1f}%
### 故障模式分布
"""
for mode, count in sorted(failure_modes.items(), key=lambda x: -x[1]):
report += f"- {mode}: {count}次 ({count/total*100:.1f}%)\n"
report += f"""
### 性能指标
- 平均步骤数: {sum(r['steps'] for r in self.results)/total:.1f}
- 平均耗时: {sum(r['duration_ms'] for r in self.results)/total:.0f}ms
- 使用工具种类: {len(set(t for r in self.results for t in r['tools_used']))}
"""
return report
# 使用示例
benchmark = AgentBenchmark("my-openclaw-agent")
tasks = [
{"id": "t1", "instruction": "搜索今天AI新闻并总结前3条", "available_tools": ["web_search", "web_fetch"]},
{"id": "t2", "instruction": "创建一个Python Flask项目并运行", "available_tools": ["exec", "write"]},
{"id": "t3", "instruction": "分析这个CSV文件的数据趋势", "available_tools": ["read", "exec"]},
]
for task in tasks:
benchmark.run_task(task)
print(benchmark.generate_report())
一个Agent任务完成率85%听起来不错,但如果你深入分析:
这就是为什么VAKRA强调故障模式分析——看它怎么失败的比看它怎么成功的更有价值。
不要只标记对错。为每个任务准备2-3条"黄金轨迹"(专家级解决方案),对比Agent的路径和黄金轨迹的偏离度。
每次更新Agent配置或模型后,跑一遍完整测试集。用OpenClaw的cron设个每日评测任务,发现问题比用户发现早。
评测环境要和生成环境隔离。用OpenClaw的sandbox运行评测任务,避免Agent在评测中真的删库跑路。