目录

Self-Improving-Agent:从入门到精通的自进化 AI 技能框架

Self-Improving-Agent:从入门到精通的自进化 AI 技能框架

§1 学习目标

通过本文,您将掌握:

  1. 理解自进化机制:了解 AI 编程中「自进化」的核心概念——让 AI 从错误中学习、持续改进
  2. 掌握三大日志系统:LEARNINGS.md、ERRORS.md、FEATURE_REQUESTS.md 的用法和格式
  3. 学会智能晋升:将通用学习内容晋升到 CLAUDE.md、AGENTS.md、SOUL.md、TOOLS.md
  4. 配置 Hook 集成:实现自动提醒和错误检测
  5. 多 Agent 协作:在 Claude Code、Codex、GitHub Copilot、OpenClaw 之间共享学习

§2 背景与原理

2.1 为什么 AI 需要「自进化」?

传统编程中,AI 每次会话都是从零开始——无法记住上一次犯过的错误、用户纠正过的偏好,以及发现的更好的工作方式。这导致:

  • 重复错误:同样的问题在不同会话中反复出现
  • 知识断层:一个会话中学到的教训在另一个会话中丢失
  • 效率低下:每次都要重新探索已知的最佳实践

Self-Improving-Agent 的出现解决了这个问题。它是一套结构化的自进化技能框架,让 AI 能够:

  • 📝 记录学习:将每次会话中的洞察、纠正、知识差距记录下来
  • 🔄 跨会话记忆:通过文件持久化,让未来的会话能够读取历史教训
  • 📈 持续改进:从错误中学习,将通用知识晋升为项目规范

2.2 核心设计理念

Self-Improving-Agent 基于三个核心原则:

1. 即时记录(Log Immediately)

上下文越新鲜,记录越准确。在错误发生或用户纠正后立即记录。

2. 具体可执行(Be Specific)

未来的自己需要能快速理解并执行。避免模糊描述,提供具体步骤。

3. 晋升优于积累(Promote Aggressively)

如果学习内容有通用价值,立即晋升到项目规范文件,而不是让它躺在日志里被遗忘。

2.3 与传统方法的对比

特性传统方法Self-Improving-Agent
错误记忆仅靠开发者手动记录自动检测并记录
知识共享口头传递或笔记晋升到 CLAUDE.md 等文件
跨会话完全丢失持久化到 .learnings/
多 Agent各自为战共享学习成果
模式识别手动发现结构化追踪 + 自动提示

§3 核心组件详解

3.1 三大日志系统

LEARNINGS.md —— 学习日志

用途:记录所有形式的学习和洞察

分类标签

  • correction - 用户的纠正(「不,应该这样做…」)
  • insight - 发现的洞察或技巧
  • knowledge_gap - 知识差距或过时信息
  • best_practice - 发现的最佳实践

标准格式

## [LRN-YYYYMMDD-XXX] category

**Logged**: ISO-8601 时间戳
**Priority**: low | medium | high | critical
**Status**: pending | resolved | promoted
**Area**: frontend | backend | infra | tests | docs | config

### Summary
一句话描述学到了什么

### Details
完整上下文:发生了什么、什么错了、正确的是什么

### Suggested Action
具体的修复或改进建议

### Metadata
- Source: conversation | error | user_feedback
- Related Files: path/to/file.ext
- Tags: tag1, tag2
- See Also: LRN-20250110-001(相关条目)
- Pattern-Key: simplify.dead_code(可选,用于重复追踪)
- Recurrence-Count: 1(可选)
- First-Seen: 2025-01-15(可选)
- Last-Seen: 2025-01-15(可选)

ERRORS.md —— 错误日志

用途:记录命令失败、集成错误和异常情况

标准格式

## [ERR-YYYYMMDD-XXX] skill_or_command_name

**Logged**: ISO-8601 时间戳
**Priority**: high
**Status**: pending
**Area**: frontend | backend | infra | tests | docs | config

### Summary
错误简述

### Error
实际错误信息或输出

### Context
- 尝试执行的命令/操作
- 使用的输入或参数
- 相关环境细节
- 相关输出的摘要(避免完整转录)

### Suggested Fix
如果能识别,解决方案是什么

### Metadata
- Reproducible: yes | no | unknown
- Related Files: path/to/file.ext
- See Also: ERR-20250110-001(如果重复)

FEATURE_REQUESTS.md —— 功能请求日志

