| name | Self-Improving Agent (With Self-Reflection) |
| slug | self-improving |
| version | 1.2.0-local |
| description | 三 agent 协作的自我迭代记忆系统。实时捕获纠错/反思 → 每日自动提炼 → 回写 shared 层 → 向量索引统一检索。 |
适用场景
- 被 Daniel 纠错时
- 完成重要多步骤任务后
- 发现自己输出有改进空间时
- 收到外部有价值的信号(X/公众号/文档)时
实际部署架构
memory/self-improving/
├── lolita/
│ ├── hot.md ← HOT 层:碎片写入(允许噪声)
│ ├── corrections.md ← 纠错日志(结构化,用于晋升计数)
│ └── signals.md ← 外部信号(X/公众号/文档链接)
├── lisa/
│ └── (同上)
├── doubao/
│ └── (同上)
└── promote/
├── state.json ← 提炼状态(上次运行时间、连续空跑次数)
├── promote.log ← 每次提炼的审计日志
└── staging.patch ← 本次提炼草稿(人工确认前)
不使用软链。各 agent 直接用绝对路径写入自己的子目录:
- Lolita:
/root/.openclaw/workspace/memory/self-improving/lolita/
- Lisa:
/root/.openclaw/workspace/memory/self-improving/lisa/
- Doubao:
/root/.openclaw/workspace/memory/self-improving/doubao/
⚠️ 禁止在 ~/self-improving 或各自 workspace 下创建副本目录,所有写入必须指向上述权威路径。
写入格式
hot.md(热碎片,允许噪声)
- ts: YYYY-MM-DD HH:MM
topic: <主题关键词>
type: observation | rule | idea
text: <内容>
source: <来源,如 msg-453 / 无>
corrections.md(纠错,结构化)
- ts: YYYY-MM-DD HH:MM
domain: <领域,如 tooling/wechat>
mistake: <错误描述>
fix: <正确做法>
prevention: <预防措施>
severity: low | medium | high
evidence: <证据,如 msg-id / 无>
signals.md(外部信号)
- ts: YYYY-MM-DD HH:MM
channel: x | mp | github | clawhub | docs
claim: <核心观点>
link: <URL>
reproducible: yes | no | unknown
notes: <备注>
触发规则
⚠️ 核心原则:立即写入,不允许推迟。 触发条件满足时,在当前回复结束前必须完成写入,不能"等下次"。
写 corrections.md(被纠错时)— 强制,立即执行:
- Daniel 说"不对"、"你搞错了"、"之前说过"、"别再这样做"
- 自己发现输出有明显错误并已修正
- 格式:ts / domain / mistake / fix / prevention / severity / evidence
写 hot.md — 强制,立即执行,满足任一即触发:
| 触发场景 | 示例 |
|---|
| 学到新的路径、工具、配置规则 | "关键项目放 main workspace" |
| Daniel 明确表达偏好或习惯 | "代码块包裹命令" |
| 完成多步骤任务,发现有效方法 | "先 clone 再测试读写流程" |
| 发现之前的假设是错的 | "lolita=main,不是 doubao" |
| 任何"下次遇到同类问题会有用"的信息 | 新 API、新工具用法 |
| 任务完成后主动反思(复杂任务、跨 agent 协作、首次使用新工具) | "这次信号采集用了 3 轮搜索才凑够,下次可以先定关键词再并行" |
| Near-miss:差点犯错但自己纠正了 | "差点用 web_fetch 抓公众号,想起来要用 weixin-search skill" |
| 纠错时的规则泛化:不只记具体事件,提炼成通用原则 | 具体:"出发提醒不能估算" → 泛化:"涉及物理世界数据的场景,优先调 API" |
| Daniel 说 "update hot.md" / "update self-improving" | 立即回顾当前对话,提取可记录的 observation 写入 |
写入标准:宁可多写噪声,不要漏掉有价值的内容。 hot.md 允许噪声,promote 机制会过滤。
写 signals.md(外部信号):
- 搜索到有价值的案例/工具
- 公众号/X 上的可复现实践
不写(忽略):
- 一次性指令("现在做 X",下次不会再用)
- 纯上下文特定("在这个文件的第 3 行…")
- 假设性问题
自动提炼机制(Job A + Job B)
Job B:增量索引(每 30 分钟,零 LLM)
- 脚本:
/opt/scripts/index-memory.sh
- 日志:
/opt/scripts/index-memory.log
- 扫描
memory/ 下所有 .md 变更,自动推送到向量索引服务(127.0.0.1:8766)
- Namespace 映射:
memory/self-improving/lolita/* → self_hot_lolita
memory/self-improving/lisa/* → self_hot_lisa
memory/self-improving/doubao/* → self_hot_doubao
memory/shared/* → shared
memory/lolita/* → private_lolita
memory/YYYY-MM-DD.md → daily
Job A:每日提炼(每天 03:00,Lisa 执行)
- 脚本:
/opt/scripts/run-promote.sh
- 日志:
/opt/scripts/promote-cron.log + memory/self-improving/promote/promote.log
- 流程:
- 生成过去 24h 增量材料包(
/tmp/promote-materials-YYYY-MM-DD.md)
- 触发 Lisa session:
openclaw agent --agent lisa --message "[SYSTEM][PROMOTE] ..."
- Lisa 按晋升规则提炼,Top 5 以内
- 输出到
promote/staging.patch
- 写入
memory/shared/errors.md 或 memory/shared/preferences.md
- 更新
promote/state.json
- 熔断:连续 7 天无晋升 → 暂停并通知 Daniel
晋升规则
晋升到 memory/shared/(满足任一):
- 同一
mistake→fix 在 corrections.md 中出现 ≥3 次
severity: high
- Daniel 明确确认(强制晋升)
晋升后写入格式(shared/errors.md):
## [domain] 标题
- Symptom: 现象
- Root cause: 根因
- Fix: 修复方式
- Prevention: 预防措施
- Evidence: 证据链接
- Last verified: YYYY-MM-DD
每次 Session 启动时
在 AGENTS.md 启动检查清单中已加入:
- 读
memory/self-improving/<自己的名字>/hot.md — 加载热记忆
向量检索权重
| Namespace | 权重 | 说明 |
|---|
shared (preferences/errors) | 1.0 / 0.95 | 经提炼的权威层 |
self_hot_* | 0.85 + recency | 热记忆,7天内线性加权 |
corrections.md | 0.6 | 原始纠错,未提炼 |
hot.md 碎片 | 0.4 | 允许噪声 |
daily | 0.3 | 流水日志 |
可观测性
- 查看索引日志:
tail -f /opt/scripts/index-memory.log
- 查看提炼日志:
tail -f /opt/scripts/promote-cron.log
- 查看向量库状态:
curl -s http://127.0.0.1:8766/status -H "Authorization: Bearer ms-549eef5c016d31741ce215767e9d20e7"
- 查看提炼草稿:
cat memory/self-improving/promote/staging.patch