让 OpenClaw 拥有持久记忆:记忆体系架构解析与优化实战

79 阅读14分钟

你是不是也遇到过这种情况:跟 OpenClaw 聊了一个小时,结果它突然"失忆"了——之前说好的架构方案忘了,你的技术偏好忘了,甚至连你是谁都不记得了?本文从 OpenClaw 的记忆体系架构讲起,手把手教你打造一个"过目不忘"的 AI 助手。


前言:AI 为什么会"失忆"?

用过 OpenClaw 的人大概都经历过这种场景:

  • 你告诉它"我用 React + TypeScript,别给我推荐 Vue",结果下次对话它又推荐 Vue 了
  • 一个复杂任务聊到一半,它突然忘了之前确认过的方案
  • 换了个项目回来,它完全不记得你的代码规范和偏好
  • 聊着聊着感觉它"变笨了"——其实是上下文被压缩,之前的关键信息被丢掉了

这不是 OpenClaw 的 bug(好吧,有一部分确实是 bug),而是 LLM 的本质限制

┌───────────────────────────────────────────────────────────┐
│                    LLM 的记忆真相                           │
│                                                           │
│  1. 模型本身没有"记忆"                                       │
│     └── 每次对话都是全新的推理过程                             │
│     └── 所谓的"记忆"其实是把历史信息塞进 prompt                │
│                                                           │
│  2. 上下文窗口有限                                           │
│     ├── Claude:200K tokens                               │
│     ├── GPT-4o:128K tokens                               │
│     └── 聊着聊着就超了 → 必须压缩或丢弃旧信息                  │
│                                                           │
│  3. 压缩 = 有损                                            │
│     ├── OpenClaw 的上下文压缩是"摘要式"的                     │
│     ├── 它会把 10 轮对话压缩成几句话                          │
│     └── 关键细节(架构图、表格、代码)很容易被丢掉               │
│                                                           │
│  结论:想让 AI 有持久记忆,必须在 LLM 外部建存储                │
└───────────────────────────────────────────────────────────┘

OpenClaw 的解决方案是建了一套 三层记忆体系。搞懂它的架构,你才知道怎么优化。


一、OpenClaw 记忆体系架构:三层金字塔

┌───────────────────────────────────────────────────────────────┐
│                                                               │
│              OpenClaw 三层记忆架构                              │
│                                                               │
│     ┌─────────────────────────────────────┐                   │
│     │         第一层:Markdown 文件          │  ← 最持久         │
│     │   SOUL.md / USER.md / MEMORY.md      │  ← 你手写的       │
│     │   AGENTS.md / TOOLS.md               │  ← 每次都加载      │
│     └─────────────┬───────────────────────┘                   │
│                   │                                           │
│     ┌─────────────▼───────────────────────┐                   │
│     │         第二层:向量记忆(Mem0)        │  ← 自动记忆        │
│     │   语义检索 / 自动提取 / 去重合并       │  ← 跨会话持久        │
│     │   memory_store / memory_search        │  ← 需安装插件     │
│     └─────────────┬───────────────────────┘                   │
│                   │                                           │
│     ┌─────────────▼───────────────────────┐                   │
│     │         第三层:对话历史重建            │  ← 最脆弱          │
│     │   当前会话的聊天记录                   │  ← 超长会被压缩     │
│     │   压缩后只保留摘要                     │  ← 容易丢信息       │
│     └─────────────────────────────────────┘                   │
│                                                               │
│   信息流动方向:                                                │
│   Session 启动 → 加载第一层文件 → 检索第二层记忆 → 重建第三层        │
│                                                               │
└───────────────────────────────────────────────────────────────┘

1.1 第一层:Markdown 文件(你的"宪法")

这是最可靠的一层。每次启动新会话,OpenClaw 都会自动加载这些文件到上下文中:

文件作用类比
SOUL.md定义 Agent 的人格、工作风格、核心原则它的"灵魂"
USER.md记录你的信息、偏好、目标它对你的了解
MEMORY.md持久化的决策记录和关键上下文它的"笔记本"
AGENTS.md工作流规则、自治权限、协作规范它的"工作手册"
TOOLS.md工具清单、基础设施映射它的"工具箱说明书"

