记忆管理(Memory Management)| Agentic Design Patterns | 智能体设计模式

内容纲要

一、核心定义

记忆管理(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=&quot;Greeter&quot;,
    model=&quot;gemini-2.0-flash&quot;,
    output_key=&quot;last_greeting&quot;  # 自动保存响应到state
)

方法2:标准方式 - EventActions.state_delta

def log_user_login(tool_context: ToolContext) -&gt; dict:
    state = tool_context.state
    state[&quot;user:login_count&quot;] = state.get(&quot;user:login_count&quot;, 0) + 1
    state[&quot;task_status&quot;] = &quot;active&quot;
    return {&quot;status&quot;: &quot;success&quot;}

❌ 禁止直接修改

# 错误示例 - 不要这样做!
session.state[&quot;key&quot;] = &quot;value&quot;  # 绕过事件机制,不持久化

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(&quot;我下周要去纽约。&quot;)
history.add_ai_message(&quot;太好了!这是一个很棒的城市。&quot;)
print(history.messages)

2. ConversationBufferMemory - 自动集成

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key=&quot;history&quot;,      # 提示词中的变量名
    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={&quot;embed&quot;: embed, &quot;dims&quot;: 2})
namespace = (&quot;user_123&quot;, &quot;chitchat&quot;)

# 存储
store.put(namespace, &quot;memory_key&quot;, {&quot;rules&quot;: [&quot;用户喜欢简短语言&quot;]})

# 获取
item = store.get(namespace, &quot;memory_key&quot;)

# 搜索
items = store.search(namespace, query=&quot;语言偏好&quot;)

六、Vertex Memory Bank

定义:Vertex AI Agent Engine 的托管长期记忆服务

核心能力

  • 使用Gemini模型异步分析对话历史
  • 自动提取关键事实和用户偏好
  • 按用户ID组织,智能更新和解决矛盾
  • 支持完整召回或语义搜索

使用示例

from google.adk.memory import VertexAiMemoryBankService

memory_service = VertexAiMemoryBankService(
    project=&quot;PROJECT_ID&quot;,
    location=&quot;LOCATION&quot;,
    agent_engine_id=agent_engine_id
)

# 自动存储会话记忆
await memory_service.add_session_to_memory(session)

跨框架支持

  • Google ADK (原生集成)
  • LangGraph (API调用)
  • CrewAI (API调用)

七、设计原则

黄金法则

  1. 短期记忆用于连贯性:维持单次对话的流畅
  2. 长期记忆用于持久性:跨会话保留重要信息
  3. 分层存储:根据作用域和生命周期选择存储方式
  4. 语义检索:使用向量数据库实现相似性搜索

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 章:反思 (程序记忆的更新机制)

滚动至顶部