概念:必要基础

Agent Memory:记忆系统基础概念

没有记忆的 Agent 就像一个每次对话都失忆的助手——你需要反复解释背景、重复要求、从头开始。记忆让 Agent 能:

来源: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 的使用边界。