ENZH

五个 AI 同时干活是什么体验

五个 AI 队友协同工作五个 AI 队友协同工作

十几个文件,一个人根本写不过来

Mio 是我在做的一个 AI 伴侣 Telegram Bot——五个不同性格的 AI 角色,每个都有自己的人格配置文件、记忆系统和对话风格。功能已经跑起来了,但三个大模块一直没做:多模态输入(语音、图片、视频)、增强版 Onboarding(角色预览、自定义故事、用户画像采集)、自拍生成。

三个模块加起来,涉及数据库迁移、新的 media 处理模块、Telegram 文件下载、五个角色的配置更新、onboarding 流程重写、system prompt 改造、selfie 生成管道——横跨三层架构、十几个文件。

以前的话,我会花半天拆任务,然后一个一个写。或者把计划扔给 Claude Code 让一个 agent 串行干——但十个任务串行下来,上下文窗口肯定撑不住。

这次我用了 Claude Code 的 Agent Team。

Agent Team 是什么

简单说:一个 Lead agent 负责协调,多个 Teammate agent 并行干活。每个 Teammate 是一个独立的 Claude 实例,有自己的上下文窗口、能读写文件、能发消息汇报进度。

核心机制:

  • TaskCreate / TaskUpdate:创建任务、设依赖关系、追踪状态
  • TeamCreate:启动 Teammate agent,分配任务
  • SendMessage:Lead 和 Teammate 之间的消息通道
  • 文件所有权:每个 Teammate 只编辑分配给它的文件,不碰别人的

不是"把大任务拆小然后顺序执行"——而是真正的并行。五个 agent 同时写代码,各自 commit,Lead 在中间协调依赖和调度。

十个任务,三批执行

我给 Claude Code 的输入是一份完整的实现计划——三个 Step、九个子步骤、带依赖关系的实现顺序表。Claude Code 先花两分钟探索了一遍代码库,然后把计划拆成了十个任务:

#任务依赖
1数据库迁移(aboutUser, customStory 字段)
2Media 处理模块(transcribe, vision, process)
3Telegram 文件下载工具
4接入 media 管道到 server2, 3
5角色摘要 + 自定义故事 + UI
6Onboarding 增强(故事流、用户画像采集)1
7aboutUser/customStory 注入 system prompt6
8/reonboard 支持切换角色5, 6
9Selfie 生成模块
10Selfie 触发接入9

关键在依赖关系。1、2、3、5、9 是独立的——可以同时开始。4 要等 2 和 3 都完成。6 要等 1。7 要等 6。8 要等 5 和 6。10 要等 9。

一个典型的 DAG(有向无环图),Claude Code 自动识别出了三批并行执行的任务。

五个 Agent,同时开工

第一波,五个 agent 同时启动:

5 agents launched
├─ @schema-migrator     → #1 DB migration
├─ @media-builder       → #2 Media module
├─ @file-downloader     → #3 Telegram file download
├─ @preset-designer     → #5 Preset summaries + UI
└─ @selfie-builder      → #9 Selfie module

每个 agent 拿到的任务描述里包含:要创建/修改哪些文件、参考哪些现有代码、具体的实现规格。更关键的是——每个 agent 只被允许编辑特定的文件。schema-migrator 只碰 schema.tsmedia-builder 只碰 media/ 目录下的文件。

文件所有权是防止冲突的核心机制。

Lead 的显示面板实时更新:

┌─────────────────┬──────────────────────────────────────┬─────────┐
│      Agent      │                 Task                  │ Status  │
├─────────────────┼──────────────────────────────────────┼─────────┤
│ schema-migrator │ #1 - DB migration                    │ Running │
│ media-builder   │ #2 - Media module                    │ Running │
│ file-downloader │ #3 - Telegram file download          │ Running │
│ preset-designer │ #5 - Preset summaries + UI           │ Running │
│ selfie-builder  │ #9 - Selfie module                   │ Running │
└─────────────────┴──────────────────────────────────────┴─────────┘

Lead 不只是派活的

接下来发生的事情让我开始理解"Lead"到底在干嘛。

依赖解除,立刻调度

第一个完成的是 file-downloader——任务简单,一个文件搞定。然后 schema-migrator 完成了。

这一刻 Lead 做了一个关键判断:#1 完成了,意味着 #6(onboarding 增强)的依赖解除了。它立刻启动了第六个 agent:

● Task #1 done. That unblocks #6. Spawning onboarding-enhancer now.

不需要我干预。Lead 持续追踪依赖图,每当一个任务完成,它就检查哪些被阻塞的任务现在可以开始了。

然后 selfie-builder 完成了 #9,Lead 立刻启动 selfie-wirer 做 #10。media-builder 完成了 #2,加上之前已完成的 #3,Lead 启动 media-wirer 做 #4。

整个过程三波推进:

  • 第一波(并行):#1, #2, #3, #5, #9 → 5 个 agent
  • 第二波(依赖解除后):#4, #6, #10 → 3 个 agent
  • 第三波(依赖解除后):#7, #8 → 2 个 agent

并行的代价:噪声

