基于 OpenClaw 搭建分层记忆系统,自动从历史和错误中学习

3 阅读10分钟

基于 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——项目状态、经验教训、配置变更、用户偏好……其他文件基本没动。用了两周,出了三个问题:

  1. MEMORY.md 膨胀——什么都往里塞,3.5KB 的文件很快变得臃肿,Agent 每次会话都要读一遍,浪费 token
  2. 其他文件闲置——SOUL.md、AGENTS.md、TOOLS.md、USER.md 本来各有所属,但 Agent 不会主动往里写,多文件分工形同虚设
  3. 无法改进——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

关键配置说明:

配置原因
sessionTargetisolated审查是独立任务,不应污染主会话上下文
schedule0 3 * * *凌晨运行,避开活跃时段
delivery.modeannounce有重要晋升时通知用户,无事则安静

审查任务的两个关键机制:

  1. 进度追踪:用 .review-state.json 记录上次审查到的日期,每次只处理新的每日笔记,避免重复读取浪费 token
  2. 晋升门槛:不是所有经验都晋升。一次性偶发问题保留观察,反复出现的模式(≥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 能记住昨天做了什么、上周的项目进展
  • 被纠正过的错误不会再犯(经验晋升为行为规则)
  • 记忆不会无限膨胀(分层管理 + 审查进度追踪)
  • 全自动:每天凌晨自动审查和晋升,无需人工干预