单 Agent 不够用了:AI 编程进入舰队模式

摘要:2026 年,不少 AI 编程工具开始从"一个 Agent 帮你写代码"走向"多个 Agent 像一支工程团队一样协同工作"。Cursor SDK 支持子 Agent 嵌套,Claude Code sub-agents 可以 5 层深度,Meta Muse Spark 1.1 原生多 Agent 编排。这篇文章不讲概念,只谈落地:怎么拆任务、怎么隔离上下文、怎么合并结果。附带 Java 后端实战场景和决策框架。

给企业后台系统做认证升级,从 JWT 切到 OAuth2。涉及三个模块:auth、user、gateway。

我把需求丢给一个 Agent,"帮我全部改完"。它吭哧吭哧干了二十分钟,看起来都改好了。跑起来才发现------它在 gateway 里加了个多余的拦截器,把 OAuth2 token 解析了两次;user 模块的 token 校验逻辑根本没改,还留着老 JWT 的代码。我修了几个小时。

这问题不在于模型够不够聪明。在于一个大脑同时管三个模块、六七个文件、还要盯测试和部署------注意力撑不住。

为什么单 Agent 在复杂任务上吃力

2026 年上半年的数据可以参考。SWE-bench Pro------那是需要跨 4 个以上文件、平均改动 107 行的真实任务------目前最强模型得分不到 25%。说明单 Agent 在多文件复杂任务上仍有明显瓶颈。

但这种瓶颈的本质,不是"上下文窗口塞不下"。当前 Claude、GPT、Gemini 的上下文窗口已达 200K 甚至百万 token 级别,代码库本身是放得下的。真实问题是注意力稀释(attention dilution)------模型在长上下文中,后面的内容"看到了,但没真正用上"。它不知道什么时候该看哪个文件,所以就自己猜。

一个 Agent 同时管代码生成、审查、测试、部署验证,注意力迟早被稀释干净。你让它修一个 bug,修到一半它开始改无关文件。你让它重构一个模块,弄到后面连最开始的需求都忘了。

还有效率问题。auth 模块和 billing 模块是两个人可以并行干的活,单 Agent 只能串行,费的是时间。

所以今年以来,不少主流工具开始探索多 Agent 工作流:拆成多个 Agent。

Cursor 在 v2.4(1 月 22 日)引入子 Agent 嵌套------定义一个主 Agent 负责调度,子 Agent 分别负责代码生成、审查、测试,各自独立上下文窗口。Claude Code 在 3 月推出 sub-agents,5 月实现 Dynamic Workflows------一段 JavaScript 编排几百个子 Agent 并行跑,6 月支持 5 层嵌套。Codex CLI 搞了 controller pairing,多个 Agent 实例通过 controller 通信,谁改了哪个文件、谁跑了什么测试,全部透明。

一个值得关注的变化:随着任务复杂度提升,工作流设计的重要性正在超过单次 Prompt 优化------你怎么组织 Agent 的协作方式,比你怎么跟一个 Agent 说话,越来越关键。

三问:怎么拆、怎么隔离、怎么合

多 Agent 不是"多开几个窗口,各干各的"。它需要三个问题的工程解。

第一问:怎么拆任务

拆不好,五个 Agent 比一个更快地把你代码库搞乱。

核心原则是按模块边界切,不按文件名切。给你看一个对比:

❌ 拆法 1------"Agent A 改 auth 模块的文件,Agent B 改 auth 模块的测试"------两个 Agent 会同时碰 AuthService.java,因为改实现和改测试都会动核心类,必冲突。

✅ 拆法 2------"Agent A 负责 src/auth/ 全部,Agent B 负责 src/gateway/ 全部,Agent C 负责 src/user/ 全部"------三个模块,零交叉。

任务描述也得精确到边界。一个好的 orchestrator 提示词长这样:

复制代码
End goal:将认证从 JWT 切到 OAuth2
子任务 1:改 src/auth/ --- 新增 OAuth2TokenResolver,废弃 JwtUtils
   输入:现有 JwtUtils.java、application.yml
   输出:OAuth2TokenResolver.java + 单元测试
   禁止触碰:src/gateway/、src/user/
   成功标准:单元测试全绿,令牌解析延迟 < 50ms

