尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

多Agent协作全栈开发实战:从任务拆解到容器化部署

发布时间:2026/9/26 14:12:00

资讯中心
01
ARTICLE

多Agent协作全栈开发实战:从任务拆解到容器化部署

多Agent协作全栈开发实战:从任务拆解到容器化部署
上个月我带着一个练手项目把“多Agent协作全栈开发”完整跑通了一遍一个内部任务卡片面板前后端加起来两千多行代码交给三个大模型Agent分工完成最后用三个容器和五条命令部署上线。整个过程给我的最大冲击不是“AI会写代码了”而是多Agent协作一旦理顺全栈开发会变成一条非常清晰的流水线需求拆解、后端实现、前端实现、容器化部署每一段的产出物都能被下一段直接消费。这篇文章就围绕这个真实项目展开从技术选型、Agent分工、编排配置到部署上线和翻车复盘完整还原从零到上的过程。它不适合想背某个框架API的人适合那些已经听过“多Agent”这个概念但还不知道怎么把它落到一个真实全栈项目里的人。1. 项目立项为什么选“任务卡片板”而不是博客系统1.1 项目选择背后的三个约束很多人第一次尝试多Agent开发时会选一个类似“博客系统”的经典练手项目。但博客系统的思路太成熟了网上模板一大把Agent就算“抄”也能抄出来根本看不出协作机制的优劣。我当时给项目定了三个约束这三个约束也值得你下次选型时参考。第一个约束是功能必须覆盖完整CRUD链路。创建、查询、更新、删除、筛选这五件事能逼着后端设计出合理的数据模型和接口也能让前端Agent真正处理状态同步问题而不是做个纯静态页面。第二个约束是必须有一个跨端交互的复杂点。我选了“标签筛选状态流转”用户在页面上点一个状态筛选前端要请求后端后端要查数据库数据库要返回关联数据。这样一个简单的交互就串起了完整链路Agent协作时天然需要沟通接口格式。第三个约束是代码量适中但目录结构必须接近真实工程。两千行代码对Agent来说刚好是一天的工作量太少看不出分工价值太多则排查成本高。而这个项目里后端有数据模型和路由前端有组件和API调用层部署有环境变量和容器配置足够还原真实项目的全貌。1.2 需求拆解成Agent可执行的任务清单项目定了之后我没有直接让Agent写代码而是先把需求拆成一份“机器可读”的任务清单。这一步后来被证明是整件事最关键的决策。因为大模型Agent不像人那么“懂事”你告诉它“做一个任务卡片面板”它会给出一个看似合理但你无法控制的实现。我最终拆成了四个层级数据层卡片数据结构、标签数据结构、卡片与标签的多对多关系。接口层创建卡片、更新卡片状态、按标签筛选、查询标签列表。页面层卡片列表展示、筛选栏、新增/编辑卡片抽屉、状态下拉切换。部署层开发环境与容器化环境的差异处理、跨域配置、数据库初始化。每一条任务都标注了优先级和依赖关系比如“更新卡片状态接口”依赖“Cards数据模型”“前端状态切换组件”依赖“PATCH接口格式”。这份任务清单的作用是给Agent定边界让每个Agent只对自己负责的那一段产出负责。1.3 技术栈选定及其理由技术栈的选定原则只有一个让Agent生成代码时“翻车率”最低。我不追求最新最酷只追求生态成熟、文档被语料充分覆盖。后端FastAPI SQLAlchemy 2.0 Pydantic v2。FastAPI的自动文档和类型提示太适合Agent生成了Pydantic的校验模型能让前后端对接时少很多隐蔽问题。前端React 18 Vite Tailwind CSS。Vite启动快、构建简单Tailwind的类名方式让Agent不用纠结写一整套CSS。数据库PostgreSQL 16。不是因为它最轻量是因为它在Docker生态里最标准而且SQLAlchemy对它的类型支持最完备。编排框架AgentScope 2.0后面专门用一章讲配置过程。部署Docker Compose三个容器分别跑前端静态资源、后端接口、数据库。这套组合的好处是每一层都有海量训练语料Agent写出来的代码即便不完美也总是“形似”的后续人工修复成本极低。2. 三个Agent的角色边界从“谁都能写代码”到“各管一段”2.1 单Agent全包为什么不可行我先试过让一个Agent全包整个项目理由是“大模型上下文足够长让它一路写下去就行”。结果问题非常大Agent写着写着就忘掉了自己半小时前定义的数据模型前端组件里硬编码了一个后端根本不存在的时间格式到了部署阶段又和之前写的数据库配置对不上。这不是模型能力不够而是上下文衰减和角色漂移的问题。一个Agent既要想需求又要写数据模型又要调页面样式它的注意力会被不断稀释。人做不到一边做产品经理一边做后端一边做前端还能每个角色都深度在线Agent同样做不到。所以多Agent协作的第一原则是给每个Agent一个足够窄、足够清晰的角色让它在自己的赛道里做到最好。跨赛道的沟通通过结构化的产物来完成而不是靠“记得”。2.2 Planner / Backend / Frontend 的职责契约我最终把开发过程拆成三个Agent外加一个“人机混合”的协调位。三个生产Agent各自对应的职责边界如下角色核心职责典型产出物不负责的事Planner Agent把需求拆成任务单输出数据字典和接口契约PRD、任务清单、API契约文档不写具体业务代码Backend Agent实现数据模型、业务接口、数据库操作数据表定义、FastAPI路由、测试脚本不决定接口字段只实现已定义的契约Frontend Agent实现页面交互、状态管理、API调用封装组件代码、API Client、页面状态逻辑不修改后端接口定义只对齐契约这里有个容易被忽略的点Planner虽然不写业务代码但它反而决定了整个项目的成败。它的产出物是所有其他Agent的“唯一事实来源”。如果Planner说字段叫created_at后端和前端都只能跟着用created_at谁也不能擅自改成createTime。这种“契约先行”的方式直接避免了多Agent协作里最常见的字段各写各的问题。2.3 任务单和接口文档如何充当“交接凭证”Agent之间不直接对话而是通过“交接凭证”完成信息传递。这是我这套流程里最关键的机制任何跨Agent的信息传递都必须落成一份结构化的文档而不是聊天记录。例如Planner给Backend Agent的任务单长这样任务编号T-003目标卡片状态更新接口请求方法PATCH路径/api/cards/{card_id}请求体{status: in_progress}校验规则status必须是open/in_progress/done三者之一返回体更新后的完整卡片对象前置依赖Cards数据模型已完成完成标准curl脚本调用返回200且数据库记录被更新同样Backend Agent完成后给Frontend Agent的“交接凭证”是一份接口调试记录包含真实返回的JSON样例。前端Agent不需要“问”后端字段是什么直接按照JSON样例里的结构写页面就够了。这套机制的建立让我意识到多Agent协作的本质不是“几个AI聊天然后写出代码”而是把工程里的分工和契约抽象成Agent能消费的格式。人怎么协作Agent就怎么协作只是沟通语言变成了结构化文档。3. 多Agent协作的编排配置AgentScope 2.0 的接入全过程3.1 编排框架到底解决了多Agent协作的哪三个问题最开始我考虑过不用编排框架直接用代码手动调多个模型的API来回串。结果发现要处理的东西太多哪个Agent先跑、消息发给谁、输出怎么传给下一个、什么时候需要人来审批、整个流程怎么终止。手写这些逻辑不仅烦而且每次调整都要改代码。AgentScope 2.0这类编排框架给我的核心价值可以压缩成三个词路由、状态、终止条件。路由决定一个Agent的输出往哪儿走。是给下一个Agent还是给人审查还是直接结束。状态所有Agent共享一份当前项目的进度状态避免“后端不知道前端已经改完了”这种信息孤岛。终止条件整个协作流程不能无限跑下去必须定义“什么时候算完成”。理解了这三个词你看任何多Agent框架的配置文档都会轻松很多因为所有框架解决的都是同一组问题。3.2 配置多Agent调用的核心清单我以项目里实际用的AgentScope 2.0为例把配置多Agent调用时需要想清楚的事情列一下。不同版本字段名可能有差异但底层思路是一致的。第一模型接入是基础。三个Agent都走同一个大模型服务但各自的System Prompt完全不同。Planner的系统提示词偏向“拆解和归纳”Backend Agent的提示词强调“遵循契约、写干净的代码”Frontend Agent的提示词则包含UI交互规范和前端框架用法。第二每个Agent需要单独维护一份上下文。Backend Agent不需要知道前端页面长什么样Frontend Agent也不需要关心ORM查询性能。如果让所有Agent共享全部上下文很快上下文就会被无关信息淹没这也是单Agent全包失败的根源。第三消息传递格式最好是结构化的而不是自由文本。两个Agent之间传的不应是“好的我看看下面这个需求”而是“任务ID、接口路径、请求字段、响应字段、完成状态”这种结构。结构化消息可以被校验能被识别状态也能追溯到具体任务单。3.3 消息路由与人工审批节点的实际配置当时我为了落地这套机制把编排配置写成了一份接近下面这样结构的文件。注意字段名以你实际安装的版本为准我这里做的是结构和思路说明# 多Agent协作配置示意结构 agents: planner: role: 需求拆解与任务规划 system_prompt: ./prompts/planner.md next: backend backend: role: 后端接口实现 system_prompt: ./prompts/backend.md next: frontend frontend: role: 前端页面实现 system_prompt: ./prompts/frontend.md next: review review: type: human when: backend完成契约接口或frontend完成页面联调 approve_to: finish flow: start: planner route_map: - from: planner to: backend - from: backend to: frontend - from: frontend to: review这份配置表达的流程是Planner先拆任务Backend按契约实现Frontend消费接口写页面最后人工或半自动的Review节点验收。如果验收不通过我可以手动把任务重新压回给Backend或Frontend形成一个受控的迭代闭环。这套配置看起来简单但实际跑起来之后我才意识到人工审批节点有多重要。如果没有这个节点三个Agent会按照自己的判断无限“优化”下去前端觉得按钮样式不够好看会反复改后端觉得SQL不够高效会反复重构。加了Review节点之后流程变成“完成即可暂停”由人来决定要不要继续深入。3.4 上下文管理的取舍与“减负技巧”配置过程中我踩了一个很深的坑Agent之间的消息传递如果携带完整历史跑到第三轮时Token消耗就会爆炸。比如Backend Agent收到任务单后把整份任务单、自己的所有代码、测试结果一股脑传给Frontend Agent前端那边乍一看什么都知道了实际上有效信息密度极低。我的解决办法是给每个Agent的“输出摘要”加一个模板约束上一轮Agent在向下一个Agent传消息时只允许携带几种字段——本次任务ID、核心决策点、产出物路径、遗留问题。其他调试过程、被废弃的代码版本一概不传。这个“摘要传递”的做法规避了上下文过长导致的模型“失忆”问题而且意外地让整个协作过程更像真实的工程协作——你在公司里给同事交接任务时也不会把半小时的调试日志全部贴过去而是说清楚结论和下一步就够了。4. 一个功能从需求到页面的完整链路卡片功能的诞生过程4.1 Planner 的输出数据字典与API契约我以“卡片功能”为例还原一下三个Agent接力交付的过程。这一步的起点是Planner Agent产出的一份数据字典和API契约。数据字典长这样cards 表id主键、title字符串不超过120字符、description文本、status枚举open / in_progress / done、created_at时间戳、updated_at时间戳tags 表id主键、name字符串唯一card_tags 表card_id 关联 cards.id、tag_id 关联 tags.id联合主键对应的API契约是GET /api/cards?statusopentagabc返回卡片列表支持状态和标签筛选。POST /api/cards请求体含title、description、tag_ids创建卡片后返回完整卡片对象。PATCH /api/cards/{card_id}请求体含status或title更新后返回新对象。GET /api/tags返回全量标签列表。这份契约的意义在于它把模糊的“做卡片功能”变成了一组可以直接写代码的规范。Backend和Frontend Agent看不到对方的大脑但它们共同消费这份契约所以实现出来的东西天然是能对接的。4.2 Backend Agent 写出的数据模型与接口Backend Agent接到任务后需要先建数据模型再写路由。它给出的核心模型大概是这样的from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy import String, Text class Card(Base): __tablename__ cards id: Mapped[int] mapped_column(primary_keyTrue) title: Mapped[str] mapped_column(String(120)) description: Mapped[str] mapped_column(Text, default) status: Mapped[str] mapped_column(String(20), defaultopen)随后是PATCH接口的处理逻辑核心只有两步从路径参数取出card_id从请求体取出新状态更新数据库并返回新对象。我评价Backend Agent的产出标准不是“代码写得有多漂亮”而是“是否严格遵循了Planner的契约”。假如它擅自把created_at改成createTime哪怕代码本身是对的我也会把任务打回去。契约一旦被打破前端Agent就会在联调时收到一份跟文档不一致的返回体然后陷入无休止的“我以为字段是这个”的循环。实测下来Agent在“严格按契约执行”这件事上的可靠性远高于“自由发挥”。4.3 Frontend Agent 的页面实现与自测Frontend Agent拿到接口契约和真实返回样例后开始写页面。我的React项目里有一个API Client层负责把后端接口封装成前端函数例如// src/api/cards.js export async function updateCardStatus(cardId, status) { const res await fetch(/api/cards/${cardId}, { method: PATCH, headers: { Content-Type: application/json }, body: JSON.stringify({ status }), }); return res.json(); }页面组件部分采用了最简单的卡片列表方案顶部是筛选栏中间是卡片Grid右侧是新增和编辑抽屉。Frontend Agent自己写了组件自己调mock数据跑了几轮验证确认拿到的字段和Planner契约完全一致才交付。这里有一个非常实用的经验给Frontend Agent准备好的是“接口已就绪”的假象它只需要专注写页面。也就是说把后端接口的mock返回放在项目里让前端Agent不依赖后端环境就能自测。否则如果前后端并行开发前端Agent会不停追问“接口怎么没通”最后必然开始自己改后端代码——这恰恰是多Agent协作里最不该发生的事情。4.4 联调、冲突回溯与测试当Backend和Frontend的产物都在本地跑起来后就进入联调阶段。这一步我保留了一个完全由人主导的权力只有人可以触发真正的联调并决定是否让Agent修复问题。联调中最常见的问题是“前端传的字段和后端解析的字段不完全一致”。比如前端在更新状态时传的是{ status: in_process }但契约里定义的是in_progress。这类问题几乎无法靠双方的Agent自查发现因为它们各自都认为自己是对的。我的处理方式是把报错信息原样贴回给对应Agent要求它对照契约文档修改。一次只喂一个问题而不是把一整个列表一次性丢过去。实测下来逐个问题的修复准确率几乎百分之百一旦把多个问题打包丢给Agent它就会开始“自作聪明”地猜测哪些该改、哪些不该改反而产生新的错误。联调通过后我会让Backend Agent生成一套curl测试脚本把CRUD和筛选逻辑全部跑一遍。这一步的意义不是“看它测没测”而是“让契约实现的正确性有一个可重复验证的载体”。哪天部署完出了线上问题这套脚本就是第一道排查工具。5. 部署上线三个容器五条命令从零跑通5.1 为什么坚持容器化而不是直接装环境本地开发的时候我们直接在宿主机上跑Python和Node服务一切顺利。但是“从零到上线”包含了另一层问题别人或另一台机器拿到这套代码之后能不能快速重现同样的环境。不容器化的方式很简单直接但需要手动安装Python、PostgreSQL、Node还要处理版本冲突、系统差异。容器化最大的价值不是“多了一个Docker概念”而是把环境本身变成了代码你第一次部署时踩过的所有环境坑都已经被封装在镜像构建过程里下次执行就是确定性的结果。这个项目正好做了三层拆分天然适合三个容器PostgreSQL负责数据存储、FastAPI负责业务逻辑、前端静态资源由Nginx容器托管并提供反向代理。每一个容器只承担一个职责日志分开、扩缩容互不影响、配置显式清晰。这也是当前多容器部署最主流的形态。5.2 Compose 规划的关键细节健康检查和反向代理Docker Compose文件是整个部署的核心我重点说两个容易翻车的细节。第一个是数据库健康检查。如果后端容器先启动数据库还没就绪后端进程会反复重连然后崩溃。Compose里用depends_on只能保证顺序不能保证“数据库真的能接受连接”。正确做法是在db服务里加healthcheck让api服务等数据库健康后再启动services: db: image: postgres:16-alpine environment: POSTGRES_USER: myapp POSTGRES_PASSWORD: myapp POSTGRES_DB: cardflow volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: [CMD, pg_isready, -U, myapp] interval: 5s timeout: 3s retries: 10第二个是前端的反向代理配置。前端容器本质上是一个Nginx它对外暴露8080端口同时把/api开头的请求反代到后端服务。这样浏览器里所有请求都指向同一个源不用处理跨域问题部署体验非常干净。Nginx里只需要写一条location规则location /api/ { proxy_pass http://api:8000; proxy_set_header Host $host; }容器间的服务名api就是Compose里的服务名直接当成域名来用。这个配置方案比让前端直接请求另一个端口的API要优雅得多跨域不存在、端口暴露少、部署结构统一。5.3 五条命令从拉代码到服务全部起来的完整流程整个部署过程我最终压缩成了五条命令任何一台装了Docker的机器都可以复现git clone https://your-repo/cardflow.git cd cardflow cp .env.example .env docker compose up -d --build docker compose ps docker compose logs -f api web第一条是拉代码第二条是进入项目目录并生成环境变量文件第三条是构建镜像并启动全部三个容器第四条是确认容器状态是否为running第五条是实时盯日志看有没有启动报错。第一次执行时大概率不会一次通过。最常见的报错有三个数据库端口被本机占用、后端连不上数据库导致启动后自动退出、前端构建时依赖拉取超时。前两个都好解决第三个可以通过给镜像构建配置国内npm镜像源规避。这套流程跑通之后我再也不担心“换个机器就起不来”的问题了。Dockerfile和Compose文件本身就是部署文档它有唯一性不会像手写部署文档那样出现“文档和实际操作不一致”的经典问题。5.4 上线后必须验证的几个关键点服务起来之后不能只看“容器是running”就宣布大功告成。我每次都会做四步验证缺一步都会留下隐患。第一步是验证数据库表是否自动创建成功。这个项目里我让后端启动时执行Base.metadata.create_all适合快速验证但正式项目要换成Alembic迁移脚本。第二步是验证前端静态资源能不能正常加载以Nginx返回200且页面有内容为准。第三步是验证API反代通路直接执行curl http://localhost:8080/api/cards看能不能拿到JSON数组。第四步是验证写操作随便创建一张卡片、改一次状态、再从列表刷新确认数据持久化。这套验证串起来基本就能覆盖一个全栈项目从“服务进程活着”到“业务功能真正可用”的完整链路。很多人上线只看到了进程没挂结果一打开页面发现前端调后端全是404就是少了中间那几层验证。6. 协作翻车的现场复盘与规范沉淀6.1 场景一两个Agent同时改同一个文件引发的覆盖灾难最开始的版本里我没有给Agent划分“目录所有权”。结果Backend Agent为了给前端提供方便直接在React代码里加了个调试入口Frontend Agent为了验证接口直接把某个后端路由的返回给硬编码成mock。两个Agent同时动了彼此的领地最后合并代码时满屏冲突谁也说不清哪个版本才是对的。复盘之后我给协作流程加了条铁律每个Agent只拥有自己目录的写权限跨目录的修改一律通过任务单申请由人审批后才允许执行。这个权限既可以是Agent配置里的文件访问限制也可以是人在Git层面的分支保护策略。没有物理隔离所谓的角色边界就是一句废话。6.2 场景二Agent“忘掉”了前文的项目约定在开发第5个接口时Backend Agent忽然在返回体里用了驼峰命名createTime但Planner契约里明明确确写的是created_at。它并不是故意违反而是上下文里的信息太多最初的字段约定被后续大量代码讨论给淹没了。这让我意识到Agent的记忆不可靠时不能靠提示词里的“记住”来解决而要靠外部化的规范来解决。比如把字段契约单独放在一个contracts/目录里每次开发新接口前先让Agent读取对应的契约文件比如在提交模板里强制要求填写“本次变更对应的契约编号”。任何你不希望Agent忘掉的事情都应该落成一个文件而不是落成一句“你记住了吗”。6.3 多智能体AI Agent协作开发规范沉淀经过这几轮翻车我把这套多智能体协作方法沉淀成了一页可复用的检查清单也分享给你API First接口契约先于任何代码存在前后端Agent只消费契约不自由发挥。任务单携带上下文编号每个Agent的每次修改都必须关联对应的任务单编号否则无法追溯。目录所有权隔离不能让两个Agent同时拥有同一个目录的写权限。摘要化消息传递Agent之间只传结构化结论不传完整调试历史。人工审批闸门关键节点接口完成、页面联调通过必须有人工确认禁止Agent无限制“优化”。自动化测试兜底后端至少要有curl脚本测试前端至少要有手动验证步骤这些测试要随时可跑。这套清单不是理论是从实际翻车和修复里一个字一个字抠出来的。你下次用多Agent协作做全栈项目时可以先拿这份清单做一轮评审看看自己的流程里哪些环节还缺闸门。我再补充一个个人感受多Agent协作开发真正能跑通的前提是“工程规范足够强”而不是“模型足够聪明”。项目里每个Agent用的模型能力当然很重要但最终让流程稳定的恰恰是那份看起来不起眼的契约文档、目录权限和人工审批节点。我试过把规范删掉只靠模型自觉结果第二天就翻了车。把Agent当成一群能力很强但记性很差的实习生这才是多Agent协作最靠谱的心智模型。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。