Agent 记忆系统设计:从短期对话到长期知识
Agent 记忆系统设计:从短期对话到长期知识
与上午的「可观测性架构」形成互补:如果说可观测性解决的是”如何看见 Agent”,那么记忆系统解决的就是”如何让 Agent 记住”。
一、问题的本质:为什么 Agent 需要记忆?
想象一个场景:用户昨天告诉客服 Agent “我喜欢用支付宝付款”,今天再次对话时 Agent 却问”您想用微信还是银行卡?”——这种失忆体验会让用户抓狂。
传统 LLM 的局限:
- 无状态:每次请求都是独立的,不保留历史上下文
- 上下文窗口有限:即使保留对话历史,长对话也会溢出
- 无法跨会话学习:无法从过去互动中积累知识
Agent 记忆的三大价值:
- 效率:避免重复询问已知信息
- 个性化:基于用户历史提供定制服务
- 能力进化:从经验中学习,持续改进
二、记忆系统的双轨架构
LangGraph 将记忆系统划分为两个互补的层级:
1 | ┌─────────────────────────────────────────────────────────────┐ |
2.1 短期记忆:对话的上下文
核心机制: 通过 checkpointer 自动保存和恢复图状态
1 | from langgraph.checkpoint.memory import MemorySaver |
短期记忆存储的内容:
- 完整的消息历史(HumanMessage + AIMessage)
- 中间计算结果(检索到的文档、生成的草稿等)
- 用户上传的文件引用
- 当前对话的临时变量
关键特性:
1 | # 1. 自动状态恢复 |
2.2 长期记忆:跨会话的知识沉淀
核心机制: 通过 store 显式读写跨线程的记忆
1 | from langgraph.store.memory import InMemoryStore |
三、长期记忆的三重分类
借鉴人类记忆类型,AI Agent 的长期记忆可分为:
| 记忆类型 | 存储内容 | 人类类比 | Agent 示例 |
|---|---|---|---|
| 语义记忆 | 事实、概念 | 学校里学的知识 | 用户偏好、产品规格 |
| 情景记忆 | 经验、事件 | 个人经历 | 成功案例、失败教训 |
| 程序记忆 | 规则、技能 | 骑自行车的能力 | 系统提示词、工作流 |
3.1 语义记忆:用户画像与事实
两种管理策略:
策略 A:统一画像(Profile)
1 | # 单个 JSON 文档,持续更新 |
优点:结构清晰,易于提供给模型作为上下文
缺点:大画像更新时容易丢失信息
策略 B:文档集合(Collection)
1 | # 多条独立记忆,语义检索 |
优点:不易丢失信息,检索灵活
缺点:需要更多 tokens 提供给模型
3.2 情景记忆:从经验中学习
核心价值:让 Agent 记住”怎么做”而不是”做什么”
1 | # 保存成功案例 |
Few-shot 学习的记忆化:
1 | def agent_with_episodic_memory(user_input, store): |
3.3 程序记忆:自我进化的指令
最激进的记忆形式:Agent 修改自己的系统提示词
1 | # 初始系统提示词 |
四、记忆写入的两种策略
4.1 热路径写入(Hot Path)
特点:在 Agent 响应用户前同步写入记忆
1 | def agent_with_hotpath_memory(state, store): |
优点:
- 新记忆立即可用
- 用户可见记忆创建过程(透明度高)
缺点:
- 增加响应延迟
- Agent 需要多任务处理(回复 + 记忆)
ChatGPT 的实现方式:
1 | # OpenAI 的 save_memories 工具 |
4.2 后台写入(Background)
特点:异步处理记忆写入,不阻塞主流程
1 | from langgraph.func import task |
触发策略:
1 | # 策略 1:定时触发(每 5 分钟) |
对比:
| 维度 | 热路径 | 后台写入 |
|---|---|---|
| 延迟 | 高(同步写入) | 低(异步) |
| 即时性 | 新记忆立即可用 | 可能延迟几秒到几分钟 |
| 复杂度 | 简单 | 需要任务队列 |
| 一致性 | 强 | 最终一致 |
| 适用场景 | 关键事实必须记住 | 大批量记忆处理 |
五、生产级记忆系统架构
5.1 完整架构图
1 | ┌─────────────────────────────────────────────────────────────────────────────┐ |
5.2 完整实现代码
1 | from typing import TypedDict, Annotated, List |
六、记忆系统的挑战与对策
6.1 记忆冲突
问题:新旧记忆矛盾(用户之前说喜欢支付宝,现在说更喜欢微信)
对策:
1 | def resolve_memory_conflicts(new_fact, existing_memories): |
6.2 记忆膨胀
问题:长期记忆过多,检索效率下降
对策:
1 | def memory_maintenance(store, user_id): |
6.3 隐私与安全
问题:敏感信息泄露(密码、个人身份信息)
对策:
1 | def sanitize_memory(fact: str) -> str: |
七、最佳实践与 Checklist
7.1 记忆设计黄金法则
- 分层存储:短期记忆放 checkpointer,长期记忆放 store
- 显式优于隐式:让用户知道你在记住什么
- 可遗忘:支持用户删除特定记忆
- 可解释:能回答”为什么这样回复”(基于哪些记忆)
- 渐进增强:没有记忆时也能正常工作
7.2 生产部署 Checklist
- 选择合适的存储后端(开发:内存,生产:Postgres/Redis)
- 配置向量索引支持语义搜索
- 实现记忆写入策略(热路径 vs 后台)
- 添加记忆冲突检测和解决
- 实施敏感信息过滤
- 设置记忆清理和压缩策略
- 监控记忆检索延迟和命中率
- 提供用户管理记忆的界面
7.3 与可观测性的结合
1 | # 在 LangSmith 中追踪记忆使用 |
八、总结
Agent 记忆系统的核心在于分层和分类:
- 短期记忆解决”对话连续性”问题——通过 checkpointer 自动管理
- 长期记忆解决”知识积累”问题——通过 store 显式读写
- 语义/情景/程序三种记忆类型覆盖不同应用场景
- 热路径/后台两种写入策略权衡延迟和一致性
与上午的「可观测性架构」结合,构成完整 Agent 系统:
- 可观测性让你知道 Agent 在做什么
- 记忆系统让 Agent 记得之前做过什么
两者相辅相成,缺一不可。
参考资源:
- LangGraph Memory Concepts
- LangGraph Persistence Guide
- CoALA: Cognitive Architectures for Language Agents
本文是「Agent 架构系列」的第二篇,第一篇《Agent 可观测性架构:从黑箱到白盒的监控革命》已发布。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 晨启Tech!
评论









