Rewind:Agent 的时间回溯
本章摘要:
Rewind 是 Agent 跑出循环后对状态进行回滚的辅助机制。它的关键约束是原子性——对话和文件必须一起回退,只恢复一边会让 Agent 的记忆与磁盘状态不一致。
Agent 会犯错,所以需要时间回溯
在 Agent Loop 中,模型围绕目标持续思考、行动、观察。但这个循环并不总是走对的——模型可能误解了意图、选错了工具、改错了文件。如果一条路走不通,最直接的办法就是退回去,重新来。
这就是 rewind 存在的原因:它不是 Agent 主循环的一部分,而是循环出错时对状态进行回滚的辅助机制。
消息是怎么存下来的
要能回退,首先得把每一步的状态完整记录下来。
一种常见做法是:会话中的每条消息被赋予唯一标识,按时间顺序追加写入一个日志文件。这种"只追加、不修改"的存储方式天然适合回退——因为每一步的状态都完整保留,回退只需要从末尾截断即可。文件里既有用户说了什么、助手回了什么、工具返回了什么,每一步都按时间顺序连接起来。
文件也要一起回去
Agent 在之前的循环中可能已经修改了磁盘上的文件。对话记录回到了过去,文件也需要回到过去的版本。
所以 rewind 必须解决两个问题:
- 怎么记录文件的历史版本。常见做法是:每次修改文件之前为它打一个版本戳,作为快照存起来。回退时直接读快照还原。
- 怎么把版本戳和消息关联起来。一个时间点上的文件状态,必须能和触发它变更的那条消息绑定,否则截断对话后找不到该回到哪个文件版本。
原子性:对话与文件必须一起回退
这一节是 rewind 设计的根本约束,比上面两节都重要。
如果只恢复了文件但没截断消息,Agent 的"记忆"和磁盘状态就对不上了——它以为自己在某一步,但实际上文件已经是更早的版本。反过来也一样:只截断消息不恢复文件,Agent 会看到一个"从未修改过"的文件。
所以整个回退必须作为一个整体完成,不能半成功半失败。这是为什么"原子性"会单独成节——它是 rewind 区别于普通"撤销"操作的关键。
代价与限制
- 存储成本:每次文件修改都要存一份快照,长时间运行会累积大量历史版本
- 回退粒度:通常以消息为粒度(回到某条消息之前的状态),无法精细到"只回退某一次工具调用"
- 范围:rewind 只能回退 Agent 自己修改的文件状态,对外部系统(数据库、远程服务)的副作用无法撤销