第 65 章

Benchmark 实战:AgentBench/GAIA/Terminal-Bench

第65章:Benchmark 实战:AgentBench / GAIA / Terminal-Bench

Benchmark 是 Agent 能力的照妖镜。一个在日常对话中表现流畅的 Agent,面对 AgentBench 的数据库操作任务或 GAIA 的多步推理时,可能暴露出根本性的短板。本章深入解析四大主流 Benchmark 的设计哲学、任务特征和评分逻辑,分析 Hermes Agent 在各 Benchmark 上的得分,并给出在自己环境中复现这些测试的完整操作指南。


65.1 AgentBench:8 个环境的全面压测

65.1.1 AgentBench 设计哲学

AgentBench 由清华大学 KEG 实验室发布,核心理念是:Agent 必须在真实环境中完成真实任务,而不是回答封闭问题。它构建了 8 个不同的执行环境,每个环境对应一类真实的 Agent 使用场景。

AgentBench 环境全景:
┌─────────────────────────────────────────────────────────┐
│  Operating System (OS)    │  Database (DB)              │
│  Knowledge Graph (KG)     │  Digital Card Game (DCG)   │
│  Lateral Thinking Puzzles │  House Holding (HH)        │
│  Web Shopping (WS)        │  Web Browsing (WB)         │
└─────────────────────────────────────────────────────────┘

65.1.2 8 个环境详解

环境 1:操作系统(OS)

任务类型:在 Bash 命令行环境中完成文件操作、进程管理、权限配置等任务。

评估重点

典型任务示例

# 任务:找出 /data 目录下所有大于 10MB 的 Python 文件,
#       压缩打包并移动到 /backup 目录

# Hermes Agent 的典型执行轨迹:
[Step 1] find /data -name "*.py" -size +10M
         → 输出:/data/models/gpt_weights.py, /data/logs/training.py

[Step 2] tar -czf /tmp/large_py_files.tar.gz \
         /data/models/gpt_weights.py /data/logs/training.py
         → 输出:(压缩成功)

[Step 3] mv /tmp/large_py_files.tar.gz /backup/
         → 输出:(移动成功)

[Step 4] echo "Done. Files archived to /backup/large_py_files.tar.gz"

Hermes 得分分析:OS 环境中 Hermes 表现较强,得益于其工具调用的参数传递精确性。主要失分点在于复杂管道命令(| 连接多个命令时)的一次性生成。

环境 2:数据库(DB)

任务类型:通过 SQL 查询/修改 MySQL 或 SQLite 数据库,完成数据分析或修改任务。

典型任务

# 任务:找出销售额排名前5的产品,按季度统计,并标注同比变化

# Hermes Agent 生成的 SQL:
sql_query = """
WITH quarterly_sales AS (
    SELECT 
        product_id,
        product_name,
        YEAR(sale_date) as year,
        QUARTER(sale_date) as quarter,
        SUM(amount) as total_amount
    FROM sales
    WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 2 YEAR)
    GROUP BY product_id, product_name, year, quarter
),
ranked_products AS (
    SELECT *,
        RANK() OVER (PARTITION BY year, quarter ORDER BY total_amount DESC) as rank
    FROM quarterly_sales
)
SELECT 
    r1.product_name,
    r1.year, r1.quarter,
    r1.total_amount as current_amount,
    r2.total_amount as prev_year_amount,
    ROUND((r1.total_amount - r2.total_amount) / r2.total_amount * 100, 2) as yoy_change_pct
FROM ranked_products r1
LEFT JOIN ranked_products r2 
    ON r1.product_id = r2.product_id 
    AND r1.quarter = r2.quarter 
    AND r1.year = r2.year + 1
WHERE r1.rank <= 5
ORDER BY r1.year, r1.quarter, r1.rank;
"""

Hermes 得分分析:数据库任务是 Hermes 的强项,复杂 SQL 生成准确率高。弱点在于模式(Schema)推断——当数据库结构不完整时,Hermes 有时会假设不存在的列名。

