一次部署任务跑两小时,一个调试会话翻几百轮——Agent 的实际工作时长早已超过单次上下文能装下的历史。记忆问题不是"要不要做",是"怎么做才不崩"。
分层记忆:借人脑的架构
人类不把所有经历原样保存,Agent 也不该:
- 工作记忆:当前上下文里的一切,容量小、易失、最贵
- 情景记忆:发生过的事件流水(做过什么、结果如何),压缩保存,可检索回放
- 语义记忆:沉淀出的稳定知识(项目约定、踩过的坑),结构化存储,长期有效
工程映射:工作记忆 = 对话窗口;情景记忆 = 事件日志 + 摘要;语义记忆 = 项目里的说明文件(AGENTS.md / CLAUDE.md)和检查清单。任务开始时先读语义记忆,任务结束时把新教训写回去——这个闭环是长任务不退化的关键。
滚动摘要:最朴素也最有效
对话超出阈值时,把最旧的 N 轮压缩成摘要替换原文。细节决定成败:
[会话摘要 v3]
目标:修复支付回调签名校验失败(#2841)
已确认:webhook 密钥与平台配置一致;失败集中在 JSON 体重排序
已排除:网络问题(本地重放成功)、时间戳偏差(已校正仍失败)
当前假设:签名计算用了原始串而非重排序串
关键文件:src/payments/signature.py, tests/test_webhook.py
注意这个摘要的形态:不是叙述性的"我们讨论了…",而是状态快照——目标、已确认、已排除、当前假设、相关文件。状态快照丢的信息少,恢复成本低。
一个容易忽略的坑:摘要会丢掉"为什么排除"。人类工程师不重试已排除路径,靠的就是这个;摘要时"已排除"一栏必须保留,否则 Agent 会在同一个坑里反复跌。
外部笔记:把记忆物化到文件系统
上下文里的记忆再好也是易失的。更稳的做法是让 Agent 把中间态写进文件:
NOTES.md:当前任务的状态快照(上述摘要的物化版)- 决策记录:ADR 风格,一条决策一行理由
- 检查清单:重复流程逐次沉淀
好处立竿见影:上下文被压缩或重启后,读 NOTES.md 一步就能恢复状态;文件本身进入版本库,成为团队资产。Claude Code 的 memory 文件、Codex 的 AGENTS.md 都是这一思想的官方化。
什么时候压缩
经验阈值:上下文占用超过 60–70% 就该启动压缩,不要等满。满了才压,压缩动作本身没有空间执行,质量必降;留 30% 余量,摘要任务能拿到足够的原材料。
另外一个反直觉经验:压缩要无损于"约束",有损于"过程"。用户早期的要求(“不要动配置文件”)必须原样进入摘要且置顶;中间的试错过程则可大幅简化。
小结
长任务的上下文管理三板斧:分层(哪些该长期保存)、压缩(状态快照式摘要)、物化(写文件)。三者不是选项,是组合拳——单靠任何一种,都撑不过一个真实的工作日。