Rick-Brick
Claude Code 实践架构 — 通过 Teams/Subagents 加速开发的设计模式

Claude Code 实践架构 — 通过 Teams/Subagents 加速开发的设计模式

每天使用 Claude Code ,终将遇到“单一会话的瓶颈”。在复杂重构过程中,上下文逐渐恶化,导致提出的建议与之前的判断不符。当大量并行任务堆叠,交互变得迟缓,推理准确性下降。打破这一瓶颈的关键,是利用 Subagents 和 Agent Teams 实现的多智能体设计。

本文面向每日熟练操作 Claude Code 的工程师,全面讲解“为何这种设计有效”的理由以及“如何实践设计”。


1. 为什么需要多智能体设计 — 单一会话的局限

上下文恶化的科学根据

Addy Osmani 在其博客中指出:

“LLMs 在上下文扩展时表现更差”

这不仅是简单的令牌限制问题。当无关信息堆积在上下文窗口中时,模型的“注意力”被分散,推理质量直线下降。长会话中,Claude 提出“与之前判断矛盾的建议”,正是此机制所致。

Anthropic 的多智能体研究也得出类似结论。相比单一 Opus 4 会话,Opus 4 由领导的 Opus 4 和负责子代理的 Sonnet 4 构成的架构,表现出性能提升90.2%。值得注意的是,“升级到更高级模型”带来的改善远不及“切换到多智能体结构”。

研究还发现,令牌用量、工具调用次数和模型选择三因素,解释了 95% 的性能波动。这意味着,试图在单一会话中存放所有任务,将极大恶化这三项指标。

多智能体带来的变化

【单一会话】
 全部上下文(探索、实现、测试与调试)堆积在一个窗口
 → 后半段推理质量下降

【多智能体设计】
 各智能体只专注于“自己负责的领域”
 → 每个窗口始终保持最优状态

2026 年2月推出的 Agent Teams 功能,正是在实践中实现这种架构思想。多个 Claude Code 实例拥有独立的上下文窗口,通过共享任务列表和邮箱协作。


2. 星型拓扑 — 领导/顾问/队友三层架构

设计理念

Agent Teams 最关键的设计决策在于“信息流程的结构”。非扁平的 Mesh 拓扑,而是采用品质优先的Star 拓扑 — 所有信息通过 Leader 传递,避免信息矛盾与散失。

Team Leader (Opus)
    ↕ 查询规格和蒸馏信息
Advisor (Sonnet) ── 阅读并蒸馏设计文档和代码

Teammates (Sonnet × N) ── 专注于实现

Leader 并非信息的汇聚点,而是“信息交汇处”。保持“持有什么信息”、“舍弃哪些信息”的设计,决定团队整体的性能。

Leader 的职责 / 避免职责

Leader 做的事Leader 不做的事
任务拆解 / 依赖管理直接写代码
质量验证(测试 / 类型检查)直读规格文档
给 Teammate 反馈全局理解代码
进度控制 / 瓶颈检测允许 Teammate 之间直接协调

这种 Star 拓扑带来“逆向的强大”。Leader 不读规格书,使得其上下文窗口专注于管理和验证。

顾问层 — 信息蒸馏专家

顾问的角色,本质上就是“信息蒸馏者”。大量规格和代码由其快速读取,只提取 Leader 需要的结构化信息返回。

Leader: “T04 实现的规格、类型定义、DoD 详细说明”

Advisor: 读取 spec/ 后,提取关键信息

Leader: 转发给 Teammates

顾问的限制:只读不写。写操作会破坏信息流的清晰性。

Teammates 的原则

最重要的是“不要读规格书”。虽然直觉相反,但原因明确。

若 Teammates 直接读规格,理解可能因人而异。Leader 通过读出蒸馏信息,确保所有 Teammates 在同一理解基础上实现。

