模块三 · Agent 内核
第 9 / 14 节19 分钟阅读型
状态与记忆:三种记忆别混成一个向量库
对话记忆、工作流状态、长期记忆,生命周期完全不同。混着存的结果是又贵又乱,还查不出问题。
读完这一节,你能做到
- 分清三种记忆各自解决什么问题、该存在哪。
- 让长任务在中途失败后能续跑,而不是重头再来。
- 设计一套"能召回、不被污染、可删除"的长期记忆。
- 说清记忆与 RAG 在权限和更新上的本质区别。
一、三种记忆,三种生命周期
| 类型 | 解决什么 | 生命周期 | 存在哪 |
|---|---|---|---|
| 对话记忆 | 这轮在聊什么 | 分钟到小时 | 对话历史 + 摘要 |
| 工作流状态 | 任务做到哪了 | 小时到天 | 业务库,结构化字段 |
| 长期记忆 | 这个人是谁 | 月到年 | 用户画像表 + 向量 |
混用的代价
- 把任务进度塞进对话:一断线就丢,重跑还重复副作用。
- 把用户偏好塞进对话:每次都要重讲,跨会话消失。
- 三者塞进一个大向量库:召回不稳定,成本还高。
判断方法:这个信息失效后,谁会出错?只影响当前对话 → 对话记忆;影响任务继续 → 工作流状态;影响下次来访 → 长期记忆。
二、对话记忆:留最近的,压早先的
策略
- 最近 3-5 轮原样保留。
- 更早的对话压缩成"事实与结论",不要留过程。
- 已经确认的关键事实抽出来,变成结构化字段,不再依赖对话历史。
摘要里该有什么
- 已确认的信息(地址、金额、时间)
- 已达成的决定(选了哪个方案)
- 未解决的问题(还需要确认什么)
不该有什么
寒暄、情绪表达、重复的确认、模型自己的推测。
三、工作流状态:长任务的命门
四件套
- 状态落库:任务 id、当前步骤、每步输入输出、失败原因。
- 步骤幂等:同一步重复执行不产生额外副作用。
- 检查点:每步完成即提交,而不是全做完才写一次。
- 恢复逻辑:启动时读状态,从最后未完成的步骤继续。
恢复时的三个坑
- 上一步"已发出但结果未知",必须查状态而不是重做。
- 中断期间外部数据变了,恢复前要重新校验前置条件。
- 恢复后不要重新规划整条链路。
判断标准
一个任务如果超过几十秒、跨多个外部系统,就该用状态机或工作流引擎,而不是指望一次模型调用跑完。
四、长期记忆:存、取、清
存什么
- 结构化字段:语言、时区、套餐、明确确认过的偏好。
- 半结构化 + 向量:零散事实与历史结论,带时间戳与来源。
不存什么
- 身份证、银行卡、密码、完整手机号。
- 模型的推测("用户可能预算有限")。
- 易变事实(余额、库存、订单状态)。
- 一次性噪声(寒暄、试探性提问)。
怎么召回
- 每次只取 3-5 条,按相关性与时间衰减排序。
- 优先取"用户明确说过"的,其次才是"系统总结的"。
- 冲突时以更新的为准,旧记录保留以便追溯。
怎么防污染
- 来源标记:
user_said/inferred/system。 - 写入审核:模型提出的记忆候选先落候选表,命中规则或人工确认后才正式入库。
- 过期与冲突:给记忆设有效期,冲突时走覆盖或合并策略。
- 可查看可删除:用户能看到系统记住了什么,并能删掉。
一个反模式
每轮对话后让模型"自动总结并写入记忆"。几轮之后库里全是模型的自我复述,真实信息被稀释。
五、记忆和 RAG 不是一回事
| 维度 | RAG | 记忆 |
|---|---|---|
| 数据归属 | 共享文档/知识库 | 单个用户或租户 |
| 来源 | 上传、同步、爬取 | 对话中产生、用户确认 |
| 更新 | 文档更新后重建索引 | 每次交互可能增量写 |
| 权限 | 按文档权限过滤 | 严格按用户隔离 |
技术上两者都可能用向量检索,所以常被混为一谈。但"谁的数据、谁能看、什么时候失效"完全不同。
混用的典型后果:把用户偏好写进共享文档库,轻则召回串味,重则数据泄露。
六、常见坑
- 把任务进度存在对话里。 一断线全丢。
- 三种记忆共用一个向量库。 召回不稳定,权限也说不清。
- 让模型自动写记忆。 库会被自我复述污染。
- 记忆只增不删。 过期偏好会一直影响输出。
- 敏感信息入库。 这是合规问题,不是技术问题。
- 记忆与知识库不隔离。 租户串数据。
七、动手任务:自写 → AI 写 → 对比 → 取舍
四步不跳:① 自己写(限时,关掉补全)→ ② 让 AI 写同一题 → ③ 逐条比对 → ④ 说出保留谁的写法。
① 自己写
- 为你的场景画一张记忆分层表:哪些进对话、哪些进状态库、哪些进长期记忆,各自的失效条件是什么。
- 写一份长期记忆的字段设计:字段名、来源标记、有效期、是否可删除。
② 让 AI 写同一题
把第 1 题交给 AI,补一句 三个层次分别给“写入时机 / 读取时机 / 失效条件”,不要只列字段。
③ 对比要盯的点
- 它有没有把任务进度错放进对话记忆?
- 长期记忆有没有来源标记与有效期?
- 敏感信息它有没有明确排除?
④ 一句话取舍
如果只能保留一种记忆,你会保留哪种?为什么。
八、自测
- 三种记忆分别解决什么问题?生命周期多长?
- 判断某个信息该放哪一层,你问哪个问题?
- 摘要里应该保留什么、删掉什么?
- 长期记忆防污染有哪四个手段?
- 记忆与 RAG 的四个差别是什么?
- 为什么不让模型每轮自动写记忆?
参考答案要点:对话/工作流/长期,分钟到年;失效后谁会出错;事实与结论,删寒暄;来源标记、写入审核、过期冲突、可删;归属、来源、更新、权限;会被自我复述污染。
配套题目
★ 越多越该先背;点题目可看完整答案与深入版。
- ★★★★☆ 会话记忆、工作流状态、长期记忆,分别解决什么问题?
- ★★★☆☆ 长期记忆怎么存、怎么召回,怎么防止被污染?
- ★★★☆☆ 记忆和 RAG 是一回事吗?
- ★★★☆☆ 长任务执行到一半中断了,怎么恢复?
提示:读完可以顺手做几道对应题目,检验是否真的理解