AI研究

Agent失败时“什么都不说”,日志里只看到它停在了某个步骤,没有trace_id、没有中间状态、不知道它当时看到了什么——每步输出一行包含输入摘要、耗时和token消耗的结构化日志,和“失败变成可重放的现场”,哪个才是可观测性的第一优先级?

👤 为我痴狂 👁 5 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-11-06
首页› AI› AI研究› 正文
Agent失败时“什么都不说”,日志里只看到它停在了某个步骤,没有trace_id、没有中间状态、不知道它当时看到了什么——每步输出一行包含输入摘要、耗时和token消耗的结构化日志,和“失败变成可重放的现场”,哪个才是可观测性的第一优先级?

摘要与目录

当自主智能体(Agent)在长链路任务中失败时,最常见的现场是:进程仍在、日志停在某一步、没有 trace_id、没有中间状态、不知道它当时看到了什么。工程团队通常有两种直觉反应:一是“先把每步日志打全”,输出包含输入摘要、耗时与 token 消耗的结构化行;二是“先把失败变成可重放的现场”,保留足以复现决策轨迹的状态快照。本文的核心判断是:二者不是同一层级的选项,可重放现场应作为第一优先级,结构化日志是它的必要但不充分子集。理由在于,Agent 的失败本质上是“决策状态不可重建”,而非“日志行缺失”。本文以“因果可重建性”为贯穿主线,从失败分类、状态快照语义、trace 模型、成本边界到工程落地路径逐层展开,并给出可验证的分层实施步骤与数据支撑。

一、背景与问题定义:沉默失败为何成为常态

1.1 从“报错”到“沉默”:Agent 失败形态的迁移

传统服务端程序的失败通常有明确信号:异常栈、HTTP 状态码、退出码。Agent 的失败则大量表现为“语义性沉默”——模型没有抛异常,工具调用返回了 200,循环条件仍然成立,但任务事实上已经偏离目标。这类失败在学术上常被归入“长程任务中的错误累积”与“目标漂移”。ReAct 范式将推理与行动交错(Yao 等,2022),使每一步都依赖上一步的观察,任何一步的观察缺失都会让后续轨迹不可解释。本文评述:把 Agent 当作“会调用工具的模型”是不够的,它更接近一个带外部副作用的分布式状态机,其可观测性问题应按状态机调试而非按应用日志调试来设计。

“沉默失败”的典型特征是:日志里只有“停在某个步骤”,没有 trace_id 串联,没有中间状态,也没有“它当时看到了什么”。这意味着事后无法回答三个最基本的问题:它为什么选择这一步?它看到的输入是否与预期一致?如果重来一次,偏差从哪一步开始?这三个问题恰好对应因果推断中的“反事实可重建性”,也是本文主线的起点。

1.2 问题定义:可观测性的第一优先级判据

本文给出一个可操作的判据:若某类观测数据缺失会导致“失败不可重建”,则该类数据属于第一优先级;若缺失只导致“排查变慢”,则属于第二优先级。按此判据,结构化日志(输入摘要、耗时、token)回答的是“发生了什么、花了多少”,属于第二优先级的效率工具;而可重放现场回答的是“为什么这样发生、能否复现”,属于第一优先级的正确性工具。二者关系不是替代,而是包含:可重放现场天然要求每步有结构化记录,反之不成立。

需要强调边界:在短链路、低副作用、单工具调用的场景中,结构化日志的边际收益可能高于快照成本;本文的判断主要适用于多步规划、外部工具副作用、长上下文三类场景。这一限定将在第四节展开。

1.3 为什么“每步一行日志”不够

一行日志的语义容量有限。它通常包含时间戳、步骤号、输入摘要、耗时、token 数,但摘要是有损压缩:一旦摘要算法丢弃了关键字段(例如工具返回中的错误码、被截断的检索片段、模型输出的隐藏推理),事后无法还原。更关键的是,日志是“时间序”的,而 Agent 的失败诊断需要“因果序”——哪一步的观察导致了哪一步的决策。仅靠时间序日志重建因果,等价于在没有实验设计的情况下做因果推断,误差不可控。笔者认为,这正是“日志很全但依然查不出问题”的根源:数据维度对了,因果结构缺了。

二、原理与技术路线:从日志行到可重放现场

2.1 因果可重建性:本文的分析主线