Teammate 的实现原则如下:

  1. 只执行 Leader 指令(无额外功能)
  2. 遇不明点,向 Leader 确认
  3. 完成后,反馈变更文件、测试、类型检查和未解问题
  4. 不要读 spec/ 内文件(由 Leader 传达必要信息)

信息流程约束

【允许的通信】
  Leader ↔ Advisor: 规格查询与蒸馏
  Leader → Teammates: 实现指令与反馈
  Teammates → Leader: 完成报告与提问

【禁止的通信】
  Teammates 之间:不得直接交流(通过 Leader)
  Teammates 与 Advisor:不得直接通信(通过 Leader)
  Leader 直接读 spec/文件:不用,交由 Advisor 处理

为什么这种设计有效

Anthropic 研究表明,“模型选择”对性能影响最大。将 Opus 放在 Leader 位置,Sonnet 多作为 Teammates 并行执行,是成本与效果的理想折中。

Star 拓扑也是“防止信息矛盾”的最小方案,随着智能体数量增加,通信路径指数增长,将其统一集中在 Leader 一点,易于管理。


3. DAG 驱动任务设计 — 并行化的科学

任务使用 DAG 管理

Agent Teams 的任务列表,以**有向非循环图(DAG)**的方式设计,明确依赖关系。

{
  "tasks": [
    { "id": "T01", "name": "认证方案设计", "blocked_by": [] },
    { "id": "T02", "name": "API 接口实现", "blocked_by": ["T01"] },
    { "id": "T03", "name": "前端实现", "blocked_by": ["T01"] },
    { "id": "T04", "name": "集成测试", "blocked_by": ["T02", "T03"] }
  ]
}

T02 和 T03 可以并行执行,T04 等待两者完成。DAG 明确表示依赖关系。

Wave 执行模型

依赖关系定义了任务“Wave”。每个 Wave 独立执行,一方面最大化并行,另一方面确保依赖一致。

示例

  • Wave 1:调研与设计(全部并行)
    • 前端调研
    • 后端调研
    • 测试策略
  • Wave 2:实现(按文件分割)
    • 前端实现
    • 后端实现
  • Wave 3:集成测试(顺序执行)

重点:确保同一 Wave 内的任务没有依赖关系。

任务规模原则

规模问题
太小(<1文件)调整成本过高,不划算
太大(>1周)复查、手工调试困难
适中明确成果,易管理

每个 Teammate 由5-6个任务组成较为理想,有助于保持上下文清晰。

文件锁与冲突避免

在 Anthropic Rust 编译器项目中,采用文件锁机制避免任务冲突。每个 agent 在 current_tasks/ 目录写入锁文件,用 Git 管理竞合。

echo "$AGENT_ID" > current_tasks/task-$TASK_ID.lock
git add current_tasks/task-$TASK_ID.lock
git commit -m "claim: task-$TASK_ID"

这样无需中央调度,即实现分散式任务竞夺。

品质门控自动化

使用 TaskCompletedTeammateIdle 钩子,自动检测任务完成与 Teammate 闲置,实现自动品质检测。

{
  "hooks": {
    "TaskCompleted": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/quality-gate.sh"
      }]
    }],
    "TeammateIdle": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/verify-output.sh"
      }]
    }]
  }
}
#!/bin/bash
# .claude/hooks/quality-gate.sh
set -e
npm test || { echo "测试失败" >&2; exit 2; }
npm run lint || { echo "Lint失败" >&2; exit 2; }
npm run build || { echo "构建失败" >&2; exit 2; }
exit 0

返回 exit 2 即阻断任务,通知 Claude 反馈信息,确保质量要求。TeammateIdle 作用于停止前,发挥“不可停止”的门控作用。


4. 上下文管理的窍门 — 80/20 规则与未来

80/20 规则

上下文管理的核心原则:

在复杂多文件任务中,不使用最后 20%的上下文。

