来源:LangGraph Memory · MemGPT · Anthropic Building Effective Agents | 整理时间:2026-05-14
为什么 Agent 需要记忆?
没有记忆的 Agent 就像一个每次对话都失忆的助手——你需要反复解释背景、重复要求、从头开始。记忆让 Agent 能:
- 跨对话保持上下文:"上次我们讨论的那个方案,继续"
- 积累用户偏好:"按照我喜欢的代码风格"
- 从历史中学习:"上次这种 bug 的修复方式"
- 管理长任务状态:"做到第 3 步了,继续"
记忆的三个层次
┌────────────────────────────────────┐
│ 长期记忆 (Long-term Memory) │ ← 跨会话持久化
│ 用户偏好、项目知识、历史决策 │
├────────────────────────────────────┤
│ 短期记忆 (Working Memory) │ ← 当前对话上下文
│ 当前任务状态、最近对话、工具结果 │
├────────────────────────────────────┤
│ 工作记忆 (Context Window) │ ← 模型可见的 token
│ 系统提示 + 对话历史 + 工具输出 │
└────────────────────────────────────┘
工作记忆(Context Window)
所有 LLM 都有一个 token 上限(context window),这就是 Agent 的"即时记忆":
| 模型 | Context Window | 适合 |
|---|---|---|
| Claude Sonnet 4.6 | 200K tokens | 大代码库分析 |
| Claude Opus 4.7 | 200K tokens | 复杂推理 |
| GPT-4.1 | 1M tokens | 超长文档处理 |
核心挑战:Context window 是有限的。对话越长、工具输出越多,可用空间越少。
短期记忆(Working Memory)
当前会话中的状态管理:
- 对话历史:用户说了什么、Agent 回了什么
- 工具调用记录:调用了哪些工具、返回了什么
- 中间状态:多步骤任务进行到哪一步
关键问题:对话太长时,怎么压缩或裁剪历史?
长期记忆(Long-term Memory)
跨会话持久化的知识:
- 用户画像:偏好、风格、常用模式
- 项目知识:代码库结构、技术决策、历史变更
- 经验积累:过去遇到的问题和解决方案
实现方式:
| 方式 | 适合 | 特点 |
|---|---|---|
| 文件存储 (CLAUDE.md) | 项目级知识 | 简单直接,版本可控 |
| 向量数据库 | 大规模知识检索 | 语义搜索,按需召回 |
| 结构化存储 | 用户偏好、配置 | 精确查询,易于更新 |
| 摘要存储 | 对话历史、决策 | 节省 token,保留要点 |
记忆管理的核心问题
问题一:Context Window 不够用
解决策略:
1. 摘要压缩:对话太长时,自动摘要旧的部分
2. 滑动窗口:只保留最近 N 轮对话
3. 按需召回:需要时从长期记忆中检索相关内容
4. 子 Agent 隔离:把探索任务交给子 Agent,只返回结论
问题二:记忆不一致
解决策略:
1. 记忆版本化:标记每条记忆的来源和时间
2. 冲突检测:新信息与旧记忆矛盾时提示确认
3. 权威来源:明确哪些记忆可以覆盖(如用户明确指令)
问题三:隐私和安全
解决策略:
1. 敏感数据不存储:密码、API Key 等不入记忆
2. 用户可控:用户可以查看、修改、删除自己的记忆
3. 分级存储:不同敏感度的信息用不同的存储策略
各框架的记忆方案
Claude Code:CLAUDE.md
最简单的记忆方案——用 Markdown 文件存储项目级知识:
# CLAUDE.md
## 项目约定
- 使用 TypeScript strict mode
- 测试框架:Vitest
- 不要使用 any 类型
## 用户偏好
- 喜欢函数式风格,不用 class
- 错误处理用 Result 模式
优点:简单、版本可控、人可读 缺点:只有项目级,没有用户级或会话级记忆
LangGraph:Checkpoint + Store
LangGraph 提供两层记忆:
- Checkpointer:保存每个图节点的状态,支持时间旅行调试
- Store:跨线程的长期记忆,支持命名空间和语义搜索
from langgraph.checkpoint.memory import MemorySaver
from langgraph.store.memory import InMemoryStore
checkpointer = MemorySaver() # 短期:保存图执行状态
store = InMemoryStore() # 长期:跨线程知识存储
OpenAI Agents SDK:对话历史管理
通过 RunContext 和对话历史管理实现记忆:
# 每次运行携带上下文
result = await Runner.run(
agent=agent,
messages=previous_messages, # 历史对话
context=RunContext(user_preferences), # 用户上下文
)
记忆架构设计选择
什么时候需要长期记忆?
| 场景 | 是否需要长期记忆 | 推荐方案 |
|---|---|---|
| 一次性任务("帮我修个 bug") | 不需要 | 只用 context window |
| 多轮项目开发 | 需要(项目级) | CLAUDE.md 或文件存储 |
| 个人助手("帮我管理日程") | 需要(用户级) | 结构化存储 + 向量检索 |
| 团队知识库 | 需要(共享级) | 向量数据库 + RAG |
| 客服 Agent | 需要(会话级) | 会话存储 + 摘要 |
从简单开始
Level 0: 不用记忆 — 一次性任务
Level 1: CLAUDE.md — 项目级知识
Level 2: 会话摘要 — 长对话压缩
Level 3: 向量检索 — 大规模知识召回
Level 4: 完整记忆系统 — 多级存储 + 智能召回
建议:从 Level 0-1 开始,在遇到实际问题后再升级。过早引入向量数据库会增加不必要的复杂度;如果你还没判断任务是否真的需要 Agent,先回到 什么是 AI Agent 的使用边界。