概述
OpenClaw 的记忆系统以纯 Markdown 文件作为数据源(source of truth),采用双层架构设计,让 AI 助手能够在多轮对话中保持上下文连贯性。本文将详细拆解这一系统的工作原理和配置方法。
双层记忆架构
OpenClaw 的记忆分为两层:日志记忆和长期记忆。
日志记忆(Daily Logs)
日志记忆按日期存储在 memory/YYYY-MM-DD.md 路径下,每天自动创建新文件:
~/.openclaw/memory/
├── 2026-01-28.md
├── 2026-01-29.md
├── 2026-01-30.md
└── ...
日志记忆适合记录日常交互中的临时笔记和常规操作记录。
长期记忆(MEMORY.md)
长期记忆存储在 MEMORY.md 文件中,用于保存跨会话的重要信息:
# MEMORY.md 示例结构
## 用户偏好
- 偏好使用中文交流
- 代码风格偏好:使用 2 空格缩进
## 决策记录
- 项目技术栈选定为 TypeScript + Lit
- 部署方案确认使用 Docker Compose
写入策略
记忆系统的写入遵循明确的分层原则:
| 内容类型 | 写入目标 | 示例 |
|---|---|---|
| 决策与偏好 | 长期记忆 MEMORY.md | 用户偏好的编程语言、项目架构决策 |
| 日常笔记 | 日志记忆 YYYY-MM-DD.md | 今天讨论的问题、临时备忘 |
自动记忆刷新机制
当对话上下文即将达到模型的 token 限制时,OpenClaw 会在上下文压缩之前自动触发记忆刷新(memory flushing),将当前会话中的重要信息持久化到对应的记忆文件中,避免关键信息因压缩而丢失。
混合检索:Vector + BM25
OpenClaw 采用向量检索(Vector Search)与关键词检索(BM25)相结合的混合搜索策略,在语义理解和精确匹配之间取得平衡。
记忆工具
系统提供两个核心工具供 AI 使用:
memory_search:基于语义和关键词的混合检索,适合模糊查询memory_get:直接获取指定路径的记忆文件内容
// 记忆搜索配置示例
{
"memory": {
"search": {
"hybridWeight": 0.7, // 向量检索权重,0-1 之间
"maxResults": 10
}
}
}
嵌入模型配置
记忆系统的向量检索依赖嵌入模型(Embedding Provider),OpenClaw 支持多种提供商:
// ~/.openclaw/openclaw.json
{
"memory": {
"embedding": {
"provider": "openai", // 可选:openai / gemini / local
"model": "text-embedding-3-small"
}
}
}
本地嵌入模型
如果希望完全离线运行记忆系统,可以配置本地嵌入模型:
{
"memory": {
"embedding": {
"provider": "local",
"model": "all-MiniLM-L6-v2"
}
}
}
SQLite 加速
当记忆文件数量增多时,OpenClaw 使用 SQLite 作为索引加速层,显著提升检索性能:
{
"memory": {
"acceleration": {
"engine": "sqlite",
"dbPath": "~/.openclaw/memory/index.db"
}
}
}
SQLite 索引会在后台自动维护,无需手动干预。
嵌入缓存
为减少重复计算开销,记忆系统内置嵌入缓存机制。已经计算过的文本片段不会重复请求嵌入模型,有效降低 API 调用成本。
实验性功能:会话记忆
会话记忆(Session Memory)是当前处于实验阶段的功能,它允许在单次会话内维护一个更精细的短期记忆结构。启用方式:
{
"memory": {
"session": {
"enabled": true // 实验性,默认关闭
}
}
}
注意:会话记忆功能尚未稳定,生产环境建议谨慎使用。
故障排查
记忆检索结果不准确?
- 检查嵌入模型是否正确配置并可用
- 尝试调整
hybridWeight参数平衡语义与关键词检索
记忆文件未自动创建?
- 确认
~/.openclaw/memory/目录存在且有写入权限 - 使用
openclaw doctor --fix检查配置完整性
SQLite 索引异常?
- 删除
index.db文件后重启,系统会自动重建索引