针对 200K 令牌窗口,当达到 83.5%(167K)时,自动压缩生效,推理质量突降。应实时监控令牌使用,70-80% 时手动压缩。

压缩策略 — 何时何如何

推荐压缩时机

  • 主要功能完成后
  • 探索转实现阶段前
  • Claude 重复问问题、之前判断矛盾时
  • Wave 界限点

避免时机:

  • 调试中
  • 复杂重构中(依赖追踪)

子代理隔离探索

保护上下文的有效技艺之一,是将探索任务委托给子代理。

主上下文
  └─ “调研认证模块的现状”
          ↓ 委托
  子代理上下文(独立)
    ├─ 全读 src/auth/
    ├─ 解析测试文件
    └─ 追踪依赖
          ↓ 只返回摘要
主上下文
  └─ “认证模块为 JWT + Redis,关键函数...”

几十个文件的阅读,也能在子代理上下文内完成。主上下文只存摘要信息。

30 分钟冲刺策略

实践中,采用“30 分钟冲刺”管理上下文。每半小时切换一次,任务完成后立即压缩或 /clear。短周期保持新鲜,用更高质量的输出。

Leader 上下文设计

阶段主要信息忽略详情
已完成任务 ID、状态、成果路径细节调试、往返消息
进行中指示内容、进展全部定义(可随时问 Advisor)
待处理阻塞状态、Wave定义描述(随时更新)

强调:Leader 只保持“状态摘要”。详细内容由 Advisor 查询,确保上下文清晰且不会被占用。


5. CLAUDE.md 最优策略 — 300 行预算如何最大化利用

“少即是多”原则

研究显示:最新大型语言模型,指令最多约150-200例。而 CLAUDE.md 已含约50条指令,剩余预算约100-150。

建议:根文件不超过 300 行,理想 60 行以内。

长 CLAUDE.md 反而会使重要规则难以彰显,失去效果。

不写 Claude 已会的内容

避免写“写干净代码”、“别忘了异常处理”等指示。Claude 已经会做,写只浪费令牌。

判断写入内容的方法

  1. 不写则 Claude 还能正常?是,删。
  2. 是否项目特定或 Claude 已知?是,删。
  3. 是否经常变动?变,可写,否则删。

代码风格由 Linter 定义,通过 Hooks 强制

“永远不要让 LLM 执行 Linter 任务。”

格式化、Lint 和类型检查,用确定性工具(Biome、ESLint、tsc)实现。Hooks 自动运行,避免意外差异。

{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{
        "type": "command",
        "command": "npm run lint --fix && npm run format"
      }]
    }]
  }
}

删除 CLAUDE.md 中的风格指令,用此配置,节省成本同时保证质量。

渐进式披露(Progressive Disclosure)

防止 CLAUDE.md 长度膨胀的策略。核心信息写在根文件,“只在特定场合显示链接”。

# CLAUDE.md(限制在60行以内)

## 技术栈
- Astro 5.18.0 + Tailwind CSS 4.2.0 + Cloudflare Pages
- TypeScript 5.9.x(严格模式)

## 常用命令
- 构建:`npm run build`
- 类型检查:`npx tsc --noEmit`
- Lint:`npm run lint`

## 按需详细文档
- API 规范:@.claude/rules/api-conventions.md
- Git 流程:@.claude/rules/branching.md
- 部署流程:@.claude/rules/deployment.md

@路径/文件 用于按需加载,Claude 仅在需要时读取。

分层 CLAUDE.md 体系

~/.claude/CLAUDE.md             # 全局配置
  ./CLAUDE.md                   # 项目级(团队共享)
    ./.claude/rules/api.md     # API规范(开发时加载)
    ./.claude/rules/test.md    # 测试规范(需要时加载)
    src/components/CLAUDE.md   # 组件开发(必要时加载)

子目录内的 CLAUDE.md 只在对应文件处理时按需加载,保持主文件简洁。


本文由 LLM 自动生成,内容可能存在错误。