跳转到内容

第6章 记忆系统

一句话:OpenClaw 的记忆存储就是纯 Markdown 文件——没有外部数据库,搜索基于本地向量索引,简单但够用。


OpenClaw 的记忆系统有一个极简的设计哲学:所有记忆都是 Markdown 文件

没有 SQLite,没有 ChromaDB,没有 Pinecone——存储层就是 workspace 目录下的 .md 文件。你可以用任何文本编辑器打开它们,直接阅读、修改甚至删除。搜索基于向量索引,OpenClaw 会自动选择 embedding 提供商:优先使用远程 API(OpenAI、Gemini 等,需要 API Key),也可以配置 memorySearch.provider = "local" 使用本地模型(基于 node-llama-cpp)或使用 Ollama。

这意味着:

  • 记忆完全透明——你随时能看到 Agent 记住了什么
  • 记忆完全可控——你可以直接编辑记忆文件
  • 备份和迁移——复制文件夹即可

由 Agent 主动策展(curate)的核心信息。不同于流水账,MEMORY.md 保存的是经过筛选和整理的重要信息:

~/.openclaw/workspace/MEMORY.md
# Long-term Memory
## 用户偏好
- 编程语言偏好:TypeScript > Python > Go
- 编辑器:VS Code + Vim 键位
- 讨厌写注释,但接受 JSDoc
## 项目信息
- 主项目:电商后台管理系统(Next.js 14 + FastAPI)
- 数据库:PostgreSQL(2024-12 从 MySQL 迁移)
- 部署:AWS ECS + CloudFront
## 重要约定
- 代码风格:严格遵循 ESLint + Prettier
- Git 提交信息用英文
- PR 描述用中文

Agent 在每天的对话中自动追加重要信息到当天的日志文件:

~/.openclaw/workspace/memory/2024-12-15.md
# 2024-12-15
## 14:23 - 数据库迁移
用户提到数据库从 MySQL 迁移到 PostgreSQL,需要更新所有 SQL 查询。
## 16:45 - 部署问题
用户的 Docker 镜像在 ARM64 上构建失败,改用 multi-platform build 解决。
## 18:00 - 明日计划
用户明天需要完成 API v2 的文档编写。

每日日记是 append-only(只追加不修改)的。

MEMORY.mdmemory/YYYY-MM-DD.md
写入方式Agent 策展,可增删改只追加
内容特点精华、去重、结构化流水账、按时间排列
生命周期长期保留按天滚动
类比个人档案工作日志

Agent 内置两个记忆相关工具:

工具作用使用场景
memory_search语义搜索所有记忆文件”我之前提过数据库迁移的事?“
memory_get精确读取指定记忆文件读取某天日志或 MEMORY.md

用户无需手动调用——Agent 在需要时自动使用。比如你问”上次讨论的那个 bug 修了吗?“,Agent 会自动调用 memory_search 查找相关记忆。


记忆搜索支持多种策略,可以组合使用获得最佳效果。

基于语义相似度的搜索,能找到意思相近但措辞不同的内容。例如搜”数据库迁移”能找到”我们把 MySQL 换成了 PostgreSQL”。

结合向量(语义)+ BM25(关键词)匹配,兼顾理解力和精确度:

{
agents: {
defaults: {
memorySearch: {
provider: "local", // local | openai | gemini | ollama
query: {
hybrid: {
enabled: true,
vectorWeight: 0.7, // 语义权重
textWeight: 0.3, // 关键词权重
},
},
},
},
},
}

为什么用混合搜索?

  • 向量搜索:“Mac上跑Gateway” 能匹配到 “macOS部署”
  • 关键词搜索:ERR_MODULE_NOT_FOUND 精确匹配错误信息
  • 组合使用:两全其美

较新的记忆权重更高,模拟人类记忆的自然衰减:

{
agents: {
defaults: {
memorySearch: {
query: {
hybrid: {
temporalDecay: {
enabled: true,
halfLifeDays: 30, // 30 天半衰期
},
},
},
},
},
},
}
时间权重
今天100%
7 天前~84%
30 天前50%
180 天前~1.6%

注意:MEMORY.md 和非日期文件不受时间衰减影响(常青文件)。

排错提示:如果 Agent 好像”忘记”了某些事情,检查 memory/ 目录下对应日期的文件。如果信息在文件中但 Agent 没找到,可能是语义搜索没命中,尝试用更明确的关键词重新提问。


6.5 自动压缩刷新(Compaction Flush)

Section titled “6.5 自动压缩刷新(Compaction Flush)”

当会话的 token 消耗接近模型上限时,Agent 会自动执行 compaction flush:

  1. 将当前会话中的重要信息写入每日日志
  2. 如果有值得长期保留的信息,更新 MEMORY.md
  3. 清理较旧的上下文,释放 token 空间
  4. 整个过程对用户透明

关键点:写入记忆后释放上下文——这保证了即使在超长对话中,Agent 也不会”忘记”重要信息,因为它们已经被持久化到文件。

用户也可以手动触发:

/compact ← 在聊天中发送

对于有更高搜索质量需求的用户,OpenClaw 支持 QMD(Queryable Markdown)后端,提供更精确的语义搜索能力。这是可选的高级配置,默认的文件搜索对大多数用户已经足够。


Terminal window
# 查看 MEMORY.md 内容
cat ~/.openclaw/workspace/MEMORY.md
# 查看最近的每日日记
ls -la ~/.openclaw/workspace/memory/ | tail -10

你可以直接编辑记忆文件来纠正 Agent 的认知:

Terminal window
# 修正长期记忆中的错误信息
vim ~/.openclaw/workspace/MEMORY.md

修改后在下次会话中发送 /new 开始新会话,Agent 就会使用更新后的记忆。

长时间运行后,memory/ 目录会积累大量日记文件。可以定期清理较旧的:

Terminal window
# 删除 30 天前的日记(谨慎操作)
find ~/.openclaw/workspace/memory/ -name "*.md" -mtime +30 -delete
Terminal window
# 备份整个 workspace(包括记忆)
cp -r ~/.openclaw/workspace/ ~/backup/openclaw-workspace-$(date +%Y%m%d)/

概念说明
设计哲学纯 Markdown 文件,透明可控
MEMORY.md长期记忆,Agent 策展维护
memory/ 目录每日日记,只追加不修改
memory_search语义搜索工具,自动调用
memory_get精确读取工具
Compaction Flush自动压缩:写入记忆 → 释放上下文
维护可直接编辑文件,备份即复制目录

下一章进入渠道接入——如何把 Agent 连接到各个聊天平台。