2.3 记忆的层次——从工作记忆到长期记忆
小李发现一个奇怪的现象:
他让 Agent 修复 12 个文件的错误处理。Agent 修到第 8 个文件时,突然忘了前面的修改风格,开始用另一种写法。修到第 11 个,又忘了任务进度,把已经修过的文件又改了一遍。
Agent 「失忆」了。
为什么 Agent 需要记忆
没有记忆的 Agent 有五种症状:
| 症状 | 表现 | 后果 |
|---|---|---|
| 重复操作 | 做过的事又做一遍 | 浪费 Token,浪费时间 |
| 风格不一致 | 前后修改方式不同 | 代码风格混乱 |
| 丢失进度 | 不知道做到哪了 | 漏做或重复做 |
| 忘记约束 | 忽略用户的特殊要求 | 输出不符合预期 |
| 无法学习 | 每次都犯同样的错 | 没有进步 |
人类的记忆是一个分层系统——你能记住刚说的话(工作记忆),也能记住昨天的事(短期记忆),还能记住多年积累的经验(长期记忆)。Agent 也一样。
四层记忆架构
L4用户
🧑 用户记忆——你的偏好和习惯
"小李偏好 TypeScript,不用 Tab 缩进"
最持久 · 跟随用户而非项目
L3长期
📚 长期记忆——跨会话的经验
"上次类似 Bug,我们通过添加中间件解决了"
长期持久 · 需要检索机制
L2短期
💬 短期记忆——这次会话聊了什么
"用户说要加 try-catch,用统一的错误格式"
会话期间 · 会话结束后消失
L1工作
⚡ 工作记忆——当下在做的事
"已修复 3/12 个文件,当前在 orderRoutes.ts"
任务期间 · 容量最小,最易丢失
L1 工作记忆——当下在做的事
工作记忆存储当前任务的中间状态:做了什么、做到哪了、下一步是什么。
小李的 Agent 修复错误处理时,工作记忆里应该有:
- 任务:给 12 个 API 端点添加错误处理
- 进度:3/12 已完成
- 当前文件:orderRoutes.ts
- 修改模式:try-catch + 统一 errorHandler
- 待处理:9 个文件小李的 Agent 为什么「失忆」? 因为上下文窗口有限。当 Agent 处理到第 8 个文件时,前面几个文件的修改细节已经被新的上下文「挤出去」了——就像你看书看到后面,忘了前面。
L2 短期记忆——这次会话聊了什么
短期记忆存储当前对话的全部历史:用户说了什么、Agent 回复了什么、做了哪些决策。
上下文窗口有限,需要压缩策略:
| 压缩策略 | 原理 | 例子 |
|---|---|---|
| 滑动窗口 | 只保留最近 N 轮 | 只看最近 10 轮对话 |
| 摘要压缩 | 把旧对话总结成一段话 | "之前修改了 5 个文件" |
| 重要性过滤 | 只保留关键信息 | 保留用户指令,丢弃中间输出 |
L3 长期记忆——跨会话的经验
长期记忆存储跨会话的知识和经验:项目特点、历史教训。
json
{
"type": "bug_fix",
"project": "express-api",
"timestamp": "2025-05-10",
"actions": ["添加 try-catch", "创建 errorHandler"],
"result": "成功",
"lessons": "Express 路由的错误处理应该统一放在中间件层"
}特点:持久化存储,但需要检索机制——Agent 需要能从海量记忆中找到相关的那条。这就是为什么长期记忆通常用向量数据库实现。
| 技术 | 特点 |
|---|---|
| Pinecone | 云端托管,易上手 |
| Weaviate | 开源,功能丰富 |
| Chroma | 轻量,适合本地开发 |
| Milvus | 高性能,适合大规模 |
L4 用户记忆——你的偏好和习惯
多工具视角
- Claude Code:L4 记忆存在
~/.claude/目录下的 memory 文件中 - Cursor:通过
.cursorrules和全局 Rules 定义 - Windsurf:通过
.windsurfrules和持久上下文实现 - Copilot:通过
.github/copilot-instructions.md定义
记忆如何流转
当 Agent 需要信息时,它会从各层记忆中检索:
1. 工作记忆 → "我在做什么?做到哪了?" → 最快,最准
2. 短期记忆 → "用户刚才说了什么?" → 较快,较准
3. 长期记忆 → "我以前遇到过类似问题吗?" → 需要检索
4. 用户记忆 → "这个用户有什么偏好?" → 需要检索
5. 整合 → 把所有信息拼成完整上下文 → 注入决策循环上下文预算:记忆的经济学
所有记忆最终都要塞进上下文窗口。来看看「膨胀」和「健康」两种状态的区别:
❌ 膨胀的上下文窗口
系统提示词 ~4K (3%)
检索到的记忆 ~8K (6%)
对话历史 ~72K (56%) 过长!
Agent 输出空间 ~44K (35%)
✅ 健康的上下文窗口
系统提示词 ~4K (3%)
精准记忆 ~6K (5%) 精简!
摘要压缩历史 ~32K (25%)
Agent 输出空间 ~86K (67%)
关键洞察:记忆不是越多越好,而是越精准越好。塞太多无关记忆,既浪费 Token 又干扰决策。
本节核心要点
- Agent 记忆分四层:工作记忆(L1)、短期记忆(L2)、长期记忆(L3)、用户记忆(L4)
- 工作记忆最即时但容量最小,用户记忆最持久但需要检索
- 上下文窗口是记忆的硬约束——精准比全面更重要
- 长期记忆需要向量数据库做语义检索
- 压缩策略(滑动窗口、摘要、重要性过滤)是管理记忆的关键技术
思考题:你现在使用的 AI 编程工具,它的记忆在哪个层级?你能感觉到它「记得」什么、「忘记」什么吗?
下一节预告:理论够了,该动手了。让我们创建第一个 Agent,看看子代理是怎么调度和执行的。