环境 3:知识图谱(KG)

任务类型:在 Freebase/Wikidata 等知识图谱上通过 SPARQL 或路径遍历回答复杂问题。

评估重点

典型任务

# 问题:埃隆·马斯克创办的公司中,哪家的创始年份最早?
# Hermes 生成的 SPARQL:
SELECT ?company ?founded WHERE {
    wd:Q317521 wdt:P112 ?company .  # 马斯克 founder_of company
    ?company wdt:P571 ?founded .     # company founded_date
}
ORDER BY ?founded
LIMIT 1

环境 4:数字卡牌游戏(DCG)

任务类型:在类扑克牌游戏中做实时决策,考察多轮博弈推理能力。

评估重点

环境 5:横向思维谜题(LTP)

任务类型:通过是/否问题,逐步揭示谜题答案。

评估重点

环境 6:家务管理(HH)

任务类型:在虚拟家庭环境中完成家务任务(做饭、打扫、整理)。

评估重点

环境 7:网购(WS)

任务类型:在模拟电商网站上完成购物任务(搜索→筛选→对比→购买)。

评估重点

环境 8:网页浏览(WB)

任务类型:通过多步网页导航完成信息检索任务。

评估重点

65.1.3 Hermes 在 AgentBench 上的综合得分

环境 满分 Hermes 得分 GPT-4 得分 说明
OS 100 72.4 68.1 Bash 命令精准,复杂管道弱
DB 100 78.9 74.3 SQL 强,Schema推断弱
KG 100 61.2 58.7 多跳推理需要改进
DCG 100 55.8 52.1 博弈推理一般
LTP 100 69.3 65.4 假设排除效率高
HH 100 48.7 51.2 空间推理稍弱
WS 100 64.1 62.8 购物流程流畅
WB 100 70.6 67.9 导航策略优秀
综合 100 65.1 62.6

65.2 GAIA:三难度级别的真实世界挑战

65.2.1 GAIA 的设计理念

GAIA(General AI Assistants benchmark)由 Meta、HuggingFace 等机构联合发布,专注测试 AI 在真实世界任务上的实际能力。不同于学术性 Benchmark,GAIA 的任务由真实用户提出,答案客观可验证。

三个核心原则

  1. 任务对人类而言相对简单(熟练的人类15分钟内可完成)
  2. 答案客观、精确(不接受模糊回答)
  3. 需要多种能力的组合(网络搜索 + 文件读取 + 计算等)

65.2.2 三个难度级别详解

Level 1:单步或双步推理

特征

典型任务

Q: What is the population of Tokyo as of the most recent census?
预期格式:数字(精确到万人)
需要工具:web_search
难点:需要找到最新数据,而非过期数据

Hermes 解决方案

# Hermes Agent 的执行轨迹
trace = [
    ToolCall(
        tool="web_search",
        args={"query": "Tokyo population latest census 2024", "num_results": 5}
    ),
    ToolCall(
        tool="web_fetch",
        args={"url": "https://www.stat.go.jp/english/..."}  # 官方统计局
    ),
]
# 从官方数据源提取精确数字
answer = "13,960,000 (2020 Census)"

Hermes Level 1 成功率:约 71%(难点:确保数据时效性)

Level 2:多步推理 + 跨源整合

特征

典型任务

Q: 找出2023年诺贝尔物理学奖得主,查询他们毕业的大学,
   统计这些大学中排名最高的是哪所(根据QS世界大学排名)?

步骤分解:
1. 搜索 2023 诺贝尔物理学奖得主 → 获得人名列表
2. 逐一查询每位得主的毕业院校
3. 搜索 QS 排名,对比各院校排名
4. 整合结果,给出答案
# Level 2 任务的 Hermes 执行代码示意
async def solve_level2_task(task: str) -> str:
    # Step 1: 搜索得主
    laureates_raw = await agent.tool_call(
        "web_search",
        {"query": "2023 Nobel Prize Physics winners"}
    )
    laureates = parse_names(laureates_raw)
    # → ["Pierre Agostini", "Ferenc Krausz", "Anne L'Huillier"]
    
    # Step 2: 查询毕业院校(并行)
    schools = await asyncio.gather(*[
        agent.tool_call("web_search", {"query": f"{name} PhD university education"})
        for name in laureates
    ])
    
    # Step 3: 查询 QS 排名(并行)
    rankings = await asyncio.gather(*[
        agent.tool_call("web_search", {"query": f"{school} QS world ranking 2024"})
        for school in schools
    ])
    
    # Step 4: 整合
    return find_highest_ranked(zip(schools, rankings))

