为什么 Agent 需要专属基准

传统 LLM 基准(MMLU、HumanEval)评估的是单轮输入输出的能力。但 Agent 的工作模式截然不同:它需要多步推理工具调用环境交互状态管理。一个在 MMLU 上得高分的模型,未必能完成"在 GitHub 上修复一个 issue"这样的复杂任务。

Agent 基准测试需要回答的问题:

  • 模型能否将复杂目标拆解为可执行的子任务?
  • 模型能否正确调用工具并解析返回结果?
  • 模型能否在失败后调整策略并重试?
  • 模型能否在长上下文中保持目标一致性?

三大基准套件总览

维度SWE-benchWebArenaGAIA
领域软件工程Web 交互通用助手
任务来源真实 GitHub Issue自建 Web 环境人工设计
环境Docker 容器浏览器 + Web 服务文件 + Web + 工具
评估方式单元测试通过率端到端功能验证最终答案精确匹配
任务数量2,298 (Lite: 300)812466 (Level 1-3)
最高分(2026初)~35% (SWE-agent)~42% (GPT-4o)~25% (Level 3)
开源协议MITMITApache 2.0

SWE-bench:软件工程能力试金石

设计理念

SWE-bench 从 12 个流行 Python 开源仓库中收集真实的 GitHub Issue 及对应 Pull Request,要求 Agent 在给定代码仓库中修改代码以解决 Issue。评估标准是对应 PR 中的单元测试是否通过。

任务结构

# SWE-bench 任务示例
task = {
    "instance_id": "django__django-11099",
    "repo": "django/django",
    "base_commit": "a4b78c0e8e5d1b6...",
    "problem_statement": """
    When using ALLOWED_HOSTS with a domain that contains an underscore,
    ValidationError is raised. According to RFC 1034, underscores are
    technically not allowed in hostnames but are commonly used in
    certain DNS records. We should handle this gracefully.
    """,
    "test_patch": "diff --git a/tests/requests/tests.py ...",
    "FAIL_TO_PASS": [
        "tests.requests.tests.test_allowed_hosts_underscore"
    ],
    "PASS_TO_PASS": [
        "tests.requests.tests.test_basic"
    ],
    "environment_setup_commit": "a4b78c0e8e5d1b6..."
}

执行流程

┌──────────────┐
│  读取 Issue   │
└──────┬───────┘
       v
┌──────────────┐
│  Clone 仓库   │
│  Checkout 基线 │
└──────┬───────┘
       v
┌──────────────┐
│  Agent 工作   │  <── 探索代码、定位问题、编写修复
│  (限时 30min) │
└──────┬───────┘
       v
┌──────────────┐
│  应用测试补丁  │
│  运行单元测试  │
└──────┬───────┘
       v
┌──────────────┐
│  评估结果     │  FAIL_TO_PASS 全部通过 + PASS_TO_PASS 不回归
└──────────────┘

运行 SWE-bench 评估

import subprocess
import json
from pathlib import Path

class SWEBenchRunner:
    def __init__(self, agent_callable, benchmark_dir: str = "swe-bench"):
        self.agent = agent_callable
        self.bench_dir = Path(benchmark_dir)

    def setup_environment(self, instance_id: str):
        """为指定实例设置 Docker 环境"""
        subprocess.run([
            "python", "-m", "swebench.harness.run_evaluation",
            "--instance_id", instance_id,
            "--output_dir", str(self.bench_dir / "results"),
        ], check=True)

    def run_instance(self, instance: dict) -> dict:
        """运行单个 SWE-bench 实例"""
        # 1. 准备环境
        workdir = self.bench_dir / "workspace" / instance["instance_id"]
        workdir.mkdir(parents=True, exist_ok=True)

        # 2. 让 Agent 工作产生 patch
        agent_result = self.agent(
            problem=instance["problem_statement"],
            repo_path=str(workdir),
            base_commit=instance["base_commit"],
        )

        # 3. 应用 Agent 的 patch 并运行测试
        eval_result = subprocess.run([
            "python", "-m", "swebench.harness.run_evaluation",
            "--predictions_path", agent_result["patch_file"],
            "--swe_bench_tasks", "swe_bench_lite",
            "--log_level", "INFO",
            "--instance_ids", instance["instance_id"],
        ], capture_output=True, text=True)

        # 4. 解析结果
        report_path = self.bench_dir / "results" / instance["instance_id"] / "report.json"
        if report_path.exists():
            report = json.loads(report_path.read_text())
            return {
                "instance_id": instance["instance_id"],
                "resolved": report.get("resolved", False),
                "fail_to_pass": report.get("fail_to_pass", []),
                "pass_to_pass": report.get("pass_to_pass", []),
                "patch_size": len(agent_result.get("patch", "")),
            }
        return {"instance_id": instance["instance_id"], "resolved": False, "error": "no report"}

    def run_suite(self, instances: list[dict]) -> dict:
        results = [self.run_instance(inst) for inst in instances]
        resolved = sum(1 for r in results if r["resolved"])
        return {
            "total": len(results),
            "resolved": resolved,
            "resolve_rate": resolved / len(results) if results else 0,
            "details": results,
        }

