深度

OpenClaw Agent 记忆系统深度解析:向量搜索、混合检索与时间衰减策略

OpenClaw Agent 记忆系统完整解析:双层 Markdown 文件架构(日常日志+长期记忆)、向量搜索提供商选择、混合 BM25+向量检索、MMR 多样性重排序、时间衰减策略、QMD 实验后端,以及 Session 记忆和嵌入缓存配置。

2026/3/105分钟 阅读ClaudeEagle

OpenClaw 的记忆是工作区中的纯 Markdown 文件。文件是唯一真相来源——模型只能「记住」写入磁盘的内容。本文深度解析这套记忆系统的工作原理和高级配置。

记忆文件双层架构

~/.openclaw/workspace/ ├── MEMORY.md # 长期精华记忆(仅在主私人会话中加载) └── memory/ ├── 2026-03-10.md # 今日日志(启动时自动读取) ├── 2026-03-09.md # 昨日日志(启动时自动读取) └── projects.md # 自定义常青文件(不受时间衰减影响)
文件用途加载时机
memory/YYYY-MM-DD.md日常日志(追加为主)每次 Session 启动时读取今天+昨天
MEMORY.md精华长期记忆仅主私人 Session,绝不在群组中加载

两个核心工具

memory_search —— 语义召回,搜索相关笔记片段 memory_get —— 精准读取,按路径和行号获取内容

优化memory_get 在文件不存在时优雅降级(返回空字符串),无需 try/catch 处理 ENOENT

何时写入记忆

  • 决策、偏好、持久事实 → 写入 MEMORY.md
  • 日常笔记、运行上下文 → 写入 memory/YYYY-MM-DD.md
  • 有人说「记住这个」→ 立即写入文件(不要存在「脑子里」)
  • 如果你想让 Agent 记住某事,让它写入记忆

自动记忆刷新(压缩前触发)

当 Session 接近自动压缩时,OpenClaw 会触发静默的 Agent 轮次,提醒模型在上下文被压缩前写入持久记忆:

json
{
  "agents": {
    "defaults": {
      "compaction": {
        "reserveTokensFloor": 20000,
        "memoryFlush": {
          "enabled": true,
          "softThresholdTokens": 4000,
          "systemPrompt": "Session 即将压缩,现在保存持久记忆。",
          "prompt": "将重要笔记写入 memory/YYYY-MM-DD.md;如无需保存,回复 NO_REPLY。"
        }
      }
    }
  }
}

向量记忆搜索

OpenClaw 构建小型向量索引,支持语义查询(即使措辞不同也能找到相关笔记)。

嵌入提供商选择优先级

未配置 memorySearch.provider 时,自动选择:

  1. 本地模型(如配置了 local.modelPath
  2. OpenAI(有可用 Key)
  3. Gemini
  4. Voyage
  5. Mistral
  6. 否���禁用记忆搜索

Gemini 嵌入配置

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "provider": "gemini",
        "model": "gemini-embedding-001",
        "remote": {
          "apiKey": "YOUR_GEMINI_API_KEY"
        }
      }
    }
  }
}

自定义 OpenAI 兼容端点

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "provider": "openai",
        "model": "text-embedding-3-small",
        "remote": {
          "baseUrl": "https://api.example.com/v1/",
          "apiKey": "YOUR_API_KEY",
          "headers": { "X-Custom-Header": "value" }
        }
      }
    }
  }
}

混合检索(BM25 + 向量)

OpenClaw 结合两种检索信号:

方法优势劣势
向量搜索理解语义(即使措辞不同)精确 Token 匹配较弱
BM25 关键词精确匹配 ID、代码符号、错误字符串不理解同义词
混合(两者结合)兼顾语义和精确匹配

配置示例

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "query": {
          "hybrid": {
            "enabled": true,
            "vectorWeight": 0.7,
            "textWeight": 0.3,
            "candidateMultiplier": 4,
            "mmr": {
              "enabled": true,
              "lambda": 0.7
            },
            "temporalDecay": {
              "enabled": true,
              "halfLifeDays": 30
            }
          }
        }
      }
    }
  }
}

