引言:为什么 Agent 评估如此重要?

随着 AI Agent 从实验走向生产,如何评估一个 Agent 的能力变得至关重要。传统的 LLM 评估方法(如 BLEU、ROUGE)完全不适用于 Agent 场景——Agent 评估需要衡量推理、规划、工具使用和自主决策等多维度能力。

Agent 评估维度

核心评估矩阵

维度子维度关键指标评估方法
任务完成成功率、完成质量Task Success Rate端到端测试
推理能力逻辑、规划、反思Step Accuracy过程分析
工具使用选择准确、调用正确Tool Call F1行为日志
自主性无需人工介入程度Autonomy Level交互统计
安全性越权操作、有害输出Safety Score红队测试
效率Token、时间、成本Cost per Task资源追踪

自主性评级标准

借鉴 SAE 自动驾驶分级思路,我们定义 Agent 自主性等级:

等级名称描述人工介入频率
L0无自主每步都需人工指令100%
L1辅助执行Agent 执行但需人工确认每步>80%
L2条件自主简单操作自主,复杂操作需确认40-80%
L3有界自主在定义范围内完全自主10-40%
L4高度自主仅在边界情况需要人工<10%
L5完全自主无需任何人工介入0%

主流评估基准

1. AgentBench

OpenAI 推出的综合 Agent 评估基准:

# AgentBench 评估框架简化示例
from dataclasses import dataclass
from enum import Enum

class TaskCategory(Enum):
    REASONING = "reasoning"
    TOOL_USE = "tool_use"
    WEB_BROWSING = "web_browsing"
    CODING = "coding"
    MULTI_STEP = "multi_step"

@dataclass
class AgentTask:
    id: str
    category: TaskCategory
    prompt: str
    expected_output: str
    tools_available: list[str]
    max_steps: int
    scoring: dict  # 评分标准

@dataclass
class EvaluationResult:
    task_id: str
    success: bool
    score: float          # 0-1
    steps_taken: int
    tokens_used: int
    time_elapsed: float
    error_type: str | None

def evaluate_agent(agent, tasks: list[AgentTask]) -> list[EvaluationResult]:
    results = []
    for task in tasks:
        result = agent.run(task)
        score = score_output(result.output, task.expected_output, task.scoring)
        
        results.append(EvaluationResult(
            task_id=task.id,
            success=score > 0.8,
            score=score,
            steps_taken=result.step_count,
            tokens_used=result.total_tokens,
            time_elapsed=result.elapsed_time,
            error_type=result.error if not score > 0.8 else None
        ))
    return results

2. SWE-bench

软件工程专项评估,要求 Agent 修复真实 GitHub Issue:

# SWE-bench 评估流程
class SWEBenchEvaluator:
    def __init__(self, repo_dir: str):
        self.repo_dir = repo_dir
        self.test_cases = self.load_test_cases()
    
    def evaluate(self, agent, issue_id: str) -> dict:
        issue = self.get_issue(issue_id)
        
        # Agent 尝试修复
        patch = agent.generate_patch(issue)
        
        # 应用补丁
        self.apply_patch(patch)
        
        # 运行测试
        test_results = self.run_tests(issue.test_files)
        
        # 恢复原始状态
        self.reset_repo()
        
        return {
            "issue_id": issue_id,
            "patch_generated": patch is not None,
            "tests_passed": test_results.passed,
            "tests_failed": test_results.failed,
            "resolve_rate": test_results.passed / (test_results.passed + test_results.failed),
        }

3. WebArena

网页操作能力评估:

任务类型示例评估指标
信息查找在电商网站找到指定商品准确率
表单操作填写注册表单并提交完成率
多页导航从 A 页面到达 B 页面步骤效率
交互操作添加购物车、结账端到端成功率

基准对比

基准评估领域任务数评估方式2026 最佳表现
AgentBench综合500+自动评分GPT-5: 84%
SWE-bench软件工程2294测试通过率Claude 4: 71%
WebArena网页操作812端到端GPT-5: 79%
OSWorld桌面操作469任务完成Claude 4: 72%
GAIA通用推理466准确率GPT-5: 75%

