Chapter 06

Agent 评估:轨迹、工具调用与完成率

Agent 不像一次问答,它是一串决策。评估单次响应远远不够,必须同时衡量整条轨迹的合理性与效率。

Agent 与普通 LLM 应用的差别

普通 QA:问题 → 答案(单步)。Agent:问题 → [工具1 → 观察 → 工具2 → 观察 → ...] → 答案(多步)。这多出来的"..."里藏着所有的脆弱性:

四维评估框架

① Final Answer Correctness(终答正确)
用户问题是否被正确解决。这是最终目的,但不是唯一维度——过程烂的 Agent 即使偶尔答对也不可信。
② Tool Selection(工具选择)
每一步是否选了正确的工具。错用工具即使最终答对,也说明"运气好"而非"系统对"。
③ Tool Argument Correctness(参数正确)
工具调用的参数是否正确(日期、ID、字段名、单位)。错参数常导致沉默失败(静默返回空),难以排查。
④ Trajectory Efficiency(轨迹效率)
步数、token、延迟、重复调用次数。"对的答案但 20 步" 是生产灾难。

Trajectory 评估的两种视角

视角 A:Exact Trajectory Match(严格匹配)

拿 Agent 实际走的轨迹与"参考轨迹"比对。适合固定 SOP 的场景。

# 工具调用序列的严格匹配
expected = [
    ("search_order", {"order_id": "12345"}),
    ("get_refund_policy", {"category": "electronics"}),
    ("initiate_refund", {"order_id": "12345", "reason": "defective"}),
]

actual = [
    ("search_order", {"order_id": "12345"}),
    ("get_refund_policy", {"category": "electronics"}),
    ("initiate_refund", {"order_id": "12345", "reason": "defective"}),
]

def trajectory_exact_match(expected, actual):
    return expected == actual

def tool_sequence_match(expected, actual):
    # 忽略参数,只看工具名序列
    return [t[0] for t in expected] == [t[0] for t in actual]
严格匹配的局限 真实 Agent 常有多条合理路径。强求严格匹配会把"合理的替代方案"判为错误,导致指标失真。只建议用于流程强制规定的场景。

视角 B:LLM 裁判轨迹合理性

让 Judge 模型看完整条轨迹,判断每一步是否合理。

TRAJECTORY_JUDGE = """你是 Agent 行为审核员。下面是一个用户问题、Agent 走过的轨迹、最终答案。

用户问题: {question}
轨迹:
{trajectory}
最终答案: {answer}

请独立评估 4 个维度(1-5):

1. task_completion: 最终答案是否解决了用户问题
2. tool_selection:  每一步选的工具是否合适
3. arg_correctness: 工具参数是否正确
4. efficiency:      是否存在冗余/循环/不必要的步骤

返回 JSON:
{{
  "task_completion": {{"score": 1-5, "reason": "..."}},
  "tool_selection":  {{"score": 1-5, "reason": "...", "bad_steps": [1, 3]}},
  "arg_correctness": {{"score": 1-5, "reason": "..."}},
  "efficiency":      {{"score": 1-5, "reason": "...", "redundant_steps": [5]}}
}}"""

常见 Agent 失败模式清单

失败模式表现侦测指标
死循环反复调用相同工具相同参数去重后步数 < 实际步数 * 0.7
幻觉工具调用一个不存在的工具名工具名不在注册表 → 强制 fail
参数污染用前一步结果错置到另一个参数参数校验失败率
过度调用不必要地多次查询步数 / 参考步数 比值
早停中途放弃,返回"无法回答"early-exit 标志
忽略观察看到错误结果仍继续原计划错误观察后行为变化度
回答捏造轨迹失败,最终答案却说"已完成"trajectory vs answer 一致性

效率指标的量化

def agent_efficiency_metrics(trajectory, reference_steps=None):
    n_steps = len(trajectory)
    unique = len(set((t.name, frozenset(t.args.items())) for t in trajectory))
    dup_ratio = 1 - unique / n_steps if n_steps else 0

    total_tokens = sum(t.tokens for t in trajectory)
    total_latency = sum(t.latency_ms for t in trajectory)

    return {
        "n_steps": n_steps,
        "dup_ratio": dup_ratio,
        "total_tokens": total_tokens,
        "total_latency_ms": total_latency,
        "overshoot": n_steps / reference_steps if reference_steps else None,
    }

带环境的 Agent:成功判定

当 Agent 与真实环境交互(更新数据库、发邮件、操作浏览器),评估变成"目标状态是否达成"而非"输出看起来对不对"。

# 例:订单状态 Agent
def check_env_success(db, expected_order_id, expected_status):
    order = db.get_order(expected_order_id)
    return order and order.status == expected_status

# 评估时
def run_eval_case(case):
    env = create_isolated_env(case.initial_state)   # 每个 case 独立沙箱
    agent = build_agent(env)
    trajectory = agent.run(case.user_input)
    success = check_env_success(env.db, case.expected_order_id, case.expected_status)
    return {"success": success, "trajectory": trajectory, "env_final": env.snapshot()}

Benchmark 参考

评估新 Agent 时,公开 benchmark 是基线参考:

τ-bench / τ²-bench
Sierra 出品,客服/旅行预订等真实场景,评估 Agent 与用户模拟器交互下的成功率。工业界新标杆。
SWE-bench
真实 GitHub issue + repo,Agent 要生成 patch 通过测试。代码类 Agent 的金标准。
WebArena / VisualWebArena
浏览器环境的真实 Web 任务。Computer Use 类 Agent 主要基准。
AgentBench
综合基准,8 个环境(OS / DB / API / Web / Game / ...)混合测试。

分步归因:错在哪一步

Agent 评估最重要的不是"成功率 72%",而是"失败的 28% 错在哪个环节"。一种实用分类:

def classify_failure(trajectory, final_correct):
    if final_correct:
        return "success"
    # 未调用任何工具就答
    if len(trajectory) == 0:
        return "no_tool_used"
    # 有死循环
    if has_loop(trajectory):
        return "infinite_loop"
    # 任一工具报错且未重试
    if any(t.error for t in trajectory) and not has_retry(trajectory):
        return "unhandled_error"
    # 参数校验失败
    if any(not validate_args(t) for t in trajectory):
        return "bad_arguments"
    # 步数超阈值
    if len(trajectory) >= MAX_STEPS:
        return "step_budget_exceeded"
    return "reasoning_failure"  # 剩下的多半是推理错

一个完整的 Agent 评估报告

# 评估结果(模拟输出)
n_cases: 200
success_rate: 0.72
avg_steps: 4.3
avg_tokens: 3200
avg_latency_ms: 8400

Failure breakdown:
  - reasoning_failure:   18 (9%)
  - bad_arguments:       12 (6%)
  - step_budget:          8 (4%)
  - infinite_loop:        6 (3%)
  - unhandled_error:      5 (2.5%)
  - no_tool_used:         5 (2.5%)

By difficulty:
  easy:   90% (70 cases)
  medium: 68% (90 cases)
  hard:   50% (40 cases)

Tool selection accuracy: 86%
Arg correctness:         83%
Trajectory efficiency:   0.79 (vs reference avg)
行动信号 看到这个报告,立刻能指导优化:参数错误占 6%,说明 schema 不清晰或 description 不够好;死循环占 3%,说明缺 loop breaker;hard 案例只有 50%,说明推理能力不足,可能要换更强模型。这就是评估体系的力量。

本章小结