知识点思维导图
34 个知识节点
参考资料
记忆系统(02) - Agent 记忆与状态
读完后,你应能完成以下任务:
- 绘制“记忆系统(02) - Agent 记忆与状态 / 短期记忆:当前会话的上下文”的关键对象与数据流,解释“短期记忆就是当前这轮对话的消息历史。”,并用源码位置、日志或 Trace 标注证据。
- 为“记忆系统(02) - Agent 记忆与状态 / 长期记忆:跨会话保留的事实”设计正常与异常输入,验证“长期记忆存的是「下次还有用」的东西:用户偏好(默认客户号、常用语言)、关键事实(这个客户是 VIP)、历史结论。”,输出首个偏差位置与回归测试结果。
- 实现“记忆系统(02) - Agent 记忆与状态 / 企业项目里的三层记忆”的最小代码或配置,检验“每条长期记忆最好有来源、更新时间和置信度;”,输出命令、结果与 Diff,并说明不适用边界。
一句话目标:读完你能分清短期记忆和长期记忆各管什么、为什么短期要截断长期要持久化,并知道分别用什么存。
一、与进阶篇的分工
本篇保留为记忆概念基础:重点区分短期、长期和状态。 进阶实现请读 63《Memory 管理的三大策略》、85《Redis 短期记忆》、86《Mem0 长期记忆》, 分别讲策略、缓存层和长期记忆治理。
二、Agent 记忆与状态的真实应用场景
用户和你的 Agent 聊天:
用户:我的默认客户号是 C1001 Agent:好的,记住了 用户:帮我查下它的订单 ← 「它」指谁? Agent:(查 C1001)共 2 笔订单
这里 Agent 能听懂「它」=C1001, 靠的是短期记忆——它记得这轮对话前面说过的话。
但第二天用户重新打开,又问「查下我的订单」。 如果 Agent 只有短期记忆,新会话一开始是空的,它不知道「我」是谁,又得问一遍客户号。 要让它跨天还记得「这个用户默认是 C1001」,得靠长期记忆。
这两种记忆管的事完全不同,存法也不同。 混为一谈, Agent 要么「失忆」(该记的没记), 要么「乱记」(短期的东西当长期存, 存一堆垃圾)。
三、短期记忆:当前会话的上下文
短期记忆就是当前这轮对话的消息历史。 它的作用是让 Agent 理解上下文——「它」「上一笔」「再改一下」这类指代,全靠它。
短期记忆有两个特点:
- 有容量上限。模型的上下文窗口装不下无限长的历史,对话一长就得裁剪。最简单的裁法是「只保留最近 N 条」(滑动窗口),更讲究的会把早期对话压成摘要再保留。
- 会话结束就没了。它是这次对话的临时状态,关掉就清空,不跨会话。
为什么必须截断? 因为不截断的话, 对话越长 prompt 越大, 成本和延迟一起涨, 最后超出模型上下文上限直接报错。 截断是必然的取舍。
四、长期记忆:跨会话保留的事实
长期记忆存的是「下次还有用」的东西:用户偏好(默认客户号、常用语言)、关键事实(这个客户是 VIP)、历史结论。 它的特点和短期正相反:
- 要持久化。存进数据库、文件或向量库,不随会话消失。
- 跨会话可读。新会话开始时,按需把相关的长期记忆读出来,省得用户重复交代。
注意不是什么都往长期记忆塞。 聊天里的寒暄、一次性的临时信息没必要持久化。 长期记忆要存的是「明确对未来有用」的结构化事实,否则存一堆噪声,读出来反而干扰判断。
五、企业项目里的三层记忆
| 记忆层 | 存什么 | 典型存储 | 风险 |
|---|---|---|---|
| 短期窗口 | 最近 N 轮对话 | 内存/Redis | 太长烧 token |
| 摘要记忆 | 早期对话压缩后的摘要 | Redis/数据库 | 摘要丢关键信息 |
| 用户画像 | 长期偏好、预算、风险敏感度 | MySQL/向量库 | 过期、污染、冲突 |
记忆不是越多越好。 每条长期记忆最好有来源、更新时间和置信度; 旧记忆要能过期,冲突记忆要能覆盖。 否则 Agent 会拿过期偏好做决策,比失忆更危险。
六、工程上真正会踩的坑(本篇独有)
- 把短期记忆当长期用。会话里说的话只活在这次会话,关掉就没。用户的关键偏好必须显式写进长期存储,不能指望短期记忆「自动记住」。
- 短期记忆不截断。对话一长 prompt 无限膨胀,先是变贵变慢,最后超出上下文上限直接报错。必须设上限,要么滑动窗口要么摘要压缩。
- 什么都往长期记忆塞。把每句闲聊都持久化,长期记忆变成垃圾场,读出来全是噪声,反而干扰 Agent 判断。只存明确对未来有用的结构化事实。
- 长期记忆读取不做相关性筛选。用户偏好攒多了,每次会话全量读进 prompt 也会撑爆上下文。长期记忆通常存向量库,按当前问题相关性检索出几条,而不是全塞。
- 混淆「记忆」和「任务状态」。多步任务执行到一半的中间状态(比如 ReAct 的
state)是任务状态,和「跨会话记住用户偏好」是两回事,别用同一套存储混着管。
七、一句话面试答法
Agent 的记忆怎么管? 分两种。短期记忆是当前会话的消息历史,让 Agent 理解「它」「上一笔」这类指代,特点是有容量上限要截断(滑动窗口或摘要)、会话结束就清空。长期记忆是跨会话有用的用户偏好和关键事实,要持久化到数据库或向量库,新会话按需读回,省得用户重复交代。关键是别把短期当长期用,也别什么都往长期塞,长期记忆通常用向量库按相关性检索而非全量读取。
八、动手实践:Agent 短期与长期记忆
用同一个 MemoryStore 对比两类状态:短期消息保存在有界滑动窗口中,
长期偏好写入持久化文件并可被新实例读取。
8.1 在线运行
零依赖,Python 3.10+ 可运行。
运行中会临时写入 long_term_memory.json 模拟持久层,并在结束时清理。
8.2 预期输出
短期记忆(第一条已淘汰): ['我叫小李', '我喜欢简洁回答', '报销期限?']
长期记忆(新会话仍可读取): {'answer_style': 'concise'}
8.3 代码与概念对应
| 概念 | 源码位置 |
|---|---|
| 有界短期窗口 | deque(maxlen=SHORT_TERM_LIMIT) |
| 会话消息写入 | remember_turn |
| 长期偏好持久化 | save_preference |
| 新实例跨会话读取 | load_preferences |
| 实验数据清理 | main 的 finally |
生产环境中, 短期状态通常进入 Redis 或 LangGraph Checkpointer, 长期偏好进入带权限、来源、冲突和删除治理的记忆层; 业务事实与审计记录仍应存入各自的权威系统。
8.4 可运行源码:Agent 记忆与状态
main.py
九、总结
- 短期记忆:当前会话的上下文:短期记忆就是当前这轮对话的消息历史。
- 长期记忆:跨会话保留的事实:长期记忆存的是「下次还有用」的东西:用户偏好(默认客户号、常用语言)、关键事实(这个客户是 VIP)、历史结论。
- 工程上真正会踩的坑(本篇独有):用户的关键偏好必须显式写进长期存储,不能指望短期记忆「自动记住」。
- 一句话面试答法:短期记忆是当前会话的消息历史,让 Agent 理解「它」「上一笔」这类指代,特点是有容量上限要截断(滑动窗口或摘要)、会话结束就清空。
学完自测
选择所有正确答案;提交后逐项核对判断依据。