Rewind Sessions:会话回溯,让 Agent 重新来

Agent 不是万能的,有时候会走错路——调用了错误的 Tool、理解错了用户意图。这时候需要"反悔",把 Agent 回溯到之前的某个状态,重新来。

什么时候需要 Rewind

场景说明
Tool 调用错误Agent 调了错误的 Tool,返回了无用的结果
意图理解错误Agent 理解错了用户意图,答非所问
状态错误State 数据被污染,导致后续行为异常
重复尝试Agent 第一次尝试失败了,需要换一种方式

Rewind 的原理

当前状态(第 10 轮)
    ↓ Rewind 到第 5 轮
回到第 5 轮的状态
    ↓ 重新执行
第 6、7、8、9、10 轮重新跑

State、历史消息、自定义数据都回溯到目标轮次。


使用方式

回溯到指定轮次

err := session.RewindTo(ctx, 5)  // 回溯到第 5 轮

回溯并清除错误状态

// 清除从第 6 轮开始的所有 Tool 调用结果
err := session.RewindTo(ctx, 5, sessions.WithClearToolResults(true))

从快照恢复

snapshot := session.Snapshot(ctx)  // 创建快照
// ... Agent 运行出错了
session.Restore(ctx, snapshot)    // 恢复到快照点

实际用法

用法 1:Tool 返回错误,回溯重试

result, err := session.Run(ctx, userInput)

if err != nil {
    // Tool 调用出错了,回溯到这次调用之前
    session.RewindTo(ctx, session.Turn()-1)
    // 换个 Tool 重新试
    session.Run(ctx, userInput)
}

用法 2:用户改变主意,回溯到起点

// 用户订票过程中突然说"算了,不订了"
session.RewindTo(ctx, 0)  // 回到起点,重新开始

注意事项

不是所有状态都能回溯

外部 Tool 的实际效果(如发送了邮件、转账)无法撤回。Rewind 只回溯 Agent 的内部状态。

频繁回溯影响体验

用户感知到 Agent"重做了",体验不好。设计 Agent 时尽量减少回溯需求。

快照有代价

频繁创建快照会占用内存。合理设置快照频率和数量。


常见问题

Q:Tool 实际执行了外部操作,能撤回吗 A:不能。Rewind 只回溯 Agent 内部状态,外部实际效果(如发邮件、转账)需要业务层自己处理。

Q:回溯后 Agent 一定会走同样的路吗 A:不一定。回溯到同一状态,重新执行可能得到不同结果(如果上下文或许有变化)。

Q:回溯太多次会不会出问题 A:可能。频繁回溯可能造成状态混乱,建议记录回溯原因,方便排查问题。


小结

模块 4 完成。学习了:

  • Session 管理:对话历史的创建、持久化、恢复
  • State 读写:Agent 内部状态管理
  • Event 系统:监听 Agent 运行中的事件
  • Context Caching:缓存上下文,减少 token
  • Context Compression:压缩历史消息
  • Rewind Sessions:会话回溯,重新执行

接下来进入模块 5:多 Agent 协作——多个 Agent 如何协同工作。

Context Compression | Agent Team Architecture →


想跟着学更多 Go ADK 实战?关注「全栈之巅-梦兽编程」公众号,每周更新 Go / AI 编程实战干货。