返回文章列表
Agent可观测性事件日志调试可靠性

Agent 日志不是聊天记录:事件模型怎么建,才能调试与复盘

许多团队把 Agent 日志当“对话文本”保存,结果遇到线上问题无法定位根因。本文给出可落地的事件模型:事件类型、因果链、状态快照与审计字段设计,并结合观测性指标解释如何从“看日志”升级到“做复盘”。

2026年3月5日
Synthly 团队
预计阅读 16 分钟
Agent 事件日志结构图:计划事件、工具事件、状态快照与审计链路

📷 Photo by Yan Krukau via Pexels

一、你以为在“记日志”,其实只是在“留聊天记录”

很多 Agent 系统的日志长这样:

  • 用户输入
  • 模型回复
  • 最终答案

这种日志对演示足够,对生产排障几乎无效。因为真正的问题在中间链路:

  • 哪个工具被调用
  • 参数是否被改写
  • 第几次重试才成功
  • 为什么触发降级/回滚

所以要建立一个共识:Agent 日志是执行系统的事件账本,不是对话摘录。


二、事件模型的四层结构

推荐从四层拆分,避免单一大对象难扩展。

1)运行层(Run)

描述一次任务运行的整体上下文:

  • runId
  • tenantId
  • userId
  • goal
  • startedAt / endedAt

2)步骤层(Step)

把执行切成可定位单元:

  • stepId
  • parentStepId
  • plannerVersion
  • toolName
  • riskLevel

3)事件层(Event)

真正用于排障与复盘的核心:

  • eventType(PlanCreated / ToolCallStarted / ToolCallFailed ...)
  • causationId(导致本事件的上游事件)
  • correlationId(同一事务链路)
  • payloadDigest(参数摘要)
  • status(success / failed / timed_out)

4)快照层(Snapshot)

用于“从任意点恢复”:

  • 当前任务图
  • 已完成步骤集
  • 未决步骤队列
  • 审批状态

事件负责可追溯,快照负责可恢复。


三、事件类型设计:别怕多,怕的是语义混乱

一套可用的最小事件字典可以从 12 类起步:

  • RunStarted
  • PlanCreated
  • PlanRevised
  • StepQueued
  • ToolCallStarted
  • ToolCallSucceeded
  • ToolCallFailed
  • RetryScheduled
  • FallbackTriggered
  • ApprovalRequested
  • ApprovalResolved
  • RunCompleted

常见失败是“全部记成 INFO 文本”,导致机器不可分析。事件类型一定要离散化、可聚合。


四、因果链(Causation)比时间顺序更重要

只按时间排序会出现两个问题:

  1. 并发步骤交错,难以看懂
  2. 重试与补偿混在一起,根因被淹没

因此每个事件必须记录:

  • 我由谁触发(causationId
  • 我属于哪条业务链(correlationId

有了因果链,你才能回答:

  • 是哪个失败触发了 fallback?
  • 是哪个审批拒绝导致了终止?

这对事故复盘和面试中的系统设计问题都非常关键。


五、可观测性联动:日志不是终点,指标才是管理语言

日志体系上线后,要立刻映射指标,否则只是“多存了数据”。

建议首批映射:

  • tool_timeout_rate
  • retry_success_rate
  • approval_reject_rate
  • unsafe_action_blocked_count
  • run_resume_success_rate

这组指标能覆盖效率、稳定性、安全三条主线。

如果你刚开始搭建可观测性,可配套阅读:


六、实现建议:从 append-only 事件表开始

不要一上来就做复杂流处理,先做一个稳定的 append-only 事件存储:

  • 一条事件就是一条不可变记录
  • 修改状态通过新增事件表达
  • 快照按固定步长或关键节点生成

这样可以同时获得:

  • 审计友好
  • 回放能力
  • 并发安全

最终你会发现,优秀的 Agent 日志系统不是“写得多”,而是“写得可计算、可追责、可修复”。

更多内容见 /articles,也可在 /apps/new 体验 Agent 交互流程。