智能体的记忆系统
记忆是智能体区别于简单对话系统的核心能力之一。人类之所以能持续学习和协作,依赖于强大的记忆能力。同样,智能体也需要记忆来维持上下文连贯性、积累经验和个性化服务。本章深入解析智能体记忆系统的设计与实现。
记忆是智能体区别于简单对话系统的核心能力之一。人类之所以能持续学习和协作,依赖于强大的记忆能力。同样,智能体也需要记忆来维持上下文连贯性、积累经验和个性化服务。本章深入解析智能体记忆系统的设计与实现。
理解提示工程与工具调用
记忆的分类、短期记忆(上下文窗口)、长期记忆
行动系统 · 智能体深度解析
文章导航
点击图中节点可定位到对应正文。
引言
记忆是智能体区别于简单对话系统的核心能力之一。人类之所以能持续学习和协作,依赖于强大的记忆能力。同样,智能体也需要记忆来维持上下文连贯性、积累经验和个性化服务。本章深入解析智能体记忆系统的设计与实现。
1. 记忆的分类
1.1 按时间跨度分类
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 感觉记忆(Sensory Memory)────────────────────┐
│ 持续时间:< 1 秒 │
│ 类比:当前正在处理的输入 token │
└──────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 短期记忆(Short-term / Working Memory)────────┐
│ 持续时间:当前对话回合 │
│ 类比:LLM 的上下文窗口 │
│ 容量有限(受上下文窗口大小限制) │
└──────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 长期记忆(Long-term Memory)───────────────────┐
│ 持续时间:跨会话,永久保存 │
│ 类比:向量数据库 + 结构化存储 │
│ 容量几乎无限 │
└──────────────────────────────────────────────────┘1.2 按类型分类(认知科学类比)
| 记忆类型 | 人类类比 | Agent 实现 | 内容 |
|---|---|---|---|
| 情景记忆 | "昨天发生了什么" | 对话历史、操作日志 | 具体的事件和经历 |
| 语义记忆 | "地球是圆的" | 知识库、文档库 | 通用知识和事实 |
| 程序性记忆 | "怎么骑自行车" | 工具使用模板、工作流程 | 技能和操作步骤 |
2. 短期记忆(上下文窗口)
2.1 实现方式
短期记忆就是 LLM 的上下文窗口——当前对话的所有消息:
messages = [
{"role": "system", "content": "你是一个编程助手"},
{"role": "user", "content": "帮我写一个排序函数"},
{"role": "assistant", "content": "好的,用什么语言?"},
{"role": "user", "content": "Python"},
{"role": "assistant", "content": "def bubble_sort(arr): ..."},
{"role": "user", "content": "能改成快速排序吗?"},
# 所有历史消息构成了短期记忆
]2.2 短期记忆的管理策略
上下文窗口有限,对话太长时需要管理:
滑动窗口:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
保留最近 N 条消息,丢弃更早的:
[msg1, msg2, ..., msg100] → 保留 [msg91, ..., msg100]摘要压缩:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
对话太长时,用 LLM 对旧对话做摘要:
[msg1 ~ msg80] → LLM 摘要 → "用户讨论了排序算法,选择了快速排序"
[摘要] + [msg81 ~ msg100] → 新的上下文重要消息标记:
对重要消息(如用户偏好、关键决策)做标记,不被裁剪:
[系统消息(保留)] + [关键决策(保留)] + [最近 N 条消息]3. 长期记忆
3.1 基于向量数据库的记忆
这是最常见的长期记忆实现方式,本质上就是面向记忆的检索增强生成(RAG):
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
存储过程:
用户对话 / 重要事件 → LLM 提取关键信息 → Embedding 向量化 → 存入向量数据库根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
检索过程:
当前上下文 → 提取查询 → 在向量库中检索相关记忆 → 注入上下文根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
示例:
第一次对话:"我喜欢用 Python 编程"
→ 存储: {"memory": "用户偏好 Python", "embedding": [0.12, ...], "time": "2024-01-01"}根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
第十次对话:"帮我写一个数据分析脚本"
→ 检索到记忆:"用户偏好 Python"
→ Agent 自动用 Python 而非 R 或 Java3.2 结构化记忆
用键值对或数据库存储结构化信息:
# 用户画像记忆
user_profile = {
"name": "张三",
"role": "数据分析师",
"preferences": {
"language": "Python",
"database": "PostgreSQL",
"chart_style": "简洁风格"
},
"past_projects": ["销售分析", "用户行为分析"],
"communication_style": "喜欢直接给结果,不要太多解释"
}
# 项目上下文记忆
project_context = {
"project_name": "Q4 销售报告",
"data_sources": ["MySQL 数据库", "Excel 报表"],
"status": "数据清洗阶段",
"known_issues": ["12月数据缺失", "汇率需要统一"]
}3.3 MemGPT:操作系统式记忆管理
MemGPT 将操作系统的内存管理思想应用到 LLM 记忆:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
操作系统内存管理 MemGPT 记忆管理
───────────────── ──────────────────
寄存器 → 当前 token(注意力焦点)
L1/L2 缓存 → 核心记忆(始终在上下文中)
主存 (RAM) → 工作记忆(当前上下文窗口)
磁盘 → 归档记忆(向量数据库)4. 记忆的读写操作
4.1 记忆写入
# 策略 1: 每次对话后自动提取并存储
def after_conversation(messages, memory_store):
# 用 LLM 提取值得记住的信息
summary = llm.generate(
"从以下对话中提取值得长期记住的关键信息:"
+ str(messages)
)
if summary:
memory_store.add(summary, metadata={"time": now(), "type": "episodic"})
# 策略 2: 用户显式要求记住
# 用户说:"记住,我的服务器 IP 是 192.168.1.100"
# Agent 直接存储
# 策略 3: 重要事件触发
# Agent 完成一个复杂任务后,存储解决方案4.2 记忆检索
# 检索相关记忆并注入上下文
def get_context_with_memories(query, memory_store):
# 1. 语义检索:找与当前问题相关的记忆
relevant_memories = memory_store.search(query, top_k=5)
# 2. 时间检索:找最近的记忆
recent_memories = memory_store.get_recent(limit=3)
# 3. 组合到系统提示中
system_prompt = f"""
你是一个有帮助的助手。
以下是你对用户的记忆:
{format_memories(relevant_memories)}
最近的交互记录:
{format_memories(recent_memories)}
"""
return system_prompt4.3 记忆更新与遗忘
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
# 1. 矛盾检测:新记忆与旧记忆矛盾时,更新旧记忆
# 旧:"用户偏好 Java" → 新:"用户转用 Python" → 更新根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
# 3. 合并去重:相似记忆合并为一条更完整的记忆
# "用户喜欢 Python" + "用户用 Python 做数据分析"
# → "用户偏好 Python,主要用于数据分析"5. 记忆系统的设计原则
5.1 核心原则
| 原则 | 说明 |
|---|---|
| 选择性记忆 | 不是所有信息都值得记住,要有筛选机制 |
| 分层存储 | 核心信息常驻,一般信息按需检索 |
| 及时更新 | 记忆要随着新信息更新,避免过时 |
| 隐私保护 | 敏感信息需要加密或脱敏存储 |
| 可解释性 | 让用户知道 Agent 记住了什么,可以删除 |
5.2 记忆容量管理
记忆管理的核心问题:记什么、忘什么、何时检索
应该记住的:
- 用户偏好和习惯
- 重要决策和结论
- 项目关键信息
- 反复提到的概念
应该遗忘的:
- 临时性的调试信息
- 被纠正的错误信息
- 过于细节的过程信息
- 用户明确要求忘记的6. 实践案例
6.1 ChatGPT 的记忆功能
ChatGPT Memory(2024 年上线):
- 自动从对话中提取关键信息
- 用户可以在设置中查看和删除记忆
- 记忆跨会话保持
示例记忆:
- "用户在一家 SaaS 公司做产品经理"
- "用户喜欢简洁的回答,不需要太多解释"
- "用户的项目使用 React + TypeScript"6.2 企业级 Agent 的记忆设计
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
企业 Agent 记忆分层:
├── 全局记忆(组织级)
│ ├── 公司知识库
│ ├── 组织架构
│ └── 业务规则
├── 项目记忆(项目级)
│ ├── 项目文档
│ ├── 决策记录
│ └── 进度状态
└── 用户记忆(个人级)
├── 个人偏好
├── 历史交互
└── 权限范围7. 本章小结
| 记忆类型 | 实现方式 | 持久性 | 容量 |
|---|---|---|---|
| 短期记忆 | 上下文窗口 | 会话内 | 受窗口大小限制 |
| 长期记忆 | 向量数据库 | 永久 | 几乎无限 |
| 结构化记忆 | 键值数据库 | 永久 | 按需扩展 |
| 核心记忆 | 系统提示 | 会话内 | 精简 |
相关章节
- 什么是智能体 — 记忆在智能体整体架构中的位置
- 检索增强生成(RAG) — 向量记忆检索的技术基础
- 上下文窗口与长文本 — 短期记忆的载体
延伸阅读
- Packer, C. et al. (2023). "MemGPT: Towards LLMs as Operating Systems". arXiv:2310.08560
- Park, J.S. et al. (2023). "Generative Agents: Interactive Simulacra of Human Behavior". UIST
- Wang, Z. et al. (2024). "Augmenting Language Models with Long-Term Memory". ACL