所属阶段:第五阶段「进阶能力」(第 23-27 课) 前置条件:第 9 课(Skill 编写)、第 10 课(Hook) 本课收获:从会话中提取一个 Instinct,理解持续学习系统的完整架构
一、本课概述
到目前为止,ECC 的所有知识(Skill、Rule、Agent)都是预先定义好的。但有一类知识无法预先定义 --- 你个人的编码习惯、项目的特殊约定、团队的隐含规范。
ECC 的持续学习系统解决的就是这个问题:
- Instinct 模型 --- 什么是 Instinct,它和 Skill 有什么区别
- 记忆三件套 --- 为什么记忆不会自动保存,需要哪三个组件
- 学习时机 --- 学习发生在 Stop Hook 中(而不是 UserPromptSubmit)
- 命令链 --- 从提取到演化的完整命令
- v1 vs v2 差异 --- 持续学习系统的演进
这是 ECC 中最有"AI 味道"的一个系统 --- 让你的 AI 助手真正地"学习"。
二、Instinct 模型
2.1 什么是 Instinct
Instinct(本能)是持续学习系统的原子单元。每个 Instinct 代表一个从会话中观察到的行为模式:
yaml
---
id: prefer-functional-style
trigger: "when writing new functions"
confidence: 0.7
domain: "code-style"
source: "session-observation"
scope: project
project_id: "a1b2c3d4e5f6"
project_name: "my-react-app"
---
# Prefer Functional Style
## Action
Use functional patterns over classes when appropriate.
## Evidence
- Observed 5 instances of functional pattern preference
- User corrected class-based approach to functional on 2025-01-15
2.2 Instinct 的五个属性
| 属性 | 说明 | 示例 |
|---|---|---|
| 原子性 | 一个触发条件,一个动作 | "写函数时 → 用函数式风格" |
| 置信度 | 0.3-0.9 的权重 | 0.3=试探性,0.9=近乎确定 |
| 领域标签 | 所属领域分类 | code-style, testing, git, debugging |
| 证据链 | 创建该 Instinct 的观察记录 | "观察到 5 次偏好函数式" |
| 作用域 | project(默认)或 global | React 模式仅限 React 项目 |
2.3 Instinct vs Skill vs Rule
| 维度 | Instinct | Skill | Rule |
|---|---|---|---|
| 来源 | 自动从会话中提取 | 人工编写或从 Instinct 演化 | 人工编写 |
| 粒度 | 原子级(一个动作) | 完整工作流 | 约束条件 |
| 置信度 | 有(0.3-0.9) | 无(默认可信) | 无(强制执行) |
| 生命周期 | 可能被丢弃 | 持久存在 | 持久存在 |
| 作用域 | 项目级或全局 | 全局 | 通用/语言特定 |
类比:
- Instinct = 你的直觉("我觉得这样写更好") --- 可能对也可能错
- Skill = 你的技能("我知道怎么做 TDD") --- 经过验证的能力
- Rule = 你的纪律("代码必须有测试") --- 不可违反的约束
三、记忆不自动保存的三件套
一个关键认知:Claude Code 不会自动记住上一次会话的内容。 每次新会话都是一张白纸。
要让 AI 助手"学习",你需要三个组件协同工作:
3.1 三件套架构
vbnet
┌─────────────────────────────────────────────┐
│ 持续学习三件套 │
│ │
│ 1. Stop Hook(提取) │
│ │ 会话结束时,分析对话内容 │
│ │ 提取行为模式,创建 Instinct │
│ ↓ │
│ 2. PreCompact Hook(保存) │
│ │ 上下文压缩前,保存重要观察 │
│ │ 防止因上下文窗口满而丢失学习材料 │
│ ↓ │
│ 3. continuous-learning Skill(存储+演化) │
│ │ 管理 Instinct 的存储、评分、聚合 │
│ │ 将高置信度 Instinct 演化为 Skill/Agent │
│ │
└─────────────────────────────────────────────┘
3.2 为什么学习在 Stop Hook 中发生
不是 UserPromptSubmit(用户输入时) --- 那会导致每次提问都有延迟。
而是 Stop Hook(会话结束时) --- 原因:
| 时机 | 优点 | 缺点 |
|---|---|---|
| UserPromptSubmit | 实时学习 | 增加每次交互延迟 |
| PostToolUse | 工具级别观察 | 过于频繁,噪音大 |
| Stop(会话结束) | 不影响交互体验 | 需要等到会话结束 |
| PreCompact | 压缩前保存 | 只在上下文满时触发 |
v2 的改进是同时使用 PreToolUse/PostToolUse 做实时观察 (用 Haiku 在后台运行,不阻塞),Stop Hook 做总结提取。
四、Instinct 生命周期
4.1 从观察到演化的完整流程
markdown
会话观察(Stop Hook / PostToolUse)
↓
模式提取(分析对话中的重复行为)
↓
创建 Instinct(初始置信度 0.3-0.5)
↓
置信度评分(每次再次观察 → 置信度上升)
↓
├── 低置信度(<0.4)→ 丢弃(TTL 30 天后自动清理)
├── 中置信度(0.4-0.6)→ 继续观察
└── 高置信度(>0.7)→ 保存
↓
聚合(相关 Instinct 聚类)
↓
演化为 Skill / Command / Agent
4.2 置信度评分机制
置信度不是固定的,它会随着观察而变化:
ini
首次观察: confidence = 0.3(试探性)
第 2 次同类观察: confidence = 0.5(有迹象)
第 3 次同类观察: confidence = 0.65(有模式)
第 5 次同类观察: confidence = 0.8(近乎确定)
用户明确纠正: confidence += 0.15(强信号)
用户否定: confidence -= 0.2(负信号)
4.3 项目作用域(v2.1 新增)
v2.1 引入了项目作用域,解决了一个关键问题:跨项目污染。
arduino
❌ v2.0 的问题:
在 React 项目中学到 "use hooks for state"
↓
在 Go 项目中也建议 "use hooks" ← 这没有意义
✅ v2.1 的解决:
React 项目的 Instinct → 只在 React 项目中生效
Go 项目的 Instinct → 只在 Go 项目中生效
"always validate input" → 提升为全局 Instinct
项目检测基于 git remote URL 或仓库路径。当同一个 Instinct 在 2 个以上项目中被观察到,可以将其提升(promote)为全局 Instinct。
五、命令链
ECC 提供了完整的命令链来管理持续学习:
| 命令 | 功能 | 典型使用场景 |
|---|---|---|
/learn |
手动触发学习,从当前会话提取 Instinct | 完成一次有价值的会话后 |
/instinct-status |
查看所有 Instinct 的状态和置信度 | 了解学到了什么 |
/instinct-export |
导出 Instinct 到文件 | 备份或分享 |
/instinct-import |
从文件导入 Instinct | 导入团队共享的 Instinct |
/evolve |
将高置信度 Instinct 演化为 Skill/Command/Agent | 定期维护 |
5.1 命令使用示例
bash
# 步骤 1:完成一次开发会话后,触发学习
# /learn
# 步骤 2:查看提取到了什么
# /instinct-status
# 输出示例:
# Project: my-react-app (a1b2c3d4)
# ┌──────────────────────────────┬────────┬───────────┐
# │ Instinct │ Conf. │ Domain │
# ├──────────────────────────────┼────────┼───────────┤
# │ prefer-functional-style │ 0.70 │ code-style│
# │ always-check-null-first │ 0.55 │ debugging │
# │ use-early-return │ 0.80 │ code-style│
# │ test-edge-cases-first │ 0.45 │ testing │
# └──────────────────────────────┴────────┴───────────┘
# 步骤 3:高置信度 Instinct 演化为 Skill
# /evolve
5.2 instinct-cli.py
底层工具 instinct-cli.py 提供了更细粒度的控制:
bash
# 查看所有项目的 Instinct 统计
python3 skills/continuous-learning-v2/scripts/instinct-cli.py projects
# 将项目 Instinct 提升为全局
python3 skills/continuous-learning-v2/scripts/instinct-cli.py promote <instinct-id>
# 清理超过 30 天的低置信度 Instinct
python3 skills/continuous-learning-v2/scripts/instinct-cli.py prune
六、v1 vs v2 差异
持续学习系统经历了两个大版本的演进:
| 特性 | v1 | v2 / v2.1 |
|---|---|---|
| 观察方式 | Stop Hook(仅会话结束) | PreToolUse/PostToolUse(实时)+ Stop |
| 分析执行 | 在主上下文中(占用 Token) | 后台 Agent(Haiku,不占主上下文) |
| 学习粒度 | 直接生成完整 Skill | 原子 Instinct → 聚合 → 演化 |
| 置信度 | 无 | 0.3-0.9 加权 |
| 演化路径 | 直接写 Skill | Instinct → 聚类 → Skill/Command/Agent |
| 分享机制 | 无 | Export/Import Instinct |
| 作用域 | 全局 | 项目级 + 全局(v2.1) |
| 跨项目 | 污染风险 | 隔离(v2.1) |
6.1 为什么 v2 更好
v1 的核心问题:
- 占用主上下文 --- 学习分析消耗 Token,影响当前任务
- 粒度太粗 --- 直接生成 Skill,容易产生质量不高的 Skill
- 无置信度 --- 一次观察就当作"确定的",容易学错
- 全局污染 --- React 的习惯被应用到 Go 项目
v2 的设计思路:
- 后台运行 --- 用 Haiku(便宜、快速)在后台分析
- 原子粒度 --- 先学小的(Instinct),积累够了再聚合
- 置信度过滤 --- 观察次数不够就不当真
- 项目隔离 --- 不同项目不同知识库
七、存储结构
Instinct 存储在 ~/.claude/homunculus/ 目录中:
perl
~/.claude/homunculus/
├── projects.json # 项目注册表
├── observations.jsonl # 全局观察日志
├── instincts/ # 全局 Instinct
│ ├── personal/ # 个人观察提取的
│ └── inherited/ # 导入的
├── evolved/ # 全局演化产物
└── projects/
├── <project-hash-1>/
│ ├── instincts/
│ │ ├── personal/
│ │ └── inherited/
│ ├── evolved/
│ └── observations.jsonl
└── <project-hash-2>/
└── ...
注意 :homunculus(小人)是持续学习系统的内部代号,你在目录结构中会频繁看到这个词。
八、本课练习
练习 1:阅读 continuous-learning-v2 Skill(15 分钟)
bash
cat skills/continuous-learning-v2/SKILL.md
回答问题:
- v2.1 新增了哪两个命令?(提示:promote 和 projects)
- 项目检测基于什么?(提示:git remote URL)
练习 2:执行 /learn 并查看状态(20 分钟)
这是本课最重要的练习。
- 在 Claude Code 中完成一次有意义的开发对话(至少 5 轮交互)
- 在会话结束前执行
/learn - 执行
/instinct-status查看提取结果
记录:
- 提取到了几个 Instinct?
- 置信度分布如何?
- 有没有你不认同的 Instinct?
练习 3:理解 Instinct 生命周期(10 分钟)
用你自己的话,画出 Instinct 从"观察"到"演化为 Skill"的完整生命周期图。要包括:
- 触发条件
- 置信度变化
- 丢弃条件
- 演化条件
练习 4(选做):导出和导入
尝试导出你的 Instinct 并在另一个项目中导入:
bash
# 导出
# /instinct-export
# 在另一个项目中导入
# /instinct-import <file-path>
观察:导入后的 Instinct 是出现在 personal/ 还是 inherited/ 目录中?
九、本课小结
| 你应该记住的 | 内容 |
|---|---|
| Instinct 定义 | 原子级学习单元,有置信度、领域标签和作用域 |
| 记忆三件套 | Stop Hook(提取)+ PreCompact Hook(保存)+ Skill(存储/演化) |
| 学习时机 | Stop Hook(不影响交互体验),v2 增加了后台实时观察 |
| 生命周期 | 观察 → 提取 → 评分 → 丢弃/观察/保存 → 聚合 → 演化 |
| 项目隔离 | v2.1 按项目隔离 Instinct,防止跨项目污染 |
十、下节预告
第 26 课:Eval 驱动开发 --- 衡量 AI 行为
持续学习让 AI 变得更好,但"更好"需要衡量。下节课学习 Eval 驱动开发(EDD)--- 如何为 AI Agent 设计评估标准、运行 Eval、分析 pass@k 指标,确保 Agent 的行为是可量化、可复现的。
预习建议:思考一个问题 --- 你怎么知道你的 Agent 是变好了还是变差了?用什么指标衡量?