很多团队做 Agent 调试时,手里只有两样东西:模型返回文本和几行控制台日志。
这在 Demo 阶段还能勉强工作,一到线上就会失效。因为线上故障很少是“模型一句话答错了”,更常见的是:
- 检索拿到了错的片段
- 规划循环了两轮后才超时
- 工具调用第一次成功、第二次因为幂等冲突失败
- 最终回答看着正常,但中途已经发生过降级
如果这些事件没有被串起来,你就无法回答一个最基本的问题:
$$ 这次失败到底是在哪里开始失控的? $$
建议和 AI Agent 评估框架完全指南、AI Agent 并发与可靠性、Function Calling 工程实战 一起看。
一、日志、指标、Trace、回放分别负责什么
| 组件 | 解决的问题 | 不能替代什么 |
|---|---|---|
| 日志 | 记录单点事件 | 不能还原完整上下文 |
| 指标 | 看趋势和异常波动 | 不能解释单次失败 |
| Trace | 还原一次 run 的调用链 | 不能自动给结论 |
| 回放 | 重现失败过程 | 不能替代实时监控 |
很多系统的问题就在于只做了其中一层。
二、最小可行的 Trace 结构
至少给每次 run 生成一个全局 run_id,然后把关键阶段挂在这条链上。
推荐字段:
| 字段 | 含义 | 为什么必须有 |
|---|---|---|
run_id | 本次任务唯一标识 | 串联整条调用链 |
session_id | 用户会话或业务上下文 | 看跨轮次影响 |
step_id | 当前阶段标识 | 追踪状态迁移 |
tool_name | 调用的工具名 | 归因工具层失败 |
policy_result | 权限或策略判定结果 | 识别被阻断原因 |
latency_ms | 阶段耗时 | 定位瓶颈 |
token_usage | token 消耗 | 看成本与预算 |
degrade_reason | 降级原因 | 判断体验退化是否可接受 |
三、一个典型失败案例:超时了,但你不知道卡在哪
某个客服 Agent 的线上异常表现是“平均时延正常,但用户偶发等待 20 秒以上”。
最初团队只看到了:
- 端到端时延高
- 最终输出为空
后来把 trace 打开后才发现:
- 检索阶段耗时正常
- 第一个工具调用正常
- 第二个工具因为上游接口抖动超时
- 系统进入重试
- 重试后又触发了一次权限校验
- 最后在降级前耗尽总预算
如果没有分阶段 trace,这类问题几乎只能靠猜。
四、Trace 应该怎么和状态机配合
Agent 的可观测性最好不要只围绕“函数调用”建模,而要围绕“状态迁移”建模。
一条最小状态链可以是:
RECEIVED -> BUILD_CONTEXT -> PLAN -> EXECUTE_TOOL -> VALIDATE -> RESPOND -> DONE
每次状态迁移都要记录:进入时间、退出时间、关键输入、关键输出、异常信号。
这样你做回放时,就不是在看一堆散乱日志,而是在看一次任务如何从一个状态进入下一个状态。
五、回放链路怎么做最划算
你不需要一开始就做复杂的可视化平台。最小方案可以是:
- 保留输入和裁剪后的上下文快照
- 保留规划结果与工具请求参数
- 保留工具返回值摘要
- 保留策略判定结果
- 保留最终输出与关键指标
做到这 5 项,已经足够支撑大多数线上问题复盘。
六、上线前必须看的观测指标
p95_e2e_latencytool_failure_rateschema_fail_ratedegrade_ratereplayable_run_rate
其中 replayable_run_rate 很容易被忽略,但非常重要。没有足够可回放样本,团队的优化就会退化成碰运气。
七、AI Agent 可观测性上线清单
- 每次 run 都有唯一
run_id - 状态迁移有进入和退出打点
- 关键工具调用能关联到同一条 trace
- 失败 run 至少能复原上下文、规划和工具结果摘要
- 指标面板和单次 run 诊断链路能互相跳转


