深度

OpenClaw 记忆系统深度解析:双层 Markdown 记忆、向量搜索与 QMD 实验后端

OpenClaw 记忆系统完整解析:双层 Markdown 架构(每日日志 + 长期 MEMORY.md)、memory_search 语义搜索工具、压缩前自动记忆刷新机制、向量嵌入模型选择策略,以及 QMD 实验性本地搜索后端(BM25 + 向量 + 重排序)的配置和使用指南。

2026/2/285分钟 阅读ClaudeEagle

OpenClaw 的记忆系统是整个 Agent 持续性的基础。与大多数 AI 系统「上下文即记忆」的做法不同,OpenClaw 的记忆是磁盘上的 Markdown 文件——模型只能「记住」写到磁盘上的内容。

「记忆文件是唯一的真相来源;模型只会记住被写入磁盘的内容。」

双层记忆架构

第一层:每日日志(memory/YYYY-MM-DD.md

  • 追加模式:只往里加,不删除
  • 自动加载:每次会话开始时,读取今天和昨天的日志
  • 用途:当天发生的事、临时上下文、运行中的笔记

第二层:长期记忆(MEMORY.md

  • 精选模式:重要决策、持久偏好、关键事实
  • 安全限制:⚠️ 只在私人主会话中加载,群组上下文中永远不加载(防止个人信息泄露)
  • 用途:跨会话保持一致的用户偏好、项目背景、重要决定

两个文件都位于 Agent 工作区下(默认 ~/.openclaw/workspace)。

记忆工具

OpenClaw 为 Agent 提供两个记忆工具:

工具功能
memory_search语义搜索——即使措辞不同也能找到相关笔记
memory_get精确读取指定 Markdown 文件的特定行

memory_get 现在支持优雅降级:如果文件不存在(比如今天的日志还没有第一条记录),返回 { text: "", path } 而不是报错,Agent 可以无缝处理「还没有记录」的情况。

何时写记忆

官方原则很简单:

  • 决策、偏好、持久事实 → MEMORY.md
  • 日常笔记、临时上下文 → memory/YYYY-MM-DD.md
  • 有人说「记住这个」→ 立刻写到文件,不要只放在 RAM 里
  • 如果你想让某件事持续存在,告诉 Bot 写下来

自动记忆刷新(压缩前 Ping)

当会话接近上下文窗口上限时,OpenClaw 会触发一个静默的 Agentic 轮次,提醒 Agent 在压缩前写入持久记忆:

json
{
  "agents": {
    "defaults": {
      "compaction": {
        "reserveTokensFloor": 20000,
        "memoryFlush": {
          "enabled": true,
          "softThresholdTokens": 4000,
          "systemPrompt": "Session nearing compaction. Store durable memories now.",
          "prompt": "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store."
        }
      }
    }
  }
}

工作机制

  • 当会话 Token 数超过 contextWindow - reserveTokensFloor - softThresholdTokens 时触发
  • 默认静默(Prompt 包含 NO_REPLY,用户看不到这次轮次)
  • 每次压缩周期只触发一次
  • 工作区必须可写(沙箱只读模式下跳过)

向量记忆搜索

OpenClaw 默认为 MEMORY.mdmemory/*.md 构建向量索引,支持语义搜索——即使措辞完全不同,也能找到相关笔记。

嵌入模型自动选择顺序

  1. 本地模型(如配置了 memorySearch.local.modelPath
  2. OpenAI(如有 API Key)
  3. Gemini(如有 API Key)
  4. Voyage
  5. Mistral
  6. 都没有 → 记忆搜索保持禁用,直到配置

配置示例

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "provider": "openai",
        "model": "text-embedding-3-small",
        "extraPaths": ["../team-docs", "/srv/shared-notes/overview.md"]
      }
    }
  }
}

extraPaths 支持索引工作区以外的 Markdown 文件,方便团队共享知识库。

QMD 实验性后端

QMD 是一个完全本地的搜索引擎,比默认的 SQLite 索引更强大:

优势

  • BM25 关键词搜索 + 向量搜索 + 重排序
  • 全本地运行(Bun + node-llama-cpp,自动从 HuggingFace 下载 GGUF 模型)
  • 无需 Ollama 等独立守护进程

启用方式

json
{
  "memory": {
    "backend": "qmd",
    "citations": "auto",
    "qmd": {
      "includeDefaultMemory": true,
      "update": { "interval": "5m", "debounceMs": 15000 },
      "limits": { "maxResults": 6, "timeoutMs": 4000 },
      "paths": [
        { "name": "docs", "path": "~/notes", "pattern": "**/*.md" }
      ]
    }
  }
}

安装步骤

bash
# 安装 QMD CLI
bun install -g https://github.com/tobi/qmd

# macOS 需要 Homebrew 版 SQLite
brew install sqlite