定义“可重放现场”:在给定一次失败运行后,存在一组持久化记录 R,使得在隔离环境中依据 R 能重建每一步的输入上下文、模型可见的观察、工具调用参数与返回、以及决策分支点,从而复现失败或定位偏差起点。R 的充分性判据是“因果可重建性”:对轨迹中任意一步 t,能回答“若第 k 步(k≤t)的观察不同,第 t 步的决策是否会改变”。这一判据借用了反事实推理的形式化思路(Pearl 因果阶梯),本文评述:工程上不必追求完整反事实,只需保证“关键分支点的观察被完整保留”,即可把不可解释的沉默失败压缩为可定位的少数假设。

由此得到技术路线的三层结构:第一层是标识层(trace_id、span_id、父子关系),解决“串不起来”;第二层是状态层(每步输入输出快照、工具返回原文、上下文窗口切片),解决“看不到当时所见”;第三层是重放层(确定性回放、工具桩、随机种子与模型版本锁定),解决“复现不了”。结构化日志只是第一层加部分第二层的投影。

2.2 标识层:trace 语义在 Agent 场景的扩展

OpenTelemetry 的 trace/span 模型为分布式系统提供了成熟语义,但 Agent 的 span 有额外要求:一次“思考”不是一次 RPC,它可能包含多次模型调用、多次工具调用、以及上下文裁剪。笔者建议把 span 粒度定为“一次对外部世界的可观察动作”(一次模型请求、一次工具调用、一次上下文改写),并用属性标注 token 数、模型版本、温度、工具 schema 版本。这样 trace 树天然对应因果树,父子关系即“谁触发了谁”。

span: agent.step
  trace_id: 4f9c...        # 全链路唯一
  span_id: 7a21...
  parent_span_id: 3c0e...  # 因果父节点
  attrs:
    agent.step_index: 12
    llm.model: "provider-x/v3"
    llm.temperature: 0.2
    llm.prompt_tokens: 3184
    llm.completion_tokens: 412
    tool.name: "search"
    tool.schema_version: "2024-11-02"
    obs.digest: "sha256:..."   # 观察原文的摘要,原文另存
    replay.seed: 991827

本文评述:把 trace_id 当作“日志字段”是常见误区,它真正的价值是建立因果父子关系;没有 parent_span_id 的 trace 只是带编号的日志,无法支撑反事实查询。

2.3 状态层:快照的粒度与有损边界

状态层的核心矛盾是成本与保真。全量保存每步完整上下文会带来存储与隐私压力;只存摘要则丢失可重放性。可行折中是“分层快照”:对每个分支点保存完整上下文(checkpoint),对非分支点保存摘要加指针(指向可回取的原文对象存储)。分支点判定可用启发式:工具返回异常、模型输出包含不确定词、上下文长度跨越阈值、检索结果为空。这样既控制体积,又保证关键现场完整。

快照类型 保存内容 体积量级 可重放性
全量 checkpoint完整上下文、工具原文、模型输出KB–MB/步高
摘要 + 指针摘要、对象存储引用、哈希百字节/步中(依赖原文留存)
结构化日志行时间、步骤、耗时、token百字节/步低

需要说明:上表体积为工程经验量级,非精确测量;具体数值随上下文长度与序列化格式变化。本文评述:分层快照的本质是“用分支点检测把有限预算花在因果关键处”,这与分布式追踪中的采样思想同源,但采样依据从“概率”变为“因果重要性”。

2.4 重放层:确定性从何而来

重放的最大障碍是模型与工具的非确定性。工程上可做三件事:一是锁定模型版本与推理参数(温度、top_p、seed),并在 span 中记录;二是对工具调用做“录制—回放”,把真实返回存为桩数据,回放时优先命中;三是对时间、随机数、外部检索做可注入的虚拟化。这样即使模型本身不完全确定,也能在“同输入同桩”的条件下复现决策分支,把问题从“无法复现”降为“可对比差异”。

笔者认为,重放层是区分“日志系统”与“可观测系统”的分水岭:前者服务于人读,后者服务于机器可验证的复现。没有重放能力的可观测性,在长链路 Agent 上会退化为“事后讲故事”。

2.5 结构化日志的正确定位

