18|长期记忆:写入、检索、冲突、失效与遗忘
本章目录
本章预备知识
记忆要保存的是有来源、条件和时间的信息,而不是“模型曾经说过的话”。工作状态、项目事实和经验规则的更新方式不同。
本章各题列出所需基础。可先完成相应基础课,也可通过自检确认掌握程度。
进入深读前的小检查:区分“政策从10月1日生效”和“系统10月5日才获知”,再回答查询10月3日的真实政策与当时系统已知政策为何不同。
术语带虚线时可点击速查。公式中的字母先看定义;不要用猜缩写替代推导。
本章把记忆当作带来源和生命周期的数据系统。框架与论文提供不同实现思路,但“能存入向量库”只完成了很小一部分工作。[COALA][MEMGPT]
沿着对象与状态理解本章
记忆必须回答两个时间问题:事实什么时候生效,系统什么时候知道。下图用超时配置30秒变20秒追踪来源、有效时间和过期,避免把旧知识以熟悉的口吻重复出来。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
长期记忆不是永远正确的小纸条
新事实出现后,旧记忆怎样更新而不毁掉历史?
记忆要同时回答:这条信息说的是什么范围、何时有效、系统何时得知、依据在哪里。最新写入的记录不一定描述最新生效的事实。保留时间和来源,才能既回答当前问题,也准确解释过去。
输入与适用条件:独立配置案例;月份只用于展示时间顺序,不涉及真实产品当前参数。30秒与20秒属于不同有效期。
1 / 5 · 1月1日 生效
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
配置超时30秒
保留作用域与来源默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
跨会话复用有效知识,减少重复查找和重复错误。
怎样实现
保存范围、来源与两个时间;使用前核验;过期、冲突与撤销显式处理。
可能的代价与误解
把一次模型猜测写成通用规则,会在后续检索中放大错误。
如何判断是否做对
同时测试当前查询、历史查询、错误范围查询和来源已失效查询。
Q069|工作记忆、情景记忆、语义记忆、程序性记忆有什么区别?
核心回答
工作记忆支持当前任务;情景记忆记录具体经历;语义记忆保存相对稳定事实;程序性记忆保存可复用操作方法。分类帮助决定何时写、怎样查和何时失效,不必强制建四种数据库。
同一Bug产生四种不同信息
当前工作记忆:“已定位filter.py,下一步补测试”。情景记忆:“在2026年某次任务中,绝对路径与相对规则不匹配导致exclude失败,补丁和测试位于PR X”。语义记忆:“本项目排除规则按仓库根目录解释”。程序性记忆:“检查文件过滤问题时,先核对路径基准、分隔符和规则语义”。
这四条不能直接互换。工作记忆任务结束后价值下降;情景记忆保留具体证据;语义事实随项目改动可能失效;程序性经验可迁移,但必须有条件,不能变成“所有过滤Bug都是路径问题”。
参数记忆是训练形成的模型能力,与应用外部记忆不同。外部存储可更新和审查,却需要可靠检索。把整个历史全部放上下文是最简单的工作记忆延伸,但会受到长度、成本与信息干扰限制。
同一事故里,四种记忆分别保存什么
输入与条件。事故:v7中路径前缀判断误排除ab目录;v8已修复并测试通过。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1工作状态 | 当前任务v8待合并 | 下次恢复这一个任务需要。 |
| 2情景记忆 | 事故输入、错误版本、补丁与结果 | 帮助未来相似问题追溯经历。 |
| 3语义事实 | 当前exclude按目录边界判断 | 必须带版本和来源,防止长期过期。 |
| 4程序性经验 | 遇到前缀匹配改动先测同前缀兄弟目录 | 是一条带适用条件的方法。 |
| 5取舍 | 完整失败日志放外部证据 | 不要四种记忆各复制同一长日志。 |
把过程连起来。记忆分类的用途是决定保存与读取粒度,不是为了建立更多互相重复的数据库。
边界与反例。记忆类型在研究与产品中命名不完全一致;本例强调职责,不规定必须采用四张表。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
追问:记忆与RAG是不是一回事?
RAG是从外部知识检索后辅助生成的一类机制,记忆系统还包括从交互中写入、更新、冲突处理和遗忘。记忆检索可用RAG,但仅有读文档能力并不自动形成经验积累。
追问:模型自动总结的“经验”为什么容易过拟合?
一次成功可能由特定环境、偶然路径或测试不足造成。总结若去掉条件,就会把局部做法升级成通用规则。经验至少需要记录场景、行动、结果、证据和已知限制;多次复用后的效果再决定是否提升为默认流程。
追问:长期记忆是不是越多越好?
不是。重复、冲突和过期记忆会增加检索噪声与上下文负担。核心指标是减少重复错误、提高任务质量和节省重建上下文的成本,而不是记忆条目数。
Q070|一条信息从对话进入长期记忆,应该经过哪些判断?
核心回答
先识别候选事实或经验,核验来源与适用范围,查重和冲突,再选择新增、更新、保留为待确认或不保存。不能把模型在回答里产生的一切都自动存成事实。
一条候选的写入链
用户明确说“项目日志保留7天”,这是来自用户的项目约束;工具配置显示生产环境保留30天,属于实现事实。二者冲突时不能只选较新文本覆盖,要判断用户是在设定新目标还是描述现状。记忆可分别保存“目标要求7天”和“当前生产配置30天”,标注待调整。
写入时可使用轻量结构:subject、predicate、value、scope、valid_time、source、status。对经验再加conditions与outcome。字段应对应真实需要,不必机械套用复杂知识图谱。
查重先找同一主题/范围候选,再比较语义。相同结论来自两个独立证据可以合并证据引用;相似措辞但不同环境不应合并;否定关系应作为冲突处理。模型可辅助提取与比较,但重要权威事实最好有确定性身份和人工/工具确认。
一句模型猜测经过哪些检查才能进入长期记忆
输入与条件。候选记忆:“所有路径错误都用startswith修复。”它来自一次尚未通过测试的建议。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1核对事实 | 没有成功验证,且措辞“所有”过宽 | 不能升级为通用经验。 |
| 2缩小命题 | 改为“本次排除目录需要边界判断” | 范围限定到具体问题。 |
| 3取得证据 | 记录修复版本和a/a-x/ab反例测试 | 区分提议与已确认结果。 |
| 4写入条件 | 与已有条目不冲突、未来可复用且成本合理 | 满足才保存。 |
| 5复核触发 | 路径平台或实现改变 | 重新验证适用性,不永久强制所有任务执行。 |
把过程连起来。长期记忆不是把模型最后一句话自动粘贴到系统提示里。
边界与反例。此处写入门槛是可选工程策略;简单偏好可更轻量,不必给每条记录设计复杂审批。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
追问:什么时候可以不保存?
临时状态、容易重新查到且变化快的数据、无证据猜测、对未来无用的闲聊,以及保存风险高于收益的敏感信息,都可能不值得长期记忆。省去无价值写入比事后清理更有效。
追问:自动记忆是否意味着模型自行修改规则?
保存候选经验与激活执行规则应分开。可以允许自动积累证据,但让已验证规则、待确认假设和用户明确指令有不同状态。否则一次误总结可能立即影响所有后续任务。
追问:异步写记忆会发生什么问题?
写入延迟会让刚纠正的事实尚未生效,旧记忆仍被检索;并发写入可能覆盖新内容。需要定义可见性、版本和冲突策略。并不是所有应用都要求强一致,但必须知道何时读到的是旧状态。
Q071|新旧记忆冲突怎样处理?Valid time和Recorded time为什么要分开?
核心回答
Valid time表示事实在现实中适用的时间,Recorded time表示系统何时知道/记录它。二者分开才能回答“当时事实是什么”和“当时系统知道什么”。新记录不必然代表更新的现实事实。
用迟到消息看双时间
10月10日系统记录“超时30秒”。10月17日收到通知:“10月12日起已改为60秒”。新事实的生效时间是12日,记录时间是17日。查询10月14日实际配置,应回答60秒;复盘“系统在10月14日为什么建议30秒”,要知道当时它尚未收到新消息。
如果只是用updated_at覆盖原记录,旧知识状态会消失,无法解释历史决策。轻量实现可保留版本记录与supersedes关系,未必需要完整时态数据库。对高风险任务,还应区分目标政策、实际部署和观测值,因为它们可能同时存在不同数值。
冲突处理顺序可以是:同一对象吗?同一环境/版本吗?同一生效时间吗?来源是否有权修改该事实?新记录是更正、例外还是追加证据?回答这些后再决定覆盖、并存或标记未决。
“什么时候生效”与“什么时候知道”不是同一时间
输入与条件。10月1日记录:生产超时5秒,生效区间[10月1日,∞)。10月10日才得知:10月5日起应为7秒,并记录修正。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1按10月3日业务时间查询 | 当时有效值 | 5秒。 |
| 2按10月7日业务时间、截至10月8日的已知记录查询 | 系统那时尚不知道修正 | 仍会返回当时知道的5秒。 |
| 3按10月7日业务时间、截至10月11日查询 | 可以用10月10日记录的回溯修正 | 返回7秒。 |
| 4不能直接覆盖 | 只存当前值7会丢掉“当时为何答5” | 保留记录时间支持审计。 |
| 5范围过滤 | 测试环境也有7秒 | 不能与生产混用。 |
把过程连起来。有效时间回答现实规则何时成立,记录时间回答系统何时得到这条信息。
边界与反例。时间区间按左闭右开定义;这是简化双时间示例,回溯修正必须有权威证据,不能随意改写历史。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
追问:用户的最新指令一定覆盖旧经验吗?
在该用户有权决定且范围明确的任务约束中,新指令通常应改变旧偏好;但不能让低可信网页伪装成用户指令,也不能用项目A的新要求覆盖项目B。权限与scope先于单纯时间顺序。
追问:删除错误记忆后,派生总结怎么办?
需要让依赖它的摘要、规则和缓存失效或重新生成。只删除原条目但保留“根据旧条目总结出的经验”,错误仍会继续传播。记录来源依赖不只是为了引用好看,还用于撤销传播。
追问:发生冲突时全部交给LLM自由判断可行吗?
低风险文本可让模型给候选解释;关键身份、时间、版本和授权最好由结构化信息约束。LLM善于语义比较,但不应凭语言自信覆盖高权威事实。无法判定时保留冲突比制造一个虚假的统一结论更可靠。
Q072|记忆检索怎样避免拿错项目、拿到过期规则?什么时候应该遗忘?
核心回答
先按身份、项目、任务类型、时间和有效状态过滤,再做相关性检索与必要重排,使用前核对关键来源。遗忘用于减少过期和低价值信息,不应破坏审计需要或仍被引用的证据。
从查询到使用的完整链
任务是“修复项目A的退款重复执行”。先限制用户/项目A,排除失效规则,检索与幂等和退款有关的经验。候选可能包括项目B的一次支付事故,即使语义相近也不能直接当A的规则;可以作为通用注意点,但必须保留适用边界。
选择记忆后,把它转成当前可用上下文:一条简洁经验、适用条件、证据入口、与当前版本的关系。若经验依赖旧接口行为,先读当前代码再决定是否适用。不能因为“上次有效”而省略对变更边界的检查。
遗忘可按生命周期处理:临时任务状态过期;稳定事实被新版本替代;重复条目合并;长期未用且低价值经验归档;被证伪条目标记撤销。对敏感信息删除还需贯穿备份、索引和派生数据,具体保留要求应由应用政策决定。
删除一条记忆后,为什么向量索引仍可能泄露它
输入与条件。记忆m7有正文、向量、摘要引用与缓存答案四个派生存储位置。用户撤回其使用授权。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1访问即时限制 | 先让检索和答案层不再返回m7 | 不能等待所有后台物理清理完成才生效。 |
| 2派生定位 | 根据来源ID找向量、摘要和缓存 | 正文删除不等于派生内容全部删除。 |
| 3检索过滤 | 授权过滤在候选选择和最终输出都核查 | 避免摘要绕过正文权限。 |
| 4物理清理 | 按存储策略删除或使派生项失效 | 记录已处理范围与未完成项。 |
| 5回归测试 | 原查询再次执行 | 确认已撤回信息不再出现在返回内容里。 |
把过程连起来。记忆生命周期必须覆盖派生索引和缓存,而不只是数据库主表。
边界与反例。删除技术方案依存储与合规要求;这里不作法律上的彻底删除承诺。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
追问:最近使用频率高的记忆一定重要吗?
不一定。检索偏好可能让一条错误记忆越用越多,形成自我强化。价值应看实际帮助与证据,而非仅看访问次数。稀有但关键的安全边界也可能长期不被调用,却不应因低频被删除。
追问:怎么测记忆系统是否真正有效?
使用跨会话任务、迟到更正、多项目隔离、冲突和遗忘测试。比较无记忆、原始历史、精选记忆的任务完成与错误率;LongMemEval等基准提供记忆能力的评测思路,但自己的项目还需真实任务对照。[LONGMEM]
追问:何时应该停止继续增加记忆机制?
当新增机制没有减少重复错误或重建成本,却增加维护、检索噪声和延迟时,应简化。一个版本化文档加精简索引可能比复杂Memory Service更适合小团队。复杂度应该由已出现的问题推动。