注意:第一次搜索可能较慢,QMD 会自动下载本地 GGUF 模型(重排序器/查询扩展)。

会话搜索(实验性)

开启 memory.qmd.sessions.enabled = true 后,OpenClaw 会将历史会话记录导出到 QMD 集合,memory_search 可以搜索以往对话内容,不仅限于 Markdown 文件。

混合搜索架构(BM25 + 向量)

为什么要混合?

纯向量搜索纯 BM25 关键词
能找到语义相关但措辞不同的内容精确匹配特定术语和代码
对变量名/方法名效果差无法理解语义相似性

混合搜索取两者之长:语义理解 + 精确匹配。

结果处理流水线

  1. BM25 + 向量搜索 并行运行
  2. RRF 融合(倒数排名融合)合并两路结果
  3. MMR 重排序(最大边际相关性):在相关性和多样性之间取平衡,避免返回大量重复内容
  4. 时间衰减:最近写入的笔记权重更高

实用建议

让记忆真正有用

# 有效的记忆写作示例 ## 2026-02-28 项目决策 - 用户偏好使用 TypeScript 而非 JavaScript - 数据库选型:PostgreSQL(已部署在 Docker 上) - API 认证方案:JWT,Token 有效期 24h - 部署目标:Vercel(前端)+ Railway(后端)

何时用 memory_search vs memory_get

  • 不确定在哪里:用 memory_search(语义搜索)
  • 知道具体文件和行号:用 memory_get(精确读取,省 Token)

引用格式

设置 memory.citations = "auto" 后,搜索结果会附上 Source: <路径#行号> 的来源标注,方便追溯。


原文:Memory - OpenClaw | 来源:OpenClaw 官方文档

相关文章推荐

深度OpenClaw 长期记忆系统深度解析:Markdown 文件、向量搜索与 QMD 后端OpenClaw 记忆系统深度解析:两层架构(每日日志+长期记忆MEMORY.md)、两个工具(memory_search/memory_get)、Pre-Compaction 自动刷新机制、BM25+向量混合搜索(MMR重排序+时间衰减)、QMD 实验性后端和扩展记忆路径配置。2026/3/2深度OpenClaw Agent 记忆系统深度解析:向量搜索、混合检索与时间衰减策略OpenClaw Agent 记忆系统完整解析:双层 Markdown 文件架构(日常日志+长期记忆)、向量搜索提供商选择、混合 BM25+向量检索、MMR 多样性重排序、时间衰减策略、QMD 实验后端,以及 Session 记忆和嵌入缓存配置。2026/3/10深度OpenClaw 记忆系统深度解析:MEMORY.md、日记文件与长期记忆管理完全指南OpenClaw Agent 记忆系统完整解析:为什么 AI 每次对话不会遗忘(文件型记忆机制)、MEMORY.md 长期记忆的写法和维护策略、每日日记文件的自动创建规则、HEARTBEAT.md 心跳任务与记忆同步、跨会话上下文传递原理,以及如何让 OpenClaw 记住你的偏好和项目背景。2026/3/17深度OpenClaw 多 Gateway 架构完全指南:一台机器运行多个独立 AI 助手实例OpenClaw 多 Gateway(Multi-Gateway)架构完整教程:多实例的隔离优势、同一台机器运行多个 Gateway(不同端口/配置文件/workspace)、systemd 管理多个 Gateway 服务、Nginx 虚拟主机为每个实例分配独立域名、API Key 隔离与成本拆分、单机多实例 vs 多机方案对比,以及 Docker Compose 多容器隔离部署方案。2026/3/26深度OpenClaw Hooks 自动化进阶:消息前后的智能拦截、转换与触发机制OpenClaw Hooks(钩子)自动化系统进阶教程:Hooks 的触发时机(before-send/after-receive/on-tool-call)、用 Hooks 拦截消息并修改内容(自动翻译/过滤/格式化)、基于条件的 Hook 触发(渠道过滤/关键词匹配)、Hook 中调用外部 API(Notion 记录/Bark 通知/监控告警)、exec 工具二次确认 Hook,以及 Hooks 与 SOUL.md 和 Standing Orders 的优先级关系详解。2026/3/26深度OpenClaw 插件开发完全指南:从零构建自定义渠道和工具插件OpenClaw 插件(Plugin)开发完整教程:插件类型(渠道插件/工具插件/Provider插件)、插件的目录结构和 package.json 规范、使用 Plugin SDK 开发自定义消息渠道(实现 onMessage/sendMessage 接口)、开发自定义工具(Tool)的函数签名和参数 Schema、本地插件安装与调试(openclaw plugins install ./local-plugin)、发布到 npm 的规范要求(@openclaw/ 命名空间)、插件的权限声明(capabilities)、社区插件列表(Plugin Bundles)获取,以及常见插件开发错误和调试技巧。2026/3/25