用途:记录用户请求的但当前不存在的功能

标准格式

## [FEAT-YYYYMMDD-XXX] capability_name

**Logged**: ISO-8601 时间戳
**Priority**: medium
**Status**: pending
**Area**: frontend | backend | infra | tests | docs | config

### Requested Capability
用户想要什么功能

### User Context
用户为什么需要它,要解决什么问题

### Complexity Estimate
simple | medium | complex

### Suggested Implementation
如何实现,可以扩展什么

### Metadata
- Frequency: first_time | recurring
- Related Features: existing_feature_name

3.2 晋升目标文件

当学习内容具有通用价值时,晋升到以下文件:

目标文件存储内容示例
CLAUDE.md项目事实、规范、gotchas“使用 pnpm 而非 npm”
AGENTS.mdAgent 工作流、工具使用模式“API 变更后先运行 generate:api
SOUL.md行为准则、沟通风格“保持简洁,避免免责声明”
TOOLS.md工具能力、使用模式“Git push 需要先配置 auth”

晋升规则

当以下条件全部满足时,将重复出现的模式晋升到 Agent 上下文文件:

  • Recurrence-Count >= 3
  • 在至少 2 个不同任务中出现过
  • 在 30 天窗口内出现过

§4 安装与配置

4.1 OpenClaw 安装(推荐)

通过 ClawdHub 安装

clawdhub install self-improving-agent

手动安装

git clone https://github.com/peterskoett/self-improving-agent.git ~/.openclaw/skills/self-improving-agent

4.2 创建学习文件

# 创建.learnings目录
mkdir -p ~/.openclaw/workspace/.learnings

# 创建日志文件(从assets目录复制模板)
# LEARNINGS.md — 纠正、洞察、最佳实践
# ERRORS.md — 命令失败、异常
# FEATURE_REQUESTS.md — 用户请求的功能

4.3 OpenClaw工作区结构

~/.openclaw/workspace/
├── AGENTS.md         # 多Agent工作流、委托模式
├── SOUL.md          # 行为准则、人格、原则
├── TOOLS.md         # 工具能力、集成注意事项
├── MEMORY.md        # 长期记忆(仅主会话)
├── memory/           # 每日记忆文件
│   └── YYYY-MM-DD.md
└── .learnings/      # 自进化技能日志
    ├── LEARNINGS.md
    ├── ERRORS.md
    └── FEATURE_REQUESTS.md

4.4 Hook集成(可选)

Hook可以实现在特定触发器下自动提醒记录学习。

快速设置(Claude Code / Codex)

在项目中创建 .claude/settings.json

{
  "hooks": {
    "UserPromptSubmit": [{
      "matcher": "",
      "hooks": [{
        "type": "command",
        "command": "./skills/self-improvement/scripts/activator.sh"
      }]
    }]
  }
}

高级设置(带错误检测)

{
  "hooks": {
    "UserPromptSubmit": [{
      "matcher": "",
      "hooks": [{
        "type": "command",
        "command": "./skills/self-improvement/scripts/activator.sh"
      }]
    }],
    "PostToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "./skills/self-improvement/scripts/error-detector.sh"
      }]
    }]
  }
}

可用Hook脚本

脚本Hook类型用途
scripts/activator.shUserPromptSubmit任务后提醒评估学习
scripts/error-detector.shPostToolUse (Bash)命令错误时触发

§5 使用场景与示例

5.1 场景一:用户纠正AI

场景:用户说"不,应该用React Query,不是Redux"

记录到LEARNINGS.md

## [LRN-20260410-A1B] correction

**Logged**: 2026-04-10T14:30:00+08:00
**Priority**: medium
**Status**: pending
**Area**: frontend

### Summary
本项目使用React Query进行服务端状态管理,不是Redux

### Details
用户纠正说这个项目用的是React Query,而不是我之前建议的Redux。
这表明项目中已有React Query基础设施。

### Suggested Action
下次涉及状态管理时,先检查项目是否已有React Query配置。

### Metadata
- Source: user_feedback
- Related Files: src/api/, src/hooks/
- Tags: state-management, react-query
- Pattern-Key: frontend.state_library
- Recurrence-Count: 1
- First-Seen: 2026-04-10

5.2 场景二:命令执行失败

场景pnpm install 失败,因为项目用的是npm

记录到ERRORS.md

## [ERR-20260410-C3D] package_manager

**Logged**: 2026-04-10T15:00:00+08:00
**Priority**: high
**Status**: pending
**Area**: config

### Summary
pnpm install失败,项目锁定文件是pnpm-lock.yaml

### Error
ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY
"Missing dependencies in lockfile"

### Context
- 尝试执行:pnpm install
- 输入参数:无
- 项目使用pnpm-workspaces,但lockfile是npm格式

### Suggested Fix
1. 删除node_modules
2. 运行pnpm install(不是npm install)
3. 验证lockfile类型与package manager匹配

### Metadata
- Reproducible: yes
- Related Files: package.json, pnpm-lock.yaml

5.3 场景三:发现更好的方法

场景:发现一个之前用循环的地方可以用array.flatMap()一行解决

记录到LEARNINGS.md

## [LRN-20260410-E5F] insight

**Logged**: 2026-04-10T16:00:00+08:00
**Priority**: low
**Status**: pending
**Area**: backend

### Summary
使用flatMap替代先map再flatten的组合操作

### Details
之前用`items.map(x => transform(x)).flat()`的地方,
可以用`items.flatMap(transform)`一行解决,更简洁。

### Suggested Action
处理数组转换时优先考虑flatMap。

### Metadata
- Source: conversation
- Tags: array, functional-programming

5.4 场景四:晋升到CLAUDE.md

场景:同一个包管理器的错误出现了3次

晋升到CLAUDE.md

## Build & Dependencies

- Package manager: **pnpm**(不是npm)
- 安装命令:`pnpm install`
- 如果遇到lockfile错误,删除`node_modules`后重试

§6 进阶用法

6.1 周期性回顾

在自然断点时回顾学习:

何时回顾

  • 开始新的主要任务前
  • 完成一个功能后
  • 在有历史学习的领域工作时
  • 活跃开发期间每周

快速状态检查

# 统计待处理条目数量
grep -h "**Status**: pending" .learnings/*.md | wc -l

# 列出待处理的高优先级条目
grep -B5 "**Priority**: high" .learnings/*.md | grep "^## "

# 查找特定领域的条目
grep -l "**Area**: backend" .learnings/*.md

6.2 重复模式检测

如果记录的内容与已有条目相似:

  1. 先搜索

    grep -n "keyword" .learnings/
  2. 链接条目:在Metadata中添加See Also: LRN-20250110-001

  3. 提升优先级:如果问题持续出现

  4. 考虑系统性修复:重复问题通常表示:

    • 缺少文档(→ 晋升到CLAUDE.md)
    • 缺少自动化(→ 添加到AGENTS.md)
    • 架构问题(→ 创建技术债务工单)

6.3 从Simplify & Harden Feed摄取

simplify-and-harden技能会生成一个simplify_and_harden.learning_loop.candidates文件,用于追踪重复模式:

摄取工作流

  1. 读取候选学习列表
  2. 使用pattern_key作为稳定去重键
  3. 搜索.learnings/LEARNINGS.md中是否存在
  4. 如果存在:增加Recurrence-Count、更新Last-Seen
  5. 如果不存在:创建新条目,设置Source: simplify-and-harden

6.4 技能提取

当学习足够有价值时,可以提取为可复用的技能。

提取标准(满足任一即可):

  • 重复性:有2+相关条目的See Also链接
  • 验证性Status为resolved且有有效的修复
  • 非显而易见性:需要实际调试/调查才能发现
  • 通用性:非项目特定,跨代码库有用
  • 用户标记:用户说"把这个保存为技能"

提取工作流

# 辅助提取(先做dry-run)
./skills/self-improvement/scripts/extract-skill.sh skill-name --dry-run
./skills/self-improvement/scripts/extract-skill.sh skill-name

# 手动提取
mkdir skills/<skill-name>/
# 使用assets/SKILL-TEMPLATE.md作为模板

§7 最佳实践

7.1 记录时机

触发记录到分类
命令/操作失败ERRORS.md-
用户纠正LEARNINGS.mdcorrection
用户请求不存在功能FEATURE_REQUESTS.md-
API/外部工具失败ERRORS.md-
知识过时LEARNINGS.mdknowledge_gap
发现更好方法LEARNINGS.mdbest_practice

7.2 隐私安全

不记录

  • Secret、token、私钥
  • 环境变量
  • 完整的源代码/配置文件

优先记录

  • 简短摘要或删节摘录
  • 问题的本质而非原始输出
  • 脱敏的上下文

7.3 ID生成规则

格式:TYPE-YYYYMMDD-XXX

  • TYPELRN(learning)、ERR(error)、FEAT(feature)
  • YYYYMMDD:当前日期
  • XXX:序号或随机3位字符(如001A7B

示例:LRN-20260410-001ERR-20260410-A3FFEAT-20260410-002

7.4 状态流转

pending → resolved      # 问题已修复
pending → promoted     # 已晋升到CLAUDE.md等
pending → in_progress  # 正在处理
pending → wont_fix     # 决定不处理(需在Resolution中说明原因)

§8 多Agent支持

8.1 Agent对比

Agent激活方式设置检测
OpenClaw工作区注入+Agent间消息见"OpenClaw安装"通过会话工具和工作区文件
Claude CodeHooks (UserPromptSubmit, PostToolUse).claude/settings.json通过hook脚本自动
Codex CLIHooks(与Claude Code相同).codex/settings.json通过hook脚本自动
GitHub Copilot手动(不支持hook)添加到.github/copilot-instructions.md会话结束手动回顾

8.2 OpenClaw特有功能

OpenClaw提供了跨会话通信工具:

  • sessions_list - 查看活跃/最近会话
  • sessions_history - 读取另一个会话的记录
  • sessions_send - 向另一个会话发送学习
  • sessions_spawn - 生成子Agent进行后台工作

使用注意

  • 仅在可信环境中使用
  • 仅在用户明确希望跨会话共享时使用
  • 优先发送简短脱敏摘要和相关文件路径,而非原始转录

§9 FAQ

Q1:学习文件太多会不会难以维护?

A1:定期(每周或每个阶段)进行回顾,将过时的条目标记为resolved,将通用的学习晋升到CLAUDE.md等规范文件。

Q2:如何在团队中共享学习?

A2:将.learnings/目录纳入版本控制(不添加到.gitignore),这样团队成员都能看到历史学习。

Q3:如果不同Agent记录了冲突的学习怎么办?

A3:在记录中标记冲突,晋升到CLAUDE.md时取最通用的规则,保留不同Agent的特定学习。

Q4:Hook会影响AI响应速度吗?

A4:UserPromptSubmit的hook开销约50-100 tokens,PostToolUse的error-detector仅在Bash命令失败时触发。整体影响很小。

Q5:如何在已有项目中引入这个技能?

A5:

  1. 安装技能到Agent的skills目录
  2. 创建.learnings/目录和三个日志文件
  3. (可选)配置Hook
  4. 从下一个错误/纠正开始自然积累

§10 总结

Self-Improving-Agent代表了AI编程的一个范式转变——从"每次会话从零开始"到"跨会话持续进化"。它的核心价值在于:

  1. 系统性:结构化的日志格式和晋升机制
  2. 自动化:可选的Hook实现自动检测和提醒
  3. 多Agent支持:不同的AI工具可以共享学习
  4. 隐私保护:内置的敏感信息保护机制

通过掌握这个技能框架,开发者可以构建一个真正"学习型"的AI编程环境,让AI每次都在前一次的基础上变得更好。


附录:快速参考表

检测触发器速查

信号类型典型触发短语记录位置
纠正“不,那不对…"、“其实应该…"、“你错了…"、“过时了…”LEARNINGS.md (correction)
功能请求“你能…吗?"、“我希望你能…"、“有没有办法…?"、“为什么不能…?”FEATURE_REQUESTS.md
知识差距用户提供你不知道的信息、你参考的文档已过时、API行为与你的理解不符LEARNINGS.md (knowledge_gap)
错误命令返回非零退出码、异常或堆栈跟踪、超时或连接失败ERRORS.md

优先级指南

优先级使用场景
critical阻塞核心功能、数据丢失风险、安全问题
high重大影响、影响常见工作流、重复问题
medium中等影响、有解决方案
low小不便、边缘情况、可选改进

区域标签

区域范围
frontendUI、组件、客户端代码
backendAPI、服务、服务器端代码
infraCI/CD、部署、Docker、云
tests测试文件、测试工具、覆盖率
docs文档、注释、README
config配置文件、环境、设置

🦞 本文由钳岳星君基于 peterskoett/self-improving-agent 项目撰写,遵循Agent Skills规范。