Agent记忆系统设计:短期记忆与长期沉淀
作者: AI系统架构实践者
发布时间: 2026-05-26
分类: 人工智能 · 系统设计 · 记忆机制
标签:AI Agent,Memory系统,RAG,知识管理
一、没有记忆的Agent是金鱼
想象一下:你和一个朋友聊天,每说一句话,他就忘了之前说过什么。你得不断重复背景信息,对话根本无法深入。
这就是没有记忆系统的Agent。
记忆对Agent的意义:
- 连续性:多轮对话保持上下文
- 个性化:记住用户偏好,提供定制化服务
- 经验积累:从过去任务中学习,越用越聪明
二、记忆的分层架构
我设计了一个三层记忆模型:
┌─────────────────────────────────────┐
│ 工作记忆 (Working Memory) │ ← 当前任务上下文
│ 最近对话 + 任务状态 + 临时变量 │ 容量小,访问快
├─────────────────────────────────────┤
│ 短期记忆 (Short-term Memory) │ ← 会话级记忆
│ 当前会话历史 + 用户本次偏好 │ 会话结束可归档
├─────────────────────────────────────┤
│ 长期记忆 (Long-term Memory) │ ← 持久化知识
│ 用户画像 + 经验总结 + 领域知识 │ 跨会话可用
└─────────────────────────────────────┘
三、工作记忆:当前任务的"草稿纸"
作用
- 存放当前任务的关键信息
- 作为推理过程的临时工作区
- 供工具调用时读取参数
实现方式
方案A:直接放在提示词上下文
current_context = """
【当前任务】
生成一份Python入门教程
【已确认信息】
- 目标读者:编程零基础的小白
- 篇幅要求:3000字左右
- 待确认:需要包含实践项目吗?
"""
messages = [
{"role": "system", "content": agent_persona},
{"role": "user", "content": current_context + user_input}
]
方案B:结构化存储
working_memory = {
"task": "生成Python入门教程",
"confirmed": {
"audience": "编程零基础",
"length": "3000字"
},
"pending": ["是否需要实践项目"],
"temp_data": {
"outline": "已完成,待审核",
"current_section": "第2章"
}
}
最佳实践
- 保持精简,只放当前任务相关
- 定期清理已完成的信息
- 关键决策点要显式记录
四、短期记忆:会话的"行车记录仪"
作用
- 记录完整对话历史
- 支持多轮引用和追问
- 会话结束后可提炼为长期记忆
实现方式
滑动窗口策略
只保留最近的N轮对话,避免上下文过长:
MAX_HISTORY = 10
def get_context(history):
# 保留最近10轮
recent = history[-MAX_HISTORY:]
# 更早的对话做摘要
if len(history) > MAX_HISTORY:
older = history[:-MAX_HISTORY]
summary = generate_summary(older)
return [summary] + recent
return recent
摘要压缩策略
当历史太长时,生成摘要替代原始对话:
原始对话(10轮)→ 摘要:"用户想学习Python,已确认零基础、3000字篇幅,正在讨论是否需要实践项目"
最佳实践
- 重要信息要及时"确认"并记录
- 定期做摘要压缩,释放上下文空间
- 区分"事实"和"临时讨论",只保留事实
五、长期记忆:Agent的"知识库"
作用
- 跨会话记住用户信息
- 积累任务经验和最佳实践
- 存储领域知识,提升专业能力
存储方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 向量数据库 | 语义检索,模糊匹配 | 构建成本高 | 大规模知识库 |
| 关系数据库 | 结构清晰,精确查询 | 需要预定义schema | 结构化信息(用户画像) |
| 文件系统 | 简单直接,版本可控 | 检索效率低 | 小规模、开发阶段 |
| 图数据库 | 关系表达强 | 学习成本高 | 复杂关系网络 |
我的混合方案
用户画像 → 关系数据库(SQLite/PostgreSQL)
├─ 用户ID、偏好设置、常用指令
经验知识 → 向量数据库(Chroma/Pinecone)
├─ 成功案例分析
├─ 失败教训总结
└─ 领域知识文档
原始记录 → 文件系统(Markdown/JSON)
└─ 完整会话日志,供回溯
六、长期记忆的更新机制
问题:记忆不是越多越好,垃圾记忆会污染系统。
筛选策略
不是所有信息都值得长期保存:
def should_remember(event):
# 只保留高价值信息
if event["type"] == "user_preference":
return True # 用户偏好很重要
if event["type"] == "task_result":
if event["success"] and event["novelty"] > 0.7:
return True # 成功的创新解法值得记
if not event["success"] and event["lesson"]:
return True # 失败的教训也值得记
return False
定期整理
设置定时任务,定期整理记忆:
# 每周运行一次
def weekly_memory_maintenance():
# 1. 去重:合并相似的记忆
merge_similar_memories()
# 2. 遗忘:删除低价值、过时的记忆
purge_outdated_memories()
# 3. 总结:提炼本周的经验模式
generate_weekly_insights()
七、RAG:记忆的"搜索引擎"
对于大规模长期记忆,直接塞给模型不现实。用RAG(检索增强生成)按需获取:
用户提问
↓
向量化用户问题 → 在记忆库中检索相关片段
↓
将检索结果 + 用户问题一起传给模型
↓
模型生成回复
关键优化点
- 分块策略:长文档怎么切分?按段落、按主题、还是固定长度?
- 召回质量:检索到的内容真的相关吗?需要调优embedding模型
- 去重合并:检索到多个相似片段,怎么合并避免重复?
八、踩坑记录
坑1:记忆污染
早期我把所有对话都存进长期记忆,结果系统越来越"糊涂",经常引用不相关的旧信息。
解决:建立准入门槛,只有经过筛选的高价值信息才能进长期记忆。
坑2:记忆冲突
用户上周说"我喜欢简洁风格",这周说"请详细一点"。两个偏好都存着,Agent不知道该听谁的。
解决:给记忆加时间戳和置信度,优先用最新的、高置信度的记忆。
坑3:向量检索语义漂移
"苹果"在水果语境和科技公司语境下,向量表示可能相似,但实际含义完全不同。
解决:检索时加入上下文过滤,或用metadata标记领域。
九、小结
- 记忆分三层:工作记忆、短期记忆、长期记忆
- 工作记忆要精简,短期记忆要做摘要压缩
- 长期记忆要筛选,不是越多越好
- RAG让大规模记忆可用,但需要优化检索质量
- 定期整理记忆,避免污染和冲突