Openclaw
OpenClaw是什么
OpenClaw是一个开源的,可以自托管的个人AI助手平台,本质上是一个事件驱动的Agent执行引擎,前面放了一个多渠道的网关
记忆系统
OpenClaw的记忆系统是指其实现的跨会话持久化知识检索机制,总共分为四层:
-
Bootstrap Files
- Bootstrap Files在每次开启新
session的时候都会从磁盘进行读取,被注入上下文 - 其存储目录位于
~/.openclaw/workspace目录,包含SOUL.mdAGENTS.mdUSER.mdTOOLS.mdIDENTITY.mdMEMORY.mdHEARTBEAT.mdBOOTSTRAP.md
- Bootstrap Files在每次开启新
-
Session Transcript
- OpenClaw中实现了会话持久化, 整个会话以一个
<sessionID>.jsonl的文件格式被持久化到sessions目录 -
会话的元数据以
sessions.json的格式保存 - 在产生新消息时,会将新消息写入持久化文件
- 在产生新会话时,会创建新的持久化会话
- OpenClaw中实现了会话持久化, 整个会话以一个
-
Context Window
本质上是一个固定大小的
token容器,大小是由模型决定的包含:
- 系统提示词
- Bootstrap Files
- 对话历史
- 工具调用结果(包括memory_search/memory_get检索到的记忆片段)
- 当前的用户消息
当上下文窗口满了之后,会触发
compaction -
Retrieval Index
OpenClaw专门为记忆文件建立了检索机制,Agent会根据用户的查询,自主判断需不需要进行记忆检索-
索引范围
MEMORY.md+memory/**/*.md -
索引以
sqlite的格式进行存储
OpenClaw提供了两个记忆工具memory_search和memory_get-
memory_search该工具用于搜索记忆内容,其采用的是BM25 + 语义的双路检索策略,权重分别为0.3, 0.7
memory_search检索到的是markdown chunk, 其会将检索到的chunk的文件名metadata传递给memory_get工具 -
memory_get根据文件名读取完整的文件内容
-
上下文压缩
OpenClaw的上下文压缩有三种触发时机
-
llm API错误
如果llm返回了上下文过长之类的错误,那么OpenClaw会将上下文进行一次压缩,然后将压缩之后的上下文重试请求
-
阈值维护
如果当前的上下文窗口
token超过阈值,OpwnClaw就会触发压缩操作这里的阈值是
ContextWindow - reversed -
手动触发
用户可以使用
/compact命令来进行手动压缩
memory flush
memory fulsh是一种在上下文达到软阈值的时候,所进行的一种记忆持久化操作, 会将当前会话中需要保存的重要信息写入memory
1
2
3
4
5
6
7
8
会话 Token 使用情况
┌─────────────────────────────────────────────────────┐
│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░│
│<──────── 已用 Token ────────>│<── 软阈值 ──>│<保留>│
│ │ (4000) │ │
│ ↑ │
│ 触发 Memory Flush │
└─────────────────────────────────────────────────────┘
具体过程
-
划分保留区和压缩区
最近的20000 tokens被划分为保留区,原封不动进行保留,模型看到的就是原文, 保留区之间所有的消息进入压缩区
-
分割压缩区
把旧压缩区的旧消息按照token的数目划分成若干块
-
逐块总结
用模型对每个块生成摘要
-
合并摘要
将多个块的摘要进行合并,合并成一个总的摘要
-
摘要写入
将摘要写入到
sessionID.jsonl文件中,跨会话持久
Q & A
-
OpenClaw是什么?
OpenClaw是一个开源的、可托管的个人AI助手平台,其本质上是一个事件驱动的Agent执行引擎,前面放了一个多渠道的网关。
-
OpenClaw的架构是什么?
其包含三层架构:触发层、网关层、Agent层。
-
触发层有五种事件源(Messages、HeartBeats, Crons、Hooks, WebHooks)
- 网关层负责协议切换、认证和路由分发
- Agent层负责推理(Think)、工具执行(Act)和记忆(Remember)
其本质上是一个事件驱动的执行管道:事件产生 → 网关路由 → Agent执行 → 状态持久化
-
-
网关是什么?它的作用是什么
网关是一个本地常驻的Node.js进程,监听单一端口,同时提供HTTP和WebSocket。他是触发层和Agent层之间的中间层,负责渠道连接管理、协议转换、会话路由、认证鉴权、插件加载以及设备配对。
网关并不做推理,也不调用LLM,不执行工具,其只要负责“消息到了应该给谁”和“回复应该送回哪里”
-
有哪些消息源/触发源
- Messages: 用户通过聊天渠道发消息
- Heartbeats: 固定间隔定时器,让Agent主动唤醒
- Crons: 用户定义的计划任务(cron表达式),执行具体的定时任务
- Hooks: 网关/Agent内部生命周期事件触发的回调
- WebHooks: 外部系统通过HTTP POST触发
-
为什么OpenClaw能接入各个平台
因为网关层的Channel Manager把每个渠道封装为一个独立的插件, 每个插件实现统一的接口, 不同渠道的协议被封装在插件内部,对上层的Agent暴露一致的消息接口,加一个新渠道只需要写一个新的插件即可
-
OpenClaw的如何组织长短期记忆
-
OpenClaw的短期记忆就是当前会话的对话上下文,包括用户消息,助手回复,工具调用这些内容,全部在上下文窗口内存储
其容量手模型的上下文窗口限制,当上下文窗口满了之后,会触发压缩机制,保留近20000个token, 更远的记忆被压缩成摘要
-
长期记忆完全依赖于磁盘上的Markdown文件,分为两种组织方式
-
MEMORY.md
该文件存储用户偏好,持久性决策,重要事实这些东西,由Agent主动维护和更新,在每次会话启动的时候注入上下文
-
memory/YYYY-MM-DD.md
其维护的是每日的日志,在会话启动的时候只会读入今天和昨天的内容
-
- 长期记忆有着配套的检索机制,系统会对所有的记忆系统建立混合搜索,包括向量语义搜索和BM25关键词搜索, Agent在需要的时候会通过
memory_search和memory_get来检索记忆文件,而不是把所有的记忆全部塞进上下文,这样即使记忆文件越积越多,也不会撑爆上下文窗口 - 两者通过压缩机制进行衔接,当短期记忆快慢的时候,系统会静默提醒Agent将当前对话中重要的内容写入长期记忆文件,然后再做压缩,这样能够保证短期记忆中有用的内容能够持久化到长期记忆,而不会因为压缩而彻底丢失。
-