详解 ADK Go 的 Rewind 机制——如何将 Agent 回溯到历史状态重新执行,适用于 Agent 走错路、需要重新来的场景。
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 编程实战干货。