结构化日志并非不重要,它是可重放现场的低成本投影与索引。合理做法是:日志行携带 trace_id 与 span_id,携带摘要哈希而非全文,携带足以触发“回取原文”的指针。这样日志负责“快速筛选与告警”,快照负责“深度重建”。二者通过 id 与哈希对齐,形成“轻查询、重回取”的两级结构。本文评述:把日志与快照对立是伪命题,真正需要排序的是“先建因果骨架,再补效率指标”。

实施要点:日志行必须包含 trace_id、span_id、parent_span_id、obs.digest 四个字段,否则该行无法参与因果重建,只能算“文本记录”。

三、关键数据与工程案例

3.1 公开基准中的失败与轨迹特征

在 Agent 评测方面,AgentBench(Liu 等,2023)覆盖操作系统、数据库、知识图谱等多环境,报告显示不同模型在长程任务上的成功率差异显著,且失败多发生在多步交互的中后段;WebArena(Zhou 等,2023)在真实网页环境中评测,强调可复现环境的重要性;SWE-bench(Jimenez 等,2023)以真实仓库 issue 为任务,其“可验证修复”的设计本身就是一种重放友好范式。本文评述:这些基准的共同启示不是“模型不够强”,而是“评测环境必须可重放”,否则分数不可比。工程可观测性应借鉴这一思路,把“可重放”作为一等公民。

需要说明数据边界:上述基准的具体成功率随模型版本与评测配置变化,本文不引用单一数字作为结论,只引用其方法论特征。凡本文出现的比例类数字,除标注来源外,均为笔者基于公开资料的整合估计或模拟数据,已注明。

3.2 一个可复现的失败现场构造(模拟示例)

为说明“日志全但不可重放”的差距,构造一个模拟场景:Agent 执行“检索—摘要—写文件”三步任务,第二步检索返回被截断,模型据此生成了不完整摘要,第三步写文件成功但内容错误。若只有结构化日志,能看到“step2 耗时 1.2s、token 800、step3 成功”,但看不到截断;若有快照,可回取 step2 的原始返回,发现截断标记缺失。下表为模拟数据,用于对比两类观测的排查效率。

观测配置 定位到根因所需假设数 是否可复现 备注
仅结构化日志5–8(模拟估计)否需人工猜测截断
日志 + trace_id3–5(模拟估计)部分可串链路,仍缺原文
日志 + 快照 + 重放1–2(模拟估计)是可回取原文并对比

上表为模拟数据,仅用于说明趋势,不代表任何真实系统测量。笔者认为,假设数的下降比“日志行数增加”更能反映可观测性的真实收益,因为它直接对应排障时间。

3.3 成本视角:快照不是免费的

全量快照的成本主要来自存储与序列化开销。以每步 50KB、单任务 40 步、日任务 1 万次估算(模拟数据),日增原始数据约 20GB,压缩后约 4–6GB;若只对分支点(估计占 15%)做全量快照,其余存摘要,可降至约 3–4GB 量级。这一量级对多数团队可接受,但需配合保留策略与脱敏。本文评述:成本不应成为“不做重放”的理由,而应成为“做分层快照”的理由;关键是把预算花在因果关键处。

隐私与合规是另一边界:快照可能包含用户数据与工具返回的敏感字段,需在写入前做字段级脱敏,并保留脱敏映射的可审计记录。否则“可重放”会变成“可泄露”。

3.4 拓展资源

延伸阅读与动手材料可参考:OpenTelemetry 语义约定文档(opentelemetry.io/docs/specs/semconv)、LangSmith 的 tracing 概念文档(docs.smith.langchain.com)、AgentBench 项目页(github.com/THUDM/AgentBench)、WebArena 项目页(webarena.dev)。视频类可检索“distributed tracing fundamentals”与“LLM agent evaluation”公开讲座,注意以原始发布为准。

四、对比与局限:两种优先级的边界条件

4.1 何时结构化日志优先

在单步工具调用、无长上下文、失败即报错的场景中,结构化日志的投入产出比更高:它便宜、易接入、能快速定位超时与配额问题。此时“可重放现场”的边际收益有限,因为失败本身已足够显式。本文评述:优先级判断应基于“失败是否沉默”,而非“系统是否叫 Agent”。

4.2 何时可重放现场不可替代

多步规划、外部副作用(写库、发消息、下单)、检索增强、长上下文裁剪四类场景中,失败往往沉默且不可逆,此时没有快照就无法回答“它当时看到了什么”。尤其是上下文裁剪:裁剪策略本身可能丢弃关键信息,若不留裁剪前后对照,事后无法判断是模型错还是裁剪错。笔者认为,这四类场景应默认开启分支点全量快照。

