连续学习与 Instinct 模型
连续学习与 Instinct 模型
学习目标
读完本章后,你将能够:
- 理解 Hook 驱动观察与 Skill 驱动观察的触发率差异(100% vs ~50-80%)
- 设计原子化 Instinct 模型(触发器 + 动作 + 置信度 + 领域标签)
- 实现置信度评分的增减机制
- 设计项目作用域隔离的 Instinct 存储架构
- 理解 Instinct 演化管线:观察 → 模式检测 → 聚类 → 技能/命令/代理
前置知识
- 记忆系统设计 — 短期/长期记忆分层与持久化方案
- Hook 系统架构 — 工具生命周期事件与钩子执行模型
- 多 Agent 路由 — 子代理委托与模型选择
1. 为什么需要连续学习
问题定义
AI 编码代理在每次会话中都会积累模式:用户的编码偏好、项目约定、常见的错误与规避策略。如果没有连续学习机制,每次新会话都是”从零开始”,用户需要反复重申相同的偏好。
两种观察模式的对比
| 维度 | Hook 驱动观察 | Skill 驱动观察 |
|---|---|---|
| 触发率 | 100%(确定性) | ~50-80%(概率性) |
| 实现方式 | PreToolUse / PostToolUse 钩子 | Agent 自主判断是否调用 Skill |
| 覆盖范围 | 每次工具调用都被记录 | 取决于 Agent 的技能激活判断 |
| 延迟 | 极低(同步或异步后台) | 中等(需要 Agent 推理轮次) |
| 适用场景 | 全面的模式捕获 | 特定场景的上下文感知学习 |
Hook 驱动的观察是连续学习的基础设施层 —— 它保证不遗漏任何模式。Skill 驱动的观察可以作为补充,捕获需要更高上下文理解的微妙模式。
2. Instinct 模型
2.1 什么是 Instinct
Instinct(本能)是一个原子化的已学习行为,表示一条从会话中提炼的可复用模式:
---id: prefer-functional-styletrigger: "when writing new functions"confidence: 0.7domain: "code-style"source: "session-observation"scope: projectproject_id: "a1b2c3d4e5f6"project_name: "my-react-app"---
# Prefer Functional Style
## ActionUse functional patterns over classes when appropriate.
## Evidence- Observed 5 instances of functional pattern preference- User corrected class-based approach to functional on 2025-01-15Instinct 的五个核心属性:
| 属性 | 说明 | 示例 |
|---|---|---|
| Atomic(原子性) | 一个触发器,一个动作 | ”写新函数时 → 使用函数式风格” |
| Confidence-weighted(置信度加权) | 0.3 ~ 0.9,表示确信程度 | 0.3 = 试探,0.9 = 确定 |
| Domain-tagged(领域标签) | 分类标签,用于过滤和聚类 | code-style / testing / git |
| Evidence-backed(证据支撑) | 追踪产生该 Instinct 的观察记录 | ”5 次观察 + 1 次用户纠正” |
| Scope-aware(作用域感知) | project(项目级)或 global(全局级) | React hooks → project,输入验证 → global |
2.2 置信度评分系统
置信度随时间动态演化:
评分变化规则:
| 事件 | 置信度变化 |
|---|---|
| 模式被重复观察到 | +0.1 ~ +0.2 |
| 用户未纠正建议的行为 | +0.05 |
| 相似 Instinct 从其他来源确认 | +0.05 |
| 用户明确纠正行为 | -0.2 ~ -0.3 |
| 模式长期未被观察到 | -0.05 / 周期 |
| 出现矛盾证据 | -0.1 |
阈值行为:
| 分数 | 含义 | 行为 |
|---|---|---|
| 0.3 | 试探性 | 仅建议,不自动应用 |
| 0.5 | 中等 | 在相关场景中参考应用 |
| 0.7 | 强 | 自动批准应用 |
| 0.9 | 几乎确定 | 核心行为,几乎总是应用 |
3. 架构与数据流
3.1 连续学习管线
3.2 存储架构:项目作用域隔离
${XDG_DATA_HOME:-~/.local/share}/ecc-homunculus/├── identity.json # 用户画像、技术等级├── projects.json # 注册表: 项目 hash → 名称/路径/远程├── observations.jsonl # 全局观察(回退)├── instincts/│ ├── personal/ # 全局自动学习的 Instinct│ └── inherited/ # 全局导入的 Instinct├── evolved/│ ├── agents/ # 全局生成的 Agent│ ├── skills/ # 全局生成的 Skill│ └── commands/ # 全局生成的 Command└── projects/ └── a1b2c3d4e5f6/ # 项目 hash(来自 git 远程 URL) ├── project.json # 项目元数据 ├── observations.jsonl # 项目级观察 ├── instincts/ │ ├── personal/ # 项目专属 Instinct │ └── inherited/ # 项目导入的 Instinct └── evolved/ # 项目级生成的技能为什么选择 XDG 数据目录而非 ~/.claude/:
- Claude Code 的敏感路径守卫会阻止后台 Agent 写入
~/.claude/下的某些路径 - XDG 标准目录(
~/.local/share/)是用户数据的约定位置 - 支持从旧位置迁移(
scripts/migrate-homunculus.sh)
3.3 项目检测
系统通过以下优先级自动检测当前项目:
CLAUDE_PROJECT_DIR环境变量(最高优先级)git remote get-url origin→ 哈希生成可移植项目 IDgit rev-parse --show-toplevel→ 使用仓库路径(机器特定)- 全局回退 → 若无项目检测,Instinct 归入全局作用域
项目 ID 是一个 12 字符的哈希值(如 a1b2c3d4e5f6),同一仓库在不同机器上生成相同 ID。
4. Instinct 晋升机制
4.1 自动晋升标准
当满足以下条件时,项目级 Instinct 可晋升为全局:
- 同一 Instinct ID 在 2+ 个项目中出现
- 平均置信度 ≥ 0.8
4.2 作用域决策指南
| 模式类型 | 作用域 | 示例 |
|---|---|---|
| 语言/框架约定 | project | ”使用 React hooks”、“遵循 Django REST 模式” |
| 文件结构偏好 | project | ”测试放在 __tests__/”、“组件在 src/components/“ |
| 代码风格 | project | ”使用函数式风格”、“偏好 dataclass” |
| 安全实践 | global | ”验证用户输入”、“清理 SQL” |
| 通用最佳实践 | global | ”先写测试”、“始终处理错误” |
| 工具工作流 | global | ”编辑前先 Grep”、“读取后再写入” |
5. 陷阱与对策
5.1 跨项目污染
问题:项目 A 的 React 模式被错误应用到项目 B 的 Python 代码中。
对策:项目作用域隔离。每个项目的 Instinct 存储在独立的 projects/<hash>/ 目录下,仅在对应项目中激活。
5.2 过度拟合个人习惯
问题:某个偶然的编码习惯被提升为高置信度 Instinct,导致不必要的自动应用。
对策:
- 置信度阈值:低置信度(<0.7)仅建议,不自动应用
- 矛盾证据检测:当用户行为与 Instinct 冲突时降低置信度
- 定期评估:
/evolve命令审查 Instinct 的有效性和适用性
5.3 Observer 成本过高
问题:每次工具调用都触发观察分析,消耗大量 Token。
对策:
- Observer 使用 Haiku 模型(最低成本)
- 异步后台执行(不阻塞主会话)
- 最小观察数阈值(默认 20 条才触发分析)
- 可配置的观察间隔(默认 5 分钟)
6. 设计取舍
为什么用 Hook 而非 Skill 做观察?
v1 依赖 Skill 自主观察,但 Skill 是概率性的 —— 触发率约 50-80%,取决于 Agent 的自主判断。Hook 是确定性的,100% 触发。这意味着:
- 每次工具调用都被观察
- 不会遗漏任何模式
- 学习是全面的
为什么 Instinct 是原子化的?
早期的连续学习方案尝试捕获完整的”会话模式”,但完整的模式过于复杂:
- 难以聚类(大对象之间相似度高)
- 难以演化(一个模式包含多个行为)
- 难以调试(不知道哪个部分导致了问题)
原子化 Instinct 将每个行为拆分为最小的”触发器 → 动作”对,使得:
- 聚类更精确(相似触发器自然归组)
- 演化更灵活(一组 Instinct 可以组合成 Skill 或 Command)
- 调试更直接(每个 Instinct 独立追踪置信度)
为什么置信度而非布尔开关?
简单的”已学习 / 未学习”二元模型无法处理:
- 新模式的试探阶段
- 矛盾证据出现时的降级
- 不同来源的确认叠加
置信度评分提供了一个连续的、可逆的评分系统,能够优雅地处理这些场景。
参考来源
- Claude Code Hooks 文档
- ReAct 模式:Yao et al., “ReAct: Synergizing Reasoning and Acting in Language Models”, arXiv:2210.03629, 2022
- XDG Base Directory Specification