第 25 课:持续学习 — Instinct 提取与演化

0 阅读8分钟

所属阶段:第五阶段「进阶能力」(第 23-27 课) 前置条件:第 9 课(Skill 编写)、第 10 课(Hook) 本课收获:从会话中提取一个 Instinct,理解持续学习系统的完整架构


一、本课概述

到目前为止,ECC 的所有知识(Skill、Rule、Agent)都是预先定义好的。但有一类知识无法预先定义 — 你个人的编码习惯、项目的特殊约定、团队的隐含规范。

ECC 的持续学习系统解决的就是这个问题:

  1. Instinct 模型 — 什么是 Instinct,它和 Skill 有什么区别
  2. 记忆三件套 — 为什么记忆不会自动保存,需要哪三个组件
  3. 学习时机 — 学习发生在 Stop Hook 中(而不是 UserPromptSubmit)
  4. 命令链 — 从提取到演化的完整命令
  5. v1 vs v2 差异 — 持续学习系统的演进

这是 ECC 中最有"AI 味道"的一个系统 — 让你的 AI 助手真正地"学习"。


二、Instinct 模型

2.1 什么是 Instinct

Instinct(本能)是持续学习系统的原子单元。每个 Instinct 代表一个从会话中观察到的行为模式:

---
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(默认)或 globalReact 模式仅限 React 项目

2.3 Instinct vs Skill vs Rule

维度InstinctSkillRule
来源自动从会话中提取人工编写或从 Instinct 演化人工编写
粒度原子级(一个动作)完整工作流约束条件
置信度有(0.3-0.9)无(默认可信)无(强制执行)
生命周期可能被丢弃持久存在持久存在
作用域项目级或全局全局通用/语言特定

类比

  • Instinct = 你的直觉("我觉得这样写更好") — 可能对也可能错
  • Skill = 你的技能("我知道怎么做 TDD") — 经过验证的能力
  • Rule = 你的纪律("代码必须有测试") — 不可违反的约束

三、记忆不自动保存的三件套

一个关键认知:Claude Code 不会自动记住上一次会话的内容。 每次新会话都是一张白纸。

要让 AI 助手"学习",你需要三个组件协同工作:

3.1 三件套架构

┌─────────────────────────────────────────────┐
│              持续学习三件套                    │
│                                              │
│  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 从观察到演化的完整流程

会话观察(Stop Hook / PostToolUse)
    ↓
模式提取(分析对话中的重复行为)
    ↓
创建 Instinct(初始置信度 0.3-0.5)
    ↓
置信度评分(每次再次观察 → 置信度上升)
    ↓
    ├── 低置信度(<0.4)→ 丢弃(TTL 30 天后自动清理)
    ├── 中置信度(0.4-0.6)→ 继续观察
    └── 高置信度(>0.7)→ 保存
         ↓
    聚合(相关 Instinct 聚类)
         ↓
    演化为 Skill / Command / Agent

4.2 置信度评分机制

置信度不是固定的,它会随着观察而变化:

首次观察:           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 引入了项目作用域,解决了一个关键问题:跨项目污染。

❌ 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 命令使用示例

# 步骤 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 提供了更细粒度的控制:

# 查看所有项目的 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 差异

持续学习系统经历了两个大版本的演进:

特性v1v2 / v2.1
观察方式Stop Hook(仅会话结束)PreToolUse/PostToolUse(实时)+ Stop
分析执行在主上下文中(占用 Token)后台 Agent(Haiku,不占主上下文)
学习粒度直接生成完整 Skill原子 Instinct → 聚合 → 演化
置信度0.3-0.9 加权
演化路径直接写 SkillInstinct → 聚类 → Skill/Command/Agent
分享机制Export/Import Instinct
作用域全局项目级 + 全局(v2.1)
跨项目污染风险隔离(v2.1)

6.1 为什么 v2 更好

v1 的核心问题:

  1. 占用主上下文 — 学习分析消耗 Token,影响当前任务
  2. 粒度太粗 — 直接生成 Skill,容易产生质量不高的 Skill
  3. 无置信度 — 一次观察就当作"确定的",容易学错
  4. 全局污染 — React 的习惯被应用到 Go 项目

v2 的设计思路:

  1. 后台运行 — 用 Haiku(便宜、快速)在后台分析
  2. 原子粒度 — 先学小的(Instinct),积累够了再聚合
  3. 置信度过滤 — 观察次数不够就不当真
  4. 项目隔离 — 不同项目不同知识库

七、存储结构

Instinct 存储在 ~/.claude/homunculus/ 目录中:

~/.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 分钟)

cat skills/continuous-learning-v2/SKILL.md

回答问题:

  • v2.1 新增了哪两个命令?(提示:promote 和 projects)
  • 项目检测基于什么?(提示:git remote URL)

练习 2:执行 /learn 并查看状态(20 分钟)

这是本课最重要的练习。

  1. 在 Claude Code 中完成一次有意义的开发对话(至少 5 轮交互)
  2. 在会话结束前执行 /learn
  3. 执行 /instinct-status 查看提取结果

记录:

  • 提取到了几个 Instinct?
  • 置信度分布如何?
  • 有没有你不认同的 Instinct?

练习 3:理解 Instinct 生命周期(10 分钟)

用你自己的话,画出 Instinct 从"观察"到"演化为 Skill"的完整生命周期图。要包括:

  • 触发条件
  • 置信度变化
  • 丢弃条件
  • 演化条件

练习 4(选做):导出和导入

尝试导出你的 Instinct 并在另一个项目中导入:

# 导出
# /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 是变好了还是变差了?用什么指标衡量?