基于 OpenClaw 搭建分层记忆系统,自动从历史和错误中学习
问题:AI Agent 没有原生记忆
用过 AI Agent 的人都知道一个痛点:每次开一个新会话,Agent 就什么都不记得了。昨天讨论的项目、上周踩过的坑、你告诉过它的偏好——全部归零。
这不是 bug,是 LLM 的基本特性。模型本身是无状态的,每次调用都是独立的。
OpenClaw 的思路很直接:让 Agent 读写文件来延续记忆。每次会话开始时读取记忆文件,交互过程中更新,下次会话就能「记得」上次做了什么。
听起来简单,但实际做起来很快就会遇到问题。
第一版:OpenClaw 默认记忆策略的局限
OpenClaw 默认提供了一套记忆文件体系:SOUL.md(行为规则)、AGENTS.md(工作流程)、TOOLS.md(工具备忘)、USER.md(用户偏好)、MEMORY.md(长期记忆)。
但实际使用中发现,Agent 几乎把所有东西都写进了 MEMORY.md——项目状态、经验教训、配置变更、用户偏好……其他文件基本没动。用了两周,出了三个问题:
- MEMORY.md 膨胀——什么都往里塞,3.5KB 的文件很快变得臃肿,Agent 每次会话都要读一遍,浪费 token
- 其他文件闲置——SOUL.md、AGENTS.md、TOOLS.md、USER.md 本来各有所属,但 Agent 不会主动往里写,多文件分工形同虚设
- 无法改进——Agent 犯过的错还会反复犯,因为没有「从错误中学习」的机制
核心问题:默认策略缺少两个东西——一是没有约束 Agent 把信息写到正确的文件,二是没有从经验中学习和晋升的机制。
第二版:分层记忆 + 自动晋升
最终设计了一套两层记忆系统:
情形记忆(Episodic Memory)——记「发生了什么」
memory/
├── 2026-04-10.md # 每日事实记录
├── 2026-04-11.md
└── ...
- 每天一个文件,记录当天实际发生了什么
- 只记事实,不记反思
- 心跳轮询时自动写入
反思记忆(Reflective Memory)——记「学到了什么」
.learnings/
├── LEARNINGS.md # 被纠正的错误、更好的做法
├── ERRORS.md # 命令失败、API 报错
└── FEATURE_REQUESTS.md # 用户期望但尚不存在的功能
- 每条记录有结构化格式(时间、优先级、状态、详情)
- 状态从
pending开始,审查后可晋升为promoted - 反映的是「经验教训」而非「做了什么」
晋升通道
两层记忆各有独立的晋升路径:
情形记忆晋升:每日笔记 → 长期记忆文件
| 内容类型 | 晋升到 | 示例 |
|---|---|---|
| 项目里程碑(完成/上线/归档) | MEMORY.md | 「daily-ai-agent 项目核心代码完成」 |
| 配置变更或架构调整 | MEMORY.md | 「每日AI简报从单阶段拆分为生成+审查两阶段」 |
| 用户偏好和习惯 | USER.md | 「偏好 OpenAI API 兼容格式,不用 LiteLLM」 |
晋升方式是复制+提炼,不删除原始每日笔记(保持时序完整性)。每天凌晨定时任务自动审查,用 .review-state.json 追踪进度,每次只处理新笔记。
反思记忆晋升:经验教训 → 行为规则
| 经验类型 | 晋升到 | 示例 |
|---|---|---|
| 行为模式改进 | SOUL.md | 「说到等于做到,没做就不要说」 |
| 工作流程优化 | AGENTS.md | 「写笔记前必须先读 SKILL.md」 |
| 工具使用坑点 | TOOLS.md | 「himalaya 走 proxychains 不稳定,优先用 gog」 |
| 用户偏好 | USER.md | 「偏好 OpenAI API 兼容格式,不用 LiteLLM」 |
反思记忆不是所有经验都晋升——一次性偶发问题保留观察,反复出现的模式(≥2 次)或被用户明确纠正的才晋升为行为规则。
这样 Agent 不仅「记得」发生了什么,还会从经验中提炼出规则,让自己变得越来越聪明。
完整的文件职责划分
| 文件 | 存什么 | 不存什么 |
|---|---|---|
SOUL.md | 行为规则 | 身份信息、工具细节 |
AGENTS.md | 工作流程 | 具体项目信息 |
TOOLS.md | 环境专属信息 | 通用规范 |
USER.md | 用户偏好和习惯 | 项目信息 |
MEMORY.md | 长期事实(项目状态、配置、产出目录) | 经验教训、每日流水 |
memory/ | 每日事实记录 | 反思和经验 |
.learnings/ | 待晋升的经验教训 | 已晋升的(标记 promoted) |
技术实现
基于 OpenClaw Agent 平台搭建,依赖 self-improving-agent 技能提供反思记忆的结构化格式和审查逻辑。
第一步:安装技能并初始化
# 安装反思记忆技能
openclaw skills install self-improving-agent
安装后必须手动初始化——技能本身不会自动创建目录和文件:
# 创建反思记忆目录
mkdir ~/.openclaw/workspace/.learnings
# 创建三个日志文件(技能定义了它们的结构化格式,见第四步)
touch ~/.openclaw/workspace/.learnings/LEARNINGS.md
touch ~/.openclaw/workspace/.learnings/ERRORS.md
touch ~/.openclaw/workspace/.learnings/FEATURE_REQUESTS.md
在 LEARNINGS.md 中添加标题头:
# LEARNINGS.md - 反思记忆
记录值得反思的经验教训。每日定时任务审查并晋升到核心配置文件。
⚠️ 技能安装不等于启用。安装后如果不创建目录和文件,反思记忆系统根本不会工作。
第二步:在 AGENTS.md 中定义记忆规范
确保 Agent 每次会话都能读到记忆规范,在 AGENTS.md 中添加以下内容:
## 记忆
### 情形记忆 (Episodic Memory)
- **每日笔记**:memory/YYYY-MM-DD.md
- **长期记忆**:MEMORY.md —— 项目概览、硬件配置等长期事实
- **目的**:保证连续性,不遗忘每天发生的事情
- **规则**:只记事实(发生了什么),不记反思(学到了什么)
### 反思记忆 (Reflective Memory)
- **目录**:.learnings/
- **LEARNINGS.md** — 被纠正的错误、更好的做法、知识盲区、最佳实践
- **ERRORS.md** — 命令失败、API 报错、异常行为
- **FEATURE_REQUESTS.md** — 用户期望但尚不存在的功能
- **目的**:积累经验,通过晋升机制让自己越来越聪明
- **晋升**:每天夜里 3:00 定时任务审查,符合条件的晋升到核心配置文件
### 晋升机制
1. **记录**:交互中遇到值得反思的情况 → 写入 .learnings/
2. **审查**:每天 3:00 定时任务审查 .learnings/ 中的 pending 条目
3. **晋升**:符合条件的经验提炼为简短规则,写入目标配置文件
4. **标记**:原条目 status 改为 promoted
| 经验类型 | 晋升到 |
|----------|--------|
| 行为模式改进 | SOUL.md |
| 工作流程优化 | AGENTS.md |
| 工具使用坑点 | TOOLS.md |
| 用户偏好 | USER.md |
第三步:在 HEARTBEAT.md 中触发记忆写入
心跳轮询是记忆写入的主要时机,在 HEARTBEAT.md 的检查步骤中添加:
1. **记录每日记忆**:更新 memory/YYYY-MM-DD.md,记录当天做了什么(情形记忆)
2. **记录反思经验**:如果本次交互中遇到了值得反思的情况(被纠正、发现更好的做法、踩了坑),记录到 .learnings/ 对应文件中(反思记忆)
这样每次心跳轮询时,Agent 会自动把当天的情形和反思分别写入对应文件。
第四步:反思记忆的结构化格式(技能自带)
self-improving-agent 技能为三种日志文件定义了完整的结构化格式,Agent 会在交互过程中自动按此格式写入,无需额外配置。以下格式供了解:
LEARNINGS.md 格式(被纠正的错误、更好的做法):
## [LRN-20260404-001] correction
**Logged**: 2026-04-04T12:07:00+08:00
**Priority**: high # high / medium / low
**Status**: pending # pending → promoted
**Area**: config # 分类标签
### Summary
说了要做的事但没有对应行动
### Details
在讨论笔记站回顾机制时,说了倾向方案 2 但没有实际创建。
### Suggested Action
说到 = 做到。如果还没做,就不要说。
ERRORS.md 格式(命令失败、API 报错):
## [ERR-20260410-001] command_name
**Logged**: ISO-8601 timestamp
**Priority**: high
**Status**: pending
**Area**: config
### Summary
Brief description of what failed
### Error
`Actual error message`
### Context
- Command/operation attempted
- Environment details if relevant
### Suggested Fix
What might resolve this
FEATURE_REQUESTS.md 格式(用户期望但尚不存在的功能):
## [FEAT-20260410-001] capability_name
**Logged**: ISO-8601 timestamp
**Priority**: medium
**Status**: pending
**Area**: config
### Requested Capability
What the user wanted to do
### User Context
Why they needed it
### Complexity Estimate
simple | medium | complex
### Suggested Implementation
How this could be built
关键字段说明:
Priority:critical(阻塞核心功能)> high(用户纠正/反复出现)> medium(有影响但有变通)> low(偶发小问题)Status:pending 等待处理 → promoted 已晋升到核心配置文件 → resolved 已解决Area:config / style / thinking / note-taking 等分类标签
第五步:创建定时审查任务
每天凌晨 3:00 运行,做两件事:情形记忆晋升和反思记忆晋升。
cron 配置:
name: 每日记忆审查与晋升
schedule: "0 3 * * *"
timezone: Asia/Shanghai
sessionTarget: isolated # 独立会话,不污染主会话
timeout: 300s
payload:
kind: agentTurn
message: |
执行每日记忆审查任务,包含两部分:
## 第一部分:情形记忆晋升(memory/ → MEMORY.md / USER.md)
1. 读取审查进度文件 ~/.openclaw/workspace/memory/.review-state.json,
格式:{"lastReviewed": "YYYY-MM-DD"}。不存在则视为从未审查
2. 读取 ~/.openclaw/workspace/memory/ 下所有日期 > lastReviewed 的每日记忆文件
3. 读取 ~/.openclaw/workspace/MEMORY.md 和 ~/.openclaw/workspace/USER.md
4. 识别每日笔记中值得长期保留的内容,按类型晋升到对应文件:
- 项目里程碑(完成/上线/归档)→ MEMORY.md
- 重要的配置变更或架构调整 → MEMORY.md
- 新的协作产出目录或工作流程 → MEMORY.md
- 用户偏好、习惯、表达喜好 → USER.md
- 任何未来会话需要知道的事实 → MEMORY.md
5. 晋升是复制+提炼,不要删除原始每日笔记中的内容(保持时序完整性)
6. 更新 .review-state.json 的 lastReviewed 为今天日期
## 第二部分:反思记忆晋升(.learnings/ → 核心配置文件)
1. 读取 .learnings/LEARNINGS.md、.learnings/ERRORS.md、.learnings/FEATURE_REQUESTS.md
2. 找出所有 status 为 pending 的条目
3. 评估每条是否值得晋升:
- 出现过 2 次以上的经验 → 高优先晋升
- 被用户明确纠正的经验 → 中优先晋升
- 一次性偶发问题 → 保留观察
4. 将值得晋升的经验提炼为简短规则,写入目标配置文件:
- 行为模式改进 → SOUL.md
- 工作流程优化 → AGENTS.md
- 工具使用坑点 → TOOLS.md
- 用户偏好 → USER.md
5. 更新原条目的 status 为 promoted,并记录晋升目标
## 输出
- 两部分都无更新 → 安静结束
- 有重要发现 → 简要总结(晋升了什么、为什么)
delivery:
mode: announce # 有重要发现时通知用户
channel: feishu
to: <你的飞书用户ID> # 替换为你的飞书 open_id
关键配置说明:
| 配置 | 值 | 原因 |
|---|---|---|
| sessionTarget | isolated | 审查是独立任务,不应污染主会话上下文 |
| schedule | 0 3 * * * | 凌晨运行,避开活跃时段 |
| delivery.mode | announce | 有重要晋升时通知用户,无事则安静 |
审查任务的两个关键机制:
- 进度追踪:用
.review-state.json记录上次审查到的日期,每次只处理新的每日笔记,避免重复读取浪费 token - 晋升门槛:不是所有经验都晋升。一次性偶发问题保留观察,反复出现的模式(≥2 次)或被用户明确纠正的才晋升
踩坑总结
坑 1:技能安装不等于启用
安装了 self-improving-agent 技能,以为反思记忆就自动工作了。结果 .learnings/ 目录从未创建过——技能安装只下载了 SKILL.md,不会自动创建目录和文件。
教训:任何组件安装后都必须验证初始化状态,不能假设安装即启用。
坑 2:一个文件什么都往里塞
最初 MEMORY.md 里混着身份信息、经验教训、工作流程、项目状态,找信息像翻垃圾堆。拆分到对应文件后,从 ~3.5KB 降到 ~2KB,每次会话读取更快,信息定位也更准。
坑 3:情形和反思混在一起
每日笔记里既记「做了什么」又记「学到了什么」,两边都做不好。拆开后各有清晰的职责和晋升路径。
坑 4:每次审查都重读 7 天笔记
最初设计每次审查读过去 7 天的每日笔记,同一条记忆被反复处理 7 次。用 .review-state.json 记录审查进度后,每次只读新的。
坑 5:晋升时删除了原始笔记
最初设计晋升后删除每日笔记中的「冗余」内容。但这样丢失了时序性——「4月3日做了什么」是情形记忆的核心价值,不该被清理。改为只复制+提炼,原始笔记保持不动。
最终效果
- Agent 能记住昨天做了什么、上周的项目进展
- 被纠正过的错误不会再犯(经验晋升为行为规则)
- 记忆不会无限膨胀(分层管理 + 审查进度追踪)
- 全自动:每天凌晨自动审查和晋升,无需人工干预