一、核心定义
记忆管理(Memory Management):智能体保留并利用过往交互、观察和学习经验中的信息的能力,分为短期记忆(即时上下文)和长期记忆(持久化知识库)两种类型,使智能体能维持对话连贯性、个性化响应并持续改进。
可视化示意图:

图 1:记忆管理设计模式
记忆类比:
人类记忆 智能体记忆
────────── ──────────────
工作记忆 → 短期记忆(Context Window / Session State)
长期记忆 → 长期记忆(Vector DB / External Storage)
二、短期记忆 vs 长期记忆
| 维度 | 短期记忆 (Short-Term) | 长期记忆 (Long-Term) |
|---|---|---|
| 存储位置 | 上下文窗口 / Session State | 外部数据库 / 向量数据库 |
| 作用域 | 当前对话 | 跨多个会话 |
| 生命周期 | 会话结束后丢失 | 持久化存储 |
| 容量 | 受LLM上下文窗口限制 | 理论上无限 |
| 访问方式 | 直接读取 | 查询检索(语义搜索) |
| 内容 | 最近消息、工具调用结果、反思 | 用户偏好、历史交互、知识库 |
| 类比 | 工作台/草稿本 | 档案室/图书馆 |
为什么需要两种记忆?
- 短期记忆:维持对话流畅性,处理当前上下文
- 长期记忆:实现跨会话连续性,个性化和学习能力
三、典型应用场景
1. 聊天机器人和对话AI
- 短期记忆:记住本次对话中的用户输入,生成连贯回复
- 长期记忆:调取用户偏好、过往问题历史
2. 任务导向型智能体
- 短期记忆:追踪已完成步骤、当前进度、总体目标
- 长期记忆:访问用户特定数据(如订单历史)
3. 个性化体验服务
- 长期记忆:存储用户偏好、历史行为模式、个人信息
- 价值:动态调整响应策略
4. 学习与性能优化
- 长期记忆:保存成功策略、错误经验、新获取知识
- 价值:持续改进,强化学习
5. 信息检索(RAG)
- 长期记忆:作为知识库,通过RAG检索相关文档
- 价值:准确回答问题
6. 自主控制系统
- 短期记忆:实时环境感知
- 长期记忆:地图信息、导航路线、学习的行为模式
四、Google ADK 记忆管理架构
核心三要素
| 组件 | 作用 | 生命周期 | 类比 |
|---|---|---|---|
| Session | 独立聊天线程,记录消息和动作 | 单次对话 | 会议记录本 |
| State | 会话内的临时数据(键值对) | 单次对话 | 便签纸 |
| Memory | 可搜索的长期知识库 | 跨多个会话 | 档案室 |
1. Session(会话)
定义:一个独立的对话线程
包含内容:
- 唯一标识符(id, app_name, user_id)
- 事件历史(Event对象)
- 会话状态(state)
- 更新时间戳(last_update_time)
SessionService 实现方式:
| 类型 | 适用场景 | 持久化 |
|---|---|---|
| <code>InMemorySessionService</code> | 测试/开发 | ❌ 重启丢失 |
| <code>DatabaseSessionService</code> | 生产环境 | ✅ 数据库持久化 |
| <code>VertexAiSessionService</code> | GCP生产 | ✅ Vertex AI托管 |
2. State(状态)
定义:会话的临时工作记忆,以字典形式存储数据
State 前缀机制:
| 前缀 | 作用域 | 生命周期 | 示例 |
|---|---|---|---|
| (无前缀) | 当前会话 | 会话结束销毁 | <code>task_status</code> |
| <code>user:</code> | 用户级,跨所有会话 | 持久化(取决于Service) | <code>user:login_count</code> |
| <code>app:</code> | 应用级,所有用户共享 | 持久化 | <code>app:feature_flags</code> |
| <code>temp:</code> | 当前处理轮次 | 单次处理后销毁 | <code>temp:validation_needed</code> |
State 更新方式:
方法1:简单方式 - output_key
greeting_agent = LlmAgent(
name="Greeter",
model="gemini-2.0-flash",
output_key="last_greeting" # 自动保存响应到state
)
方法2:标准方式 - EventActions.state_delta
def log_user_login(tool_context: ToolContext) -> dict:
state = tool_context.state
state["user:login_count"] = state.get("user:login_count", 0) + 1
state["task_status"] = "active"
return {"status": "success"}
❌ 禁止直接修改:
# 错误示例 - 不要这样做!
session.state["key"] = "value" # 绕过事件机制,不持久化
3. Memory(长期记忆)
MemoryService 实现:
| 类型 | 存储方式 | 适用场景 |
|---|---|---|
| <code>InMemoryMemoryService</code> | 内存 | 测试 |
| <code>VertexAiRagMemoryService</code> | Vertex AI RAG | 生产,语义搜索 |
核心操作:
- <code>add_session_to_memory()</code>: 从会话提取信息存储
- <code>search_memory()</code>: 语义搜索相关信息
五、LangChain / LangGraph 记忆管理
LangChain 短期记忆
1. ChatMessageHistory - 手动管理
from langchain.memory import ChatMessageHistory
history = ChatMessageHistory()
history.add_user_message("我下周要去纽约。")
history.add_ai_message("太好了!这是一个很棒的城市。")
print(history.messages)
2. ConversationBufferMemory - 自动集成
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="history", # 提示词中的变量名
return_messages=True # 返回消息对象列表(推荐)
)
# 集成到链中
conversation = LLMChain(llm=llm, prompt=prompt, memory=memory)
LangGraph 长期记忆
三种类型(类比人类记忆):
| 类型 | 定义 | 实现方式 | 用途 |
|---|---|---|---|
| 语义记忆 | 事实和概念 | 用户档案(JSON) | 存储偏好、领域知识 |
| 情景记忆 | 过往经历 | 少样本示例 | 学习如何完成任务 |
| 程序记忆 | 如何执行任务 | System Prompt | 核心指令,反思更新 |
InMemoryStore 示例:
from langgraph.store.memory import InMemoryStore
store = InMemoryStore(index={"embed": embed, "dims": 2})
namespace = ("user_123", "chitchat")
# 存储
store.put(namespace, "memory_key", {"rules": ["用户喜欢简短语言"]})
# 获取
item = store.get(namespace, "memory_key")
# 搜索
items = store.search(namespace, query="语言偏好")
六、Vertex Memory Bank
定义:Vertex AI Agent Engine 的托管长期记忆服务
核心能力:
- 使用Gemini模型异步分析对话历史
- 自动提取关键事实和用户偏好
- 按用户ID组织,智能更新和解决矛盾
- 支持完整召回或语义搜索
使用示例:
from google.adk.memory import VertexAiMemoryBankService
memory_service = VertexAiMemoryBankService(
project="PROJECT_ID",
location="LOCATION",
agent_engine_id=agent_engine_id
)
# 自动存储会话记忆
await memory_service.add_session_to_memory(session)
跨框架支持:
- Google ADK (原生集成)
- LangGraph (API调用)
- CrewAI (API调用)
七、设计原则
黄金法则
- 短期记忆用于连贯性:维持单次对话的流畅
- 长期记忆用于持久性:跨会话保留重要信息
- 分层存储:根据作用域和生命周期选择存储方式
- 语义检索:使用向量数据库实现相似性搜索
State 设计最佳实践
✅ 应该做的:
- 保持简洁,使用基本数据类型
- 键名清晰,正确使用前缀
- 通过<code>append_event</code>更新状态
- 避免深度嵌套
❌ 不应该做的:
- 直接修改<code>session.state</code>字典
- 存储大量数据在State(用Memory)
- 混淆State和Memory的职责
八、关键概念速查
| 概念 | 定义 |
|---|---|
| 短期记忆 | 上下文窗口内的即时信息 |
| 长期记忆 | 外部存储的持久化知识 |
| Session | 独立的聊天线程 |
| State | 会话内临时数据字典 |
| Memory | 可搜索的长期知识库 |
| SessionService | 管理会话生命周期 |
| MemoryService | 管理长期记忆存取 |
| EventActions.state_delta | 标准状态更新方式 |
| output_key | 自动保存响应到State |
| 语义搜索 | 基于相似性检索记忆 |
| Memory Bank | Vertex AI托管记忆服务 |
九、常见问题
Q1:上下文窗口越长越好吗?
不一定。长上下文增加成本和延迟,且仍是短期记忆(会话结束丢失)。应该用长期记忆存储重要信息。
Q2:如何选择SessionService?
- 测试/开发:<code>InMemorySessionService</code>
- 生产(自建):<code>DatabaseSessionService</code>
- 生产(GCP):<code>VertexAiSessionService</code>
Q3:State和Memory的区别?
State是临时便签,Memory是永久档案。State用于当前会话数据,Memory用于跨会话知识。
Q4:如何避免State数据丢失?
1) 使用持久化的SessionService;2) 通过<code>append_event</code>更新;3) 重要信息应存入Memory而非State。
Q5:向量数据库如何实现语义搜索?
将信息转为向量,存储在向量数据库。检索时,将查询转为向量,计算相似度,返回最相关结果。
Q6:三种长期记忆类型如何选择?
- 语义记忆:事实和偏好 → 用户档案
- 情景记忆:如何做任务 → 少样本示例
- 程序记忆:核心指令 → System Prompt + 反思更新
十、参考资源
官方文档
代码示例
- 原文章节:<code>14-Chapter-08-Memory-Management.md</code>
- ADK Session/State示例(章节内嵌)
- LangChain Memory示例(章节内嵌)
扩展阅读
- 第 14 章:知识检索 RAG (长期记忆的核心实现)
- 第 4 章:反思 (程序记忆的更新机制)