拆完后必须做交叉检查:打开三个子任务的文件列表,看看有没有共享的热点文件(路由表、配置文件、公共注册器)。有重叠就重新划边界。

反面教材:让两个 Agent 同时改 application.yml 里相邻的配置项------你收获的不是并行效率,是一份需要手工消解的合并冲突。

但注意:不是所有任务都适合这样拆。如果是改公共框架、重构基础库、DDD 领域模型改造------这些高耦合场景,拆了也不会变快。merge 冲突、review 带宽膨胀、子 Agent 之间的信息不对称,综合下来可能比单 Agent 更慢。多 Agent 更适合低耦合、独立模块、改动模式重复的任务。

第二问:怎么隔离上下文

文件冲突靠 Git 解决,上下文冲突必须在 Agent 启动前解决。

答案是 Git Worktree------Git 的原生能力,允许同一个仓库同时 checkout 出多个工作目录,各有一个独立分支,但共享同一个 .git 对象库。不需要 clone 五遍代码。

bash 复制代码
git worktree add ../project-auth  -b agent/auth-oauth2  origin/main
git worktree add ../project-gateway -b agent/gateway-oauth2 origin/main
git worktree add ../project-user  -b agent/user-oauth2  origin/main

然后每个 Agent 在自己的 worktree 目录里启动:

bash 复制代码
cd ../project-auth  && claude   # Agent A 只改 auth
cd ../project-gateway && claude   # Agent B 只改 gateway
cd ../project-user  && claude   # Agent C 只改 user

Cursor 做这件事更简洁------子 Agent 设计上就是独立上下文窗口,中间输出(搜索过程、Shell 日志)留在子 Agent 内部,只回传摘要给主 Agent。Claude Code 的 isolation: worktree 参数同理,还会在 Agent 崩溃后通过 supervisor 进程自动恢复。

但上下文隔离有代价。根据 Anthropic 官方文档和开发者社区实测,在不同的模型组合和任务复杂度下,3 个 background session 的 token 消耗约为单线程的 2-4 倍,含编排逻辑的复杂工作流可达 5-7 倍。这个数字不是固定公式------你用的模型、任务耦合度、工具调用密度都会影响最终账单。一条可参考的节流策略是模型混用:轻量模型做 Reviewer(上下文高、输出少、便宜),标准模型做 Implementer,只在 Orchestrator 上用量级模型(需要广域判断)。

多说一句:这里实际上有三个不同层级的东西------Git Worktree 是文件系统层的物理隔离(基础设施层),多 Agent 是执行层的逻辑隔离(工作流层),Harness 是规则层的约束(治理层)。三者常常一起出现,但不是一个概念。Worktree 是多 Agent 的一种隔离手段,不是所有多 Agent 都需要 Worktree;反过来,你可以在单 Agent 下用 Worktree 做干净分支切换,和多 Agent 没关系。分清了再落地,不会乱。

第三问:怎么合并结果

五个 Agent 跑完产出五个分支,这时候最容易翻车------不是 Agent 写错了,是你合错了。

合并只有一条纪律:diff first,merge second,一次只合一个。

操作顺序不能乱:

bash 复制代码
# 每个 Agent 分支合入前
git diff main..agent/auth-oauth2     # 1. 先看改了什么
# 检查:有没有越界改文件?有没有顺手删了别人的配置?
git checkout agent/auth-oauth2
git rebase origin/main               # 2. rebase 到最新 main
# 跑测试
git checkout main
git merge agent/auth-oauth2           # 3. 确认无误后再合
git worktree remove ../project-auth   # 4. 清理 worktree

一次只合一个分支。并行 merge 多个 Agent 分支会制造复合冲突,消解成本远超单独 merge 三次的和。

审查的时候目光锐一点。CI 全绿不代表没问题。真实翻车案例:一个 Agent 实现了 sha256 校验功能,验证逻辑只检查了配置项元数据、没检查实际哈希计算------测试过了,代码上线了,三周后才发现。所以 merge 前至少要过一遍:Agent 有没有越界改文件?有没有"只让测试过、功能没实现"的花招?