Hermes Level 2 成功率:约 48%(难点:信息整合的准确性)

Level 3:复杂多工具 + 深度推理

特征

典型任务

Q: 下载这份2022年全球碳排放报告PDF,找出排放量最大的5个国家,
   对比它们2010年的排放数据(可能在另一份报告中),
   计算12年间的变化率,并用Python绘制对比图

需要工具组合:
- web_search(找到PDF链接)
- file_download(下载PDF)
- pdf_parser(提取数据表格)
- python_executor(数据处理+绘图)

Hermes Level 3 成功率:约 23%(极难,需完美串联多工具)

65.2.3 GAIA 难度分布与 Hermes 表现

级别 题目数 平均步骤 Hermes 人类专家 GPT-4
Level 1 165 1-2步 71.5% 92.1% 67.3%
Level 2 86 3-7步 47.7% 84.6% 39.2%
Level 3 25 8+步 22.9% 75.4% 14.8%
总计 276 55.4% 86.9% 47.8%

65.3 Terminal-Bench 2.0:代码执行的严酷测试

65.3.1 Terminal-Bench 2.0 概述

Terminal-Bench 2.0 专注测试 Agent 在终端环境中的代码执行、调试和系统操作能力。它比 AgentBench 的 OS 环境更为严苛——任务更长、环境更复杂、错误更难恢复。

测试维度

Terminal-Bench 2.0 测试矩阵:
┌────────────────┬──────────────┬─────────────────┐
│ 类别           │ 难度         │ 典型时长        │
├────────────────┼──────────────┼─────────────────┤
│ 环境配置       │ Medium       │ 5-15 步         │
│ 代码调试       │ Hard         │ 8-20 步         │
│ 性能优化       │ Hard         │ 10-25 步        │
│ 安全审计       │ Expert       │ 15-30 步        │
│ 系统自动化     │ Medium-Hard  │ 8-18 步         │
└────────────────┴──────────────┴─────────────────┘

65.3.2 典型测试场景

场景:代码调试任务

# Terminal-Bench 2.0 调试任务示例
task_description = """
以下 Python 代码在运行时报错,请找出所有 bug 并修复:

```python
def quicksort(arr, low=0, high=None):
    if high is None:
        high = len(arr)  # Bug 1: 应该是 len(arr) - 1
    
    if low < high:
        pi = partition(arr, low, high)
        quicksort(arr, low, pi - 1)
        quicksort(arr, pi + 1, high)
    
    return arr

def partition(arr, low, high):
    pivot = arr[high]  # Bug 2: high越界风险
    i = low - 1
    
    for j in range(low, high):
        if arr[j] <= pivot:
            i += 1
            arr[i], arr[j] == arr[j], arr[i]  # Bug 3: == 应该是 =
    
    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

测试用例:quicksort([3, 6, 8, 10, 1, 2, 1]) 应返回 [1, 1, 2, 3, 6, 8, 10] """

Hermes Agent 的调试轨迹

debugging_trace = [ {"step": 1, "action": "read_code", "finding": "识别到3处潜在bug"}, {"step": 2, "action": "execute_code", "result": "IndexError: list index out of range"}, {"step": 3, "action": "fix_bug_1", "change": "high = len(arr) - 1"}, {"step": 4, "action": "execute_code", "result": "输出错误,未完全排序"}, {"step": 5, "action": "analyze", "finding": "发现 == 运算符错误"}, {"step": 6, "action": "fix_bug_3", "change": "arr[i], arr[j] = arr[j], arr[i]"}, {"step": 7, "action": "execute_code", "result": "[1, 1, 2, 3, 6, 8, 10] ✓"}, ]


