上一篇文章我们介绍了 OpenClaw 的记忆系统架构,主要包括:
- 会话记忆:存储在内存中,会话结束即消失;
- 短期记忆:存储在磁盘的
YYYY-MM-DD.md 文件中,定期归档;
- 长期记忆:存储在磁盘的
MEMORY.md 文件中,定期更新。
了解结构后,一个很自然的问题就产生了:在上下文窗口(Context Window)大小有限的实际场景中,每次与 OpenClaw 交互时,它会将哪些信息加载到上下文中呢?这直接关系到 Agent 的“记性”和反应能力。
核心配置:必定加载的“人设”
首先,一些核心配置文件是每次都会加载的“必选项”,它们定义了交互的基本框架:
USER.md:描述“我是谁”,以及期望 OpenClaw 协助完成的工作,例如:“架构师沈剑”;
IDENTITY.md:定义“你是谁”,即 OpenClaw 扮演的角色,例如:“妩媚的运营小姐姐”;
SOUL.md:设定核心人格,例如:“温柔,善解人意”;
AGENTS.md:规划如何协助完成任务,例如:“帮我实现公众号 OpenClaw 选题”。
这里给我们的重要启示是:核心配置文件的内容不宜过长。如果有限的上下文空间被过长的固定配置占据,留给动态信息和任务数据的空间就会减少,导致 OpenClaw 显得“健忘”,无法有效利用之前的交流内容。
长期记忆:按会话类型选择性加载
其次,长期记忆文件 MEMORY.md 是“按需加载”的:
- 主会话加载:在与你进行一对一聊天时加载;
- 非主会话不加载:例如在群聊等场景中执行任务时,不会加载
MEMORY.md,这是为了避免泄露其中的私人或机密信息。
这个机制的启示在于,我们需要定期整理和维护 MEMORY.md 文件,清理过时或冗余的信息,防止其无限膨胀,影响核心信息的检索效率。
短期记忆与历史记忆检索
第三,短期记忆文件 YYYY-MM-DD.md 中的内容,同样遵循按需加载的原则。
这通常需要通过显式的指令来控制,例如,当你发出“请回忆过去几天的记忆内容”这样的指令时,OpenClaw 会启动 memory_search 功能。这个功能会回顾之前的记忆文件,并将相关的片段加入到当前的上下文中。
你可能会在 OpenClaw 的根目录(注意,不是 workspace 目录)下,发现一个 memory 文件夹,里面有一些 SQLite 数据库文件。这些文件是系统启动时,将历史记忆(包括短期和长期记忆)进行切片、向量化处理后存储的索引库。其目的正是为了在需要“回忆”时,能够实现快速的相关性检索,这背后涉及对内存管理和数据库系统的有效运用。
当前会话:并非全部加载
第四,即使当前会话没有断开,内存中的会话数据也不会被全部加载到上下文中。
原因依然是那个核心约束:上下文窗口大小是有限的。在加载完上述“必选项”之后,系统会根据相关性算法,选择当前最可能需要的会话片段进行加载,而不是一股脑儿塞进去。
历史会话:默认节省 Token
第五,过往的历史会话,默认情况下是不会被加载的。这样做主要是为了节省 Token 消耗,控制成本。除非用户通过指令显式要求,例如:“请回忆我们过去几天的聊天内容”。
总结与优化思路
简单总结一下 OpenClaw 的记忆加载策略:
- 核心人设配置:必定加载,需保持精炼;
- 长期记忆:按需加载(主会话加载,非主会话不加载);
- 短期记忆:按需加载(通过
memory_search 指令触发);
- 当前会话:受上下文窗口限制,选择性加载相关性高的部分;
- 历史会话:原则上不加载,除非显式控制。
理解这套机制,能帮助我们更好地设计配置和使用 OpenClaw。例如,在计算机基础层面思考,这本质上是一种在有限资源(上下文长度)下的缓存与调度策略。通过精简核心配置、定期整理记忆、善用检索指令,我们可以让 OpenClaw 在有限的“脑容量”内,更智能、更高效地为我们工作。
|