前两篇讲了 Tracing 和评估。这一篇讲 Replay 调试——LangSmith 的一个杀手锏功能,对 Agent 调试价值极大。

传统软件调试靠断点:在代码某行停下,看变量,单步执行。但 Agent 这种程序,断点调试不好使——它是多步的、有状态的、不确定的。Replay 提供了一种更适合 Agent 的调试方式。

传统断点调试对 Agent 的局限

传统断点调试假设:代码是确定的,同样输入同样路径。但 Agent 不是:

  • 多步且有状态:一个 run 跨很多步,每步的状态都不同,断点看哪个?
  • 不确定:同样输入,模型可能走不同路径,断点这次停的位置下次不一定停
  • 难复现:线上的 bug,本地复现不了(因为模型行为不确定)

传统断点对 Agent 的局限

所以 Agent 调试需要新工具。Replay 就是。

Replay:取一次 run,改输入重跑

Replay 的机制:取出某次 run 的状态(trace + checkpoint),改它的输入或中间状态,重新跑

Replay:取 run 改输入重跑

这建立在前面两个东西上:

  • Tracing(第 38 篇):记录了这次 run 的每一步
  • Checkpoint(第 14 篇):记录了这次 run 每一步的 state

有了这两个,Replay 能把某次 run「定格」,让你从任意一步重新开始,改了再跑。

Replay 解决什么问题

Replay 最擅长解决「这个 run 为什么是这个结果」的问题。

比如线上一个 Agent 给了奇怪回答。你想搞清楚:是输入的问题?某一步模型判断的问题?工具返回的问题?

用 Replay:

  1. 取出这次 run 的 trace + checkpoint
  2. 从某一步开始 replay,改改输入看结果变不变
  3. 定位「这一步换这个输入,结果就对了」——说明是这一步的问题

用 Replay 定位问题

这比断点调试直观得多——你不用在代码里打断点,而是直接在「run 的历史」上做实验,看哪一步改了能让结果变对。

Replay vs 普通重跑

有人问:我直接拿原输入重新跑一次 Agent,不也行?为什么非要 Replay?

区别在于确定性

  • 普通重跑:模型行为不确定,同样输入可能走不同路径,复现不了原来的问题
  • Replay:基于原来的 trace/checkpoint,能精确复现原来的路径,在确定的基础上改

Replay vs 普通重跑

普通重跑因为模型不确定性,可能跑出来不一样的结果,没法定位。Replay 锁定了原来的路径,改动的影响才清晰。

一个类比:数据库的时间点恢复

Replay 的机制,类似数据库的 PITR(Point-in-Time Recovery,时间点恢复)——把数据库恢复到某个历史时刻,从那里重新开始。

Agent 的 Replay 也是:把 Agent 的状态恢复到某个历史步骤,从那里重新跑。这是「有状态长流程程序」调试的通用范式,不只是 LangChain 有,是这类程序的共同需求。

收束:Agent 时代的新调试范式

这一篇讲了 Replay 调试:

  • 传统断点对 Agent(多步、有状态、不确定)不好使
  • Replay:取一次 run 的状态,改输入重跑
  • 建立在 Tracing + Checkpoint 之上
  • 解决「这个 run 为什么是这个结果」
  • 比普通重跑确定,能精确复现
  • 类似数据库 PITR,是长流程调试通用范式

下一篇讲 部署——LangServe 到 LangGraph Platform 的演进。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。

如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

十三Tech公众号二维码