跳转至

3.2 Memory System

本节摘要

从State Management角度看,OpenClaw Memory 系统的核心特点是:文件即 Memory——所有 Memory以人类可读的 Markdown 文件落盘,没有隐藏的黑箱状态。本节按「记了什么 → 怎么写入 → 怎么召回」展开。


一、记了什么:工作区 Markdown 文件

Memory 全部落盘到 workspace 目录下的固定路径文件:

文件 记录什么 谁来写
MEMORY.md 长期知识:项目约定、关键决策、重要 Context Agent 主动写入
memory/YYYY-MM-DD.md 日笔记:当天对话中提取的 Memory Agent 按日期自动分片
SOUL.md 人格定义:角色、语气、价值观 用户/管理员编辑
AGENTS.md 行为规则:Session Startup、Red Lines 用户/管理员编辑
DREAMS.md 梦境/反思记录 Agent 自动生成

设计优势:Memory 天然持久化(无需数据库)、用户可直接编辑、Git 版本控制天然适用、透明可审计。

与 Claude Code 的对比

Claude Code 把所有持久状态塞进 CLAUDE.md五层体系(Managed → User → Project → Local → AutoMem),统一但复杂。OpenClaw 将人格(SOUL)、行为(AGENTS)、知识(MEMORY)拆成独立文件——职责更清晰,但缺乏层级覆盖的灵活性。


二、怎么写入:Memory Flush 安全网

OpenClaw Memory 写入的最关键机制是 Memory Flush——在压缩发生前,自动将当前对话中的重要信息写入磁盘,防止压缩摘要丢失细节。

触发决策链

graph LR
    A["shouldRunMemoryFlush()"] -->|"门控检查"| B{"通过?"}
    B -->|"否"| C["跳过"]
    B -->|"是"| D["resolveMemoryFlushPlan()"]
    D --> E["写入 MEMORY.md\nmemory/*.md"]
    E --> F["更新 SessionEntry\nmemoryFlushCompactionCount++"]

门控条件:

  • 当前会话是否有足够的新内容
  • 距离上次 flush 是否经过了足够多的交互轮次
  • memoryFlushCompactionCount 是否低于当前 compactionCount

这种「先保存再压缩」的策略是 OpenClaw 防御性编程哲学的典型体现——即使压缩生成的摘要质量不高,关键信息也已经安全写入磁盘。


三、怎么召回:被动向量检索

Memory 检索通过可插拔的 memory 插件实现(同一时刻只能有一个 memory 插件 active):

工具 模式 实现
memory_search 向量检索 / 混合检索 LanceDB 或 sqlite-vec
memory_get 精确获取 按路径直接读取Memory 文件

被动检索 vs 主动预取

与 Claude Code(每 turn 自动用 Sonnet 预取)不同,OpenClaw 的Memory 检索是被动的——需要 LLM 主动决定调用 memory_search

维度 Claude Code(主动预取) OpenClaw(被动检索)
触发 每 turn 自动 LLM 主动调用工具
召回率 100%(每 turn 必触发) 不确定(依赖模型判断)
成本 高(每 turn 一次 Sonnet) 低(按需检索)
延迟 并行预取,不阻塞 串行工具调用,增加 1 turn
精度 高(LLM 理解语义) 中(依赖 Embedding 质量)

四、Memory 与 System Prompt 的集成

Memory 文件在系统提示构建阶段被加载(loadWorkspaceBootstrapFiles)——MEMORY.md、SOUL.md 等内容直接注入 Bootstrap 段落。

压缩后通过 readPostCompactionContext 重新注入 AGENTS.md 中的 Session StartupRed Lines——确保 Agent 的核心行为规则不会因压缩而丢失。


关键文件索引

文件 职责
src/agents/workspace.ts Bootstrap 文件加载(MEMORY/SOUL/AGENTS.md)
src/agents/pi-embedded-runner/attempt.ts 压缩触发 + Memory Flush
docs/concepts/memory.md Memory 概念文档
docs/reference/memory-config.md Memory 配置参考