一文读懂 Agent Memory:让 AI 智能体真正“记住你”的工程实践
很多 AI Agent Demo 看起来很聪明,但一旦进入真实使用,很快会暴露一个问题:
它每次都像第一次认识你。
你要反复告诉它项目背景、个人偏好、常用命令、代码规范、上次讨论到哪里。
这不是模型不够强,而是 Agent 缺少可控、可持续的 Memory(记忆)系统。
这篇文章结合 LangGraph Memory / Persistence、OpenAI Agents SDK Sessions 和 Claude Code Memory 的设计,系统讲清楚:
- Agent Memory 是什么
- 为什么 Agent 需要 Memory
- Memory 的类型和应用场景
- Memory 与 Prompt、RAG、Skill、Rule 的区别
- 基于现有 Agent 框架实现 Memory 的最佳实践
先说结论:Agent Memory 是什么?
Agent Memory 是让 AI Agent 在一次或多次任务之间保存、检索和更新上下文的机制。
它解决的不是“模型会不会推理”,而是“Agent 能不能记住”。
这些记忆可能包括:
- 当前对话历史
- 用户偏好
- 项目结构
- 已验证的命令
- 业务规则
- 历史任务结果
- 长期用户画像
- 可复用经验和决策
一个没有 Memory 的 Agent,只能依赖当前 prompt。
一个有 Memory 的 Agent,可以跨会话持续成长。
为什么需要 Memory?
1. 减少重复解释
没有 Memory 时,你每次都要重复:
- “这个项目用 pnpm”
- “回答请用中文”
- “不要改生成文件”
- “测试命令是 npm run test:unit”
- “我偏好先给结论再给细节”
Memory 可以把这些长期稳定信息保存下来,让 Agent 自动带入后续任务。
2. 支持多轮任务连续性
复杂任务往往不是一轮完成的。
例如:
- 第一次让 Agent 阅读代码
- 第二次让它制定计划
- 第三次让它实现
- 第四次让它修 bug
- 第五次让它写总结
短期记忆能保存同一个 thread 中的历史状态,让 Agent 不需要每轮都从零开始。
3. 支持个性化体验
同一个 Agent 面向不同用户时,应该有不同表现:
- 开发者希望输出命令和代码
- 产品经理希望输出决策摘要
- 运维工程师希望输出风险和回滚方案
长期用户记忆可以让 Agent 学会用户偏好。
4. 支持可恢复和可审计
生产级 Agent 不能只靠“上下文窗口”。
它需要能恢复任务、追踪状态、回放历史、排查问题。
LangGraph 的 persistence 就强调 checkpoint、thread 和 state,用于会话恢复、人类审批、调试和容错。
Memory 的常见类型
1. 短期记忆(Short-term Memory)
短期记忆保存同一个对话或任务 thread 内的状态。
典型内容:
- 最近几轮消息
- 当前任务进度
- 中间工具结果
- 临时变量
- 人类审批状态
LangGraph 中,短期记忆通常通过 checkpointer 保存 thread state。
OpenAI Agents SDK 中,Session 会自动保存和恢复对话历史。
2. 长期记忆(Long-term Memory)
长期记忆跨会话、跨 thread 存在。
典型内容:
- 用户偏好
- 项目事实
- 常用命令
- 业务规则
- 历史经验
- 重要决策
LangGraph 的 long-term memory 通常使用 store,以 namespace + key 的形式保存 JSON 文档。
3. 语义记忆(Semantic Memory)
语义记忆保存事实性知识,例如:
- “用户使用 Windows + PowerShell”
- “项目后端在 services/api”
- “公司要求接口变更必须兼容旧版本”
这类记忆常用结构化 JSON 或向量检索存储。
4. 情景记忆(Episodic Memory)
情景记忆保存“发生过什么”:
- 某次排障过程
- 某个 bug 的修复路径
- 某次会议摘要
- 某个任务的最终决策
它适合回顾、复盘和相似案例检索。
5. 程序性记忆(Procedural Memory)
程序性记忆保存“怎么做”:
- 常用工作流
- 排障 SOP
- 代码发布步骤
- 文档生成流程
这类内容往往应该从 Memory 升级为 Skill 或 Rule。
Memory、RAG、Prompt、Skill、Rule 的区别
| 概念 | 解决什么问题 | 典型内容 |
|---|---|---|
| Prompt | 本轮任务要做什么 | 用户即时指令 |
| Memory | Agent 应该记住什么 | 偏好、历史、事实、状态 |
| RAG | 从外部知识库查什么 | 文档、知识库、网页、数据库 |
| Skill | 某类任务怎么做 | SOP、脚本、模板、流程 |
| Rule | 始终必须遵守什么 | 编码规范、安全边界、输出约束 |
简单判断:
- 一次性目标:写 Prompt
- 长期事实:写 Memory
- 大量文档:用 RAG
- 重复流程:做 Skill
- 长期约束:写 Rule
Memory 的应用场景
场景一:个人 AI 助手
Memory 可以保存:
- 用户语言偏好
- 常用工具
- 工作时间
- 常见任务
- 常用项目路径
这样 Agent 就能越来越像“专属助理”。
场景二:AI 编程助手
Memory 可以保存:
- 项目结构
- 构建命令
- 测试命令
- 代码规范
- 常见错误修复方案
Claude Code 官方建议把构建命令、约定、项目布局、“always do X” 这类长期事实写入 CLAUDE.md。
场景三:客服 Agent
Memory 可以保存:
- 用户历史问题
- 工单状态
- 产品版本
- 偏好渠道
- 上次未解决事项
这样用户不会每次都重新解释背景。
场景四:企业知识助手
Memory 可以保存:
- 用户所属团队
- 常访问系统
- 权限范围
- 最近查询主题
- 已确认的业务规则
同时,大量制度文档仍应放在 RAG 知识库,而不是全部塞进 Memory。
场景五:长期自动化 Agent
例如 Hermes Agent 这类长期在线 Agent,Memory 可以与 Skills、cron、消息网关结合:
- 记住用户偏好
- 沉淀任务经验
- 定期推送报告
- 从历史任务中学习
基于 LangGraph / LangChain 的 Memory 实践
LangGraph 对 Memory 的划分很清晰:
- 短期记忆:thread-level state,通过 checkpoint 保存
- 长期记忆:cross-thread memory,通过 store 保存
短期记忆:Checkpointer
最小示例:
from typing import Annotated, TypedDict
from langchain_core.messages import AnyMessage
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.checkpoint.memory import InMemorySaver
class AgentState(TypedDict):
messages: Annotated[list[AnyMessage], add_messages]
def call_model(state: AgentState):
response = model.invoke(state["messages"])
return {"messages": [response]}
builder = StateGraph(AgentState)
builder.add_node("model", call_model)
builder.add_edge(START, "model")
builder.add_edge("model", END)
checkpointer = InMemorySaver()
graph = builder.compile(checkpointer=checkpointer)
graph.invoke(
{"messages": [{"role": "user", "content": "我叫 Alice"}]},
{"configurable": {"thread_id": "user-1"}}
)
生产环境不要用纯内存 checkpointer,建议用 Postgres、Redis 或其他持久化后端。
长期记忆:Store
长期记忆应该与 thread 解耦。
例如保存用户偏好:
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
namespace = ("users", "alice", "profile")
store.put(namespace, "preferences", {
"language": "zh-CN",
"answer_style": "先结论后细节",
"preferred_shell": "PowerShell"
})
memory = store.get(namespace, "preferences")
LangGraph 最佳实践
- 短期记忆保存任务状态,长期记忆保存稳定事实
- 所有长期记忆都要有 namespace
- 不要把完整聊天记录当长期记忆
- 长期记忆写入前要做筛选和总结
- 敏感信息不要写入 Memory
- 生产环境使用数据库后端,而不是 InMemoryStore
基于 OpenAI Agents SDK 的 Memory 实践
OpenAI Agents SDK 使用 Session 管理会话历史。
Session 会在 Agent run 之间自动:
- 读取已有历史
- 合并本轮输入
- 执行 Agent
- 保存新的输入和输出
核心接口包括:
get_items(limit)add_items(items)pop_item()clear_session()
Python Session 示例
from agents import Agent, Runner
from agents.memory import SQLiteSession
agent = Agent(
name="Assistant",
instructions="You are a helpful assistant."
)
session = SQLiteSession("user-123", "memory.db")
result = Runner.run_sync(
agent,
"记住我喜欢中文回答,并且先给结论。",
session=session
)
result = Runner.run_sync(
agent,
"请解释什么是 RAG。",
session=session
)
Session 适合:
- 持久聊天状态
- 可恢复审批流程
- 多轮任务
- 你能控制的存储后端
但它更偏“会话记忆”,如果要做用户画像、长期事实、跨 session 检索,仍建议单独设计长期 Memory store。
基于 Claude Code 的 Memory 实践
Claude Code 的 Memory 主要包括两类:
CLAUDE.md:用户显式写入的持久说明- Auto memory:Claude 从纠正和模式中自动沉淀的学习
CLAUDE.md 适合写:
- 构建命令
- 测试命令
- 项目结构
- 代码规范
- 常见约定
- 用户偏好
示例:
# Project Memory
## Commands
- Install dependencies with `pnpm install`.
- Run tests with `pnpm test`.
- Run lint with `pnpm lint`.
## Conventions
- Keep edits scoped to the user request.
- Do not modify generated files manually.
- Answer in Chinese unless asked otherwise.
Claude Code 还支持不同层级的 memory:
- 企业/组织级
- 项目级
- 用户级
- 本地覆盖
更具体的规则通常优先级更高。
基于 Hermes Agent 的 Memory 实践
Hermes Agent 把 Memory 作为长期在线 Agent 的核心能力之一。
它会把记忆放在本地 ~/.hermes/memories/,并与 Skills、消息网关、cron、子 Agent 协同。
典型目录:
~/.hermes/
├── memories/
├── skills/
├── sessions/
├── logs/
└── config.yaml
配置示例:
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200
user_char_limit: 1375
Hermes 的思路更像“个人长期智能体”:
- Memory 记住用户和项目
- Skills 记住怎么做
- cron 主动执行任务
- gateway 跨平台触达用户
Memory 系统架构设计
一个生产级 Agent Memory 通常分成四层。
1. Session Store
保存当前会话或 thread 的消息历史和状态。
适合:
- 多轮对话
- 当前任务进度
- 临时上下文
2. Profile Store
保存用户画像和偏好。
适合:
- 语言
- 风格
- 时区
- 常用工具
- 权限范围
3. Knowledge Store
保存稳定知识或通过 RAG 检索的内容索引。
适合:
- 项目文档
- 产品手册
- FAQ
- 历史案例
4. Procedure Store
保存可复用流程。
这部分成熟后应该变成 Skill 或 Rule。
Memory 写入策略
Memory 最难的不是读取,而是写入。
什么应该写入?
适合写入:
- 用户明确要求“记住”
- 多次重复出现的偏好
- 长期稳定的项目事实
- 已验证的命令和路径
- 重要决策和结论
不适合写入:
- 临时情绪
- 未验证猜测
- 大段日志
- 机密信息
- 一次性任务细节
写入前要做总结
不要原样存聊天记录。
应该把对话压缩成短事实:
{
"type": "preference",
"subject": "response_style",
"value": "用户偏好中文回答,先给结论再给细节",
"confidence": 0.9,
"source": "explicit_user_request",
"updated_at": "2026-05-06"
}
给 Memory 加元数据
建议每条 memory 包含:
typescopeuser_idproject_idconfidencesourcecreated_atupdated_atexpires_at
Memory 检索策略
读取 Memory 时不要“全量塞入 prompt”。
应该按任务检索相关记忆。
推荐流程
- 识别当前任务类型
- 读取 session memory
- 检索用户偏好
- 检索项目相关事实
- 检索历史相似案例
- 组装最小必要上下文
伪代码:
def build_context(user_id, project_id, query):
short_term = session_store.get_recent(thread_id=query.thread_id, limit=10)
profile = memory_store.search(("users", user_id), query.text, top_k=3)
project = memory_store.search(("projects", project_id), query.text, top_k=5)
cases = memory_store.search(("episodes", project_id), query.text, top_k=3)
return assemble_context(
short_term=short_term,
profile=profile,
project=project,
cases=cases
)
Memory 的风险与治理
1. 错误记忆
Agent 可能把错误结论写成长期事实。
解决方案:
- 写入时标注 confidence
- 用户确认后再提升权重
- 允许用户查看和删除记忆
2. 过期记忆
项目命令、路径、API 可能变化。
解决方案:
- 设置
updated_at - 定期刷新
- 对低置信度记忆重新验证
3. 隐私风险
Memory 可能保存敏感信息。
解决方案:
- 禁止保存密钥、密码、token
- 对 PII 做脱敏
- 加密存储
- 按用户隔离 namespace
4. 上下文污染
塞入太多 Memory 会降低回答质量。
解决方案:
- top-k 检索
- 摘要压缩
- 按任务类型过滤
- 只注入最小必要记忆
Memory 最佳实践清单
设计原则
- 区分短期记忆和长期记忆
- 区分事实、偏好、流程和历史事件
- 先检索再注入,不要全量注入
- 写入前总结,写入后可修改
- 每条记忆都带来源和置信度
- 敏感信息默认不写入
技术选型
- 短期会话:Session / Checkpointer / Redis
- 长期事实:Postgres / SQLite / KV Store
- 语义检索:Vector DB
- 审计回放:事件日志
- 用户可控:Memory 管理 UI
工程落地
- 开发期可用内存存储
- 生产期使用数据库
- 对团队项目做 namespace 隔离
- 给用户提供“查看/删除/更新记忆”的入口
- 对 memory 写入建立 eval 或人工确认
一个推荐架构
常见误区
误区一:把聊天记录全存起来就是 Memory
不是。
聊天记录只是原始材料,Memory 应该是筛选、总结、结构化后的长期有用信息。
误区二:Memory 可以替代 RAG
不能。
Memory 适合保存用户和任务相关的个性化事实,RAG 适合检索大规模外部知识。
误区三:Memory 越多越好
不是。
过多记忆会污染上下文,甚至让 Agent 坚持过期信息。
误区四:所有记忆都应该自动写入
高质量 Memory 需要写入门槛。
用户明确要求、重复出现、长期稳定、已验证的信息才值得写。
总结
Agent Memory 的本质,是让 AI 从“一次性问答系统”变成“可持续协作伙伴”。
你可以这样记:
- 短期记忆保存当前任务连续性
- 长期记忆保存跨会话事实和偏好
- 语义记忆保存稳定知识
- 情景记忆保存历史事件
- 程序性记忆最终应该沉淀成 Skill 或 Rule
如果你正在构建生产级 Agent,建议从三件事开始:
- 用 Session 或 Checkpointer 管理短期会话状态
- 用独立 Store 管理长期用户偏好和项目事实
- 给 Memory 写入加上总结、脱敏、置信度和用户可控机制
Memory 不是越自动越好,而是越可控越可靠。

1万+

被折叠的 条评论
为什么被折叠?



