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

所属阶段:第五阶段「进阶能力」(第 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 代表一个从会话中观察到的行为模式:

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 的核心问题:

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

v2 的设计思路:

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

七、存储结构

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 分钟)

这是本课最重要的练习。

  1. 在 Claude Code 中完成一次有意义的开发对话(至少 5 轮交互)
  2. 在会话结束前执行 /learn
  3. 执行 /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 是变好了还是变差了?用什么指标衡量?

相关推荐
王小酱3 小时前
第 20 课:数据库模式 — 设计、迁移与优化
ai编程
王小酱3 小时前
第 24 课:安全(下)— 防御机制与实战
ai编程
王小酱3 小时前
第 10 课:Hooks — 事件驱动自动化
openai·ai编程·aiops
王小酱3 小时前
第 16 课:多代理编排 — 并行、视角与隔离
openai·ai编程
王小酱3 小时前
第 15 课:会话管理 — 上下文、模型与持久化
openai·ai编程·aiops
王小酱3 小时前
第 27 课:Agent 工程与 LLM 成本优化
ai编程
王小酱3 小时前
第 11 课:Scripts — Hook 的底层实现
openai·ai编程·aiops
王小酱3 小时前
第 17 课:后端语言 — Python / Go / Rust / Java
openai·ai编程
王小酱3 小时前
第 22 课:软件架构 — 六边形、微服务与决策记录
ai编程