自动化评估工具链

评估流水线

import asyncio
from dataclasses import dataclass
from typing import Callable

@dataclass
class EvalConfig:
    agent_factory: Callable
    task_set: str           # "agentbench" | "swebench" | "webarena"
    max_concurrent: int = 5
    timeout_per_task: int = 300
    save_traces: bool = True
    output_dir: str = "./eval_results"

class AgentEvaluationPipeline:
    def __init__(self, config: EvalConfig):
        self.config = config
        self.tasks = self.load_tasks(config.task_set)
    
    async def run(self) -> dict:
        """执行完整评估流水线"""
        semaphore = asyncio.Semaphore(self.config.max_concurrent)
        
        async def run_single(task):
            async with semaphore:
                try:
                    return await asyncio.wait_for(
                        self.evaluate_single(task),
                        timeout=self.config.timeout_per_task
                    )
                except asyncio.TimeoutError:
                    return {"task_id": task.id, "status": "timeout"}
                except Exception as e:
                    return {"task_id": task.id, "status": "error", "error": str(e)}
        
        results = await asyncio.gather(*[run_single(t) for t in self.tasks])
        
        # 生成评估报告
        report = self.generate_report(results)
        return report
    
    async def evaluate_single(self, task) -> dict:
        """评估单个任务"""
        agent = self.config.agent_factory()
        
        # 记录执行轨迹
        trace = []
        start_time = time.time()
        
        try:
            result = await agent.run(task.prompt, tools=task.tools)
            
            # 评分
            score = self.score(result, task)
            
            return {
                "task_id": task.id,
                "status": "completed",
                "score": score,
                "steps": len(trace),
                "time": time.time() - start_time,
                "trace": trace if self.config.save_traces else None,
            }
        except Exception as e:
            return {
                "task_id": task.id,
                "status": "failed",
                "error": str(e),
                "time": time.time() - start_time,
            }
    
    def generate_report(self, results: list) -> dict:
        """生成评估报告"""
        total = len(results)
        completed = [r for r in results if r["status"] == "completed"]
        success = [r for r in completed if r["score"] > 0.8]
        
        return {
            "summary": {
                "total_tasks": total,
                "completed": len(completed),
                "successful": len(success),
                "success_rate": len(success) / total,
                "avg_score": sum(r["score"] for r in completed) / len(completed) if completed else 0,
                "avg_time": sum(r["time"] for r in completed) / len(completed) if completed else 0,
            },
            "by_category": self.breakdown_by_category(results),
            "error_analysis": self.analyze_errors(results),
        }

LLM-as-Judge 评估

# 使用 LLM 作为评估者
from openai import OpenAI

judge_client = OpenAI()

def llm_judge_evaluate(
    task: str,
    agent_response: str,
    reference: str | None = None,
    criteria: list[str] = None
) -> dict:
    """使用 LLM 评估 Agent 输出质量"""
    
    criteria = criteria or [
        "任务完成度:是否完成了用户要求的任务",
        "准确性:输出内容是否准确无误",
        "效率:是否以合理的方式完成任务",
        "安全性:是否存在安全风险",
        "可读性:输出是否清晰易懂",
    ]
    
    prompt = f"""
    你是一个专业的 AI Agent 评估者。请评估以下 Agent 的表现。
    
    任务: {task}
    Agent 输出: {agent_response}
    参考答案: {reference or "无"}
    
    评估维度:
    {chr(10).join(f'{i+1}. {c}' for i, c in enumerate(criteria))}
    
    对每个维度给出 1-5 分的评分和理由,最后给出总分。
    输出 JSON 格式。
    """
    
    response = judge_client.chat.completions.create(
        model="gpt-5",
        messages=[{"role": "user", "content": prompt}],
        response_format={"type": "json_object"},
    )
    
    return response.choices[0].message.content

生产环境监控

在线评估指标

from dataclasses import dataclass, field
from collections import defaultdict
import time

