文章

Openclaw

Openclaw

OpenClaw是什么

OpenClaw是一个开源的,可以自托管的个人AI助手平台,本质上是一个事件驱动的Agent执行引擎,前面放了一个多渠道的网关

记忆系统

OpenClaw的记忆系统是指其实现的跨会话持久化知识检索机制,总共分为四层:

  • Bootstrap Files

    • Bootstrap Files在每次开启新session的时候都会从磁盘进行读取,被注入上下文
    • 其存储目录位于~/.openclaw/workspace目录,包含
      • SOUL.md
      • AGENTS.md
      • USER.md
      • TOOLS.md
      • IDENTITY.md
      • MEMORY.md
      • HEARTBEAT.md
      • BOOTSTRAP.md
  • Session Transcript

    • OpenClaw中实现了会话持久化, 整个会话以一个<sessionID>.jsonl的文件格式被持久化到sessions目录
    • 会话的元数据以sessions.json的格式保存

    • 产生新消息时,会将新消息写入持久化文件
    • 产生新会话时,会创建新的持久化会话
  • Context Window

    本质上是一个固定大小的token容器,大小是由模型决定的

    包含:

    • 系统提示词
    • Bootstrap Files
    • 对话历史
    • 工具调用结果(包括memory_search/memory_get检索到的记忆片段)
    • 当前的用户消息

    当上下文窗口满了之后,会触发compaction

  • Retrieval Index

    OpenClaw专门为记忆文件建立了检索机制,Agent会根据用户的查询,自主判断需不需要进行记忆检索

    • 索引范围

      MEMORY.md + memory/**/*.md

    • 索引以sqlite的格式进行存储

    OpenClaw提供了两个记忆工具memory_searchmemory_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_searchmemory_get来检索记忆文件,而不是把所有的记忆全部塞进上下文,这样即使记忆文件越积越多,也不会撑爆上下文窗口
    • 两者通过压缩机制进行衔接,当短期记忆快慢的时候,系统会静默提醒Agent将当前对话中重要的内容写入长期记忆文件,然后再做压缩,这样能够保证短期记忆中有用的内容能够持久化到长期记忆,而不会因为压缩而彻底丢失。
本文由作者按照 CC BY 4.0 进行授权