关键限制

所有文件的总字符数上限:150,000 字符
单个文件上限:20,000 字符

超过这个限制会被截断 → 后面的内容就丢了
所以每个文件都要精简!不要写成文档大全!

1.2 第二层:向量记忆(Mem0)

这是 OpenClaw 的"自动记忆系统",需要安装 @mem0/openclaw-mem0 插件。

工作原理:

你说:"我用 React + TypeScript,不要 Vue"
        │
        ▼ 自动提取(Auto-Capture)
   ┌──────────────────────────────────┐
   │  Mem0 向量数据库                  │
   │                                  │
   │  记忆 #1:用户偏好 React + TS     │
   │  记忆 #2:用户不喜欢 Vue          │
   │  记忆 #3:用户使用 PostgreSQL 后端 │
   │  记忆 #4:用户在做 SaaS 项目      │
   │  ...                             │
   └──────────────────────────────────┘
        │
        ▼ 自动召回(Auto-Recall)
   下次你问:"帮我搭建前端项目"
   → Mem0 自动检索到 #1 #2
   → 注入到 prompt:"用户偏好 React+TS,不要推荐 Vue"
   → Agent 直接给你 React + TypeScript 方案

5 个工具命令

# Agent 可以在对话中使用这些工具
memory_store   # 主动保存一条记忆
memory_search  # 语义搜索记忆(模糊匹配)
memory_list    # 列出所有记忆
memory_get     # 通过 ID 获取特定记忆
memory_delete  # 删除某条记忆

1.3 第三层:对话历史

这层最脆弱也最容易出问题。OpenClaw 会在上下文快满时触发 上下文压缩(Compaction)

上下文压缩的问题:

正常对话 → 上下文越来越长 → 接近模型 token 上限
                │
                ▼ 触发压缩
        ┌──────────────────┐
        │  压缩算法          │
        │  把 50 轮对话     │
        │  压缩成 5 段摘要   │
        └──────────────────┘
                │
                ▼
        关键信息可能被丢掉!
        ├── 你确认过的架构方案 → 没了
        ├── 代码中的具体行号 → 没了
        ├── 讨论过的 edge case → 没了
        └── 表格/数据 → 变成一句话总结

这就是你感觉 Agent "突然变笨"的原因

二、手把手优化:5 个文件怎么写

搞懂了架构,下面说怎么写好这 5 个核心文件。

2.1 SOUL.md —— 精简到 1KB 以内

很多人的 SOUL.md 写了几千行,写成了"AI 使用说明书"。错误做法

这个文件每次 API 调用都会被加载,写多了 = 每次都浪费钱。

# SOUL.md

## 核心原则
- 直接给方案,不要问"你是否需要我帮你..."
- 如果我的想法有问题,直接指出,不要附和
- 代码给完整可运行的版本,不要 placeholder
- 中文交流,代码注释用英文

## 工作方式
- 复杂任务先列 todo,确认后再动手
- 遇到模糊需求主动追问,不要猜
- 引用外部资料需要标注来源
- 参考 OPTIMIZATION.md 了解详细工作流程(按需加载,不要内联)

## 模型选择
- 日常编码:Claude Sonnet
- 架构设计 / 复杂推理:Claude Opus
- 简单查询 / 格式化:Claude Haiku

核心原则:只写 Agent 在每一次交互中都需要知道的东西。

2.2 USER.md —— 只写高频需要的信息

# USER.md

- **名字**:张三
- **时区**:Asia/Shanghai (UTC+8)
- **当前目标**:开发一个全栈 SaaS 产品
- **技术栈**:React + TypeScript + Tailwind(前端),Node.js(后端),PostgreSQL(数据库)
- **角色**:全栈开发者,5 年经验

## 偏好
- 前端用 React,不要 Vue/Angular
- 状态管理用 Zustand,不要 Redux
- CSS 用 Tailwind,不要 styled-components
- ORM 用 Prisma,不要 TypeORM
- 中文交流,代码注释用英文

不要写的东西:公司历史、简历、日程表、联系方式。这些信息 Agent 用不上,只会浪费 token。

