在 AI 助手领域,记忆系统是实现长期对话和知识积累的关键。OpenClaw 作为一个开源的自托管 AI 助手平台,实现了一套完整的 Memory 系统,将简单的文件存储与强大的向量检索相结合。本文将深入剖析 OpenClaw Memory 系统的完整技术实现,从文件系统设计到向量检索,从工具接口到混合排序算法。
本文涵盖的内容:
- 基于文件系统的 Memory 和 Message 存储设计
- 文件监听机制与向量/全文数据库的增删改查联动
- Memory 工具设计与 LLM Prompt 集成
- 关键词搜索的 BM25 算法实现
- Embedding 模型的自动选择与配置
- 混合检索的排序算法与优化策略
让我们从最基础的文件系统设计开始。
OpenClaw 的 Memory 系统采用了一个优雅的设计原则:文件是数据的唯一真实来源(Single Source of Truth)。
这种设计带来了几个关键优势:
- 人类可读可编辑:Memory 数据存储为纯文本 Markdown 格式
- 版本控制友好:可以使用 Git 管理知识库
- 无锁定风险:不依赖专有数据库格式
- 灾难恢复简单:索引损坏时可以完全重建
工作区组织:
文件类型详解:
MEMORY.md:持久知识库
用途:存储长期、结构化的知识
推荐格式:
特点:
- 手动编辑和维护
- 结构化组织
- 长期保存
memory/YYYY-MM-DD.md:每日日志
用途:存储时间敏感的上下文和事件
格式示例:
特点:
- 自动追加(pre-compaction flush)
- 时间序列
- 事件驱动
sessions/*.jsonl:对话历史
用途:存储完整的对话记录
格式示例:
特点:
- JSONL 格式(每行一个 JSON)
- 包含工具调用和结果
- 支持增量索引
OpenClaw 采用 标准工具 + 自动刷新 的混合策略。
策略 1:使用标准 write 工具
Agent 使用标准的 工具写入 Memory 文件:
特点:
- 与其他文件写入一致
- 受工作区权限控制
- 支持完整覆盖
策略 2:Pre-compaction Memory Flush(自动)
最重要的自动写入机制:
配置:
时机:
- Token 使用率达到阈值(默认 80%)
- 消息数量超过限制
- 手动触发压缩
为什么重要?
- 防止长对话中信息丢失
- 自动化知识积累
- 无需用户干预
策略 3:用户明确要求
OpenClaw 使用 Chokidar 实现实时文件监听。
监听器配置:
监听的事件:
防抖机制:
为什么需要防抖?
- 避免写入过程中的部分读取
- 批量处理多个文件变化
- 减少重复索引
OpenClaw 使用 SQLite + 三表架构:
索引设计:
增量同步流程
分块算法
核心代码:
可视化:
为什么重叠?
- 避免语义边界被切断
- 提高检索召回率
- 保留上下文连贯性
批量嵌入优化
批处理流程:
性能对比:
删除时的级联清理
完整删除流程:
删除顺序很重要:
- 先删向量(依赖 chunks.id)
- 再删主块
- 然后删 FTS 索引
- 最后删元数据
容错设计:
- 向量和 FTS 删除使用 (允许失败)
- 主块和元数据删除必须成功
- 兼容 FTS-only 模式(无向量扩展)
OpenClaw 提供 2 个 Memory 工具(以 Tool 形式注册):
工具定义:
返回示例:
工具定义:
使用模式:
Memory Recall 指导:
关键设计点:
- "Mandatory recall step":强烈建议但不强制
- 明确场景:什么时候需要查询 memory
- 两步流程:search → get(节省 token)
- 低信心处理:搜索无结果时告知用户
- 写入指导:何时写、写什么、写哪里
完整流程:
为什么是 Tool 而不是预查询?
- 按需查询:LLM 判断是否需要,避免浪费
- 动态参数:LLM 可调整 query、maxResults、minScore
- 多次查询:一轮对话中可多次调用
- 标准化:复用工具基础设施
虚拟表定义:
索引特点:
- 只有 列被完全索引
- 其他列存储但不索引(节省空间)
- 自动分词和倒排索引
- 内置 BM25 评分
BM25(Best Matching 25)是信息检索中的经典算法。
核心公式
直观理解
1. 词频(TF):
2. 逆文档频率(IDF):
3. 文档长度归一化:
提取 tokens:
查询示例:
SQL 查询:
分数转换:
转换表:
例子:
OpenClaw 支持 5 个提供商:
provider: "auto" 的逻辑(默认):
代码实现:
完全不配置:
行为:
- 检查环境变量:、 等
- 使用第一个找到的 API 密钥
- 如果没有任何 API 密钥,降级到 FTS-only
- Memory 功能仍然可用(仅关键词搜索)
环境变量配置:
配置文件配置:
本地模型配置:
行为:
- 优先使用 OpenAI
- 如果失败(无 API 密钥、配额用尽等),自动切换到本地模型
- 如果本地模型也失败,降级到 FTS-only
L2 归一化(所有向量):
为什么归一化?
- 余弦相似度计算更高效
- 数值稳定性更好
- 向量长度统一为 1
核心思想:结合向量搜索的语义理解和关键词搜索的精确匹配。
算法:
权重配置(默认):
为什么 7:3?
- 向量搜索擅长语义理解(同义词、相关概念)
- 关键词搜索擅长精确匹配(术语、代码、命令)
- 7:3 平衡两者优势
例子:
配置:
逻辑:
为什么需要?
- 避免过早截断
- 提供更多候选供合并算法选择
- 提升最终结果质量
最大边际相关性(Maximal Marginal Relevance):
配置:
例子:
算法:
配置:
衰减曲线:
应用场景:
- 项目文档(新版本优先)
- 会议记录(近期会议更相关)
- 日志和笔记
向量搜索 vs 关键词搜索 vs 混合搜索:
策略 1:嵌入缓存
效果:
- 相同块不重复嵌入
- 80% 缓存命中率 → 减少 80% API 调用
- 重新索引时速度提升 5x
策略 2:批量嵌入
效果:
- 批处理 vs 单个:性能提升 10x
- 100 个块:2 秒 vs 20 秒
策略 3:增量同步
效果:
- 只索引变化的文件
- 避免全量重建
- 大型知识库友好
策略 4:调整权重
OpenClaw 的 Memory 系统展现了从简单到复杂的完整技术栈:
- 文件优先:Markdown 文件作为唯一真实来源
- 零配置:开箱即用,优雅降级
- 混合检索:结合语义和精确匹配
- 实时同步:文件变化自动索引
- 工具驱动:LLM 主动决策查询时机
- 智能分块:400 token + 80 token 重叠
- BM25 算法:经典的信息检索评分
- 向量归一化:L2 归一化保证数值稳定
- RRF 融合:加权合并向量和关键词结果
- MMR 去重:避免返回重复内容
- 时间衰减:优先返回近期信息
- ✅ 个人知识库管理
- ✅ 长期对话上下文
- ✅ 项目文档检索
- ✅ 会议记录查询
- ✅ 代码库知识积累
- 多模态支持:图片、PDF 的向量化
- 图结构索引:知识图谱增强
- 动态 chunking:语义边界分块
- 联邦搜索:跨多个 Agent 的记忆查询
OpenClaw 的 Memory 系统证明了一个理念:简单的文件系统 + 强大的向量检索 = 高效的知识管理。
- OpenClaw 官方文档:docs.openclaw.ai
- 项目仓库:github.com/openclaw/op…
- BM25 算法论文:Robertson & Zaragoza (2009)
- SQLite FTS5 文档:www.sqlite.org/fts5.html
- 向量检索综述:Johnson et al., “Billion-scale similarity search”
本文基于 OpenClaw 版本 2026.3.1 撰写。项目持续演进中,部分实现细节可能有所变化。
关键文件参考:
- - 核心管理器
- - 同步操作
- - 搜索实现
- - Embedding 提供商
- - 混合检索
- - Memory 工具
- - 系统提示
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/227815.html