OpenClaw 的 Memory 机制:Agent 为什么能“记住你”?
普通大模型有一个很明显的问题:
这次聊得好好的,下次再聊,它可能已经不知道之前发生过什么。
所以 Agent 除了会思考、会调用工具,还需要一个非常重要的能力:
Memory。
可以先把 OpenClaw 的记忆理解成两层:
Session / Context
↓
当前对话记忆
↓
Memory
↓
跨对话长期信息
一、Session:记住“我们刚才聊了什么”
Session 主要解决当前对话连续性。
例如:
用户:我的项目数据库用 MySQL。
用户:帮我设计一个用户表。
第二句话没有再次说“MySQL”,但 Agent 仍然需要结合前面的上下文来回答。
Session 中通常会涉及:
用户输入
Agent 回复
工具调用
工具返回结果
当前任务上下文
所以可以简单记成:
Session 解决“接着聊”的问题。
二、Memory:记住“以后还有用的信息”
但 Session 不可能无限增长。
如果聊了几百轮,每次都把全部历史消息送给 LLM:
对话越来越长
↓
Context 越来越大
↓
Token 越来越多
↓
速度越来越慢
↓
成本越来越高
因此需要把真正有长期价值的信息,从大量聊天内容中沉淀下来。
例如:
用户长期偏好
项目的重要约定
关键业务背景
长期有效的事实
重要任务结论
这就是长期 Memory 更适合承担的角色。
所以:
Memory 不是把所有聊天记录永久保存,而是尽可能留下以后真正有用的信息。
三、Compaction:上下文太长怎么办?
这里还有一个非常重要的概念:
Compaction(上下文压缩)。
假设当前上下文已经非常长:
第1轮
第2轮
第3轮
...
第80轮
第81轮
第82轮
不能永远原封不动地全部塞给模型。
因此需要进行压缩:
大量历史上下文
↓
Compaction
↓
提取 / 总结重要信息
↓
缩短上下文
↓
继续后面的任务
它解决的核心问题就是:
有限的 Context Window,如何支撑更长时间的任务和对话?
四、Memory 怎么被重新使用?
有了长期记忆还不够。
关键是:
需要的时候,Agent 怎么把正确的记忆找回来?
可以把它理解成:
用户提出新问题
↓
判断当前需要什么背景
↓
寻找相关 Memory
↓
把相关信息加入 Context
↓
交给 LLM
↓
生成答案
这里有一个非常重要的思想:
不是把所有 Memory 都塞给模型,而是只拿当前任务真正相关的部分。
否则 Memory 越多,上下文反而越乱。
五、Session、Compaction、Memory 到底什么关系?
一张图就能说明白:
用户不断对话
↓
Session
当前完整上下文
↓
内容越来越多
↓
Compaction
上下文压缩
↓
┌─────────┴─────────┐
↓ ↓
继续当前任务 沉淀重要信息
↓ ↓
Context Memory
↑ │
└────需要时检索──────┘
因此三者不要混淆:
Session:现在正在聊什么。
Compaction:内容太长了,怎么压缩。
Memory:哪些信息值得以后继续使用。
六、Memory 不是越多越好
这是实际使用 Agent 时非常容易踩的坑。
如果什么都记:
你好
谢谢
临时搜索结果
重复信息
过期任务
无关聊天
最后 Memory 会变成一个“垃圾场”。
真正好的记忆系统应该追求:
少
+
准
+
相关
+
可更新
比如:
“用户喜欢喝咖啡”
可能值得记。
但:
“用户今天下午 3:17 说了一句谢谢”
通常没有长期价值。
所以 Memory 最难的地方,其实不是“存”。
而是三个问题:
记什么?什么时候记?什么时候拿出来?
七、一句话搞懂 Memory
把整个 Agent 想象成人:
Context / Session
= 工作台上正在看的材料
Compaction
= 把一大堆材料整理成重点
Memory
= 笔记本里长期保存的重要信息
LLM
= 大脑
Tools
= 手脚
所以 OpenClaw 的 Memory 机制,本质上是在解决:
如何让一个上下文窗口有限的 Agent,在长期使用过程中仍然保持任务和信息的连续性。
这也是 Agent 从“一问一答的聊天机器人”,走向长期智能助手非常关键的一步。