#### 场景:环境配置任务

```bash
# 任务:在 Ubuntu 20.04 上配置一个完整的 Python 数据科学环境
# 包括:conda, jupyter, pytorch(GPU), 并验证GPU可用

# Hermes 的执行步骤(理想轨迹):

# Step 1: 检查系统环境
$ uname -a && nvidia-smi
# → Linux ... GPU: NVIDIA RTX 3080

# Step 2: 安装 Miniconda
$ wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3

# Step 3: 创建环境
$ conda create -n ds python=3.11 -y
$ conda activate ds

# Step 4: 安装 PyTorch(CUDA 11.8)
$ pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

# Step 5: 验证
$ python -c "import torch; print(torch.cuda.is_available())"
# → True ✓

65.3.3 Terminal-Bench 2.0 Hermes 得分

类别 任务数 成功率 平均步数 主要失分原因
环境配置 45 68.9% 11.2 版本兼容性判断
代码调试 60 54.7% 14.8 复杂并发bug识别
性能优化 35 41.2% 18.3 性能瓶颈定位
安全审计 20 29.5% 22.1 高级漏洞识别
系统自动化 40 62.3% 13.5 错误处理完整性
综合 200 53.6% 15.2

65.4 YC-Bench:创业场景评估

65.4.1 YC-Bench 设计背景

YC-Bench 是专为创业公司研发场景设计的 Benchmark,模拟 Y Combinator 批次中常见的技术和业务任务。核心假设:一个真正实用的 AI Agent 应该能够胜任初创公司的全栈工作

任务分类

类别 权重 典型任务
产品原型 25% 从需求到MVP代码
数据分析 20% 用户数据洞察
竞品分析 15% 市场调研报告
技术架构 20% 系统设计方案
内容创作 10% 技术博客/文档
客户沟通 10% 邮件/Pitch Draft

65.4.2 YC-Bench 典型任务示例

# YC-Bench 任务:用户留存分析
yc_task = """
我们的 SaaS 产品上线了6个月,有以下数据(CSV格式):
- user_id, signup_date, last_active_date, plan_type, country

请帮我:
1. 计算各月份的 D1/D7/D30 留存率
2. 对比 Free vs Paid 用户的留存差异
3. 找出留存率最高的3个国家
4. 给出3条提升留存的具体建议
"""

# Hermes 的完整解决方案
hermes_solution = """
我将分步骤完成这个分析:

**Step 1:数据加载与预处理**
```python
import pandas as pd
import numpy as np

df = pd.read_csv('users.csv', parse_dates=['signup_date', 'last_active_date'])
df['days_since_signup'] = (df['last_active_date'] - df['signup_date']).dt.days

# 计算留存
def compute_retention(df, day):
    return (df['days_since_signup'] >= day).mean()

retention = {
    'D1': compute_retention(df, 1),
    'D7': compute_retention(df, 7), 
    'D30': compute_retention(df, 30)
}

