跳到主要内容
SUN / 笔记
← 全部文章

记忆管理(Memory Management)

智能体系统需要记住过往交互信息,才能完成复杂任务并提供连贯体验。没有记忆机制,智能体就是无状态的,无法保持对话上下文、学习经验或个性化响应,仅能处理简单的一问一答,无法应对多步骤流程或用户需求变化。

核心问题是如何高效管理单次会话的临时信息和长期积累的知识。

核心思想:短期记忆维持当前对话,长期记忆跨会话保留知识。

短期记忆 vs 长期记忆

对比 短期记忆 长期记忆
范围 单次会话内 跨多次会话
存储 LLM 上下文窗口 / 框架状态 外部数据库(常为向量库)
生命周期 会话结束即消失 持久保存
用途 维持对话连贯 用户偏好、历史知识、学习经验
限制 上下文窗口大小 检索准确性、存储成本

标准解决方案是实现双组件记忆系统:短期记忆保存最近交互数据于 LLM 上下文窗口,维持对话流畅;需持久的信息则通过外部数据库(常为向量库)实现高效语义检索。

经验法则

只要智能体需要做的不仅仅是回答单个问题,就应采用该模式。对于需在对话中保持上下文、跟踪多步骤任务进度或通过回忆用户偏好和历史实现个性化的 Agent,记忆管理是必需的。只要智能体需根据过往成功、失败或新知识学习和适应,都应实现记忆管理。

Google ADK 的记忆组件

ADK 等智能体框架提供专用组件管理记忆:

Session(会话线程)

管理会话生命周期,包括历史(events)和临时数据(state)。SessionService 负责会话的创建、获取和管理。

State(临时数据)

session.state 是临时数据字典,通过前缀标明数据归属和持久性:

前缀 含义
user: 用户级数据,跨会话保留
app: 应用级数据
temp: 临时数据,会话结束即清除
无前缀 会话级数据

重要:推荐通过 EventActions.state_delta 或 output_key 更新 state,不要直接修改 session.state 字典。直接修改会绕过标准事件处理机制,导致变更未被记录、无法持久化、可能引发并发问题且不会更新元数据。session.state 应主要用于读取数据。

设计 state 时应保持简单,使用基础类型、清晰命名和正确前缀,避免深层嵌套,并始终通过 append_event 流程更新。

MemoryService(长期知识库)

MemoryService(BaseMemoryService 接口)定义了长期知识管理标准,主要功能包括:

  • 添加信息:add_session_to_memory
  • 检索信息:search_memory

Session 和 State 可视为单次会话的短期记忆,而 MemoryService 管理的长期知识则是持久且可检索的信息仓库,可能包含多次交互或外部数据。

ADK 提供多种长期知识存储实现:

  • InMemoryMemoryService:适合测试但不持久化
  • VertexAiRagMemoryService:生产环境推荐,利用 Google Cloud 的 RAG 服务实现可扩展、持久和语义检索

LangChain 的记忆管理

在 LangChain 中,记忆是构建智能、自然对话应用的关键。它让智能体能记住过往交互、学习反馈并适应用户偏好。LangChain 的记忆功能通过引用历史丰富当前提示,并记录最新交互以备后用。

ChatMessageHistory:手动管理

适合在链外直接控制对话历史:

python
history = ChatMessageHistory()
history.add_user_message("我下周要去纽约。")
history.add_ai_message("太棒了!纽约是个很棒的城市。")

ConversationBufferMemory:链式自动记忆

集成于链中,自动保存对话历史并注入到提示中。主要参数:

  • memory_key:指定提示中保存历史的变量名,默认 history
  • return_messages:False 返回格式化字符串,适合标准 LLM;True 返回消息对象列表,推荐用于 Chat Model
python
memory = ConversationBufferMemory(memory_key="history")
conversation = LLMChain(llm=llm, prompt=prompt, memory=memory)
response = conversation.predict(question="我想订机票。")

LangGraph 的长期记忆

