更新于

Codex 多 Agent 任务拆分边界


多 Agent 的价值不是“多叫几个人一起想”,而是把原本串行的等待时间压缩掉。任务拆得好,代码搜索、方案比较、独立模块实现和测试补齐可以同时推进;任务拆得差,多个 Agent 会重复读同一批文件、争抢同一个配置,最后由主 Agent 花更多时间解决冲突。

OpenAI 官方文档将 Multi-agent 描述为由根 Agent 创建并协调多个 subagent,再综合结果。官方同时提醒:它适合具体、独立的工作流;对依赖单一顺序推理、频繁写共享可变状态,或主要耗时集中在一个外部操作上的任务,收益可能有限。本文不绑定某个界面按钮,而是把这个原则转成日常编码可执行的拆分边界。

一、先判断瓶颈能否被并行化

不要从“能开几个 Agent”开始,而要先画依赖关系。若 B 必须读取 A 的输出、C 又必须读取 B 的输出,即使把三步分别交给三个 Agent,它们仍只能排队。真正值得并行的是同一层中的独立节点。

任务形状是否适合多 Agent原因
分别探索前端、后端和测试结构适合读取范围独立,结果可汇总
比较三种互斥技术方案适合假设与证据可分开维护
在三个互不重叠模块补测试适合写入所有权可明确划分
连续修改同一个核心函数不适合后一步依赖前一步代码
一次数据库迁移通常不适合共享状态且失败代价高
等待同一条 CI 完成不适合瓶颈是单一外部操作

一个简单判断是:假设其中一个子任务晚十分钟完成,其他子任务能否继续并产生有效结果?如果答案是否定的,这些工作并不独立,应保留在主线串行处理。

二、探索可以按问题拆,不能只按目录拆

“你看前端、你看后端”有时过于宽泛。目录边界并不一定对应问题边界:认证逻辑可能同时分布在路由、中间件、数据库和前端状态中。更好的委派方式是一条可证伪的问题,例如“找出 access token 从签发到校验的完整路径,并列出相关文件与入口函数”。

每个探索任务需要四个元素:问题、范围、期望证据和停止条件。示例:

目标:定位订单重复创建的所有可能入口。
范围:只读 src/api、src/jobs 与数据库 schema。
证据:文件路径、函数名、调用关系、去重键位置。
停止:覆盖 HTTP、重试队列和定时任务三个入口后返回。

这种写法让不同 Agent 可以分别查入口、数据约束和日志证据,又不会都写一篇泛泛的“系统架构总结”。主 Agent 汇总时也能判断证据是否互补,而不是比较三份措辞不同的同义答案。

三、写代码必须先分配文件所有权

多个 Agent 共享工作区时,最危险的不是 Git 冲突提示,而是没有提示的语义覆盖:一个 Agent 改了类型,另一个仍按旧类型实现,文件可能都能合并,整体却已经不一致。因此写入型委派必须明确所有权。

理想边界是互不重叠的文件集合,例如 Agent A 负责 src/auth/,Agent B 负责 tests/auth/。若两个子任务必须修改同一个 barrel export、路由表或 schema,先指定唯一所有者;其他 Agent 只返回建议或补丁说明,由所有者统一落地。

所有权还要包含“不得做什么”:不要顺手格式化全仓库,不要回退别人刚出现的改动,不要重写共享 lockfile,不要为了让局部测试通过而修改另一位 Agent 的模块。并行窗口越长,这些约束越重要。

四、上下文应按最小充分集传递

把主会话全部历史复制给每个 subagent 看似稳妥,实际上会增加干扰。子 Agent 应拿到完成任务所需的最小上下文:目标、相关规则、候选文件、接口契约和验收命令。与它无关的讨论、失败尝试和其他模块细节可以省略。

但“少给上下文”不能变成省略硬约束。项目的 AGENTS.md、目录级规则、安全边界、用户明确禁止的动作,必须随任务传递。若需要修改接口,还应提供消费者清单或要求先查找调用方,避免局部实现正确、系统集成失败。

上下文的另一条边界是决策权。可以让子 Agent 收集事实、实现明确组件,但涉及跨模块权衡、公共 API 变化和破坏性迁移时,应由主 Agent统一决策。否则多个 Agent 会基于不同假设各自“优化”。

五、依赖型工作采用波次,而非全量并发

复杂功能往往不是完全并行或完全串行,而是分成几波。第一波并行探索,第二波由主 Agent确定接口,第三波并行实现独立组件,第四波统一集成与验证。这种“并行—收敛—并行—收敛”比一次性派发全部任务稳定。

Wave 1: 代码路径探索 | 风险审计 | 测试现状

Gate 1: 主 Agent 确认方案与接口

Wave 2: 模块 A 实现 | 模块 B 实现 | 独立测试

Gate 2: 集成、全量测试、diff 审查

每个 Gate 都要产出可检查的事实,而不是“大家都完成了”。Gate 1 至少固定接口、文件所有权和验证方法;Gate 2 至少确认所有结果已合并、没有越界修改、全量测试通过。

六、哪些任务应坚持单 Agent

小改动不值得支付协调成本。修改一个文案、修一个定位清楚的条件分支、更新单一配置,通常由一个 Agent 完成更快。需要反复读取同一份长文并保持一致语义的工作,例如重写核心协议,也适合单一上下文连续推进。

频繁写共享状态的工作更应谨慎,包括数据库 schema、依赖锁文件、全局路由表、统一类型定义和发布版本号。可以并行进行只读评审,但最终写入应有一个所有者。生产发布、删除数据和外部通知也不应因多 Agent 而分散授权判断;这些动作仍需清晰的单点审批与审计记录。

调试时也不要机械并行。如果只有一个稳定复现路径,先由一个 Agent 缩小故障范围;当出现多个独立假设,例如缓存、并发和序列化都可能是根因,再分别验证。过早并行会让每个人都从零复现,浪费相同时间。

七、主 Agent 的工作是集成,不是转发

subagent 返回“完成”不是验收证据。主 Agent需要读取关键 diff,确认修改范围,运行跨模块测试,并处理结果之间的矛盾。若两个探索结论不同,应回到文件、日志或测试,而不是用多数票决定。

建议要求每个子任务返回固定结构:结论、证据、修改文件、已运行验证、未解决风险。实现任务还要说明是否观察到他人并发改动。这样主 Agent可以快速识别缺口,不必从长篇过程叙述里寻找关键事实。

衡量多 Agent 是否有效,至少比较端到端耗时、总 token 或计算消耗、重复探索比例、冲突数和一次集成通过率。并发降低了墙钟时间但让集成返工翻倍,并不一定是成功。官方资料也明确指出,多 Agent 可能增加 token 使用量,团队应以代表性任务实测,而不是默认“越多越快”。

八、一个可复用的拆分检查表

派发前逐项确认:子任务是否有独立输入与输出;是否能在其他任务失败时仍产生价值;写入文件是否互斥;共享接口是否已经固定;是否提供了项目规则;完成条件能否由命令或证据验证;是否指定了回传格式;主 Agent是否保留最终集成责任。

如果其中“文件互斥”“接口固定”“独立产生价值”有任意一项不满足,先改成只读探索或放回主线串行处理。多 Agent 的边界本质上不是角色数量,而是依赖、状态和所有权是否清晰。

九、相关阅读

需要在多 Agent 工作流中统一调用不同模型时,YoTradeApi 可提供兼容常见 SDK 的 API 接入方式,便于集中管理鉴权与用量。