评测(Eval)、可观测性(Observability)和安全(Security)是 Agent 从原型走向生产的三大门槛。它们共同回答一个问题:如何确保 Agent 在生产环境中可靠、可控、可信地运行?
开发阶段: Eval(你的 Agent 能力够吗?)
↓
部署阶段: Security(你的 Agent 安全吗?)
↓
运行阶段: Observability(你的 Agent 在做什么?出了问题能发现吗?)
| Benchmark | 领域 | 评测内容 | 局限性 |
|---|---|---|---|
| SWE-bench | 软件工程 | 从 GitHub Issue 到 PR 的全流程 | 真实 repo 复杂度有限 |
| HumanEval | 编程 | 函数级代码生成 | 过于简单,不反映实际编程 |
| GAIA | 通用 Agent | 多工具、多步骤任务 | 场景覆盖有限 |
| WebArena | 网页操作 | 浏览器自动化任务 | 网站会变化 |
| TAU-bench | 多领域 | 航空、零售等真实业务场景 | 规模较小 |
核心矛盾:Benchmark 分数 ≠ 生产可用性。
三层评测体系:
Layer 1: Benchmark(快速筛选)
│ SWE-bench、HumanEval 等标准化测试
│ 作用:粗筛,淘汰明显不达标的方案
│
Layer 2: 领域 Eval(深度验证)
│ 针对你的具体业务场景构建评测集
│ 作用:验证 Agent 在你的场景中的实际表现
│
Layer 3: 用户反馈(持续监控)
收集真实用户的满意度和错误报告
作用:发现 Benchmark 和 Eval 无法覆盖的问题
构建领域 Eval 的要点:
传统软件的调试:看日志、看堆栈。Agent 的调试远比这复杂——LLM 的推理过程是黑盒,工具调用链路可能分叉,同样的输入不一定产生同样的输出。
Agent 可观测性需要回答:
| 工具 | 定位 | 核心功能 |
|---|---|---|
| LangSmith | LangChain 生态 | Trace 可视化、评测运行、Prompt 管理 |
| Langfuse | 开源替代 | Trace、评测、成本追踪、与框架无关 |
| Helicone | API 代理 | 请求日志、成本分析、缓存 |
| Arize Phoenix | ML 可观测性 | Trace、Span 分析、LLM 评估 |
性能指标:
质量指标:
成本指标:
一个好的 Agent Trace 应该包含:
Trace: "给 API 加速率限制"
├── Span: 代码探索 (2.1s, 15K tokens)
│ ├── Tool: Glob("**/middleware/*.go")
│ ├── Tool: Read("middleware/auth.go")
│ └── Tool: Grep("func.*Middleware")
├── Span: 方案设计 (1.5s, 8K tokens)
│ └── LLM: 输出结构化计划
├── Span: 代码实现 (4.2s, 25K tokens)
│ ├── Tool: Write("middleware/ratelimit.go")
│ └── Tool: Write("middleware/ratelimit_test.go")
├── Span: 测试验证 (3.0s, 5K tokens)
│ ├── Tool: Bash("go test ./middleware/...")
│ ├── [FAIL] → 自动修复
│ └── Tool: Bash("go test ./middleware/...") → PASS
└── Span: 集成 (1.2s, 6K tokens)
└── Tool: Edit("router/router.go")
Total: 12.0s, 59K tokens, $0.18
Agent 比传统 LLM 应用多了执行能力,安全风险相应升级:
| 风险类型 | 传统 LLM 应用 | Agent 系统 |
|---|---|---|
| Prompt 注入 | 输出不可信文本 | 执行恶意工具调用 |
| 信息泄露 | 输出敏感信息 | 读取并传输敏感文件 |
| 越权操作 | N/A | 删除文件、执行危险命令 |
| 供应链攻击 | N/A | 恶意 MCP 工具注入 |
Layer 1: Prompt 护栏
│ 系统提示中的行为约束和安全规则
│ "NEVER delete files without explicit user confirmation"
│
Layer 2: Schema 限制
│ 工具参数的类型和范围验证
│ file_path 必须在白名单目录内
│
Layer 3: 运行时审批
│ 高危操作需用户确认
│ 区分可逆(自动执行)和不可逆(需确认)操作
│
Layer 4: 工具验证
│ 执行前检查(文件存在性、权限、安全扫描)
│ 检测潜在的命令注入
│
Layer 5: 生命周期钩子
执行前/后的自定义验证逻辑
支持组织级安全策略注入
| 操作类型 | 可逆性 | 影响范围 | 建议策略 |
|---|---|---|---|
| 读取文件 | 完全可逆 | 本地 | 自动执行 |
| 编辑文件 | 可通过 git 恢复 | 本地 | 自动执行(有 git 时) |
| 创建文件 | 可删除 | 本地 | 自动执行 |
| 删除文件 | 难恢复 | 本地 | 需确认 |
| git push | 影响他人 | 共享 | 需确认 |
| API 调用 | 不可逆 | 外部 | 需确认 |
| 执行脚本 | 不确定 | 不确定 | 需确认 |
常见的 Agent 失败模式及应对策略:
| 失败模式 | 症状 | 根因 | 应对 |
|---|---|---|---|
| 无限循环 | Agent 反复执行相同操作 | 缺少终止条件或结果判断 | 设置最大循环次数 |
| 幻觉工具 | 调用不存在的工具 | 工具 Schema 注入不当 | 严格的 Schema 验证 |
| 上下文遗忘 | 忘记之前的约束 | 上下文窗口溢出 | Compaction + 关键信息置顶 |
| 权限升级 | 尝试执行未授权操作 | Prompt 注入或规则模糊 | 分层权限 + 白名单 |
| 成本爆炸 | Token 消耗异常高 | 无效的探索循环 | Token 预算 + 告警 |
在将 Agent 系统从原型推向生产之前,验证以下要点:
评测:
可观测性:
安全:
运维: