引言:Agent评估的工程困境

2026年,AI Agent 已广泛应用于代码生成、数据分析、客服自动化等场景。但一个尖锐的问题始终困扰着工程团队:**如何评估一个 Agent 系统的质量?**传统的 LLM 评估方法(Benchmark、困惑度)对 Agent 几乎无效。Agent 的行为是多步骤、非确定性的——同一个输入可能产生完全不同的执行路径,最终结果也可能"殊途同归"。更复杂的是,Agent 的失败模式往往是隐蔽的:它可能完成了任务但使用了低效的路径,或者得到了正确答案但基于错误的推理。本文将系统性地构建一个从开发到生产的 Agent 评估体系,涵盖离线 Benchmark、在线监控和持续改进的完整闭环。## Agent 评估与传统 LLM 评估的本质差异### 评估维度对比| 维度 | 传统 LLM 评估 | Agent 评估 ||------|-------------|-----------|| 输入 | 单次提示 | 多轮交互 + 工具调用 || 输出 | 文本生成 | 动作序列 + 最终结果 || 正确性 | 与标准答案对比 | 目标达成 + 过程质量 || 确定性 | 相对确定(温度=0) | 高度非确定 || 评估粒度 | 输出级别 | 步骤级别 + 路径级别 + 结果级别 || 评估成本 | 低(自动对比) | 高(需要模拟环境或人工) || 失败模式 | 输出错误 | 路径低效、工具误用、循环、超时 |### Agent 的六种失败模式pythonfrom enum import Enumclass AgentFailureMode(Enum): """Agent 失败模式分类""" WRONG_ANSWER = "wrong_answer" # 最终答案错误 RIGHT_ANSWER_WRONG_REASONING = "rawr" # 答案对但推理错 EFFICIENT_PATH_VIOLATION = "inefficient" # 正确但路径低效 TOOL_MISUSE = "tool_misuse" # 工具调用错误 INFINITE_LOOP = "loop" # 陷入循环 TIMEOUT = "timeout" # 超时未完成 PARTIAL_COMPLETION = "partial" # 部分完成 SAFETY_VIOLATION = "safety" # 安全违规# 各失败模式的检测难度和影响failure_analysis = { AgentFailureMode.WRONG_ANSWER: { "detect_difficulty": "低", "impact": "高", "auto_detectable": True, }, AgentFailureMode.RIGHT_ANSWER_WRONG_REASONING: { "detect_difficulty": "高", "impact": "高(隐患)", "auto_detectable": False, # 需要 LLM-as-Judge }, AgentFailureMode.EFFICIENT_PATH_VIOLATION: { "detect_difficulty": "中", "impact": "中(成本+延迟)", "auto_detectable": True, }, AgentFailureMode.TOOL_MISUSE: { "detect_difficulty": "中", "impact": "高", "auto_detectable": True, }, AgentFailureMode.INFINITE_LOOP: { "detect_difficulty": "低", "impact": "高(资源浪费)", "auto_detectable": True, },}text## 第一层:离线评估框架### 1.1 任务完成度评估pythonclass AgentEvaluator: """Agent 综合评估器""" def __init__(self, llm_judge, simulation_env): self.judge = llm_judge self.env = simulation_env def evaluate(self, agent, test_cases: List[dict]) -> dict: """评估 Agent 在测试集上的表现""" results = [] for case in test_cases: result = self._evaluate_single(agent, case) results.append(result) return self._aggregate(results) def _evaluate_single(self, agent, case: dict) -> dict: """评估单个测试用例""" trace = agent.execute( task=case["task"], env=self.env.clone(), # 隔离环境 max_steps=case.get("max_steps", 20), ) return { "case_id": case["id"], "task": case["task"], "trace": trace, "metrics": { # 1. 结果正确性 "task_success": self._check_success( trace, case["expected"] ), # 2. 步骤效率 "step_efficiency": self._step_efficiency( trace, case.get("optimal_steps", 5) ), # 3. 工具使用准确率 "tool_accuracy": self._tool_accuracy(trace), # 4. 路径质量 "path_quality": self._path_quality( trace, case.get("reference_path") ), # 5. 推理质量(LLM-as-Judge) "reasoning_quality": self._reasoning_quality( trace, case["task"] ), # 6. 安全性 "safety_score": self._safety_check(trace), # 7. 成本 "token_usage": trace.total_tokens, "api_calls": trace.total_api_calls, # 8. 延迟 "latency_ms": trace.total_latency_ms, } }text### 1.2 LLM-as-Judge 评估pythonclass LLMAsJudge: """LLM 评审员""" def __init__(self, judge_model, rubric: str): self.judge = judge_model self.rubric = rubric # 评分标准 def evaluate_reasoning(self, trace, task: str) -> dict: """评估推理质量""" prompt = f""" 你是一个 AI Agent 评估专家。请评估以下 Agent 执行轨迹。 任务:{task} Agent 执行轨迹: {self._format_trace(trace)} 评分标准(1-5分): {self.rubric} 请从以下维度评估: 1. 理解准确性:Agent 是否正确理解了任务? 2. 规划合理性:Agent 的步骤规划是否合理? 3. 工具选择:Agent 是否选择了正确的工具? 4. 错误处理:Agent 遇到错误时的恢复能力如何? 5. 推理深度:Agent 的推理是否足够深入? 输出 JSON 格式: {{ "understanding": {{"score": 1-5, "reason": "..."}}, "planning": {{"score": 1-5, "reason": "..."}}, "tool_selection": {{"score": 1-5, "reason": "..."}}, "error_handling": {{"score": 1-5, "reason": "..."}}, "reasoning_depth": {{"score": 1-5, "reason": "..."}}, "overall": {{"score": 1-5, "summary": "..."}} }} """ response = self.judge.generate(prompt, temperature=0.0) return self._parse_judgment(response) def evaluate_correctness(self, agent_answer, expected_answer, task: str) -> dict: """评估答案正确性(支持开放式答案)""" prompt = f""" 任务:{task} 标准答案:{expected_answer} Agent 答案:{agent_answer} 请判断 Agent 答案是否正确。对于开放式任务,判断是否 包含标准答案的关键信息点。 输出 JSON: {{ "is_correct": true/false, "confidence": 0.0-1.0, "missing_points": ["未覆盖的关键点"], "extra_points": ["多余的错误信息"], "reasoning": "判断理由" }} """ response = self.judge.generate(prompt, temperature=0.0) return self._parse_judgment(response)text### 1.3 AgentBench:多维度 Benchmark 套件pythonclass AgentBenchmark: """Agent 多维度评估套件""" BENCHMARKS = { # 代码生成与执行 "swe_bench": { "description": "真实 GitHub Issue 修复", "metrics": ["resolved", "partial", "failed"], "evaluation": "test_based", "difficulty": "hard", }, "human_eval": { "description": "函数级代码生成", "metrics": ["pass@1", "pass@10"], "evaluation": "test_based", "difficulty": "medium", }, # 工具使用 "tool_bench": { "description": "多工具编排任务", "metrics": ["success_rate", "tool_accuracy", "avg_steps", "recovery_rate"], "evaluation": "simulation", "difficulty": "medium", }, # 推理 "gaia_benchmark": { "description": "通用 AI 助手能力", "metrics": ["accuracy", "efficiency"], "evaluation": "answer_based", "difficulty": "hard", }, # 多轮对话 "mt_bench_agentic": { "description": "多轮 Agent 对话", "metrics": ["task_completion", "conversation_quality"], "evaluation": "llm_judge", "difficulty": "medium", }, # 安全性 "safety_bench": { "description": "Agent 安全行为", "metrics": ["safety_violation_rate", "refusal_accuracy"], "evaluation": "rule_based", "difficulty": "easy", }, } def run_full_evaluation(self, agent) -> dict: """运行完整评估套件""" results = {} for name, config in self.BENCHMARKS.items(): print(f"运行 {name}...") test_data = self._load_benchmark(name) if config["evaluation"] == "test_based": results[name] = self._eval_test_based(agent, test_data) elif config["evaluation"] == "simulation": results[name] = self._eval_simulation(agent, test_data) elif config["evaluation"] == "llm_judge": results[name] = self._eval_llm_judge(agent, test_data) elif config["evaluation"] == "rule_based": results[name] = self._eval_rule_based(agent, test_data) return resultstext## 第二层:在线监控体系### 2.1 实时质量监控pythonclass AgentMonitor: """Agent 生产环境监控""" def __init__(self, config): self.metrics = MetricsCollector() self.alerting = AlertManager(config.alerts) self.llm_judge = LLMJudge(config.judge_model) def monitor_execution(self, trace: AgentTrace): """监控单次 Agent 执行""" # 1. 实时指标采集 self._collect_realtime_metrics(trace) # 2. 异常检测 anomalies = self._detect_anomalies(trace) if anomalies: self.alerting.alert(anomalies) # 3. 异步质量评估(不阻塞用户) asyncio.create_task( self._async_quality_check(trace) ) def _collect_realtime_metrics(self, trace: AgentTrace): """采集实时指标""" metrics = { # 执行指标 "agent.steps.count": len(trace.steps), "agent.duration_ms": trace.duration_ms, "agent.tokens.total": trace.total_tokens, "agent.api.calls": trace.api_call_count, # 工具指标 "agent.tool.calls": trace.tool_call_count, "agent.tool.errors": trace.tool_error_count, "agent.tool.types": [s.tool_name for s in trace.steps if s.type == "tool_call"], # 质量指标 "agent.task.success": trace.success, "agent.task.partial": trace.partial_success, "agent.task.timeout": trace.timed_out, "agent.task.loop_detected": trace.loop_detected, } for key, value in metrics.items(): self.metrics.gauge(key, value) def _detect_anomalies(self, trace: AgentTrace) -> List[dict]: """异常检测""" anomalies = [] # 1. 步骤数异常(过多可能陷入循环) if len(trace.steps) > 15: anomalies.append({ "type": "excessive_steps", "severity": "warning", "detail": f"Agent 执行了 {len(trace.steps)} 步", }) # 2. 工具调用失败率 if trace.tool_call_count > 0: error_rate = trace.tool_error_count / trace.tool_call_count if error_rate > 0.3: anomalies.append({ "type": "high_tool_error_rate", "severity": "critical", "detail": f"工具错误率 {error_rate:.0%}", }) # 3. Token 消耗异常 if trace.total_tokens > 50000: anomalies.append({ "type": "high_token_usage", "severity": "warning", "detail": f"消耗 {trace.total_tokens} tokens", }) # 4. 循环检测 if self._detect_loop(trace): anomalies.append({ "type": "loop_detected", "severity": "critical", "detail": "检测到 Agent 陷入循环", }) # 5. 延迟异常 if trace.duration_ms > 60000: anomalies.append({ "type": "high_latency", "severity": "warning", "detail": f"执行耗时 {trace.duration_ms/1000:.1f}s", }) return anomalies def _detect_loop(self, trace: AgentTrace) -> bool: """循环检测算法""" actions = [s.action_signature for s in trace.steps] # 滑动窗口检测重复模式 for window_size in [2, 3, 4]: for i in range(len(actions) - window_size * 2): pattern = actions[i:i+window_size] next_pattern = actions[i+window_size:i+window_size*2] if pattern == next_pattern: return True return Falsetext### 2.2 用户反馈采集pythonclass FeedbackCollector: """用户反馈采集器""" def __init__(self): self.feedback_store = FeedbackStore() async def collect_implicit_feedback(self, trace: AgentTrace): """采集隐式反馈""" feedback = { "trace_id": trace.id, "implicit_signals": {}, } # 1. 用户是否采纳了 Agent 的建议 if trace.result_type == "suggestion": adopted = await self._check_adoption(trace) feedback["implicit_signals"]["adopted"] = adopted # 2. 用户是否重新提问(暗示不满意) if trace.result_type == "answer": reasked = await self._check_reask(trace.session_id) feedback["implicit_signals"]["reasked"] = reasked # 3. 用户是否手动修改了 Agent 的输出 if trace.result_type == "code": modified = await self._check_modification(trace) feedback["implicit_signals"]["modified"] = modified # 4. 会话是否在 Agent 回答后很快结束 if trace.result_type == "answer": quick_exit = await self._check_quick_exit(trace) feedback["implicit_signals"]["quick_exit"] = quick_exit self.feedback_store.add(feedback) async def collect_explicit_feedback(self, trace_id: str): """采集显式反馈""" # 在 Agent 回答后展示反馈入口 # "这个回答有帮助吗?" 👍 👎 # "有什么可以改进的?" [文本输入] passtext## 第三层:持续改进闭环### 3.1 基于评估的自动优化pythonclass ContinuousImprovement: """持续改进系统""" def __init__(self, agent, evaluator, monitor): self.agent = agent self.evaluator = evaluator self.monitor = monitor async def improvement_loop(self): """持续改进循环""" while True: # 1. 收集近期生产数据 traces = await self.monitor.get_recent_traces( days=7, sample_size=500 ) # 2. 识别失败模式 failure_patterns = self._analyze_failures(traces) # 3. 生成改进策略 improvements = self._generate_improvements( failure_patterns ) # 4. 离线评估改进效果 for improvement in improvements: score_before = self.evaluator.evaluate( self.agent, self.test_set ) # 应用改进 improved_agent = self._apply_improvement( self.agent, improvement ) score_after = self.evaluator.evaluate( improved_agent, self.test_set ) # 5. A/B 测试 if score_after > score_before: await self._start_ab_test( self.agent, improved_agent, traffic_split=0.1 ) await asyncio.sleep(86400) # 每天运行一次text## 评估指标体系总览textAgent 评估指标体系├── 结果指标(What)│ ├── 任务完成率│ ├── 答案正确率│ ├── 部分完成率│ └── 安全合规率├── 过程指标(How)│ ├── 步骤效率(实际/最优步数比)│ ├── 工具选择准确率│ ├── 错误恢复率│ ├── 循环检测率│ └── 推理质量评分├── 效率指标(Cost)│ ├── Token 消耗│ ├── API 调用次数│ ├── 端到端延迟│ └── 每任务成本└── 用户体验指标(Experience) ├── 采纳率 ├── 重问率 ├── 修改率 └── 满意度评分text## 结语Agent 评估是一个系统工程,不是单一的 Benchmark 分数可以概括的。离线评估保证基线质量,在线监控捕捉真实分布的异常,持续改进闭环让系统越用越好。对于工程团队,建议从"任务完成率 + 步骤效率 + 工具准确率"三个核心指标起步,逐步引入 LLM-as-Judge 和用户反馈。最重要的是:评估体系本身也需要持续迭代——随着 Agent 能力的提升,评估标准和难度也必须同步升级。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