多Agent协同实战:从上下文污染到任务交接的完整指南

发布时间:2026/10/5 12:38:04
多Agent协同实战:从上下文污染到任务交接的完整指南 1. 为什么说让 Codex 一个人包打天下是一场豪赌1.1 上下文污染单 Agent 的天花板如果你至今还在把需求文档、数据库设计、接口定义、前端页面、测试用例一股脑丢进同一个 Codex 会话大概率已经体验过那种诡异的感觉前面明明已经把报表接口的设计敲定了后面让它改一个按钮样式时它却把接口字段也顺手改了明明让它只处理前端组件它却在帮你优化后端逻辑。这不是 Codex 太笨而是上下文污染在发作。拿一个 128k token 的上下文窗口来算笔账一份需求文档可能占 3k-5k一次仓库扫描要吃掉 8k-15k再加上前面十几轮对话累积的问答记录真正留给当前任务决策的空间往往不到 40k。也就是说越干到后面Codex 手里真正能用的工作台越小。它会开始遗忘你早期定的约束开始返回已经废弃的代码模式甚至把两个互斥的需求同时缝合进一个实现里因为它的记忆已经被海量历史会话撑爆了。这个场景就像让同一个服务员同时给十桌客人点菜第一桌要辣、第二桌忌口、第三桌催单、第四桌加菜信息全堆在他脑子里。前十分钟他还能记住谁是谁半个小时后他端上来的菜大概率会串味。单 Agent 不是不能干长任务而是每干一步都要把大量上下文重新加载进窗口代价非常高。1.2 上下文窗口不等于团队配置很多人把上下文窗口理解成模型越强我给它塞的任务就可以越多这个想法恰恰是单 Agent 翻车的根源。上下文窗口只是容量不是组织能力。真正做项目时我们需要的不是一个记性好的全才而是多个职责明确、交接清晰的专才。我举一个实际例子。假设任务是为一个内部工具增加导出 CSV 的功能。这不是单纯的写代码需要先看数据表的字段定义然后确定后端路由再改前端导出按钮还要考虑导出超大的文件时要不要走异步任务。让单个 Codex 全程处理时它会在后端和前端两套逻辑之间来回横跳。它在写 SQL 查询的时候脑子里还挂着前端的 loading 状态它在调按钮交互的时候又被后端返回格式的 bug 干扰。每一次角色切换都不是免费的它需要忘掉上一套项目上下文才能把注意力集中在当前模块上。更麻烦的是环境状态是全局的。Agent 在早期改了一个接口签名后期做前端对接时它自己都不一定记得住。如果你把任务拆给两个独立的 Agent 会话情况就不同了后端 Agent 只需要关心接口契约前端 Agent 只需要按照契约文档写调用两者不需要互相理解彼此的完整背景。当然也要说句公道话单 Agent 在特定场景下依然有不可替代的价值。改动范围在单文件级别、需求非常明确的任务比如帮我给这个函数增加一个重试参数、修复这个数组越界报错让 Codex 一个人干完反而最省事。多 Agent 是为复杂组织型任务准备的不是为了所有场景服务的银弹。1.3 什么时候单 Agent 仍是正确选择我不建议一上来就把所有项目都改成多 Agent那样只会给自己添乱。我的判断标准有三个修改文件数是否超过 3 个、是否涉及跨技术栈、是否需求本身还没收敛。三条都不占的单 Agent 快速解决就好占了任何一条才值得考虑拆人。一个很典型的判断方式是把任务写在一张便签上如果你自己都需要翻四五份材料才能说清要做的事情那单 Agent 几乎没戏。多 Agent 的本质不是把任务分给多个人而是把一个人脑子里纠缠不清的多重职责拆成多个互不干扰的单项职责。想通了这一点后面一切就好办了。2. 多 Agent 协同的三种编排模式2.1 协调者-执行者模式适合大多数常规项目这是我最推荐新手入手的第一种模式也叫星型模式。它的核心是一个中枢协调者负责拆任务、派活、验收成果底下的 Worker Agent 只做被分配的那一件工作做完交结果不负责看全局。举个例子假设要开发一个销售统计报表页。协调者会把任务拆成四份数据库 Agent建一张销售事实表编写初始化 SQL。后端 Agent在backend/app/routes下新增统计接口按天/按产品维度聚合。前端 Agent在web/src/pages下新增报表页面对接统计接口。测试 Agent补接口和页面的关键用例并跑一轮冒烟测试。每个 Worker 只拿到一份简洁的任务书里面写清楚输入、输出路径、完成标准它不需要理解整条业务链路。这样做的好处是上下文互不污染后端 Agent 不会因为看到前端代码而分心前端 Agent 也不会因为数据库表结构改动而怀疑人生。这个模式的瓶颈也很明显协调者是所有信息的汇聚点一旦协调者拆的任务书含糊不清下面所有 Worker 都会跟着歪楼。因此协调者必须花时间把任务书写得足够细——不是把实现细节写死而是把边界、验收标准、依赖关系写死。2.2 流水线模式适合前后端完全解耦的项目流水线模式是一环扣一环前一个 Agent 的输出作为后一个 Agent 的输入。比如生成数据模型 → 生成接口实现 → 生成对接文档 → 生成前端页面。它最适合顺序依赖强、步骤边界清晰的项目。流水线最大的坑是中间任一步出错整个链条都要回滚重来。所以每一步之间必须有一份显式的交付物而不是口头说我改好了。我会要求每个环节至少产出一个独立的文件比如docs/api-contract.md、backend/routes/statistics.py下一个 Agent 被派发任务时输入就是这些文件路径。这样如果后面发现问题可以直接定位是哪个环节的交付物不合格再决定只重跑那一环还是整链重跑。我个人的经验是流水线步骤不要超过 4 步。超过 4 步后错误传播的路径太长排查复杂度和重跑成本都呈指数级上升。真需要那么多步骤应该把部分步骤合并或者改用协调者-执行者模式。2.3 黑板模式适合并行探索型任务黑板模式借鉴了早期人工智能里的共享存储思想所有 Agent 不直接互相通信而是把信息、进度、结论写在一块共享区域黑板上谁需要谁去读。落到工程实践里黑板可以是一份docs/task-board.md文档也可以是 git 仓库里一个共享分支。这种模式最适合做模块边界清晰的并行开发。比如一个项目有独立的用户管理、订单管理、商品管理三大模块三个 Agent 可以并行开工各自在任务板上登记我改了什么、接下来谁需要关注什么。由于模块间几乎没有共享文件冲突概率低并行度很高。但黑板模式对强耦合任务非常不友好。如果两个 Agent 需要频繁修改同一个核心文件黑板上的信息流转根本赶不上代码冲突的速度最终只会变成一场 Overwrite 大混战。因此使用黑板模式前必须先确认模块间的依赖确实被物理隔离了。三种模式的对比我整理了一个速查表方便读者按项目特征做选择模式适用场景核心优点主要风险协调者-执行者需求明确、任务可拆解、步骤多职责清晰全局可控协调者质量决定一切流水线顺次依赖、交付物明确每步可验收错误可定位单点错误会级联放大黑板模块独立、并行开发并行度高自由度大强耦合任务容易冲突3. 实战落地先把角色和交接规范定下来3.1 先定角色再谈工具很多团队处理多 Agent 协同时第一反应是要不要上个框架、用哪个平台。我的建议完全相反先为当前项目定义角色表再决定用什么工具承载这些角色。工具只是容器角色才是灵魂。以我最近做的一个内部数据看板为例我把 Agent 分成四个角色角色职责边界典型输入典型输出需求 Agent梳理非功能需求产出任务清单产品初始文字描述docs/tasks.md架构 Agent划模块边界、定数据契约、定接口签名任务清单、现有代码扫描docs/contract.md实现 Agent按契约编写代码只改指定目录契约文档、任务书对应模块代码验收 Agent跑测试、审查变更、检查回归代码 diff、测试报告验收单/驳回说明注意我把实现 Agent拆成了两个独立会话一个只负责后端目录一个只负责前端目录。很多人会图省事让同一个 Codex 会话兼任前后端美其名曰全栈结果就是上下文污染的高发地。既然拆成两个人不花多少钱为什么不拆清楚呢这里的核心原则是每个 Agent 只拥有一小块世界。它不需要知道别的角色怎么实现只需要知道自己的输入从哪来、输出给谁、完成标准是什么。这个原则贯穿我后续所有的 Agent 配置和任务书编写。3.2 AGENTS.md仓库里的团队章程要让多个 Agent 在同一仓库里协作不打架必须有一份它们共同遵守的规范文件。我习惯把它放在仓库根目录命名为AGENTS.md。这个名字的灵感来自很多项目里的CONTRIBUTING.md但内容是专门写给 Agent 看的而不是给人看的。一份典型的 AGENTS.md 我会写成这样# 项目协作章程 ## 角色与目录边界 - backend-agent只允许修改 backend/ 目录 - frontend-agent只允许修改 web/ 目录 - docs-agent只允许修改 docs/ 目录 ## 工作流 - 开工前先读 docs/contract.md - 每个任务在独立分支 feat/xxx 上完成 - 完成后更新 docs/board.md 的交接记录 - 禁止跨目录改动如有需要先提出契约变更 ## 代码规范 - 遵守项目现有 lint 规则 - 公共函数必须写类型标注 - 新接口必须同步更新 api-contract.md写 AGENTS.md 的过程本质上就是把以前散布在开发者脑子里的默契显式化。我踩过的最大坑是写得太空泛比如请遵循最佳实践。这句话对 Agent 毫无约束力它不知道该查哪份文档、该用哪种模式。只有把它变成机器可执行的边界条件比如只允许修改哪个目录才能真正约束行为。3.3 一个轻量编排器示例CLI 队列 交接单在早期项目里我不建议急着引入 MetaGPT、CrewAI 这类成熟框架它们功能强大但也带来额外的学习成本。我更倾向于用几十行代码写一个轻量编排器直接把 Codex CLI 串起来。这么做的好处是每一步都可控、可日志、可回滚不会被框架的黑盒逻辑绑架。下面是我常用的编排思路用 Python 写了一个最小示例import subprocess import yaml def run_codex(task_file: str, agent_role: str): prompt f你是{agent_role}请严格依据任务书 {task_file} 执行只改动规定目录。完成后更新交接文档。 cmd [ codex, exec, --skip-git-repo-check, -t, 你的模型标识符, prompt ] result subprocess.run(cmd, capture_outputTrue, textTrue) return result.returncode, result.stdout def load_tasks(board_file: str): with open(board_file, r, encodingutf-8) as f: return yaml.safe_load(f) if __name__ __main__: tasks load_tasks(docs/board.yaml) for task in tasks: code, output run_codex(task[task_file], task[role]) print(f[{task[role]}] exit{code}) if code ! 0: print(output) raise SystemExit(任务失败终止流水线)这段代码做的事很简单读取一个 YAML 格式的任务看板遍历里面的任务依次调用codex exec让 Agent 干活。YAML 任务看板的长这样- role: backend-agent task_file: docs/tasks/001-export-api.md - role: frontend-agent task_file: docs/tasks/002-export-button.md - role: reviewer-agent task_file: docs/tasks/003-review.md很多读者看到这里估计会问这跟把任务图省事全丢给它有啥区别区别在两点第一点是每个codex exec是全新的会话上一个任务留下的上下文不会污染下一个任务第二点是每个任务的文件边界都由 AGENTS.md 约束即使某一个 Agent 中途跑偏也只会污染自己的目录不会波及其他 Agent 的成果。这里我不讨论重型框架是因为在项目早期真正卡住效率的瓶颈从来不是编排算法而是任务拆解质量和交接清晰度。等你把上面这套轻量流程跑通了再评估是否引入更复杂的框架也不迟。4. 核心环节实现任务交接与回滚机制4.1 交接单字段设计的思路多个 Agent 协作和多人协作一样成败往往在交接这个环节。让我写的最炉火纯青的就是一份不啰嗦但字段齐全的交接单。每次 Agent 完成任务必须更新对应任务条目包含以下字段字段作用我的填写要求任务ID索引用的唯一编号用task-001这类前缀格式触发条件这个任务为什么现在要做一句话说清楚依赖前置条件输入上下文从哪里读取必要信息必须是文件路径拒绝口头描述期望输出验收的对象文件路径 功能行为验收标准怎样算完成可运行的命令或测试用例变更清单实际修改了哪些文件git diff 里的文件列表遗留风险没解决或不确定的地方有就写没有写无我见过最糟糕的交接单只写一行已完成功能等到下游 Agent 接手时完全不知道改了什么、依赖什么、怎么验证。这样的交接单等于没有交接单。反过来字段太复杂也不好Agent 会花大量时间在写文档上偏离实际编码。真实项目中我一般会把验收标准写成一个具体命令比如pytest tests/test_export_api.py -k export。这样验收 Agent 不需要猜测直接跑命令看结果就行。4.2 分支与回滚策略给 Agent 的探索留安全带多 Agent 协作最怕的一件事是一个 Agent 在探索时大幅修改了共享文件结果导致其他 Agent 的成果被破坏。为了应对这种情况我强烈建议给每个 Agent 分配独立的工作分支。假设三个 Agent 分别负责新增统计接口、新增报表页面、新增测试用例。我要求它们分别在feat/api-statistics、feat/page-report、feat/test-coverage三个分支上开发每完成一个里程碑就往主干合一次并附上交接单摘要。这样一旦主干被某个分支破坏了可以用git diff main...feat/api-statistics快速定位问题分支然后单独回滚它不影响其他 Agent 的进度。如果遇到更棘手的情况比如两个分支都改了同一个公共组件我会用git log --oneline --graph --all查看分叉历史手动裁决哪个分支的改动应该保留、哪个应该重做。这个过程听起来原始但恰恰是多 Agent 协作里最可靠的一环——机器可以帮你干活但合并决策最终还是要靠人来拍板。关于代码回滚我的建议是养成小步提交的习惯。Agent 每次完成一个子任务就提交一次不要攒十个文件一次提交。小步提交的粒度通常控制在半小时以内这样即使某一个 Agent 的行为失控回滚带走的也只是半小时内的工作量而不是一整天的成果。4.3 配置与模型选型的易错点在配置 Codex 时我踩过不少坑这里集中说一下比较容易翻车的地方。第一个坑是认证令牌失效。如果你用环境变量方式传入认证信息在脚本里调用codex exec时常常会遇到auth token is unavailable这类报错。原因是环境变量没有传进子进程或者令牌已经过期。我的排查方式是先跑一下env | grep CODX看环境变量是否存在再单独在终端里跑一次codex exec排除脚本传参的问题。第二个坑是模型标识符不匹配。有些报错会提示model is not supported when using codex with ...这通常是因为定义的模型名在当前 CLI 版本里不存在或拼写有误。遇到这类问题我会用codex --version先确认当前版本再去查这个版本支持的模型列表把模型名统一抽成一个环境变量或配置文件避免每个脚本里各写各的导致排错困难。第三个坑是被忽略的配置项。Codex 遇到不认识或过时的配置字段时可能不会直接报错而是警告ignoring unrecognized configuration setting。这类问题非常隐蔽因为任务看起来照常运行但实际上你精心设置的参数可能没生效。我的做法是在改动配置后立刻跑一个最小化任务验证配置是否被读取而不是直接甩一个大任务。5. 常见问题与排查技巧实录5.1 Agent 互相覆盖文件多开会话的日常灾难很多刚上手多 Agent 的人会开几个 Codex 窗口同时干活结果发现一个窗口的改动把另一个的覆盖了。这个问题的根源不是 Codex 本身而是多个 Agent 共享同一个工作目录都在处理同一批文件git 工作区变成了一个没有锁的共享内存。解决方式参考我在 4.2 节里的分支策略每个 Agent 限定自己的目录和分支。如果只是想快速排查问题可以用git status先看冲突文件再用git diff --name-only列出每个分支实际改动过的文件找出重叠区域。如果是两个 Agent 同时改了同一个文件这种问题靠删除重来是效率最低的。最稳妥的做法是强制规定谁最后合入谁负责解决冲突因为只有最后一个合入者能看到全局状态冲突解决起来不会遗漏。5.2 登录态与令牌排查三步定位法很多人在配置环境时遇到无法加载组织设置或认证信息不可用第一反应就是重新登录。但盲目重新登录往往治标不治本尤其是当你在脚本里调用 Codex 时问题大概率出在环境变量没有正确传递。我总结了一套三步定位法在终端手动登录并确认登录状态正常用env | grep CODX检查环境变量是否存在、值是否正确在脚本里增加一行print(os.environ.get(CODX_AUTH_TOKEN))确认子进程真的能读取到令牌。大多数情况下问题都出在第 1 步和第 2 步之间终端登录状态正常但脚本进程没有拿到令牌。如果是这个问题只需要在启动脚本前统一设置环境变量或者直接在脚本里显式加载环境配置文件即可。5.3 上下文超限与模型不支持配置层面的隐藏炸弹单 Agent 场景下上下文超限的典型症状是对话越长回答越敷衍。多 Agent 场景下有另一种更隐蔽的表现某个下游 Agent 看到的输入已经不是上游 Agent 产出时的原始状态了它会基于不完整的信息做决策产出的代码会和契约文档矛盾。针对这种情况我的建议是宁可多拆两步也不要让单个任务吃得过大。如果一份任务书涉及的文件超过 10 个我通常先让架构 Agent 做一轮简化把任务书压缩到 3-5 个关键文件然后再派给实现 Agent。模型不支持的问题则按 4.3 节里的方式验证模型名和版本匹配关系。5.4 问题排查速查表多 Agent 协作场景的问题多而杂我整理了一张速查表是我自己在项目中反复用到的急诊手册症状可能原因30秒定位命令标准解法两个 Agent 互相覆盖共享目录交叉git diff --name-only分支隔离 目录限定配置项被忽略字段名拼错或版本不匹配codex --version 配置文件 diff对照版本文档修正字段认证令牌不可用环境变量未传递或过期env | grep CODX重新设置环境变量并重登模型提示不支持模型标识符不一致查看完整报错上下文抽成统一配置变量上下文被撑爆任务粒度过大查看任务书涉及文件数拆小任务、增加检查点下游得到过期数据交接单未更新查看交接单更新时间强制每次完成提交后更新这张表的价值不在于每条都精准命中而在于它帮你建立一个排查顺序先看 git 历史再看环境变量再看配置文件最后才怀疑模型本身。大多数问题都出在前三层。6. 我的经验与后续扩展方向多 Agent 协同这件事我做了大半年最大的体会是它真正的价值不在于堆砌 Agent 数量而在于建立清晰的边界和严格的交接协议。一开始我天真地以为只要给同一个 Codex 会话加上一堆角色扮演提示词它就能扮演多个专家协同工作。结果它只是在切换人格时不断失忆出了错都不知道该怪哪个角色。后来改成物理隔离、独立分支、交接单驱动稳定性才真正上来。如果你正在尝试把项目从单 Agent 迁到多 Agent我的建议是从最小的两步拆起先把实现和验收拆成两个独立 Agent其他保持不变。这一步改动最小收益却立竿见影——实现者可以放手写代码验收者可以冷静找问题两者互不干扰。等这条链路跑顺了再逐步增加需求梳理、架构设计等前置角色。我还在继续做的工作是把交接单和任务看板可视化给每个 Agent 的耗时和执行路径打日志。这样当某个任务链出问题时我一眼就能看到是哪一个环节消耗了最多的 token、哪一次交接出现了信息缺失。但这个扩展的前提依然是先把基础交接协议做得足够扎实。框架可以换、模型可以换角色边界和交接纪律才是多 Agent 协作真正的地基。