原子直觉:给 AI 助手建一套会自我进化的记忆系统
上一篇聊了用 Stop hook 做批量 skill 收割。这套方案跑了一段时间后我发现了一个问题:颗粒度太粗。一次解决了某个 React 渲染问题,shill 就写成「遇到 React 问题先检查 hooks 顺序」——听起来正确,但放到 Python 项目里毫无意义,偏偏它就静静待在全局 skill 列表里,每次都被加载进 context。
真正的问题是:AI 助手学习的单位不应该是「一整套解法」,而应该是一个触发条件、一个动作、一份证据,仅此而已。
从 skill 到 instinct:颗粒度下移
我把这类原子单位叫做 instinct(直觉)。它长这样:
id: prefer-functional-style
trigger: "when writing new functions"
confidence: 0.7
domain: code-style
scope: project三个关键属性:
trigger:在什么场景下激活。不是泛化的「写代码时」,而是具体的触发上下文。
confidence:0.3 到 0.9 的置信度。这是最有意思的设计——instinct 不是非黑即白的「开启/关闭」,而是一个持续校准的浮点数。你纠正了 AI 的行为,confidence 下降;你连续几次没有干预,confidence 上升。置信度到 0.7 才会自动应用,0.9 才成为核心行为。
scope:project 还是 global。这是 v2.1 新增的维度,也是解决「跨项目污染」问题的关键。
项目隔离:阻断知识串台
当你同时维护多个技术栈差异很大的项目时,知识串台是个真实的痛点。在 A 项目养成的「用 dataclass 替代 dict」在 B 项目(TypeScript)完全没有意义,但如果 instinct 全部存在全局作用域里,它们就会互相干扰。
v2.1 的方案是按 git remote URL 的 hash 做项目隔离:
~/.claude/homunculus/projects/
├── a1b2c3d4e5f6/ ← 项目 A 的 instincts
│ └── instincts/personal/
└── f6e5d4c3b2a1/ ← 项目 B 的 instincts
└── instincts/personal/
同一个 repo,不同机器 clone 下来,hash 一致(基于 remote URL),这个设计挺干净的。
真正跨项目都适用的模式——比如「编辑前先 grep 确认位置」、「SQL 查询必须处理注入」——满足「两个以上项目、置信度均超 0.8」时才会自动晋升为 global instinct。这个晋升机制相当于一个过滤器:只有经过多项目验证的模式才有资格成为普遍规则。
v1 用 skill 来触发观测,但 skill 有个根本缺陷:它依赖 AI 的「判断」来决定要不要调用,所以只有 50-80% 的触发率。v2 改用 PreToolUse 和 PostToolUse hook——这是系统级钩子,每次工具调用都触发,覆盖率 100%。用确定性机制替代概率性机制,是这套设计里最重要的工程决策。
演化路径:instinct → skill → agent
单个 instinct 只是原材料。/evolve 命令会把相关的 instinct 聚类,当某个领域的 instinct 足够密集时,自动生成完整的 skill 文档或者专用 agent。
这个从原子到组合的演化路径,让知识积累变成了一个连续的过程,而不是「某天我决定手写一个 skill」的一次性动作。背后跑的观测 agent 用的是轻量模型(Haiku),在后台每隔几分钟分析一次观测日志,不占用主会话的 context。
我觉得这里有一个更通用的设计原则值得记下来:让系统在你工作的间隙悄悄完成整理,而不是让整理本身成为一项需要你主动执行的任务。记录、分类、晋升,都应该是后台发生的事情。
一句话心法
instinct 的置信度是一面镜子——它的高低反映的不是 AI 有多「确定」,而是你纠正过它多少次。