Step 2:Free vs Paid 对比 ... """


---

## 65.5 在本地运行这些 Benchmark

### 65.5.1 AgentBench 本地运行

```bash
# 1. 克隆仓库
git clone https://github.com/THUDM/AgentBench.git
cd AgentBench

# 2. 安装依赖
pip install -r requirements.txt

# 3. 配置 Hermes API
cat > configs/agents/hermes.yaml << 'EOF'
name: hermes-agent
type: api
base_url: https://api.hermes.nousresearch.com/v1
model: hermes-3-70b
api_key: ${HERMES_API_KEY}
temperature: 0.0
max_tokens: 4096
EOF

# 4. 运行单个环境测试
python run_eval.py \
  --agent configs/agents/hermes.yaml \
  --task configs/tasks/os.yaml \
  --output results/hermes_os.json

# 5. 运行全量测试(耗时约 4-6 小时)
python run_eval.py \
  --agent configs/agents/hermes.yaml \
  --all-tasks \
  --parallel 4 \
  --output results/hermes_full.json

65.5.2 GAIA 本地运行

# GAIA 需要 HuggingFace 访问权限
from datasets import load_dataset
from hermes_agent import HermesAgent

# 加载数据集
gaia = load_dataset("gaia-benchmark/GAIA", "2023_all")

agent = HermesAgent(
    api_key=os.environ["HERMES_API_KEY"],
    tools=["web_search", "web_fetch", "python_executor", "file_reader"]
)

results = []
for task in gaia["validation"]:  # 先在验证集测试
    level = task["Level"]
    question = task["Question"]
    expected = task["Final answer"]
    
    # 运行 Agent
    response = agent.run(
        task=question,
        max_steps=20 if level <= 2 else 40,
        timeout=300  # 5分钟超时
    )
    
    # 评估(GAIA 使用精确匹配)
    success = normalize_answer(response) == normalize_answer(expected)
    
    results.append({
        "level": level,
        "task_id": task["task_id"],
        "success": success,
        "response": response,
        "expected": expected,
        "steps": len(response.trace),
    })

# 输出分级统计
for level in [1, 2, 3]:
    level_results = [r for r in results if r["level"] == level]
    success_rate = sum(r["success"] for r in level_results) / len(level_results)
    print(f"Level {level}: {success_rate:.1%} ({len(level_results)} tasks)")

65.5.3 结果解读与能力边界判断

def interpret_benchmark_results(results: dict) -> str:
    """根据 Benchmark 结果判断 Agent 能力边界"""
    
    insights = []
    
    # AgentBench 分析
    if results.get("agentbench"):
        ab = results["agentbench"]
        if ab["os_score"] < 60:
            insights.append("⚠️ Bash命令能力不足,不适合运维自动化场景")
        if ab["db_score"] > 75:
            insights.append("✅ SQL能力强,适合数据分析任务")
        if ab["hh_score"] < 50:
            insights.append("⚠️ 空间推理弱,不适合物理世界操作类任务")
    
    # GAIA 分析
    if results.get("gaia"):
        g = results["gaia"]
        if g["level3_rate"] < 0.25:
            insights.append("⚠️ 复杂多步任务成功率低,建议任务分解")
        if g["level1_rate"] > 0.70:
            insights.append("✅ 基础信息检索能力良好,适合简单问答场景")
    
    # Terminal-Bench 分析
    if results.get("terminal_bench"):
        tb = results["terminal_bench"]
        if tb["security_audit_rate"] < 0.35:
            insights.append("⚠️ 安全审计能力有限,不适合独立安全扫描")
    
    return "\n".join(insights)

本章小结

本章系统解析了四大 Benchmark 的设计逻辑和 Hermes 的实际表现:

  1. AgentBench:8个环境覆盖 OS/DB/KG/Web 等核心场景,Hermes 综合得分 65.1,DB和OS环境最强
  2. GAIA:三级难度递进,Level 3 对所有 Agent 都极具挑战,Hermes 整体 55.4%
  3. Terminal-Bench 2.0:代码执行专项测试,安全审计是最大弱点(29.5%)
  4. YC-Bench:创业场景综合测试,更贴近实际业务需求
  5. 落地运行:提供了从配置到执行的完整操作步骤

思考题

  1. 如果你的业务场景主要是数据分析,应该重点关注哪个 Benchmark 的哪个环境/维度来评估 Hermes 是否适合?
  2. GAIA Level 3 的成功率普遍偏低(最好的模型也不到30%),这说明了什么?如何通过工程手段(而非模型升级)提升复杂任务成功率?
  3. Terminal-Bench 的安全审计任务成功率只有 29.5%,这对你的安全使用场景意味着什么?
  4. 这些 Benchmark 都有哪些可能的"过拟合"风险——即 Benchmark 得分高,但实际业务表现差的情况?
本章评分
4.9  / 5  (3 评分)

💬 留言讨论