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

内容纲要

导语

没有记忆的智能体每次对话都是全新的开始,无法维持连贯性,也无法个性化响应。记忆管理通过短期记忆(上下文窗口)和长期记忆(向量数据库)两种机制,让智能体记住历史交互、用户偏好和学习经验,实现对话连贯性、个性化响应并持续改进。本文介绍 Google ADK 和 LangChain 的记忆管理架构、State 设计最佳实践与实战案例,适合需要构建持久化智能体的开发者。

TL;DR

  • 核心:记忆管理分为短期记忆(上下文窗口/Session State)和长期记忆(向量数据库/外部存储),使智能体维持对话连贯性、个性化响应并持续改进。
  • 价值:短期记忆维持对话流畅性,长期记忆实现跨会话连续性、个性化和学习能力。
  • 架构:Google ADK 使用 Session(会话)、State(状态)、Memory(长期记忆)三要素;LangChain 使用 ChatMessageHistory、ConversationBufferMemory、InMemoryStore。
  • 实践:State 使用前缀机制(user:/app:/temp:),通过 append_event 更新,禁止直接修改;Memory 使用语义搜索检索相关信息。
  • 边界:上下文窗口越长越好是误解,应该用长期记忆存储重要信息;State 是临时便签,Memory 是永久档案。

是什么:记忆管理的核心定义

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

记忆类比

人类记忆          智能体记忆
──────────      ──────────────
工作记忆    →    短期记忆(Context Window / Session State)
长期记忆    →    长期记忆(Vector DB / External Storage)

可视化示意图

记忆管理设计模式

图1:记忆管理设计模式 - 从短期记忆到长期记忆的完整架构

读图要点:短期记忆用于当前对话,长期记忆用于跨会话知识存储和检索。

常见误解澄清

  • ❌ 上下文窗口越长越好:长上下文增加成本和延迟,且仍是短期记忆(会话结束丢失),应该用长期记忆存储重要信息。
  • ❌ State 和 Memory 可以混用:State 是临时便签,Memory 是永久档案,职责不同。
  • ❌ 可以直接修改 session.state:应该通过 append_event 更新,直接修改不持久化。

为什么:产生背景与适用场景

产生背景

无记忆的问题:

  • 无法维持对话连贯性:每次对话都是全新开始,无法理解上下文。
  • 无法个性化响应:无法记住用户偏好和历史行为。
  • 无法持续学习:无法从过往经验中改进。

记忆管理的优势:

  • ✅ 维持对话流畅性
  • ✅ 实现跨会话连续性
  • ✅ 个性化响应
  • ✅ 持续改进和学习

短期记忆 vs 长期记忆

维度 短期记忆 (Short-Term) 长期记忆 (Long-Term)
存储位置 上下文窗口 / Session State 外部数据库 / 向量数据库
作用域 当前对话 跨多个会话
生命周期 会话结束后丢失 持久化存储
容量 受LLM上下文窗口限制 理论上无限
访问方式 直接读取 查询检索(语义搜索)
内容 最近消息、工具调用结果、反思 用户偏好、历史交互、知识库
类比 工作台/草稿本 档案室/图书馆

为什么需要两种记忆?

  • 短期记忆:维持对话流畅性,处理当前上下文
  • 长期记忆:实现跨会话连续性,个性化和学习能力

怎么做:Google ADK 与 LangChain 实现

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;)

对比与取舍:State 设计最佳实践

State 设计最佳实践

应该做的

  • 保持简洁,使用基本数据类型
  • 键名清晰,正确使用前缀
  • 通过<code>append_event</code>更新状态
  • 避免深度嵌套

不应该做的

  • 直接修改<code>session.state</code>字典
  • 存储大量数据在State(用Memory)
  • 混淆State和Memory的职责

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调用)

常见错误与排错

典型坑位

问题 症状 识别方法 修复建议
State数据丢失 会话结束后数据消失 检查是否使用持久化SessionService 使用DatabaseSessionService或VertexAiSessionService
直接修改State 数据不持久化 检查是否使用append_event 通过append_event更新状态
State和Memory混淆 重要信息存储在State 检查数据生命周期需求 重要信息应存入Memory
上下文窗口溢出 超出Token限制 检查上下文长度 使用长期记忆存储历史

调试技巧

  1. 检查SessionService类型:确认是否使用持久化服务。
  2. 验证State前缀:确保正确使用user:/app:/temp:前缀。
  3. 测试Memory检索:验证语义搜索是否正常工作。
  4. 监控上下文长度:避免超出模型限制。

FAQ

Q1:上下文窗口越长越好吗?
A:不一定。长上下文增加成本和延迟,且仍是短期记忆(会话结束丢失)。应该用长期记忆存储重要信息。

Q2:如何选择SessionService?
A:

  • 测试/开发:<code>InMemorySessionService</code>
  • 生产(自建):<code>DatabaseSessionService</code>
  • 生产(GCP):<code>VertexAiSessionService</code>

Q3:State和Memory的区别?
A:State是临时便签,Memory是永久档案。State用于当前会话数据,Memory用于跨会话知识。

Q4:如何避免State数据丢失?
A:1) 使用持久化的SessionService;2) 通过<code>append_event</code>更新;3) 重要信息应存入Memory而非State。

Q5:向量数据库如何实现语义搜索?
A:将信息转为向量,存储在向量数据库。检索时,将查询转为向量,计算相似度,返回最相关结果。

Q6:三种长期记忆类型如何选择?
A:

  • 语义记忆:事实和偏好 → 用户档案
  • 情景记忆:如何做任务 → 少样本示例
  • 程序记忆:核心指令 → System Prompt + 反思更新

延伸阅读与引用

官方文档


总结

记忆管理是智能体实现连贯对话、个性化响应和持续学习的核心能力。通过短期记忆(Session/State)和长期记忆(Memory)的分层架构,智能体可以维持对话流畅性,同时实现跨会话的连续性和个性化。Google ADK 的三要素架构(Session、State、Memory)和 LangChain 的多种记忆类型为不同场景提供了灵活的选择。

滚动至顶部