深色模式
09 · 记忆系统
短期、长期与文件式记忆
📚 系列导航:这是《Agent 开发进阶》的第 9 篇(共 24 篇)。上一篇 agent 学会了先规划再动手,但每开一次新会话它都失忆重来;这一篇给它装上跨会话的记性——三类记忆各管一段。下一篇:10 · RAG 作为工具。
用户上周明明说过"报告一律用表格,别发长段落",这周开新会话,agent 又热情甩出三屏小作文。用户感受很直接:这东西不长记性。跨会话记忆就是"工具"和"助手"的分界线。但记忆不是越多越好——我见过记忆库一个月膨胀到比上下文还大,也见过一句玩笑被记成终身偏好。这一篇只干一件事:划清三类记忆的职责,讲透最朴素也最好用的文件式记忆,配上写入门槛和遗忘机制。
看完这一篇,你会拿到:
- 一张三类记忆职责表:会话内/持久画像/文件式各管什么
- 一个文件式记忆最小实现:读写规则加写入门槛伪代码
- 一套防污染纪律:置信度门槛、存结论不存过程、定期修剪
- 一次跨会话记住偏好的实测,含"玩笑不入库"的反向验证
01 三类记忆:先划清职责边界
会话内记忆:消息历史加滚动压缩(第 06 篇),管"这次说到哪了",会话结束归零。持久画像:用户偏好和稳定事实,结构化存储、跨会话注入,管"这个人是谁"。文件式记忆:agent 自己读写的 markdown,管项目约定、经验教训这类半结构化沉淀。三类别顶班:拿会话历史当长期记忆是成本灾难,拿画像存任务过程是噪声灾难。
💡 一句话总结:会话内管当下、画像管这个人、文件管这摊事——职责不清的记忆系统必臃肿。
02 文件式记忆:朴素方案为什么好用
向量库、图谱记忆听着高级,但先看最朴素的:一个 memory.md,会话开始读一遍,满足条件追加一行——Claude Code 的 CLAUDE.md 就是这个模式。好比把备忘录贴在冰箱上:谁都能看、能改,写错了划掉就行;而锁在黑盒数据库里的记忆,出了错你都不知道它记了什么。可审计、可编辑、可版本化,这三条是刚需——记忆一定会出错,出错时你得能直接打开改。
💡 一句话总结:记忆方案先问"出错了我能不能直接改"——文件式在这条上碾压黑盒。
03 写入门槛:不是什么都配进记忆
python
MEMORY_RULES = """同时满足三条才写入:
1.用户明确表达(如"以后都用表格"),随口一提不算
2.对未来会话有用(偏好/事实),本次任务细节不算
3.压成一行结论并附日期,不存对话原文"""
def maybe_remember(turn): # 伪代码,接口以官方文档为准
d = llm(f"{MEMORY_RULES}\n本轮对话:{turn}\n返回{{write,line}}")
if d["write"]:
append("memory.md", f"- {today()} {d['line']}")预期效果:memory.md 里每条都是一行带日期的结论。核心是置信度门槛:明确表达的才记,玩笑和随口一提直接放行;拿不准就降档——先记"待确认",下次求证。
💡 一句话总结:写入是特权不是默认——明确表达、面向未来、一行结论,三关全过才落盘。
04 污染与遗忘:记忆需要园丁
记忆错了比没记忆更糟:一条错误偏好每次都被注入,agent 错得很自信。防污染三招:存结论不存过程(对话原文不进库)、定期合并去重(同类条目合成一条)、过期清理(任务状态类记忆做完就删)。不遗忘的记忆库终成噪声库——每一行都在稀释注意力,这笔账第 06 篇算过。
💡 一句话总结:遗忘不是缺陷是功能——定期修剪的记忆库才配被每次注入。
05 动手:跨会话记住用户偏好
任务:① 建 memory.md,给 agent 配读记忆、写记忆两个工具;② 把 03 节的写入规则放进 system;③ 会话 A 里明确表达一个偏好("报告一律用表格"),再随口说句玩笑("我大概是全公司最讨厌开会的人");④ 开全新会话 B,让它生成一份报告。
验收标准:两个都要验——会话 B 的报告真用了表格(偏好生效);打开 memory.md,玩笑那句没被写进去(门槛生效)。
两种结果都正常:双过,接着加第二类条目(稳定事实)扩展;偏好没生效就拆开定位——打开 memory.md 看那行在不在:在,是读取端没注入;不在,是写入门槛误杀。读和写分开修,别混着调。
06 小结
你现在应该能:给三类记忆划职责、用 memory.md 实现最小文件式记忆、给写入设置信度门槛、给记忆库定修剪节奏。
记忆管"关于用户的事";业务知识那一大库怎么接?下一篇 10 · RAG 作为工具,给 agent 外挂大脑。
📎 实战案例
有人把对话原文整段存记忆,一个月后记忆库比上下文还大,每次注入都在烧钱。改成文件式记忆、存结论不存过程、写入加置信度门槛后,记忆库稳定在几十行,跨会话偏好照常生效——瘦的记忆才是能用的记忆。
踩坑
- 我把对话原文整段存记忆,一个月后记忆库比上下文还大——存结论不存过程,一行带日期。
- 我把用户一句玩笑记成长期偏好,之后半个月每次会话都错误地"贴心"——写入要过置信度门槛,明确表达才算数。
- 我的记忆文件半年没修剪,300 多行里三分之一是早已完结的任务状态,每次会话白白注入——现在固定每月清一次,园丁活不能省。