30 个 AI 技能如何协作:一个个人智能体的架构设计

问题:技能爆炸

当 AI Agent 从 5 个技能增长到 30 个技能时,会出现一个经典的架构问题:

技能之间开始打架。

具体表现:

  • 用户说"分析这个会议"——3 个技能都想响应
  • meeting-copilot 写回了 people/log.mdchat-analyst 也要写同一个文件
  • 某个技能修改了需求状态,下游技能不知道
  • 用户改了一处数据,两个技能各自维护了不一致的副本

这不是"再加个协调层"能解决的——这是架构问题。

4 层架构

经过 3 个月迭代(从 5 个到 30 个),我最终收敛出 4 层:

各层职责

职责原则
入口层识别用户意图,路由到正确技能快速、确定性、不做业务逻辑
领域层执行业务逻辑(会议/项目/团队/沟通)拥有数据写入权,遵循 SoT
基座层提供底层能力(飞书 API/Git/索引)无业务逻辑,被调用
质量层门禁和验证(执行前/执行后)可中止流程,不做修改

路由:Entry Router 的设计

Entry Router 是最关键也最简单的组件——它只做分发,不做处理

设计决策:路由基于关键词匹配 + 优先级裁定,不用 LLM 做意图分类。原因:

  • 确定性 > 灵活性(用户说"帮我准备 1:1",100% 路由到 team-pulse,不要"可能是...")
  • 快(毫秒级),不消耗 token
  • 可审计(规则表可以 grep 检查)

数据协作:SoT 原则

30 个技能最大的风险是数据不一致。我的解法:

每个事实只有一个写入点(Single Source of Truth)。

规则很简单:

  • meetings/ 的 SoT 是 meeting-copilot(只有它能创建/修改会议实体)
  • people/{account}/README.md 的状态是 team-pulse 管的
  • 其他技能可以追加 log.md(R1 协议),但不能修改 README frontmatter
  • 所有追加必须带 source 标签(谁写的、什么时候)

质量层:Gate 机制

质量层不做业务——它做拦截

在领域技能执行前后,质量层的 Gate 会检查:

Gate 位置谁触发检查什么
执行前spec-audit输入质量:需求是否定义清晰
执行前anti-fabricationAI 是否在硬凑内容
执行后review-validation产出是否符合预期
执行后crystallization结论是否已回写 SoT
执行后artifact-purity产物是否有会话痕迹

关键设计: Gate 可以中止流程。如果 spec-audit 发现需求定义不清,直接中止,让用户补充——而不是"带着不确定性继续执行"。

技能治理:从发现到退役

30 个技能不是一次性设计出来的——是 3 个月渐进式增长的结果。治理靠三个机制:

1. private-catalog.yaml

所有技能的注册表,记录每个技能的:

  • 层级归属
  • 关系图(谁调用谁、谁共享数据给谁)
  • 状态(active / deprecated / planned)

2. skill-scout

发现新需求时:

  • 判断现有技能是否能覆盖
  • 如果不能 → 评估是新建还是扩展
  • 注册到 catalog

3. skill-squadron

编队巡逻——周期性检查所有技能的:

  • 关系图是否完整(缺失的 edge)
  • 是否有冗余功能
  • Gate 覆盖是否充分

关键设计决策

决策选择替代方案理由
路由方式关键词规则LLM intent classify确定性、速度、可审计
数据协作SoT + 追加协议事件总线简单、可 grep 追踪
质量保证Gate 中止事后修复防止错误扩散
治理方式YAML catalog数据库可 git diff、可 review
技能粒度单一职责大而全可组合、可替换

教训

3 个月 30 个技能,最大的三个教训:

  1. 层级边界要刚性 — 基座层绝不做业务判断。一旦破例,就会变成所有技能都依赖的"上帝类"
  2. 写入权必须明确 — "大家都能写"等于"没人负责一致性"。SoT 原则是救命的
  3. Gate 比修复便宜 — 在错误发生前拦住,成本是事后补救的 1/10

最终理解:AI Agent 的能力上限不取决于单个技能有多强——取决于技能之间如何不打架。架构不是让系统变复杂的东西,是让复杂系统依然可控的东西。

Comments