OpenClaw 长期记忆系统的设计思路:记忆写入、检索、更新与遗忘怎么分层
长期记忆最容易失控的地方,不在检索,而在写入和更新。这篇文章专门拆解 OpenClaw 记忆系统里的四个关键动作:写什么、怎么查、何时更新、何时遗忘。
Find related content
Search the site for tools, terms, comparison pages, or related troubleshooting notes without going back to the blog index.
Main answer
长期记忆系统更像一套记忆生命周期管理,而不是单一检索组件。写入、检索、更新、遗忘如果不拆开设计,系统很快就会被过时信息和噪声拖垮。
Who should read this
适合准备给 OpenClaw、Agent workflow 或个人 AI 系统增加长期记忆,但还不想把系统做成不可控黑箱的开发者。
Key check
很多记忆系统表现不稳定,并不是因为 embedding 不够好,而是因为没有定义何时写、何时不写、什么能覆盖旧事实、什么应该自然过期。
Next step
如果你更关心工程落地,可以继续看实现篇;如果你想先避坑,再看常见错误篇和验证篇。
你将学到
- + 写入、检索、更新、遗忘为什么必须拆开看
- + 哪些信息适合被持久化,哪些信息应该停留在会话层
- + 如何避免旧事实和新事实在系统里互相打架
- + 为什么遗忘不是可选项,而是长期记忆的一部分
OpenClaw 长期记忆系统的设计思路
如果你把长期记忆理解成一个检索接口,系统通常很快就会出问题。
更准确的理解是:长期记忆是一套信息生命周期管理机制。它至少包含四个关键动作:
- 写入
- 检索
- 更新
- 遗忘
这四个动作彼此相关,但不该混成一步。
为什么很多系统一开始就走偏
一个常见错误是从“怎么搜”开始想,而不是从“为什么存”开始想。
结果通常会变成这样:
- 写入毫无门槛
- 检索全库扫一遍
- 更新靠覆盖文本
- 遗忘根本没做
这样的系统早期看起来很灵活,后期却最难维护。
一、写入:决定系统以后会不会脏
写入是整个记忆系统里最该保守的环节。
如果什么都写,系统就会积累三类噪声:
- 临时状态
- 模型猜测
- 没有复用价值的原始片段
更稳的写入标准通常是:
- 这条信息跨会话仍然有价值。
- 它会影响后续判断、约束或执行。
- 它能被结构化,而不是只能原样堆进去。
适合写入的内容
- 用户明确表达的稳定偏好
- 项目级约束和边界
- 已验证过的解决方案摘要
- 任务中间状态的关键检查点
不适合直接写入的内容
- 一次性调试输出
- 没有验证的模型推断
- 语义重复但来源不清的摘要
- 原始聊天记录全文
二、检索:目标不是找得多,而是找得准
很多记忆系统的默认做法是“先把最像的几条拉出来再说”。
这在搜索产品里可能够用,但在执行系统里不够稳,因为“语义相似”不等于“当前可用”。
对 OpenClaw 这类执行型系统来说,检索应该先回答两个问题:
- 当前任务需要的是事实状态、经验知识,还是追溯记录
- 当前优先按什么主体召回,比如用户、项目、任务或工具
一个更稳的检索顺序
- 先查
State Memory - 再查
Knowledge Memory - 只有需要追溯时再查
Archive Memory
因为多数执行错误不是缺“相关内容”,而是缺“当前有效的事实”。
检索时应该做的额外限制
- 限定主体,比如当前项目或当前用户
- 限定时间窗口,避免过旧信息默认进入
- 限定置信度和来源
- 限定最大条目数,防止上下文再次膨胀
三、更新:不要把新信息直接粗暴覆盖旧信息
更新是最容易让系统自相矛盾的环节。
比如系统曾经记住:
项目 Alpha 允许自动发布
后来新的人工确认把它改成:
项目 Alpha 当前阶段禁止自动发布
如果你只是把第二句话再写进去,检索时两条都能被召回,模型就会拿到互相冲突的上下文。
更稳的做法是让更新显式表达关系:
- 新条目是否覆盖旧条目
- 旧条目是否退为历史版本
- 是否保留追溯链路
一个简单的更新策略
稳定事实:使用 supersedes 关系显式覆盖
中间状态:只保留最近有效版本
知识总结:追加新版本,不直接删除旧版
归档记录:不覆盖,只打标签
这样后续检索时才有机会优先拿到“当前有效”的内容。
四、遗忘:不是附属功能,而是系统自我保护
很多人不愿意碰遗忘,因为总担心删掉以后找不回来。
但如果没有遗忘,系统就会遇到两个更现实的问题:
- 过时信息持续进入默认召回
- 检索空间越来越大,噪声越来越重
所以遗忘的本质不是“消失”,而是“退出默认工作流”。
更推荐的遗忘机制
-
Expire对会过期的状态设置失效时间,到期后不再默认召回。 -
Demote把低价值条目从工作层降到归档层。 -
Supersede被新事实覆盖后,只保留为历史版本。 -
Purge对明显错误、重复污染或无追溯价值的数据做彻底清理。
一张更实用的设计表
| 动作 | 设计重点 | 最容易犯的错 |
|---|---|---|
| 写入 | 先判断价值和层级 | 什么都写 |
| 检索 | 按任务意图和主体查层 | 全库混搜 |
| 更新 | 显式版本关系 | 新旧事实混存 |
| 遗忘 | 退出默认召回链 | 永不清理 |
一个适合 OpenClaw 的流程示意
事件进入
-> 分类是否值得长期保留
-> 选择记忆层
-> 结构化写入
-> 冲突检测
-> 版本更新或待人工确认
-> 周期性做过期和降级处理
OpenClaw 在这里很适合做编排器:
- 接收事件
- 调用分类器
- 触发存储
- 定时运行清理与检查任务
- 把冲突或高风险更新送给人工确认
如果你只能先做一件事,先做什么
不要先做复杂检索。
先把下面三条规则写清楚:
- 哪些信息绝不自动写入
- 哪些状态允许覆盖旧版本
- 哪些条目默认几天后退出召回
这三条一旦清楚,系统的稳定性通常会比你换数据库还更明显。
延伸阅读
Continue exploring
Use a tool first
If you need to format JSON, XML, YAML, or prompts, start with the online tools.
See implementation projects
If you want to see how these methods enter real builds and experiments, continue with projects.
Get checklists and templates
If you need checklists, resource entries, or SOP starter packs, continue with resources.
Download reusable skills
If you want repeatable judgment, search, and cleanup actions, continue with the skill market.
要点总结
- - 长期记忆不是存储设计,而是生命周期设计
- - 写入门槛越低,后面的检索和维护成本越高
- - 没有过期与撤销机制的记忆系统,最终会把自己拖慢
常见问题
遗忘是不是删除得越多越好?
不是。长期记忆需要的是分层遗忘和可追溯归档,而不是粗暴删除。真正该避免的是让失效信息继续参与默认召回。
所有记忆都需要支持更新吗?
不需要。稳定知识更适合版本化追加,状态事实更适合显式覆盖,原始日志更适合归档保留。不同类型不该共用同一种更新策略。