2.3 MEMORY.md —— 控制在 200 行以内

这是最容易膨胀的文件。很多人让 OpenClaw 自动往里写,结果一个月后变成 2000 行。

# MEMORY.md

## 活跃决策(最多 20 条,定期清理)

- [2026-04-10] TaskFlow v1.2 已上线,新增看板视图
- [2026-04-08] 决定用 Stripe 接入支付,放弃 PayPal
- [2026-04-05] 前端从 CRA 迁移到 Vite,构建速度提升 10 倍
- [2026-04-01] 数据库从 MySQL 迁移到 PostgreSQL
- [2026-03-28] 确定用 Railway 部署后端,放弃自建服务器

## 关键上下文(最多 10 条)

- 技术栈:React + Node.js + PostgreSQL + Redis
- 部署:前端 Vercel,后端 Railway,数据库 Neon
- API 风格:RESTful,后续考虑 GraphQL
- 代码规范:ESLint + Prettier,严格模式

## 归档
历史记忆已归档到 memory/2026-03.md,不要在此文件中保留过期决策

关键操作:每周花 5 分钟清理 MEMORY.md,把过期的决策移到 memory/YYYY-MM.md 归档文件。

2.4 AGENTS.md —— 自治规则

# AGENTS.md

## 文件操作
- 读取文件:自主执行,无需确认
- 创建新文件:需要说明原因
- 修改已有文件:先展示改动方案,确认后再改
- 删除文件:必须确认

## 任务执行
- 简单任务(< 3 步):直接做
- 复杂任务(> 3 步):先列 checklist,确认后执行
- 不确定的事情:问,不要猜

## Git 操作
- commit:我明确说"提交"时才做
- push:必须我确认
- 不要修改 git config

2.5 TOOLS.md —— 工具地图

# TOOLS.md

## 开发环境
- Node.js 20 + pnpm
- Xcode 16 + iOS 17 Simulator
- VS Code / Cursor

## 项目位置
- 前端:~/projects/taskflow-web
- 后端:~/projects/taskflow-api
- 文档:~/projects/taskflow-docs

## 部署
- 前端:Vercel(git push 自动部署)
- 后端:Railway(Docker 自动部署)
- 数据库:Neon PostgreSQL
- 缓存:Upstash Redis

三、安装 Mem0 向量记忆(强烈推荐)

如果你只做一件事来优化 OpenClaw 的记忆,那就是 安装 Mem0 插件

3.1 为什么一定要装

没有 Mem0 的 OpenClaw:
├── 记忆完全依赖上下文窗口
├── 长对话后信息必然丢失
├── 每次新对话都要从零开始解释你的偏好
└── Agent 需要你手动指示它"记住这个"

装了 Mem0 的 OpenClaw:
├── 自动提取对话中的关键信息
├── 自动存入向量数据库
├── 下次对话自动检索相关记忆
├── 旧记忆自动更新(不会有冲突的重复记忆)
└── 跨项目、跨设备持久化

3.2 安装步骤(30 秒)

# 一条命令安装
openclaw plugins install @mem0/openclaw-mem0

3.3 配置

方案 A:Mem0 云端版(推荐,最简单)

// ~/.openclaw/openclaw.json
{
  "plugins": {
    "openclaw-mem0": {
      "enabled": true,
      "config": {
        "apiKey": "${MEM0_API_KEY}",  // 从 app.mem0.ai 获取
        "userId": "zhangsan"           // 你自己取个唯一 ID
      }
    }
  }
}

app.mem0.ai 注册获取 API Key。免费额度足够个人使用。

方案 B:自托管版(开源免费,但需要 OpenAI Key)

// ~/.openclaw/openclaw.json
{
  "plugins": {
    "openclaw-mem0": {
      "enabled": true,
      "config": {
        "mode": "open-source",
        "userId": "zhangsan"
      }
    }
  }
}

自托管模式需要设置 OPENAI_API_KEY 环境变量(用于生成 embedding 向量)。

3.4 验证安装

# 启动 OpenClaw 后测试
> 记住:我的项目用 React + TypeScript + Tailwind

# Agent 会回复:"已记录你的技术栈偏好"