4.3 主要局限

其一,重放不能保证完全确定性,模型服务端的非确定性可能使同一输入产生不同输出,工程上只能做到“同桩同参下的可比对”。其二,快照带来存储与合规压力。其三,分支点检测是启发式,可能漏检。其四,trace 语义在 Agent 场景尚无统一标准,跨厂商工具链存在语义漂移。本文评述:这些局限不否定优先级判断,而是要求实施时保留“人工兜底”与“可审计的检测规则”。

五、落地路径:分阶段实施步骤

5.1 第一阶段:建立因果骨架(1–2 周)

步骤一,定义 span 粒度与必填属性(trace_id、span_id、parent_span_id、step_index、model、tool、obs.digest)。步骤二,在所有模型调用与工具调用处埋点,确保父子关系正确。步骤三,日志行强制携带四个关键字段。验收标准:任取一次失败运行,能画出完整因果树且无断点。

5.2 第二阶段:分支点快照(2–4 周)

步骤一,实现分支点检测规则(工具异常、空检索、上下文超阈值、模型输出含不确定标记)。步骤二,对分支点保存全量上下文与工具原文,非分支点保存摘要加对象存储指针。步骤三,写入前做字段级脱敏并记录映射。验收标准:对模拟失败场景,能回取到导致偏差的原始观察。

5.3 第三阶段:重放与回归(持续)

步骤一,实现工具录制—回放桩,回放时优先命中桩数据。步骤二,锁定模型版本与参数,记录 seed。步骤三,把历史失败现场纳入回归集,每次变更后跑重放对比。验收标准:关键失败可稳定复现,差异可定位到具体 span。本文评述:第三阶段才是可观测性真正产生复利的地方,因为它把“一次性排障”转化为“可积累的回归资产”。

# 伪代码:分支点快照判定
def is_branch_point(step):
    return (step.tool_error is not None
            or step.retrieval_empty
            or step.ctx_tokens > CTX_THRESHOLD
            or contains_uncertainty(step.llm_output))

def persist(step):
    if is_branch_point(step):
        store.full_checkpoint(step)   # 全量上下文 + 工具原文
    else:
        store.digest_pointer(step)    # 摘要 + 对象存储指针

六、结论与展望

回到标题之问:结构化日志与可重放现场,哪个是可观测性的第一优先级?本文的结论是:可重放现场优先,结构化日志是其必要子集与索引层。判据不是“日志是否详细”,而是“失败是否可因果重建”。在沉默失败成为常态的 Agent 场景中,没有 trace_id 与中间状态的日志,只能证明“它停过”,不能解释“它为何停”。

展望未来,三个方向值得投入:一是 Agent 场景的 trace 语义标准化,使跨工具链的因果树可互操作;二是基于因果重要性的自适应采样,把存储预算动态分配给关键分支;三是把重放现场纳入评测与回归,使“可复现”成为 Agent 工程质量的一等指标。笔者认为,当行业从“能跑”走向“可运维”,可重放现场会像今天的分布式追踪一样,从加分项变成基础设施。

主要参考文献(节选,完整清单共 62 篇,近三年占比约 56%)

  1. Yao S., et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023.
  2. Liu X., et al. AgentBench: Evaluating LLMs as Agents. ICLR 2024.
  3. Zhou S., et al. WebArena: A Realistic Web Environment for Building Autonomous Agents. ICLR 2024.
  4. Jimenez C. E., et al. SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ICLR 2024.
  5. Pearl J. Causality: Models, Reasoning, and Inference. Cambridge University Press, 2009.
  6. OpenTelemetry Authors. Semantic Conventions for Generative AI Systems. 2024–2025 文档.
  7. Wang L., et al. A Survey on Large Language Model based Autonomous Agents. Frontiers of Computer Science, 2024.
  8. Chen L., et al. AgentOps: Observability for LLM Agents. 2025(预印本,引用以原始版本为准).

注:涉及数据集(如 WebArena、SWE-bench)的预处理细节以其官方仓库说明为准;本文模拟数据已在正文标注,未作为真实测量引用。

文章声明

本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

内容仅供学习参考。如需引用,请以原始文献为准。

全文约 6800 字 | 参考文献 62 篇(主要 8 篇)

🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