SWE-bench 的局限性

  • 只支持 Python:目前限于 Python 项目,无法评估多语言能力
  • 测试覆盖依赖:如果项目本身测试覆盖不足,评估质量受限
  • 环境搭建复杂:每个实例需要独立 Docker 容器,资源消耗大
  • 时间限制敏感:30 分钟的限制可能对需要深入探索的任务不公平

WebArena:Web 交互能力基准

设计理念

WebArena 构建了一个包含多个真实 Web 应用(电商、论坛、CMS、Git 托管)的沙箱环境,要求 Agent 通过浏览器完成各种 Web 交互任务。它评估的是 Agent 在真实 Web 环境中的操作能力。

环境架构

┌─────────────────────────────────────────────────────┐
│                   WebArena 环境                      │
│                                                       │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │ Ecommerce │  │  Forum   │  │   CMS    │          │
│  │ (Magento) │  │(phpBB)   │  │(WordPress)│         │
│  └──────────┘  └──────────┘  └──────────┘          │
│       │              │              │                │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │ Git Host  │  │ Map      │  │ Analytics│          │
│  │(Gitea)    │  │(OSM)     │  │(Matomo)  │          │
│  └──────────┘  └──────────┘  └──────────┘          │
│                                                       │
│  ┌─────────────────────────────────────────┐        │
│  │          Reverse Proxy (Nginx)           │        │
│  └─────────────────────────────────────────┘        │
└─────────────────────────────────────────────────────┘

任务类型

任务类型示例占比
信息查找“找到评分最高的耳机并告诉我价格”35%
站点导航“去论坛搜索关于 Python 的帖子”20%
内容创建“在 CMS 上发布一篇关于 AI 的文章”20%
账户管理“修改我的个人资料中的邮箱地址”10%
跨站点“在论坛找到推荐的商品,然后在商城购买”15%

评估方式

WebArena 采用功能验证:不是检查 Agent 的操作路径,而是检查最终状态是否满足任务要求。

class WebArenaEvaluator:
    def __init__(self, config: dict):
        self.environments = config["environments"]
        self.verifiers = self._init_verifiers()

    def _init_verifiers(self):
        return {
            "url_match": self._verify_url,
            "element_exists": self._verify_element,
            "content_match": self._verify_content,
            "api_state": self._verify_api_state,
        }

    def evaluate_task(self, task: dict, agent_actions: list) -> dict:
        """
        评估 Agent 是否完成任务
        task 包含:
        - intent: 任务描述
        - evaluators: 验证条件列表
        - init_state: 初始状态
        """
        results = []
        for verifier_spec in task["evaluators"]:
            v_type = verifier_spec["type"]
            v_config = verifier_spec["config"]
            verifier = self.verifiers[v_type]
            passed = verifier(v_config, agent_actions)
            results.append({
                "verifier": v_type,
                "config": v_config,
                "passed": passed,
            })

        # 所有验证条件都通过才算成功
        success = all(r["passed"] for r in results)
        return {
            "task_id": task["task_id"],
            "intent": task["intent"],
            "success": success,
            "verifier_results": results,
            "num_steps": len(agent_actions),
        }

    def _verify_url(self, config, actions):
        """验证最终 URL 是否匹配"""
        import re
        pattern = config["url_pattern"]
        final_url = actions[-1]["url"] if actions else ""
        return bool(re.match(pattern, final_url))

    def _verify_element(self, config, actions):
        """验证页面上是否存在特定元素"""
        # 通过 API 查询数据库状态或通过浏览器检查 DOM
        selector = config["selector"]
        expected_text = config.get("expected_text", "")
        # 实际实现需要连接浏览器或查询后端
        return True  # 简化示例

    def _verify_content(self, config, actions):
        """验证页面内容是否包含期望文本"""
        expected = config["expected_content"]
        # 获取最终页面内容
        page_content = self._fetch_final_content(actions)
        return expected.lower() in page_content.lower()

    def _verify_api_state(self, config, actions):
        """通过 API 验证后端状态"""
        import requests
        api_url = config["api_url"]
        expected_state = config["expected_state"]
        resp = requests.get(api_url)
        actual_state = resp.json()
        return self._compare_states(actual_state, expected_state)

WebArena 的独特价值

  • 真实 Web 应用:不是模拟页面,而是真实运行的服务
  • 跨站点任务:评估 Agent 在多个 Web 服务间协调的能力
  • 状态验证:不只是检查输出,还检查 Web 应用的实际状态变化

GAIA:通用 AI 助手基准

设计理念

GAIA(General AI Assistants Benchmark)由 Meta AI 等机构联合推出,设计理念是"对人类简单但对 AI 困难"的任务。这些问题对人类来说通常只需要几分钟和几次工具调用,但对 AI 来说却极具挑战。

三个难度等级

等级描述所需步骤示例
Level 1简单工具调用1-5 步“2024 年诺贝尔物理学奖得主的本科学历是什么?”
Level 2多步推理5-10 步“找到给定 PDF 文件中提到的法规在中国的实施日期”
Level 3复杂多步10+ 步“下载附件中的图片,识别其中的建筑物,找到其建筑师的其他作品列表”