# 开一个新会话,测试是否记住了
> 帮我搭建前端项目

# 如果 Agent 直接用 React + TS + Tailwind,说明 Mem0 在工作

四、解决上下文压缩丢信息的问题

这是 OpenClaw 目前最头疼的问题之一。GitHub 上有多个相关 issue(#25633, #19488, #30115)。

4.1 问题表现

你正在跟 Agent 讨论一个复杂的数据库 schema 设计,
已经确认了 15 张表的结构……

突然 Agent 说:"让我回顾一下我们之前的讨论",
然后给你一个错误的表结构——因为原始讨论被压缩成了摘要,
细节全丢了。

4.2 三个解决方案

方案 1:调整上下文上限(治标)

// ~/.openclaw/openclaw.json
{
  "context": {
    "maxContextTokens": 100000  // 设为模型上限的 80%
    // Claude 200K → 设 160000
    // GPT-4o 128K → 设 100000
  }
}

给更多空间,压缩就不会那么频繁触发。

方案 2:关键信息用 [PINNED] 标签

在 MEMORY.md 或对话中,给关键信息加上标签:

## [PINNED] 数据库架构
- users 表:id, email, name, created_at
- subscriptions 表:id, user_id, plan, status, expires_at
- conversations 表:id, user_id, platform, title, folder_id

这些信息在压缩时会被保留,不会被摘要替代。

方案 3:大任务拆成小会话(治本)

不要这样做:
└── 一个会话里从头到尾做完整个项目
    └── 聊 200 轮 → 必然触发压缩 → 必然丢信息

应该这样做:
├── 会话 1:确定架构方案 → 结论写入 MEMORY.md
├── 会话 2:实现用户模块 → 完成后总结写入 MEMORY.md
├── 会话 3:实现支付模块 → 完成后总结写入 MEMORY.md
└── 每个会话控制在 30-50 轮以内

核心思路:
把"记忆"从上下文中转移到文件中,
文件是持久的,上下文是临时的。

五、自定义 Skill:教 Agent 新技能

Skill 是 OpenClaw 的"按需加载知识"——只有在需要时才加载,不会浪费 token。

5.1 Skill 的工作原理

Skills 的三层渐进加载:

第一层:Agent 看到 skill 列表
├── "persistent-memory: 持久化记忆管理"
├── "code-review: 代码审查"
└── "deploy-vercel: 部署到 Vercel"
   (每个 skill 只消耗几个 token)

第二层:Agent 判断需要使用某个 skill
└── 加载 SKILL.md 的完整指令
   (通常几百到几千 token)

第三层:Agent 执行 skill 的脚本
└── 运行 scripts/ 下的代码

这种设计比把所有知识塞进 SOUL.md 高效得多

5.2 创建自定义 Skill 示例

以创建一个"技术文章写作"Skill 为例:

# 创建 skill 目录
mkdir -p ~/.openclaw/skills/tech-writing
# ~/.openclaw/skills/tech-writing/SKILL.md

---
name: tech_writing
description: 撰写技术博客文章(掘金/知乎风格),包含结构化排版和实用代码示例
---

## 何时使用
当用户要求写技术文章、博客、教程时使用此 skill。

## 文章结构模板
1. 标题:用"动词 + 结果"格式(如"让 X 拥有 Y")
2. 开头:1-2 段痛点描述(用"你是不是也遇到过..."引入)
3. 正文:
   - 先讲原理(为什么),再讲操作(怎么做)
   - 每个章节有清晰的标题层级
   - 关键信息用代码块或表格呈现
   - 复杂流程用 ASCII 图示意
4. 代码示例:给可运行的完整代码,不要 placeholder
5. 结尾:总结 + 行动建议

## 排版规范
- 使用 Markdown 格式
- 代码块标注语言类型
- 中英文之间加空格
- 章节之间用 `---` 分隔
- 表格用于对比信息

## 篇幅
- 目标 2000-4000 字
- 不要水字数,每一段都要有信息量

5.3 推荐安装的社区 Skill

# 持久化记忆管理(增强版)
openclaw skills install persistent-memory

# 代码审查
openclaw skills install code-review

# Git 工作流
openclaw skills install git-workflow

# 文档生成
openclaw skills install doc-generator

六、日常维护:让记忆持续高效

记忆系统不是配置一次就完事的,需要定期维护。

6.1 每日(2 分钟)

□ 结束工作前,让 Agent 总结今天的关键决策
  → "总结今天的工作,把关键决策写入 MEMORY.md"
□ 检查 MEMORY.md 是否有冗余内容

6.2 每周(10 分钟)

□ 审查 MEMORY.md
  ├── 删除已过期的决策
  ├── 合并重复内容
  └── 将历史条目归档到 memory/YYYY-MM.md
□ 审查 SOUL.md 和 USER.md
  ├── 删除从未触发过的规则
  └── 更新变化了的偏好
□ 检查 Mem0 记忆
  ├── > memory_list
  ├── 删除过时的记忆
  └── 修正错误的记忆

6.3 每月(30 分钟)

□ 全面审计所有 workspace 文件的总字符数
  └── 目标:总和 < 100,000 字符(留 50K 给对话)
□ 评估 Skill 使用情况
  ├── 删除一个月没用过的 Skill
  └── 对高频任务创建新 Skill
□ 复盘 Agent 的表现
  ├── 哪些场景它表现好?为什么?
  ├── 哪些场景它犯错?是记忆问题还是规则问题?
  └── 据此调整 SOUL.md / AGENTS.md

七、记忆优化 Checklist

直接照着做:

基础配置(必做):
□ SOUL.md 控制在 1KB 以内
□ USER.md 只写高频信息
□ MEMORY.md 控制在 200 行以内,定期归档
□ AGENTS.md 明确自治边界
□ TOOLS.md 列出工具和项目位置
□ 所有文件总字符 < 100,000

记忆增强(强烈推荐):
□ 安装 Mem0 插件
□ 配置 API Key 或自托管模式
□ 验证自动记忆和自动召回工作正常

防丢失(推荐):
□ maxContextTokens 设为模型上限的 80%
□ 关键信息用 [PINNED] 标签
□ 复杂任务拆成多个短会话
□ 每个会话结束让 Agent 总结到 MEMORY.md

进阶(可选):
□ 创建项目级自定义 Skill
□ 安装社区 Skill(persistent-memory / code-review)
□ 建立每周记忆审查习惯

八、总结:记忆优化的核心思路

┌───────────────────────────────────────────────────────────────┐
│                                                               │
│  记忆优化的本质:                                              │
│  把信息从"临时的上下文"转移到"持久的外部存储"                   │
│                                                               │
│  ┌────────────┐       ┌────────────────────┐                  │
│  │ 上下文窗口  │       │  外部存储            │                  │
│  │(临时的)   │  →→→  │(持久的)            │                  │
│  │            │       │                    │                  │
│  │ - 会被压缩  │       │ - Markdown 文件     │                  │
│  │ - 会丢细节  │       │ - Mem0 向量数据库   │                  │
│  │ - 有上限   │       │ - memory/ 归档目录  │                  │
│  │ - 一关就没  │       │ - 自定义 Skill      │                  │
│  └────────────┘       └────────────────────┘                  │
│                                                               │
│  三条黄金法则:                                                │
│  1. 核心文件要精简 → 每个字都是 token,每个 token 都是钱       │
│  2. 用 Mem0 自动化记忆 → 不靠人脑记,不靠 Agent 主动存        │
│  3. 定期维护是关键 → 记忆系统不维护 = 垃圾越堆越多 = 越来越慢 │
│                                                               │
└───────────────────────────────────────────────────────────────┘

按照这篇文章的方法配置完,你的 OpenClaw 应该能做到:

  • 跨会话记住你的偏好(技术栈、代码风格、工作习惯)
  • 不再在长对话中"失忆"(关键信息被固化到文件)
  • 新项目也能利用旧项目的上下文(Mem0 跨项目检索)
  • Token 消耗更低(精简的核心文件 + 按需加载的 Skill)

相关资源


如果这篇文章对你有帮助,点个赞让更多人看到。有问题欢迎评论区交流,下一篇我们聊聊怎么用 OpenClaw + MCP 打造个人自动化工作流。