LangGraph 支持高级长期记忆管理:

  • 短期记忆:线程级别,跟踪单次会话内的对话,通过 checkpointer 持久化,可随时恢复线程
  • 长期记忆:跨会话保存用户或应用级数据,在自定义命名空间下存储,可随时在任意线程中调用

长期记忆的三种类型

类比人类记忆:

类型 类比 说明 应用
语义记忆 记住事实 保存具体事实和概念,如用户偏好或领域知识 用户"画像"(JSON)或事实集合
情景记忆 记住经历 回忆过去事件或行为 few-shot 示例提示,学习成功交互序列
程序性记忆 记住规则 记忆任务执行方法,即核心指令和行为 系统提示,可通过"反思"自我优化

InMemoryStore

LangGraph 将长期记忆以 JSON 文档存储,每条记忆按命名空间(如文件夹)和键(如文件名)组织,支持 put、get 和 search 操作。

Vertex Memory Bank

Memory Bank 是 Vertex AI Agent Engine 的托管服务,为智能体提供持久的长期记忆。服务利用 Gemini 模型异步分析对话历史,提取关键事实和用户偏好。

信息按作用域(如用户 ID)持久存储,并智能更新以整合新数据和解决矛盾。新会话开始时,智能体可通过全量回调或嵌入相似度检索相关记忆,实现跨会话连续性和个性化响应。

Agent 的 runner 通过 VertexAiMemoryBankService 交互,初始化后自动存储会话生成的记忆,每条记忆标记唯一 USER_ID 和 APP_NAME,确保未来准确检索。Memory Bank 与 Google ADK 无缝集成,对于 LangGraph、CrewAI 等其他框架也可通过 API 直接调用。

代码示例

示例 1:LangChain 记忆管理(6.1记忆管理示例_LangChain.py)

包含三个递进示例:

  1. ChatMessageHistory:手动添加和读取对话记录
  2. ConversationBufferMemory + 标准 LLM:旅行顾问场景,自动维护对话历史,验证模型记住用户名字
  3. ConversationBufferMemory + Chat Model:return_messages=True,以结构化消息对象提升效果

示例 2:LangGraph 长期记忆(6.2记忆管理示例_LangGraph.py)

  1. InMemoryStore:演示 put/get/search 操作,存储用户偏好规则并通过语义搜索检索
  2. 反思更新程序性记忆(结构演示):智能体通过反思更新自身指令,存储于 BaseStore

示例 3:ADK 记忆管理(6.3记忆管理示例_ADK.py)

  1. State 工具封装:通过 ToolContext 在工具函数中更新 session.state(推荐做法)
  2. InMemoryMemoryService:长期知识管理基本初始化
  3. VertexAiMemoryBankService:Vertex AI Memory Bank 集成参考

关键要点

  • 记忆对于智能体跟踪信息、学习和个性化交互至关重要
  • 对话式 AI 依赖短期记忆维持单次聊天上下文,长期记忆则跨会话保存知识
  • 短期记忆(即时信息)是临时的,常受 LLM 上下文窗口或框架传递方式限制
  • 长期记忆(持久信息)通过外部存储(如向量数据库)保存,并通过检索访问
  • ADK 框架有专用组件:Session(聊天线程)、State(临时数据)、MemoryService(长期知识库)
  • 在 ADK 中,推荐通过 EventActions.state_delta 或 output_key 更新 state,不要直接修改 state 字典
  • LangChain 提供 ConversationBufferMemory 等工具,自动将对话历史注入提示
  • LangGraph 支持高级长期记忆,通过 store 保存和检索语义事实、情景经历或可更新规则
  • Memory Bank 是托管服务,自动提取、存储和回忆用户信息,支持 ADK、LangGraph、CrewAI 等框架

总结

本章深入讲解了智能体系统的记忆管理,阐明了短期上下文与长期知识的区别及其实现方式。介绍了 Google ADK 提供的 Session、State 和 MemoryService 等组件的具体用法。掌握了智能体如何记住信息后,下一步将探讨智能体如何根据新经验或数据改变思维、行为和知识。

相关笔记

相关文章

强化学习笔记 →上下文工程 →Mission: 掌握多模态 LoRA 与 QLoRA →