任务结构

gaia_task = {
    "task_id": "gaia_001",
    "level": 2,
    "question": "附件 CSV 文件中列出的所有公司,哪家在 2023 年的营收增长率最高?请给出精确百分比。",
    "file_name": "companies.csv",
    "file_path": "/data/gaia/gaia_001/companies.csv",
    "answer": "Acme Corp, 47.3%",
    "annotator_metadata": {
        "required_steps": [
            "读取 CSV 文件",
            "搜索每家公司 2022 和 2023 年营收",
            "计算增长率",
            "比较并找到最高值"
        ],
        "tools_needed": ["file_reader", "web_search", "calculator"],
        "estimated_time_human": "5-10 minutes",
    }
}

GAIA 评估框架

class GAIAEvaluator:
    def __init__(self, data_dir: str):
        self.data_dir = Path(data_dir)
        self.tasks = self._load_tasks()

    def _load_tasks(self) -> list[dict]:
        tasks = []
        for json_file in (self.data_dir / "questions").glob("*.json"):
            tasks.append(json.loads(json_file.read_text(encoding="utf-8")))
        return tasks

    def evaluate_response(self, task: dict, agent_response: str) -> dict:
        """
        GAIA 使用精确匹配或包含匹配
        答案通常是简短的字符串(数字、名称、日期等)
        """
        expected = task["answer"].strip().lower()
        actual = agent_response.strip().lower()

        # 精确匹配
        exact_match = expected == actual

        # 包含匹配(允许额外文本)
        contains = expected in actual

        # 数字匹配(提取数字比较)
        number_match = self._compare_numbers(expected, actual)

        passed = exact_match or contains or number_match

        return {
            "task_id": task["task_id"],
            "level": task["level"],
            "passed": passed,
            "expected": task["answer"],
            "actual": agent_response,
            "match_type": "exact" if exact_match else ("contains" if contains else ("number" if number_match else "none")),
        }

    def _compare_numbers(self, expected: str, actual: str) -> bool:
        import re
        exp_nums = re.findall(r"[\d.]+", expected)
        act_nums = re.findall(r"[\d.]+", actual)
        if not exp_nums:
            return False
        try:
            exp_val = float(exp_nums[0])
            act_val = float(act_nums[0]) if act_nums else None
            if act_val is None:
                return False
            # 允许 1% 的误差
            return abs(exp_val - act_val) / max(abs(exp_val), 1e-10) < 0.01
        except ValueError:
            return False

    def benchmark_summary(self, results: list[dict]) -> dict:
        from collections import defaultdict
        by_level = defaultdict(list)
        for r in results:
            by_level[r["level"]].append(r["passed"])
        return {
            "overall_accuracy": sum(r["passed"] for r in results) / len(results),
            "by_level": {
                f"level_{lvl}": {
                    "total": len(passes),
                    "passed": sum(passes),
                    "accuracy": sum(passes) / len(passes),
                }
                for lvl, passes in sorted(by_level.items())
            },
        }

三大基准横向对比

能力维度覆盖

能力维度SWE-benchWebArenaGAIA
代码理解与修改★★★★★★★
多步推理★★★★★★★★★★★★
工具使用★★★★★★★★★★★
环境交互★★★★★★★★★★★
长上下文管理★★★★★★★★★★
错误恢复★★★★★★★★★★
跨系统协作★★★★★★★★★

资源需求对比

资源SWE-benchWebArenaGAIA
CPU中(Docker 构建)高(多个 Web 服务)
内存4-8 GB/实例16+ GB2-4 GB
磁盘5-10 GB/实例20+ GB< 1 GB
网络不需要需要内部网络需要互联网
GPU不需要不需要不需要
搭建时间10-30 分钟1-2 小时< 5 分钟

选型建议

何时选择 SWE-bench

  • 你的 Agent 面向软件开发场景(如 Copilot 类产品)
  • 需要评估代码理解和修改能力
  • 团队有 Docker 基础设施
  • 关注代码质量和测试通过率

何时选择 WebArena

  • 你的 Agent 需要操作 Web 界面(如 RPA 类产品)
  • 评估多步骤 Web 交互能力
  • 需要验证跨站点协作
  • 有资源搭建完整 Web 沙箱

何时选择 GAIA

  • 你的 Agent 是通用助手(如 ChatGPT 类产品)
  • 需要评估多工具组合使用能力
  • 关注现实世界问题的解决能力
  • 资源有限,需要轻量级基准

组合使用建议

对于全面的 Agent 能力评估,推荐组合使用:

评估矩阵 = {
    "代码能力": "SWE-bench Lite (300题)",
    "Web交互": "WebArena (随机采样200题)",
    "通用推理": "GAIA Level 1+2 (200题)",
}

结语

Agent 基准测试还处于快速演进阶段。SWE-bench、WebArena 和 GAIA 各有侧重,没有单一基准能全面衡量 Agent 能力。选择适合你产品场景的基准,并持续跟踪新出现的基准测试,才能保持评估的有效性。未来,随着 Agent 能边界扩展到物理世界和更多模态,我们还需要更丰富的基准测试套件。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。