并行不是没有代价的。

这个项目配了 Git hooks——如果一个 agent 空闲但工作目录有未提交的文件,hook 会触发警告。问题是:五个 agent 同时在写代码,每个 agent 只提交了自己的文件,但其他 agent 的未提交文件也在工作目录里。

hook 开始对已完成的 agent 反复报警:

@file-downloader❯ Hook blocks me — uncommitted files belong to other teammates
@schema-migrator❯ Idle — uncommitted files belong to other teammates

Lead 的判断:这是误报。它没有让 agent 去提交不属于自己的文件,也没有关掉 hook——而是识别出"并行工作产生的预期噪声",选择忽略并继续等待活跃 agent 完成。

服务器掉线,Teammate 自己干完了

会话中间出了一件有意思的事:OAuth token 过期了,服务器断连。

❯ continue on this task, server was down
⎿  API Error: 401 — OAuth token has expired

重新登录之后,Lead 做的第一件事是 git statusgit log。它发现工作目录是干净的——说明在服务器掉线期间,最后两个 agent(prompt-wirerreonboard-builder)已经自行完成并提交了。

这是 Agent Team 一个很有意思的属性:Teammate 是独立运行的。 它们不依赖 Lead 的轮询或确认来完成工作。Lead 掉线了,Teammate 继续干。等 Lead 回来,活已经干完了。

最终整合

十个任务全部完成后,Lead 做了收尾:

  1. Typecheck — 运行 pnpm typecheck,发现两个 TS18048 错误(ctx.callbackQuery 可能为 undefined),直接修复
  2. Test — 运行 pnpm test,确认没有新的测试失败
  3. 代码审查 — 检查所有新文件是否存在、导出是否正确
  4. 文档更新 — 又启动了两个 subagent 并行更新文档和 TODO

最终产出:

┌─────┬──────────────────────────────────────┬────────────────────┐
│  #  │               Task                   │      Commits       │
├─────┼──────────────────────────────────────┼────────────────────┤
│ 1   │ Schema migration                     │ 10aa550            │
│ 2   │ Media module                         │ 8aec253, b39551b   │
│ 3   │ Telegram file download               │ f243f20            │
│ 4   │ Wire media pipeline                  │ 620829d            │
│ 5   │ Preset summaries + backstories       │ 3733f3b, e8903da   │
│ 6   │ Onboarding enhancements              │ bd148cc, 90da519   │
│ 7   │ System prompt wiring                 │ 0f94c71            │
│ 8   │ Reonboard with preset switch         │ 3d15317, af668b4   │
│ 9   │ Selfie module                        │ b749684            │
│ 10  │ Selfie trigger wiring                │ 387c378, b02f291   │
└─────┴──────────────────────────────────────┴────────────────────┘

十个任务,十几个文件,三层架构,一个会话。

什么时候该用 Team,什么时候不该

用了几次之后,我的判断标准:

用 Team

  • 有 3 个以上可以并行的独立子任务,且任务之间有明确的依赖 DAG
  • 涉及 3 个以上不同目录或模块的文件修改
  • 单个 agent 的上下文窗口不够完成全部任务

别用 Team

  • 改动集中在 1-2 个文件——直接编辑就行
  • 任务完全串行、没有并行空间——用 subagent 即可
  • 需要深度上下文理解(比如仿真调试那种反复迭代)——Team 的每个 agent 上下文是隔离的,无法共享调试状态

Team 最大的优势不是速度(虽然并行确实快),而是上下文隔离。每个 agent 只需要理解自己负责的那片代码,不需要把十几个文件全读进上下文。Lead 只需要理解依赖关系和最终接口,不需要理解每个文件的实现细节。

这和管理人类团队是一样的道理:好的分工不是为了让每个人干得更快,而是为了让每个人只需要关心自己的部分。

Lead 像一个项目经理

回看这次实战,印象最深的是 Lead 的行为模式。

它不是一个简单的任务分发器。它在做的事情是:

  • 依赖追踪:维护一张 DAG,每完成一个节点就检查哪些下游可以启动
  • 资源调度:完成的 agent 被关闭,新的 agent 在需要时启动
  • 冲突识别:区分"真正的问题"和"并行工作的预期噪声"
  • 断点恢复:服务器掉线后,通过 git 状态重建进度
  • 最终整合:所有 Teammate 完成后,做一轮统一的 typecheck、test 和修复

这些不是写代码的技能。这是项目管理的技能。

我在第六篇里写过:"你才是 Manager"。Agent Team 让这个角色分成了两层:我是 Manager 的 Manager——我定义计划和验收标准,Lead 是项目经理,Teammate 是执行者。

我全程没有审查任何一个 agent 的具体代码,只在最后看了 typecheck 结果。

这是一种新的工作方式。不是"人+AI"的一对一协作,而是"人 → Lead → Teammates"的分层协调。人的判断在最上层——定义做什么、做到什么程度。AI 负责从拆解到执行到整合的全部中间层。

一个计划,十个任务,五个 AI,三波调度。


© Xingfan Xia 2024 - 2026 · CC BY-NC 4.0