MMR 多样性重排序

MMR(最大边际相关性)解决搜索结果重复问题。

示例:搜索「家庭网络配置」时:

❌ 不用 MMR(重复结果):

1. memory/2026-02-10.md 路由器 + VLAN 设置 2. memory/2026-02-08.md 路由器 + VLAN 设置(近似重复!) 3. memory/network.md 参考文档

✅ 使用 MMR(多样化结果):

1. memory/2026-02-10.md 路由器 + VLAN(最相关) 2. memory/network.md 参考文档(多样化!) 3. memory/2026-02-05.md AdGuard DNS 配置(多样化!)

lambda 参数控制相关性与多样性的平衡:

  • 1.0 = 纯相关性(无多样性惩罚)
  • 0.0 = 最大多样性
  • 默认 0.7(略偏向相关性)

时间衰减(让近期记忆更重要)

时间衰减解决「旧日志语义匹配更好但信息已过时」的问题:

decayedScore = score × e^(-λ × ageInDays)

默认半衰期 30 天效果

  • 今天:100% 原始分
  • 7 天前:~84%
  • 30 天前:50%
  • 90 天前:12.5%
  • 180 天前:~1.6%

永青文件不受时间衰减影响MEMORY.md、非日期格式的 memory/*.md(如 memory/projects.md

示例:搜索「Rod 的工作日程」时,时间衰减让 6 个月前的旧笔记排到底部,让今天的日程出现在顶部。

QMD 后端(实验性)

QMD 是结合 BM25 + 向量 + 重排序的本地优先搜索工具:

bash
# 安装 QMD
bun install -g https://github.com/tobi/qmd
json
{
  "memory": {
    "backend": "qmd",
    "citations": "auto",
    "qmd": {
      "includeDefaultMemory": true,
      "update": { "interval": "5m", "debounceMs": 15000 },
      "limits": { "maxResults": 6, "timeoutMs": 4000 }
    }
  }
}

注意:QMD 首次运行时会自动下载 GGUF 模型(约需几分钟),之后搜索速度很快。

扩展额外记忆路径

索引工作区之外的 Markdown 文件:

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "extraPaths": ["../team-docs", "/srv/shared-notes/overview.md"]
      }
    }
  }
}

Session 记忆搜索(实验性)

将会话记录也加入记忆搜索索引:

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "experimental": { "sessionMemory": true },
        "sources": ["memory", "sessions"]
      }
    }
  }
}

嵌入缓存

缓存 Chunk 嵌入向量,避免未更改内容重复计算:

json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "cache": {
          "enabled": true,
          "maxEntries": 50000
        }
      }
    }
  }
}

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

相关文章推荐

深度OpenClaw 记忆系统深度解析:MEMORY.md、日记文件与长期记忆管理完全指南OpenClaw Agent 记忆系统完整解析:为什么 AI 每次对话不会遗忘(文件型记忆机制)、MEMORY.md 长期记忆的写法和维护策略、每日日记文件的自动创建规则、HEARTBEAT.md 心跳任务与记忆同步、跨会话上下文传递原理,以及如何让 OpenClaw 记住你的偏好和项目背景。2026/3/17深度OpenClaw 长期记忆系统深度解析:Markdown 文件、向量搜索与 QMD 后端OpenClaw 记忆系统深度解析:两层架构(每日日志+长期记忆MEMORY.md)、两个工具(memory_search/memory_get)、Pre-Compaction 自动刷新机制、BM25+向量混合搜索(MMR重排序+时间衰减)、QMD 实验性后端和扩展记忆路径配置。2026/3/2深度OpenClaw 记忆系统深度解析:双层 Markdown 记忆、向量搜索与 QMD 实验后端OpenClaw 记忆系统完整解析:双层 Markdown 架构(每日日志 + 长期 MEMORY.md)、memory_search 语义搜索工具、压缩前自动记忆刷新机制、向量嵌入模型选择策略,以及 QMD 实验性本地搜索后端(BM25 + 向量 + 重排序)的配置和使用指南。2026/2/28深度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