小白 / Xiaobai
开发者 · 产品构建者
持续构建 AI 工程系统、开发者工具与长期数字资产。
关于作者与 XBSTACK →
AI Agent Evaluation 实战:任务成功率、工具调用、失败恢复与回归测试体系
AI Agent Evaluation 实战:系统拆解 AI Agent Evaluation 的生产级评估体系,覆盖任务成功率、工具调用准确性、规划质量、状态一致性、失败恢复、成本延迟、人工复核、回归测试和线上监控,帮助开发者量化智能体系统质量。
评估范式升级:为什么最终答案不能代表 Agent 的真实质量
评估 AI Agent 必须将其视为一个动态的分布式执行系统,而不是一个静态的文本生成器。
在传统大语言模型(LLM)的应用中,评估重点通常放在输出文本的质量上,例如回答是否流畅、语义是否切题、是否包含敏感词等。这类评估可以通过主流的自动评测基准,或是利用大模型作为裁判(LLM-as-a-Judge)对最终的答案进行语义相似度与信息准确性的打分。
然而,一旦进入 Agent 时代,最终答案只是验收的一部分。一个 Agent 可能输出一段看起来合理的财务核对报告,但 Trace 中其实发生了错误参数、重复 Tool Call、状态遗漏或权限拒绝。如果评估只盯着最后文本,这些执行层问题就会被掩盖。Token 和重试到底放大多少也必须从 Trace 计数与当前价格核算,不能用“数百倍”作为没有实验记录的通用结论。
因此,生产环境下的 Agent 评估必须完成从单点文本打分向多维执行链路审计的升级。以下是两者的核心评估差异:
| 评估维度 | 传统语言模型评估 (LLM Evaluation) | 智能体系统评估 (Agent Evaluation) |
|---|---|---|
| 评估目标 | 最终生成的文本答案质量与语义一致性 | 任务成功率、决策规划、工具调用、状态一致性与容错自愈 |
| 评估颗粒度 | 单次请求-响应 (Request-Response) 级 | 跨多轮 ReAct 推理环、包含多次外部交互的执行 Trace 级 |
| 工具交互 | 不包含或仅包含简单的单步 Function Calling | 包含动态 Tool RAG、多参数强校验、高危动作审批及幂等控制 |
| 异常感知 | 仅评估是否输出错误信息 | 评估在 API 限流(429)、超时(504)下的自愈重试与降级 |
| 成本观测 | 单次交互的 Token 数量与 API 响应延迟 | 整个任务周期累计消耗的 Token、步骤开销与总体执行时长 |
推荐评估架构
构建高确定性的 Agent 评估系统必须实现测试集管理、环境隔离、链路追踪、多维度评估器与回归分析的流程解耦。
为了能够对 Agent 的每次迭代进行自动化、白盒化的质量度量,系统需要搭建一个由测试环境、执行引擎与审计网关组成的闭环评估框架:
测试数据集 (黄金评估集 - 包含 Happy & Failure Paths)
│
▼
评估运行器 (Scenario Runner - 模拟多并发执行环境)
│
├──► Mock API 沙箱 (隔离物理写操作,防止脏数据)
▼
智能体执行体 (Agent Under Test - 读取待测 Prompt / 逻辑)
│
▼
Trace 收集网关 (Trace Collector - 记录每次 Step 原始载荷与时延)
│
▼
并行多维评估模块 (Parallel Evaluators)
├─► 工具调用评估器 (Tool Call Evaluator) ──► 参数精度与安全越权校验
├─► 状态一致评估器 (State Consistency Evaluator) ─► 状态字段对比
├─► RAG 知识评估器 (Retrieval & Citation Evaluator) ─► 引用准确度审计
└─► 失败恢复评估器 (Resilience Evaluator) ────► 容错重试路径审计
│
▼
回归报告生成器 (Regression & Cost Analyzer - 汇总 Token 成本与时延变化)
在这个架构中,评估流程从测试数据集中提取用例,并在 Scenario Runner 中并行调度执行。需要特别注意的是,被评估的 Agent 严禁直接访问生产数据库或产生真实的写动作,必须在 Mock API 沙箱中进行物理隔离。所有的执行日志和中间决策过程通过 Trace Collector 统一归档,最终送往专门的评估节点生成量化报告。
工具调用评估:白盒防线与权限拦截
评估工具调用必须将工具选择准确率、参数注入校验、越权调用防范以及调用频次控制作为最硬性的安全红线。
在 Agent 的运行流程中,工具调用(Tool Calling)是模型对外部物理世界施加影响的唯一手段。针对工具调用的评估,不能简单看它有没有调用工具,而是要对调用的每个细节进行防御性分析:
- 工具选择精准度(Tool Selection Accuracy):评估 Agent 在面对数十个候选工具时,是否精准定位了最相关的 API。评估算法不仅计算查准率,更要评估是否存在漏选(本该调用的工具未调用)和多选(无意义的干扰调用)。
- 参数类型与值校验(Argument Validation):模型生成的 JSON 载荷是否符合工具约定的 Schema。评估层应捕获所有因格式、缺失必填项或超出范围产生的参数异常。
- 越权调用与安全围栏(Unauthorized Call Prevention):评估 Agent 是否根据当前会话对应的租户 ACL(访问控制列表),发起了超出权限的请求。例如,普通用户在会话中诱导 Agent 查询系统管理配置,评估模块应断言此行为被拦截器阻止。
- 重复调用与幂等性(Idempotency Check):评估在面对网络超时重试时,Agent 是否重复发送了写请求,或者能够正确透传幂等性令牌。
在工程落地中,我们可以编写一个专用的 Tool Trace 评估器,对 Agent 吐出的 trace 数据执行自动化校验:
from pydantic import BaseModel, Field, ValidationError
from typing import Dict, List, Any
class ExpectedToolCall(BaseModel):
tool_name: str
required_args: List[str]
forbidden_args: List[str]
allowed_roles: List[str]
def evaluate_tool_calls(
actual_trace: List[Dict[str, Any]],
gold_specs: List[ExpectedToolCall],
user_role: str
) -> Dict[str, Any]:
evaluation_result = {
"success": True,
"errors": [],
"metrics": {
"total_calls": 0,
"correct_selections": 0,
"unauthorized_blocks": 0
}
}
gold_map = {spec.tool_name: spec for spec in gold_specs}
evaluation_result["metrics"]["total_calls"] = len(actual_trace)
for call in actual_trace:
tool_name = call.get("name")
args = call.get("arguments", {})
if tool_name not in gold_map:
evaluation_result["success"] = False
evaluation_result["errors"].append(f"调用了未授权或不存在的工具: {tool_name}")
continue
spec = gold_map[tool_name]
evaluation_result["metrics"]["correct_selections"] += 1
# 权限评估
if user_role not in spec.allowed_roles:
evaluation_result["metrics"]["unauthorized_blocks"] += 1
evaluation_result["success"] = False
evaluation_result["errors"].append(
f"安全越权: 角色 {user_role} 无权调用工具 {tool_name}"
)
# 缺失必填字段评估
missing_fields = [field for field in spec.required_args if field not in args]
if missing_fields:
evaluation_result["success"] = False
evaluation_result["errors"].append(
f"工具 {tool_name} 缺失必要参数: {missing_fields}"
)
# 禁用字段注入评估
forbidden_fields = [field for field in spec.forbidden_args if field in args]
if forbidden_fields:
evaluation_result["success"] = False
evaluation_result["errors"].append(
f"工具 {tool_name} 被注入了违规字段: {forbidden_fields}"
)
return evaluation_result
通过这一层白盒审计,每一次工具调用的合规度和精度都能在测试报告中以数字形式量化,确保新合并的代码不会破坏已有的安全拦截逻辑。
状态一致性评估:确保多节点交接与 Checkpoint 正常
状态一致性评估必须验证多轮对话和复杂工作流中 Session/Thread 数据、任务状态以及 Agent 间交接(Handoff)的上下文无损传递。
Agent 往往不是单次执行的函数,它需要在多轮长对话中维护历史记忆,或者在有状态的图架构(如 LangGraph)中跨节点运行。这就要求评估层对状态的持续完整性进行细致度量:
- 记忆对齐(Memory Consistency):检验 Agent 在经历多轮复杂的、干扰性的对话后,是否依然能准确提取前文约定的基础上下文(如用户 ID、当前待结算订单)。
- 状态交接(Handoff Integrity):在多智能体架构中,当主 Agent 将控制权转移给特定领域的子 Agent(例如客服智能体转交工单给财务智能体)时,公共状态字典中的 canonical 字段是否在交接过程中出现丢失或错位。
- 检查点恢复(Checkpoint Recovery):测试当 Agent 执行到中途发生系统断电或超时中断后,能否利用持久化的 Checkpoint(检查点)无损复原执行状态,而不是从头启动并重复执行之前的工具调用。
评估这些指标时,可以设计状态探针,在 Handoff 前后比较 canonical 字段、版本号与业务不变量。对于明确标记为“必须保留”的字段,任何丢失都可以作为硬失败断言;对于可重新计算、可选或已经过期的字段,则应按业务语义评估,不能把所有 state diff 都解释成 Context Loss。
RAG 与知识型 Agent 评估:检索精度、Citation 核查与权限隔离
知识型 Agent 的评估必须突破单纯的文本匹配,聚焦于前置检索的 ACL 权限控制、事实引用的原句核对以及基于鲜活度的重排序机制。
对于高度依赖私域文档库的知识库智能体或 RAG 智能体,我们需要独立建设两层评估维度:
- 前置检索权限过滤(Pre-retrieval Filter Evaluation):这是评估安全性的生命线。当不同权限等级的用户向 Agent 提问时,系统必须验证传入向量数据库的 Metadata Filter 中是否正确注入了当前用户的访问权限标识。如果未带权限标识或标识错误,则判定安全性评估失败。
- 引用真实性审计(Citation Check):评估 Agent 回答中所附带的参考来源(Citations)是否能与底层向量库捞出的物理原文原句字字对应。需要特别防范 Agent 产生幻觉、编造文档链接或将 A 文档的结论指派给 B 文档的错误。
评估指标上,推荐使用 Groundedness Score(基于知识库原句的自洽度得分)与 Citation Precision(引用精确度)进行约束。通过比对生成文本中的事实断言(Claims)与检索到的 Chunck 的包含关系,自动拦截无事实支撑的输出。
失败恢复与韧性评估:测试非 happy path 场景
评估集不能只有 Happy Path,但失败用例占比没有统一的“30%”标准。更合理的是根据真实事故、依赖风险和业务影响建立 failure taxonomy,保证每一种关键失败模式都有覆盖,并对高风险场景增加重复试验。
在做 Resilience Evaluation(韧性评估)时,测试集可以模拟以下异常输入:
- 工具调用失败 Mock:模拟第三方 API 返回 500、503 或 429 Rate Limit。评估 Agent 是否会因为没有配置合理的指数退避重试,而疯狂消耗 Token 陷入 ReAct 死循环。
- 模糊意图注入:测试用户发起自相矛盾、信息残缺或刻意诱导的指令。评估 Agent 是否能够主动向用户询问发起澄清对话(Clarification),或者触发降级,将任务标记为待处理并主动求助。
- 格式偏离拦截:模拟 LLM 未按照 JSON-mode 返回标准格式。评估解析层能否捕获异常,将解析报错信息作为 Observation 回喂给大模型,驱动模型在下一轮对话中自愈修正。
对于每一次异常模拟用例,评估指标主要衡量:故障检测率(Failure Detection Rate,系统是否能感知到接口挂了,而不是装作正常继续执行)、人工升级准确率(Escalation Accuracy,是否能及时、干净地将不可恢复的任务分派给人工客服)以及静默失败率(Silent Failure Rate,即工具彻底执行出错但 Agent 却回复用户“已办妥”的最高危事故率)。
安全性与隔离评估:防范越权与提示词注入
评估体系必须作为智能体的红蓝对抗演练沙箱,常态化模拟提示词注入和跨租户越权攻击。
在开放网络环境下,Agent 面临 Prompt Injection 与越权执行等风险。红队评估应该进入持续测试,但执行频率由变更速度、暴露面和风险等级决定,不需要把“每天一次”写成通用规则。
- 注入防御测试:不要只测试固定的“Ignore previous instructions”字符串。评估应覆盖间接注入、工具返回中的恶意内容、编码/分隔符变体和权限诱导,并验证 policy/tool authorization 是否阻止危险副作用。已知攻击用例可以要求全部通过,但不能把它外推成“对所有 Prompt Injection 完美拦截”。
- 租户隔离测试:用 Tenant B 的身份尝试访问 Tenant A 的受保护资源,这类明确禁止的跨租户访问应作为硬失败断言;测试应覆盖直接 ID、搜索、缓存、异步任务和恢复路径,而不是只测一个会话凭证。
成本与延迟评估:防止 Token 级联开销失控
评估系统必须将每次任务的综合运行成本与时延作为上线前必跑的性能阈值,防止高开销的 Agent 拖垮业务。
Agent 由于其 ReAct 循环的特点,其 Token 消耗和延迟呈现出复合型累积的特征。如果评估仅在单轮跑跑,很难发现级联开销问题。我们必须测量以下性能指标:
- 任务平均运行成本(Cost per Task):完成一次端到端任务(包含多轮推理与工具调用)所消耗的输入/输出 Token 总费额。
- 级联重试开销占比(Retry Cost Ratio):记录因为工具重试、格式修复或重新规划产生的额外模型/工具成本。比例异常升高通常提示依赖不稳定、工具 Schema、Prompt 或恢复策略需要排查,但不存在统一的 20% 故障线。
- P95 任务响应时延(Latency P95):在多轮交互中,用户等待整体任务完成的延迟分布。
这三项都应该有 release budget,但阈值必须来自产品场景。例如实时聊天和后台异步审计对 P95 的要求完全不同;模型价格变化后单任务成本预算也会改变。可以在示例项目里配置 $0.1 或 15s 作为演示值,但正式门禁必须由业务 SLO 和成本模型给出,并记录阈值来源。
回归测试与生产监控:如何避免 Prompt 改变导致的连锁崩溃
智能体评估绝不是上线前的一次性工作,而是一个伴随每次变更自动触发、并能将线上失败用例自动清洗回流的持续化集成流水线。
任何关于 Prompt 模板、模型版本、工具 Schema 定义或工作流控制节点(Node)的修改,都可能由于大模型的概率性输出特点引发连锁逻辑崩溃。因此,团队必须将评估融入 CI/CD 回归测试流程:
- CI 触发回归:每次开发者向主仓库提交 Pull Request 时,CI 系统(如 GitHub Actions)自动在测试沙箱中拉起 Scenario Runner,加载最近更新的黄金评估集跑完所有用例,生成前后版本的核心指标对比报告。
- 生产环境数据回流:当线上监控系统捕获到用户投诉、人工客服频繁接管或工具报错时,系统将这些真实的失败 Session Trace 过滤整理,调用大模型去除敏感隐私信息(PII),自动转化为格式化的 expected 评估用例,回灌入黄金回归测试集中。这使得测试集能随着真实业务场景的演变而不断自我优化,形成质量控制的闭环。
对于正在开发或优化智能体交互架构的开发者,建议查阅 OpenAI Agents SDK,深入了解官方在工具手递交(Handoffs)、防御性 Guardrails 以及状态维持层面的底层接口规范,这能有效从架构源头提高 Agent 的可测试性与运行稳定性。
智能体评估中的常见坑与报错诊断
在生产实践中,开发者构建评估系统时最容易踩中以下几类典型工程陷阱:
Error: Judge Model Over-fitting and Bias (裁判模型的自我膨胀与客套偏见)
- 现象:LLM-as-a-Judge 可能偏好冗长、礼貌或与自身生成风格相似的答案,而没有充分惩罚事实、结构或工具错误。
- 归因:Judge 本身也是概率模型,Rubric、位置偏差、模型家族和上下文都会影响评分。
- 解决方案:把事实、任务完成、格式/Schema、引用与安全要求拆成可独立验证的 rubric;能用确定性断言检查的项不要交给 Judge。各维度权重应由业务重要性和人工金标准校准,不存在通用的“逻辑 90%、风格 5%”。定期抽样做人工盲评,统计 Judge 与人的一致率和系统偏差。
Error: Token Budget Cascade Bleeding (Token 级联空耗与成本熔断失效)
- 现象:复杂 failure case 可能因为重复 Tool Call、格式修复或重新规划让测试时延和成本显著增加。
- 归因:工作流缺少任务级 budget、终止条件、超时和幂等恢复,导致同一失败被重复处理。
- 解决方案:为每类任务配置最大模型调用、最大步骤、总 Token/费用、wall-clock timeout 和连续无进展熔断。
max_iterations=10、timeout_seconds=30可以出现在示例代码里,但不是生产通用值;阈值要根据正常任务分布和失败成本校准。
Error: Evaluation Data Leakage (评估集污染与真实泛化能力退化)
- 现象:开发集分数持续提高,但在新的盲测样本或线上长尾请求中明显退化。
- 归因:开发过程中反复针对同一组样本调 Prompt/工具策略,或者训练、检索语料与盲测样本之间发生泄漏。
- 解决方案:把开发集、回归集和真正的盲测/holdout 分开,记录样本来源和版本;具体拆分比例取决于数据规模。定期从新的真实失败、合成变体和领域边界补充测试,而不是固定采用 50/50、每两周扰动等规则。
常见问题解答
Q: 是否可以完全用大模型自评来代替人工评估?
A: 不建议。LLM-as-a-Judge 适合规模化比较语义质量,但权限、Schema、幂等和状态不变量应尽量使用确定性断言;事实和高风险决策还需要独立证据或人工金标准。人工抽样频率应随业务风险和变更幅度调整,而不是所有版本固定一种流程。
Q: 当项目刚起步、黄金测试样本较少时,该如何建立评估集?
A: 从最关键的用户任务和已知失败模式开始即可,不必追求固定的 30-50 条或 70/30 配比。先覆盖核心 Happy Path、权限边界、依赖失败和最昂贵的错误,再根据线上失败、人工纠错与新功能扩展。小数据集更需要明确 expected behavior 和高质量标注,而不是用数量制造安全感。
Q: 为什么有时候修改了 Prompt,工具调用成功率提升了,答案质量却下降了?
A: 这是典型的“Prompt 挤压效应”。大模型对上下文的注意力分布是有限的,当你在系统 Prompt 中加入了过多的工具参数限制与格式警告时,会挤占模型在逻辑推理和最终文本润色上的注意力权重,导致答案可读性降低。解决方案是实现模块化解耦,不要在系统 Prompt 中堆积所有限制,而是把工具校验、格式规范与答案生成拆分成独立的 Pipeline 步骤,分摊模型的注意力开销。
继续阅读
- 👉 AI Agent 全栈指南 2026:先回到生产化总路线图
- 👉 AI Agent Architecture 实战:从 Prompt 到生产级智能体系统的架构设计
- 👉 AI Agent Planning 实战:任务拆解、计划校验、重规划与失败恢复
- 👉 AI Agent Tool Use 实战:工具注册、权限控制、参数校验与调用审计
- 👉 LangGraph 实战:用状态机、Checkpoint 与 Human-in-the-loop 控制 Agent 工作流
- 👉 LangGraph Observability 实战:如何追踪每个 Agent 的决策路径?
从单个 Agent 问题继续进入完整生产体系
AI Agent 专题统一组织架构、记忆、工具调用、评测、安全、部署和多智能体协作,让每篇文章都回到明确的主题主页面。
继续阅读
返回专题 →AI 工程周报
只发真正改变工程判断的变化、故障、实验和新资产。
参与讨论
问题、验证与勘误
登录后可发表评论。所有新评论先进入审核;审核期间仅评论者本人和管理员可见,通过后才公开。