News

AI Agent总“失忆”?用结构化交接告别会话间上下文丢失烦恼

AI Agent总“失忆”?用结构化交接告别会话间上下文丢失烦恼

AI Agent的“失忆症”是很多开发者和使用者面临的普遍痛点。想象一下,你深夜11点与Claude Code完成了一次编程会话,期间修改了三个文件,做出了两个设计决策,还发现了一个未解决的bug。第二天早上,当你重新启动Agent时,它却对这一切毫无记忆。

这意味着你需要花费新会话的前十分钟,重复进行所谓的“冷启动剧场”:重新审阅修改过的文件,再次解释昨天的决策,甚至重新发现并调试你已经发现的bug。这种无状态Agent带来的重复劳动,日积月累,严重影响了工作效率。

为何简单的“对话历史”无法解决问题

最直观的解决方案似乎是“保存所有对话历史”,但这在实际操作中存在三大问题:

  1. 历史记录过于庞大: 一个真实的工作会话可能包含数千条消息、工具调用和输出。加载如此庞大的历史记录会迅速耗尽Agent的上下文窗口(context window),在执行任何有意义的工作之前就达到了上限。
  2. 噪音过多: 历史记录中大约90%的内容是Agent的推理过程,而非最终结论。下一个Agent并不需要这些思考过程,它只需要关键的结论。
  3. 难以跨Agent协作: 如果Agent A完成一项任务后,Agent B接手后续工作,B不希望阅读A冗长的独白。B真正需要的是了解A做了哪些变更以及接下来应该做什么。

结构化交接(Handoff)的真正需求

经过一年的多Agent系统实践,一种有效的模式浮现出来:一个包含五个核心字段的结构化摘要:

  • Files touched (文件变动): 磁盘上实际修改了哪些文件。
  • Decisions made (决策记录): 影响未来工作的架构或设计决策。
  • Blockers (阻碍): 阻碍进展的事项,并提供足够的上下文信息以便解除阻碍。
  • Next steps (下一步行动): 下一个Agent首先应该做什么。
  • Open threads (待定事项): 任何未解决的、未来需要记住的问题。

仅此五项字段,通常总字数不超过500字。下一个Agent可以在一秒内读取这份摘要,并迅速获得全面的操作认知。

交接协议的实现示例

在像Vigil这样的框架中,交接(handoff)被设计成一个一流操作:

from vigil import Vigil

v = Vigil()
v.handoff(
    agent="backend-cc",
    files_touched=["api/routes.py", "models/user.py"],
    decisions=["Switched to JWT auth from sessions; simpler refresh flow"],
    blockers=["Stripe webhook still failing in test mode, see line 142"],
    next_steps=["Wire JWT middleware into protected routes", "Fix Stripe webhook signature validation"],
    open_threads=["Decide on rate limit strategy before deploy"],
)

当下一个Agent启动时,它可以通过简单的API调用或CLI命令恢复最新的交接状态:

context = v.resume(agent="backend-cc")
# 返回最新的交接信息,或链式检索最近N次交接

或者通过命令行:

vigil resume backend-cc

这种交接信息以结构化数据形式存储,可供查询,并且守护程序会自动将最新的交接包含在Agent的感知文件中。

交接链(Handoff Chains)的威力

在构建这项功能时,一个令人惊喜的发现是:交接会形成链式反应,实现上下文的累积。如果Agent在同一个任务上连续进行多次会话,每次都执行结构化交接,那么后续的Agent不仅能获取最新的状态,还能追溯之前的关键信息,从而构建起一个连贯且高效的工作流。

↗ 阅读原文