智能体系统需要记住过往交互信息,才能完成复杂任务并提供连贯体验。没有记忆机制,智能体就是无状态的,无法保持对话上下文、学习经验或个性化响应,仅能处理简单的一问一答,无法应对多步骤流程或用户需求变化。
核心问题是如何高效管理单次会话的临时信息和长期积累的知识。
核心思想:短期记忆维持当前对话,长期记忆跨会话保留知识。
短期记忆 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:手动管理
适合在链外直接控制对话历史:
history = ChatMessageHistory()
history.add_user_message("我下周要去纽约。")
history.add_ai_message("太棒了!纽约是个很棒的城市。")
ConversationBufferMemory:链式自动记忆
集成于链中,自动保存对话历史并注入到提示中。主要参数:
memory_key:指定提示中保存历史的变量名,默认historyreturn_messages:False返回格式化字符串,适合标准 LLM;True返回消息对象列表,推荐用于 Chat Model
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)
包含三个递进示例:
- ChatMessageHistory:手动添加和读取对话记录
- ConversationBufferMemory + 标准 LLM:旅行顾问场景,自动维护对话历史,验证模型记住用户名字
- ConversationBufferMemory + Chat Model:
return_messages=True,以结构化消息对象提升效果
示例 2:LangGraph 长期记忆(6.2记忆管理示例_LangGraph.py)
- InMemoryStore:演示
put/get/search操作,存储用户偏好规则并通过语义搜索检索 - 反思更新程序性记忆(结构演示):智能体通过反思更新自身指令,存储于
BaseStore
示例 3:ADK 记忆管理(6.3记忆管理示例_ADK.py)
- State 工具封装:通过
ToolContext在工具函数中更新session.state(推荐做法) - InMemoryMemoryService:长期知识管理基本初始化
- 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 等组件的具体用法。掌握了智能体如何记住信息后,下一步将探讨智能体如何根据新经验或数据改变思维、行为和知识。
相关笔记
- 上下文与记忆专题 — 原理、工程、安全与面试速记
- 智能体记忆系统 — 写入、检索、更新与遗忘
- 上一章:多智能体协作
- 下一章:MCP 协议
- 反思模式 — 利用记忆实现累积反思
- AI MOC