一套为 AI Agent 设计的自进化记忆系统,让智能体在持续对话中自主学习、积累经验、避免重蹈覆辙。
现有的 AI Agent 记忆方案(如 ClawHub 上的 self-improving-agent)存在几个核心问题:
| 问题 | 现有方案 | 我们的方案 |
|---|---|---|
| 晋升规则死板 | "7天内使用3次才升级"——低频但致命的原则会被遗漏 | 按知识性质分层,重要原则永不降级 |
| 分类全自动不可控 | Agent 自动升降级,用户无法介入 | Agent 自主分类 + 用户批量审阅 |
| 反思成本高 | 回放整段 session 历史,token 翻倍 | 实时捕获信号,定时只读笔记综合,成本降两个数量级 |
| 只学错误不学成功 | 只捕获纠正和失败 | 同时捕获成功模式和用户满意信号 |
| 知道做什么不知道为什么 | 条目只记 WHAT | 每条带 WHY(原因)+ GENERALIZE(泛化规律),支持举一反三 |
| 无法衡量效果 | 没有统计,不知道记忆有没有用 | 内置引用追踪和进化趋势度量 |
graph TB
subgraph 对话层["🗣️ 对话过程"]
User[用户消息] --> AgentWork[Agent 正常工作]
AgentWork --> Response[回复用户]
end
subgraph 捕获层["📡 信号捕获(双层机制)"]
User -->|每条消息| HookLayer["🔧 Hook 自动层<br/>关键词检测<br/>命令失败检测"]
AgentWork -->|语义理解| AgentLayer["🧠 Agent 自觉层<br/>理解具体纠正内容<br/>识别偏好和成功模式"]
HookLayer -->|粗信号| Pending["📋 pending.jsonl<br/>信号临时队列"]
AgentLayer -->|细信号| Pending
end
subgraph 记忆层["💾 两层记忆架构"]
L1["🏛️ L1 原则层<br/>principles.md<br/>━━━━━━━━━━━━━<br/>永远加载 · 上限1000条<br/>永不自动降级<br/>漏掉会导致犯错的知识"]
L2["📚 L2 经验层<br/>patterns/*.md<br/>━━━━━━━━━━━━━<br/>语义匹配按需加载<br/>7个领域文件<br/>特定场景下的操作经验"]
Index["🔍 index.md<br/>语义索引"]
end
subgraph 触发层["⚡ 反思触发"]
ExplicitTrigger["👤 用户显式触发<br/>'记住' / '反思' / '不对'<br/>━━━━━━━━━━━━━<br/>跳过 pending<br/>直接写入 L1/L2"]
TimerTrigger["⏰ 定时综合<br/>pending ≥ 5条<br/>或超过 24h<br/>━━━━━━━━━━━━━<br/>生成反思报告<br/>Agent 自主分类<br/>用户批量审阅"]
end
subgraph 统计层["📊 统计追踪"]
CitationLog["citation-log.jsonl<br/>引用日志"]
Summary["summary.json<br/>按需生成统计报告"]
end
%% 触发流
User -->|"记住/反思/不对"| ExplicitTrigger
Pending -->|"攒够5条/超24h"| TimerTrigger
ExplicitTrigger --> L1
ExplicitTrigger --> L2
TimerTrigger --> L1
TimerTrigger --> L2
TimerTrigger --> Index
%% 加载流
L1 -->|每次会话自动加载| AgentWork
Index -->|会话开始语义匹配| L2
L2 -->|匹配命中则加载| AgentWork
%% 事前预防
L1 -.->|"事前预防:有坑先提醒"| AgentWork
L2 -.->|"事前预防:有坑先提醒"| AgentWork
%% 统计
Response -->|会话结束批量写入| CitationLog
CitationLog -->|用户说'统计'| Summary
style L1 fill:#1a5276,stroke:#2980b9,color:#fff
style L2 fill:#145a32,stroke:#27ae60,color:#fff
style Pending fill:#7d6608,stroke:#f1c40f,color:#fff
style ExplicitTrigger fill:#922b21,stroke:#e74c3c,color:#fff
style TimerTrigger fill:#6c3483,stroke:#8e44ad,color:#fff
style HookLayer fill:#424949,stroke:#95a5a6,color:#fff
style AgentLayer fill:#424949,stroke:#95a5a6,color:#fff
这条经验如果在需要时没被加载,会导致犯错或失败吗?
├─ 会 → L1(永远加载,永不降级)
└─ 不会,只是效率低 → L2(语义匹配按需加载)
拿不准?→ 默认放 L1(宁可多加载,不可漏)
为什么:频率不代表重要性。"一年只用一次的安全规则"比"天天用的格式偏好"更重要。
❌ 旧方案:对话结束 → 回放 3 小时 session → 找信号(25,000+ tokens)
✅ 我们的:对话中随手记 → 定时只读笔记综合(200-500 tokens)
token 成本降低两个数量级。类似"开会时随手记要点"vs"会后重听录音"。
| 层 | 可靠性 | 精度 | 作用 |
|---|---|---|---|
| Hook 自动层 | 高(不依赖 Agent) | 低(关键词匹配) | 保底,确保不遗漏 |
| Agent 自觉层 | 中(可能忘) | 高(语义理解) | 精确,提供具体内容 |
两层互补:Hook 层捕获"用户可能在纠正",Agent 层补充"具体纠正了什么"。
- 不逐条问用户(避免决策疲劳)
- Agent 按规则自主分类 L1/L2
- 定期反思报告中列出分类结果,用户扫一眼确认/调整
- 拿不准时默认放 L1(误入 L1 浪费少量 token,误入 L2 可能漏加载导致犯错)
用户明确说"记住/不对/反思"时,直接写入 L1/L2,不经 pending 缓冲。 隐式信号(Agent 自己发现的)才走 pending → 定时综合流程。
| 优化点 | 效果 |
|---|---|
| L2 会话级一次性匹配 | 不逐轮重复,整个会话只匹配一次 |
| Hook 只在命中时输出 | 未命中完全静默,零 token |
| citation-log 批量写入 | 会话结束一次写入,省 4-9 次 tool call |
| summary.json 按需生成 | 不自动更新,用户说"统计"时才计算 |
### P042: 提供商名禁用 "qwen"
category: 配置
source: 2026-03-06 排障得出
why: "qwen" 会触发内置插件自动劫持配置,属于"命名冲突触发内置行为"的通用模式
generalize: 配置自定义命名时,避免使用任何与内置插件同名的名称
---
使用 "qwen" 作为提供商名会触发内置插件劫持,导致 4008 错误。用 "aliyun" 替代。每条带 why(为什么)和 generalize(泛化规律),支持举一反三。
## 技能安装后不显示的排查流程
context: 当安装技能、调试技能加载、clawhub install 后技能列表看不到时
tags: [技能, 安装, clawhub, skills, 不显示]
source: 2026-03-10
---
1. 检查是否在 workspace/skills/skills/ 目录
2. 检查 SKILL.md 的 YAML front matter
3. 检查 metadata 字段是否为空context 字段用自然语言描述"什么时候该加载我",Agent(LLM)直接做语义匹配。
self-evolution/
├── SKILL.md # 技能主文件(Agent 每次会话加载的完整规则)
├── _meta.json # 元数据
├── config.yaml # 可配置项(阈值、上限、检查周期)
│
├── principles.md # L1: 永久原则(≤1000条,每次会话自动加载)
├── pending.jsonl # 信号临时队列(综合后清空)
│
├── patterns/ # L2: 经验层(语义匹配按需加载)
│ ├── index.md # 语义索引(会话开始时匹配用)
│ ├── config.md # 配置类经验
│ ├── skills.md # 技能类经验
│ ├── multi-agent.md # 多代理协作经验
│ ├── debug.md # 排障经验
│ ├── research.md # 调研分析经验
│ ├── general.md # 通用经验
│ └── other.md # 未分类(兜底)
│
├── stats/ # 统计系统
│ ├── citation-log.jsonl # 引用日志
│ └── reports/ # 阶段性分析报告
│
├── hooks/ # Hook 脚本
│ ├── signal-detector.sh # 用户消息关键词检测
│ ├── error-detector.sh # 命令失败检测
│ └── bootstrap.js # 启动时注入 SKILL.md
│
├── setup.md # 安装指南
└── design/ # 设计文档
├── DESIGN.md # 完整设计方案 v1.1
├── ROLLOUT.md # 三阶段部署策略
└── TODO.md # 待办项 + 讨论记录(20条决策)
clawhub install evo-memorygit clone https://github.com/Weiran71/evo-memory.git
cp -r evo-memory ~/.openclaw/workspace/skills/skills/self-evolutionmkdir -p ~/.openclaw/hooks/self-evolution
cp ~/.openclaw/workspace/skills/skills/self-evolution/hooks/bootstrap.js \
~/.openclaw/hooks/self-evolution/handler.js
cat > ~/.openclaw/hooks/self-evolution/HOOK.md << 'EOF'
---
name: self-evolution
description: "Injects self-evolution skill during agent bootstrap"
metadata: {"openclaw":{"emoji":"🧬","events":["agent:bootstrap"]}}
---
# Self-Evolution Bootstrap Hook
EOF
openclaw hooks enable self-evolutionopenclaw gateway restart
sleep 3
openclaw hooks list | grep self-evolution # 应显示 ✓ ready
openclaw skills list | grep self-evolution # 应显示 ✓ ready# 验证 bootstrap 注入
openclaw agent --agent main --message "你有没有加载 self-evolution 技能?"
# 验证 L1 写入
openclaw agent --agent main --message "记住:这是测试原则"
# 检查写入结果
cat ~/.openclaw/workspace/self-evolution/principles.md# config.yaml
pending_threshold: 5 # pending 积累多少条信号后触发综合
max_silent_hours: 24 # pending 不为空时,最长静默多少小时后强制综合
report_style: detailed # 反思报告风格:detailed / brief
l1_limit: 1000 # L1 原则层条目上限
freshness_check_interval: 30d # L1 原则保鲜检查周期| 维度 | ivangdavila/self-improving | pskoett/self-improving-agent | 本方案 |
|---|---|---|---|
| 分层依据 | 频率(7天3次) | 无分层 | 知识性质 |
| HOT 容量 | 100 行 | 无限制 | 1000 条 |
| 晋升机制 | 自动(频率驱动) | 手动 | Agent 自主 + 用户审阅 |
| 降级机制 | 30天不用降级 | 无 | L1 永不降级 |
| 匹配方式 | 项目名/目录名 | 无 | 语义匹配 |
| 信号捕获 | Agent 自觉 | 手动 | Hook + Agent 双层 |
| 反思触发 | Agent 判断任务完成 | 手动 | 实时捕获 + 定时综合 |
| 成功模式 | 不捕获 | 不捕获 | 捕获 |
| WHY 字段 | 无 | 无 | 每条带 why + generalize |
| 统计追踪 | 无 | 无 | 引用统计 |
| 事前预防 | 无 | 无 | 执行前检查记忆 |
| token 成本 | 高(回放 session) | 低(手动) | 极低(读 pending) |
| 部署风险 | 替换式 | 独立 | 旁挂零风险 |
完整的设计讨论过程记录在 design/TODO.md 中,包含 20 条关键决策(D01-D20),涵盖:
- 为什么按知识性质分层而非频率
- 为什么用语义匹配而非 Embedding
- 为什么实时捕获而非回放 Session
- L1/L2 边界模糊时怎么处理
- 反思报告如何避免决策疲劳
- Hook 在 OpenClaw 中的兼容性限制
- 6 项成本优化措施
- 两层记忆架构(L1 原则 + L2 经验)
- 实时信号捕获 + 定时综合
- Bootstrap hook 强制加载
- 引用统计系统
- Hook 自动捕获层(等 OpenClaw 支持
message:received事件) - 保鲜检查(30天周期验证 L1 条目)
- 矛盾检测(写入时检查语义冲突)
- 学习速度度量(纠正频率趋势、重犯率)
MIT