Java 后端实战:一场老项目迁移的并行复盘

回翻第 18 篇------那场从 Windows 迁到 Linux、Jacob 换 LibreOffice 的迁移。如果当时有多 Agent,流程可以这样排------不过得先声明:以下是一个可行的探索方案,不是"唯一正确做法"。实际效果取决于任务耦合度。

Orchestrator 提示词:

复制代码
任务:将文档转换模块从 Jacob 迁到 LibreOffice
拆为 3 个并行子 Agent:

Agent A:路径标准化
  范围:src/utils/FilePathUtil.java
  任务:用 java.nio.file.Paths 替换所有硬编码 \\ 和 //
  输出:FilePathUtil.java + 15 个单元测试(Windows/Linux/Mac 各 5 个路径用例)

Agent B:LibreOffice 集成
  范围:src/converter/LibreOfficeConverter.java
  任务:替换 Jacob 调用为 soffice --headless --convert-to
  输出:LibreOfficeConverter.java + 集成测试
  约束:单实例锁用 --user-profile 独立目录

Agent C:批量重转脚本
  范围:scripts/migrate-history.sh
  任务:遍历旧格式文件,批量调新接口重转,校验输出文件哈希
  输出:migrate-history.sh + 重转结果清单

三个 Agent 各开一个 worktree,并行跑。Agent A 改 FilePathUtil.java 时 Agent B 正在搭 LibreOffice 调用链路,互不干扰。跑完后按 diff-first 顺序依次合入 main。

这个场景之所以适合多 Agent,是因为三个子任务的耦合度很低------路径改法和 LibreOffice 集成互不依赖,批量脚本也只是调接口。如果这三个任务是"改同一个公共工具类",就不适合拆。

什么时候开舰队,什么时候别开

不是所有任务都值得上多 Agent。开舰队有成本(token、review 带宽、协调时间),得算账。

应该开多 Agent 的 3 个信号:总改动 10 个文件以上或 3 个模块以上;任务能按模块/目录切分且零共享文件交叉;你有时间做合并后的人工 Review。

不应该开的 3 个信号:只改 1-2 个文件(开 worktree 比改动本身重);强耦合的公共层重构(两个 Agent 必抢同一文件,合并与 review 开销反而让端到端变慢);你不熟悉这块代码(拆都拆不对,Agent 跑偏你也不会发现)。

一个判断原则:满足 3 条"应该开"的信号,再上多 Agent;少一条就老老实实单 Agent。关键不是 Agent 数量,是任务本身有没有可拆的独立子问题。

AI 工程化的核心,不是管理更多 Agent,而是管理上下文(Context)的生命周期。Agent 只是载体,Workflow 是组织方式,而 Context 才是真正需要被规划、隔离、压缩和交接的对象。你开的第一支舰队,从一个 OAuth2 迁移任务开始。

作者:唐悦玮 | 从后端出发,用 AI 拓展到全栈的工程师。

相关推荐
艾斯特_1 小时前
工作流与多Agent协作:LangGraph、MCP和A2A的应用分层
人工智能·python·ai
悟天特斯1 小时前
智慧楼宇AI节能:从数据采集到智能决策的全链路实践
大数据·人工智能
腾视科技AIoT1 小时前
私有云时代来临:AI NAS如何重塑你的数字生活?
人工智能·ai·生活·nas·企业存储·ainas·家庭存储
IT小盘1 小时前
04-大模型流式输出原理-SSE与Python实现
开发语言·网络·人工智能·python
阳光是sunny1 小时前
LangGraph实战教程:预定义状态MessagesState与AgentState
前端·人工智能·后端
网络工程小王1 小时前
【HCIE-AI】11.模型 昇腾迁移适配-精度调试-性能调优
人工智能·学习·华为·迁移学习·昇腾
不如语冰2 小时前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python
科技新芯2 小时前
WAIC首个AI影视专场落地 万兴科技发布多重出海布局
人工智能·科技
日月新著2 小时前
2026年最新!五款高评Agent开源模型介绍:能自主干活的AI来了
人工智能·语言模型