系统篇

18|长期记忆:写入、检索、冲突、失效与遗忘

系统篇约 5.4 千字1 组分步图解
本章目录

本章预备知识

记忆要保存的是有来源、条件和时间的信息,而不是“模型曾经说过的话”。工作状态、项目事实和经验规则的更新方式不同。

本章各题列出所需基础。可先完成相应基础课,也可通过自检确认掌握程度。

进入深读前的小检查:区分“政策从10月1日生效”和“系统10月5日才获知”,再回答查询10月3日的真实政策与当时系统已知政策为何不同。

术语带虚线时可点击速查。公式中的字母先看定义;不要用猜缩写替代推导。

本章把记忆当作带来源和生命周期的数据系统。框架与论文提供不同实现思路,但“能存入向量库”只完成了很小一部分工作。[COALA][MEMGPT]

沿着对象与状态理解本章

记忆必须回答两个时间问题:事实什么时候生效,系统什么时候知道。下图用超时配置30秒变20秒追踪来源、有效时间和过期,避免把旧知识以熟悉的口吻重复出来。

下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。

动态图解 · F31

长期记忆不是永远正确的小纸条

新事实出现后,旧记忆怎样更新而不毁掉历史?

记忆要同时回答:这条信息说的是什么范围、何时有效、系统何时得知、依据在哪里。最新写入的记录不一定描述最新生效的事实。保留时间和来源,才能既回答当前问题,也准确解释过去。

有效时间事实在现实或业务规则中适用的时间。
记录时间系统收到或保存该信息的时间。
作用域信息适用的项目、用户、版本或环境。

输入与适用条件:独立配置案例;月份只用于展示时间顺序,不涉及真实产品当前参数。30秒与20秒属于不同有效期。

1 / 5 · 1月1日 生效

第1步,共5步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

长期记忆不是永远正确的小纸条:1月1日 生效1月1日 生效配置超时30秒1月3日 得知系统保存“自1月1日起超时30秒”2月1日 生效新配置改为20秒,但系统尚未同步2月4日 得知系统读取新配置,保存有效时间与获知时间2月5日 查询问当前:20秒;问1月历史:30秒

配置超时30秒

保留作用域与来源

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

跨会话复用有效知识,减少重复查找和重复错误。

怎样实现

保存范围、来源与两个时间;使用前核验;过期、冲突与撤销显式处理。

可能的代价与误解

把一次模型猜测写成通用规则,会在后续检索中放大错误。

如何判断是否做对

同时测试当前查询、历史查询、错误范围查询和来源已失效查询。

Q069|工作记忆、情景记忆、语义记忆、程序性记忆有什么区别?

核心回答

工作记忆支持当前任务;情景记忆记录具体经历;语义记忆保存相对稳定事实;程序性记忆保存可复用操作方法。分类帮助决定何时写、怎样查和何时失效,不必强制建四种数据库。

同一Bug产生四种不同信息

当前工作记忆:“已定位filter.py,下一步补测试”。情景记忆:“在2026年某次任务中,绝对路径与相对规则不匹配导致exclude失败,补丁和测试位于PR X”。语义记忆:“本项目排除规则按仓库根目录解释”。程序性记忆:“检查文件过滤问题时,先核对路径基准、分隔符和规则语义”。

这四条不能直接互换。工作记忆任务结束后价值下降;情景记忆保留具体证据;语义事实随项目改动可能失效;程序性经验可迁移,但必须有条件,不能变成“所有过滤Bug都是路径问题”。

参数记忆是训练形成的模型能力,与应用外部记忆不同。外部存储可更新和审查,却需要可靠检索。把整个历史全部放上下文是最简单的工作记忆延伸,但会受到长度、成本与信息干扰限制。

运行示例 · Q069

同一事故里,四种记忆分别保存什么

输入与条件。事故: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。字段应对应真实需要,不必机械套用复杂知识图谱。

查重先找同一主题/范围候选,再比较语义。相同结论来自两个独立证据可以合并证据引用;相似措辞但不同环境不应合并;否定关系应作为冲突处理。模型可辅助提取与比较,但重要权威事实最好有确定性身份和人工/工具确认。

运行示例 · Q070

一句模型猜测经过哪些检查才能进入长期记忆

输入与条件。候选记忆:“所有路径错误都用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关系,未必需要完整时态数据库。对高风险任务,还应区分目标政策、实际部署和观测值,因为它们可能同时存在不同数值。

冲突处理顺序可以是:同一对象吗?同一环境/版本吗?同一生效时间吗?来源是否有权修改该事实?新记录是更正、例外还是追加证据?回答这些后再决定覆盖、并存或标记未决。

运行示例 · Q071

“什么时候生效”与“什么时候知道”不是同一时间

输入与条件。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的规则;可以作为通用注意点,但必须保留适用边界。

选择记忆后,把它转成当前可用上下文:一条简洁经验、适用条件、证据入口、与当前版本的关系。若经验依赖旧接口行为,先读当前代码再决定是否适用。不能因为“上次有效”而省略对变更边界的检查。

遗忘可按生命周期处理:临时任务状态过期;稳定事实被新版本替代;重复条目合并;长期未用且低价值经验归档;被证伪条目标记撤销。对敏感信息删除还需贯穿备份、索引和派生数据,具体保留要求应由应用政策决定。

运行示例 · Q072

删除一条记忆后,为什么向量索引仍可能泄露它

输入与条件。记忆m7有正文、向量、摘要引用与缓存答案四个派生存储位置。用户撤回其使用授权。

步骤与对象内部动作中间结果 / 新状态
1访问即时限制先让检索和答案层不再返回m7不能等待所有后台物理清理完成才生效。
2派生定位根据来源ID找向量、摘要和缓存正文删除不等于派生内容全部删除。
3检索过滤授权过滤在候选选择和最终输出都核查避免摘要绕过正文权限。
4物理清理按存储策略删除或使派生项失效记录已处理范围与未完成项。
5回归测试原查询再次执行确认已撤回信息不再出现在返回内容里。

把过程连起来。记忆生命周期必须覆盖派生索引和缓存,而不只是数据库主表。

边界与反例。删除技术方案依存储与合规要求;这里不作法律上的彻底删除承诺。

依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。

追问:最近使用频率高的记忆一定重要吗?

不一定。检索偏好可能让一条错误记忆越用越多,形成自我强化。价值应看实际帮助与证据,而非仅看访问次数。稀有但关键的安全边界也可能长期不被调用,却不应因低频被删除。

追问:怎么测记忆系统是否真正有效?

使用跨会话任务、迟到更正、多项目隔离、冲突和遗忘测试。比较无记忆、原始历史、精选记忆的任务完成与错误率;LongMemEval等基准提供记忆能力的评测思路,但自己的项目还需真实任务对照。[LONGMEM]

追问:何时应该停止继续增加记忆机制?

当新增机制没有减少重复错误或重建成本,却增加维护、检索噪声和延迟时,应简化。一个版本化文档加精简索引可能比复杂Memory Service更适合小团队。复杂度应该由已出现的问题推动。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。