@dataclass
class ProductionMetrics:
    """生产环境 Agent 监控指标"""
    # 任务指标
    total_tasks: int = 0
    successful_tasks: int = 0
    failed_tasks: int = 0
    avg_completion_time: float = 0
    
    # 质量指标
    user_satisfaction: float = 0  # 1-5
    human_handoff_rate: float = 0  # 转人工率
    retry_rate: float = 0
    complaint_rate: float = 0
    
    # 资源指标
    avg_tokens_per_task: int = 0
    avg_cost_per_task: float = 0
    avg_steps_per_task: int = 0
    
    # 安全指标
    safety_violations: int = 0
    unauthorized_actions: int = 0
    
    def success_rate(self) -> float:
        return self.successful_tasks / self.total_tasks if self.total_tasks > 0 else 0
    
    def health_score(self) -> float:
        """综合健康分数 (0-100)"""
        weights = {
            "success_rate": 0.30,
            "satisfaction": 0.25,
            "efficiency": 0.20,
            "safety": 0.15,
            "cost": 0.10,
        }
        score = (
            self.success_rate() * 100 * weights["success_rate"] +
            self.user_satisfaction / 5 * 100 * weights["satisfaction"] +
            (1 - self.retry_rate) * 100 * weights["efficiency"] +
            (1 - self.safety_violations / max(self.total_tasks, 1)) * 100 * weights["safety"] +
            max(0, 100 - self.avg_cost_per_task * 10) * weights["cost"]
        )
        return round(score, 1)

告警规则

# 生产环境告警配置
alert_rules = {
    "success_rate_drop": {
        "condition": "success_rate < 0.85",
        "window": "5min",
        "severity": "critical",
        "action": "notify_oncall",
    },
    "high_cost": {
        "condition": "avg_cost_per_task > $2.00",
        "window": "1hour",
        "severity": "warning",
        "action": "notify_team",
    },
    "safety_violation": {
        "condition": "safety_violations > 0",
        "window": "realtime",
        "severity": "critical",
        "action": "block_agent_and_notify",
    },
    "high_handoff": {
        "condition": "human_handoff_rate > 0.15",
        "window": "1hour",
        "severity": "warning",
        "action": "notify_team",
    },
}

评估挑战与前沿

当前挑战

  1. 评估成本高:完整 AgentBench 评估一次约需 $200-500
  2. 可重复性差:LLM 的随机性导致同一 Agent 多次评估结果不同
  3. 泛化评估难:基准测试表现好不等于真实场景表现好
  4. 安全评估不足:现有基准很少覆盖安全和对齐维度
  5. 多 Agent 评估空白:缺乏多 Agent 协作场景的评估标准

前沿方向

方向说明代表工作
动态基准基准自动更新避免数据污染DynaBench
对抗评估红队对抗测试安全边界Adversarial Agent Eval
真实世界评估在真实环境中评估SWE-bench Verified
多模态评估评估视觉、音频处理能力MM-Agent-Bench
成本效率评估单位成本的任务完成率Efficiency-Adjusted Score

评估最佳实践清单

  • 选择与业务场景匹配的基准测试
  • 多次运行取平均值(至少 3 次)
  • 同时评估成功和失败案例
  • 记录完整执行轨迹用于调试
  • 监控成本并设置预算上限
  • 定期更新评估集防止过拟合
  • 结合自动评估和人工评估
  • 建立持续评估的 CI/CD 流水线

结语

Agent 评估仍是一个快速发展的领域。没有单一指标能全面衡量 Agent 能力,需要构建多维度的评估体系。对于生产团队来说,建立持续监控的在线评估系统比一次性基准测试更为重要。

参考资料

  • OpenAI. (2026). AgentBench: A Comprehensive Evaluation Framework
  • Princeton NLP. (2026). SWE-bench: Can Language Models Resolve Real-World GitHub Issues?
  • CMU. (2026). WebArena: A Realistic Web Environment for Building Autonomous Agents
  • Google DeepMind. (2026). GAIA: A Benchmark for General AI Assistants

加入讨论

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

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