ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

一个人3个AI Agent,3周交付企业系统:全流程拆解与踩坑实录

一个人3个AI Agent,3周交付企业系统:全流程拆解与踩坑实录 过去这些年我接过不少企业项目常规节奏是4人团队排2个月工期最后还要留一周缓冲。结果这次我接了一个内部管理系统合同上写着“4人团队2个月交付”而我实际是一个人3个AI Agent辅助3周就做完了。不是标题党也不是把半成品扔出去是在验收会上当场演示客户那边愣了半天才说“你们进度有点快”。先说清楚背景这是一个中小型企业的客户管理系统包含客户档案、跟进记录、订单状态、报表统计、权限管理五个核心模块。客户原本找了一个4人开发团队报价说要60天因为要前后端分离、移动端适配、还要对接财务接口。后来项目转到我这边我评估了一下决定用3个AI Agent分工协作把全流程压到3周。这篇文章把我怎么拆任务、怎么调Agent、怎么绕坑、怎么保证代码质量全部写出来后面还有实测踩坑记录希望能给正在折腾AI写代码的人一点参考。1. 项目整体拆解与思路转变1.1 传统团队为什么需要2个月先别急着嘲讽传统团队慢。这个项目的真实复杂度其实不低业务上要区分销售、主管、管理员三种角色权限控制不是简单的前端隐藏而是后端接口拦截订单状态有创建、待支付、已支付、售后、完成五个节点每个节点的流转规则还不一样报表模块要看本月销售额、客户转化率、跟进频率要对时间字段做统计。光这几个点涉及前后端交互、数据库设计、接口规范对新手团队来说确实需要时间来磨。而且传统4人团队2个月的排期里有大量等待成本需求梳理一周UI设计一周后端开发三周前端开发同步三周联调一周测试一周改Bug再要几天。中间沟通、会议、评审、返工真正写到代码里的时间占比不大。我当时算了一笔账如果能把需求梳理和代码生成交给AI把联调和测试变成自动流程主流程开发实际只需要10个工作日左右。剩下5天做数据填充、权限验证、部署上线。所以我觉得3周是一个极限但可行的目标。1.2 用AI Agent替代的不是“人”而是“沟通延迟”很多人误解AI Agent写代码就是让ChatGPT生成一堆代码然后人肉改。如果你真的这样用会发现效率提升有限因为同样要投入大量时间在理解AI生成的内容上。我这次的打法完全不同AI Agent在我这里不是纯代码生成器而是有角色的协作成员。我定义了三个Agent规划Agent负责把需求拆成任务产出接口设计、数据表结构、测试用例清单。它的作用是替代传统“产品架构师”那部分沟通成本。编码Agent负责实现具体功能按模块生成代码、数据库迁移脚本、单元测试。它替代的是传统开发人员的重复编码工作。审查Agent负责审视代码质量检查SQL注入、权限漏洞、状态漏洞、重复代码并给出重构建议。它替代的是传统review环节中的人类专家。这三个角色之间会有信息流。规划Agent输出的接口文档是编码Agent的输入编码Agent生成代码后审查Agent又会对代码开“体检报告”再把报告反馈给编码Agent修。我相当于一个“项目经理最终负责人”只在关键节点介入。1.3 为什么敢接这种紧急项目有人可能会问这种项目风险太大了如果AI不靠谱怎么办我的判断依据有三条一是系统复杂度虽然模块多但业务逻辑并不涉及复杂的算法和未知技术栈主流框架完全能兜底二是我自己熟悉这个业务领域知道关键风险点在哪三是AI Agent的短板是“幻觉”和“上下文遗忘”但我可以通过任务切片和测试用例来对冲。如果你对业务不熟或者系统有很强的领域知识壁垒我劝你不要轻易套这个模式。AI适合的是“开发人员懂业务AI加速编码”的情况不是“AI替你做业务流程决策”。2. 三个AI Agent的角色定义与选型2.1 规划Agent——把需求变任务清单规划Agent我用的是基于大语言模型的任务拆分工具用LangChain搭了一个小流程输入一个需求描述我写清楚业务规则它会输出用户故事、数据结构建议、接口草案、风险点。说白了我让它做的是一个初级架构师的工作。这里有一个核心技巧你要给规划Agent喂“上下文”。不能只说“做客户管理系统”要说“有一个客户表字段包括姓名、电话、所属销售、创建时间每次跟进要记录沟通内容、时间、下次跟进日期订单状态流程是……”这种细节越具体它输出的设计越靠谱。如果一开始什么都没有就直接让它生成它只会给你一份看似完美但落不了地的泛泛而谈。我实际用它在1小时内生成了整个系统的数据表设计大概19张表还有40多个接口草案。里面有些字段命名不统一我花了半天改但比我从零开始写要快很多。更关键的是它把接口的入参出参都列出来了后端的编码Agent能直接按这个写。2.2 编码Agent——按接口文档写模块编码Agent我用的是一套基于上下文感知的自动编码工具配合Spring Boot MyBatis Plus。我没有让它直接生成整个项目而是一个模块一个模块来。每个模块给它的上下文包含三样东西规划Agent产出的接口定义、已有的实体类和Mapper、以及这个模块的业务规则描述。编码Agent平均10分钟生成一个模块的后端代码包括Controller、Service、Mapper、DTO、实体类甚至还包括基础的单测。但我不会直接信任它的输出每次生成完我都会让审查Agent先跑一轮再人工抽查。前端部分我不能完全依赖AI因为UI交互的细节AI生成的经常不符合预期。我的策略是让编码Agent用Vue3 Element Plus生成页面初稿包括表格、表单、弹窗、分页这些常见组件然后我自己调整样式和交互细节。这样前端的工作量被压缩到大概25%。2.3 审查Agent——用“第三方视角”盯质量审查Agent是我这次最意外的一个亮点。它不只是检查Bug而是会像资深工程师一样分析代码有没有安全隐患和逻辑漏洞。比如在订单流转的代码里它指出“支付回调接口没有做幂等处理可能导致重复回调时订单状态被覆盖”这个问题我确实没第一时间想到因为在开发时容易默认回调只发生一次。审查Agent的工作方式是把代码片段和对应的需求描述一起给它让它找差异。它可以发现“需求说管理员能删除任何客户但接口里只检查了登录状态没校验角色”这种权限漏洞很致命。我审查Agent采用的也是LangChain把大模型包装成自动化Review流程。每次编码Agent完成一个模块我就把这个模块的所有代码和需求描述打包发给审查Agent让它输出“问题清单严重级别修改建议”。我再决定哪些复核、哪些反馈给编码Agent重写。2.4 三个Agent之间怎么配合一个最小协作流我把整个工作流固定成了一套可复用的流程后面做其他项目也直接套。整体是这样的规划Agent产出《需求规格简述》和《接口设计文档》。编码Agent读取《接口设计文档》按模块生成代码。审查Agent读取代码和需求输出审查报告。如果报告里有严重问题我把它反馈给编码Agent要求修改。修改完成后审查Agent复测直到通过。我每完成2到3个模块跑一次整体联调确保模块间没有接口冲突。这样做最大的好处是每个Agent只做自己最擅长的部分不给它太多自由发挥的机会。AI最怕的是上下文太长太杂所以你一定要把它圈死在单一任务里。3. 核心实操把AI Agent真正“开进”项目里面3.1 需求向Agent“翻译”的方法很多人在AI面前不会提需求要么太宽泛要么太零碎。我给Agent输入需求时会整理成一种“规则化”的结构类似这样模块客户管理 功能点新增客户 业务规则 - 客户手机号必填且校验11位 - 同一个销售下不能存在同名客户 - 创建后自动发送一条欢迎短信调用系统通知服务 - 权限要求登录用户即可新增但客户所属人默认为当前用户 接口POST /api/customer这种格式是“机器可读人可读”的中间态。规划Agent能直接提取关键信息编码Agent也能直接按照这个规则写业务逻辑。如果你只是扔一段自然语言“我要一个客户管理功能”生成的代码很有可能会缺掉校验、缺掉权限因为AI会自动脑补一套它认为合理的规则。还有一点心得要把“例外情况”也告诉Agent。比如订单删除功能需求是只能删除状态为“已取消”的订单如果你不写明Agent生成的删除接口很可能不管状态直接delete。这种就是典型的AI幻觉导致的逻辑漏洞光靠提示词很难完全避免所以在需求描述阶段就要把约束写死。3.2 上下文管理与任务切片AI不“断片”的关键所有用过AI写长代码的人都知道上下文一长它就忘了前面说啥。你让Agent一口气写10个接口它大概率写到后面就开始风格漂移甚至重复定义变量。我的解法是强制“一次一个模块每个模块只包含必要信息”。以客户模块为例我会给编码Agent这样一个上下文块模块名称CustomerController、CustomerService、CustomerMapper数据库表结构只贴customer表相关字段和索引相关依赖已存在的BaseController、Result封装类接口定义规划Agent输出的那部分Customer接口业务规则就是上面那段规则化描述加起来大概300到500行文本不超过大模型的上下文窗口一半。这样它输出代码时能保持专注。你会发现只要你控制好上下文长度AI生成代码的质量会直线上升。还有一个小技巧在每次任务最后附一句“请严格按照接口文档中的字段命名不要自行新增或修改字段”。这句话能防止AI给你塞一堆多余的DTO字段省掉后面大量的对齐麻烦。3.3 让编码Agent按项目规范生成代码项目团队里一般都有开发规范比如类名后缀、返回结构统一、异常要抛业务异常而不是裸返回null等。这些规范你需要用“给Agent立规矩”的方式写进系统提示词里。我建了一个项目级约定文档每次编码Agent开工前都会让它先读一遍。这个约定文档我给它起了个名字叫“PROJECT_CONTRACT.md”里面包含以下内容项目使用的框架和版本统一响应类CommoResult 所有接口返回这个结构校验方式不能直接手写if用Validated 自定义注解日期格式统一为LocalDateTime不允许用DateService层必须处理事务涉及多步更新的方法加TransactionalController里不允许有业务代码只做参数接收和调用Service日志统一用Slf4j关键操作记录操作人和时间有了这份契约编码Agent生成的代码风格基本统一。审查Agent也拿这份契约当标准很容易就能发现违反规范的代码。这一点非常重要因为如果AI生成的代码风格和团队不统一后面维护就是灾难。3.4 我用LangChain怎么编排Agent我对三个Agent的编排不是手动在网页上点来点去而是用LangChain搭了一个简单的流水线这样每个任务都是自动流转的。核心结构就是一个LangGraph定义的状态图一个状态对象存当前任务、上下文、代码、审查结果。然后通过节点函数把数据从规划Agent传给编码Agent再传给审查Agent。我简单说一下这个Graph节点的处理逻辑不会贴全部代码但你可以用相似思路搭自己的编排。核心部分大致是这样的from langgraph.graph import StateGraph, END class AgentState(TypedDict): requirement: str design_doc: str generated_code: str review_report: str status: str def planning_node(state: AgentState): design planning_agent.generate_design(state[requirement]) return {design_doc: design, status: designed} def coding_node(state: AgentState): code coding_agent.generate_code(state[design_doc]) return {generated_code: code, status: coded} def review_node(state: AgentState): report review_agent.review_code(state[generated_code], state[design_doc]) return {review_report: report, status: reviewed} def decide_next(state: AgentState): if 严重 in state[review_report]: return coding_node return END graph StateGraph(AgentState) graph.add_node(planning_node, planning_node) graph.add_node(coding_node, coding_node) graph.add_node(review_node, review_node) graph.add_edge(planning_node, coding_node) graph.add_edge(coding_node, review_node) graph.add_conditional_edge(review_node, decide_next)这只是一个伪流程实际我还会在里面加上任务队列和结果持久化。这样做的好处是我不用盯着每一个任务看完规划文档后就直接跑到下一个模块去做新的事情编码和审查会在后台跑。你说AI Agent怎么扛并发其实Agent编排本身也需要考虑并发我的方式是针对不同模块开多个Graph实例并行每个实例处理一个模块同时最多跑3个避免上下文串台。3.5 前后端联调与并发问题很多人担心AI Agent写出来的接口不能直接跟前端对接因为字段名对不上。这个问题我事先做了预防规划Agent产出的接口文档同时给前端编码Agent和前端页面生成用前后端都用同一个数据字典。我在项目里定义了一个字段映射表比如客户对象里的customerName前端展示叫“客户名称”后端字段就是customerName页面组件直接绑定这个字段。联调阶段我让审查Agent额外做了一件事检查后端接口的入参对象和前端表单提交的对象是不是一致。实际上AI生成的前后端代码经常会出现“前端传了userName后端接收的是username”这种经典翻车原因就是两个Agent各自生成了命名。后来我在规划阶段把所有字段统一成驼峰并在接口文档里强制规定这个坑才彻底消失。并发问题也要提前想好。客户的系统虽然并发不高但报表查询和大批量导出会有隐患。我给编码Agent的要求是列表查询强制分页报表统计走单独的只读数据源大导出用异步任务防止接口超时。我让审查Agent专门检查这个点最后确实发现AI生成的一个统计接口没分页直接把全表拉出来了如果数据量大一点服务器直接卡死。这个必须靠人工和Agent双重把关。4. 测试、排错与上线的实战记录4.1 用AI生成测试用例和自动化测试我在这3周里最大的感受是AI写代码的速度其实还可以但真正让人崩溃的是写测试。传统团队里很少有人愿意写测试但项目要想快就必须让测试也自动化。我让规划Agent在生成接口文档时同时生成每个接口的边界测试用例列表。例如新增客户接口测试用例包括正常新增、手机号为空、手机号格式错误、重复新增同销售下同名客户、未登录调用、普通用户新增客户后userId是否正确等。这个列表比开发本身还重要因为它是检查AI代码的依据。编码Agent生成的单元测试都很基础主要验证正常路径边界情况基本覆盖不到。所以我会把规划Agent的测试用例列表直接发给审查Agent让它对照代码判断“这些边界情况代码里有没有处理”。审查Agent没有发现的问题我再从测试用例列表里挑几条手工用Postman跑接口验证。这个过程听起来很繁琐但实测每个模块额外花的时间不到2小时却能把质量拉到上线的水平。我用的测试工具有个值得提的地方让Agent写单测的时候不要让它用Mockito去Mock一切。因为过度Mock会导致测试代码测试的是Mock对象逻辑而不是真实行为。我强制要求数据库相关用真实H2内存库文件依赖用临时目录外部接口统一打桩。这样单测才有价值。4.2 那些典型的AI生成Bug和修复方法踩坑是必然的我挑几个有代表性的问题你可以当避坑指南看。第一个问题AI喜欢在循环里查数据库。比如生成客户列表时它会在for循环里逐个查每个客户的订单数这样性能奇差。我审查Agent最初没标出来是我在查看逻辑代码时发现的。解决方案是让编码Agent改成分组批量查询在SQL里用IN (?)一次查出所有订单数再组装。第二个问题状态枚举散落各处。AI在写订单状态时一会儿用数字1、2、3一会儿用字符串字符串“PAID”后来在接口文档里强制定义了枚举类OrderStatus并规定所有代码里引用枚举不允许直接写数字。改了之后逻辑清晰很多。第三个问题事务边界不对。生成“新增订单并扣减库存”的代码时AI把扣库存放在了事务外面导致如果扣库存失败订单数据会残留。排查这种问题很耗时间。后来我的审查Agent会把所有Service方法里涉及多表更新的代码都列出来我人工逐个确认是否有事务。第四个问题异常吞掉。AI生成的catch块经常是log.error或者干脆空着导致错误根本发现不了。我立了一个规矩不允许catch后不处理必须抛业务异常或返回错误码。审查Agent也会专门查“空catch块”。4.3 部署与上线Agent给出的运维建议靠谱吗部署环节我也用了AI。我让规划Agent生成一份部署手册包括服务器要求、JDK版本、MySQL配置、Nginx反向代理、systemd服务配置。它给出的建议比较通用但好在没有致命错误。有一点要注意AI对生产环境的网络端口、防火墙规则、备份策略是不了解的这些地方我会自己根据经验来定不让Agent自动操作。尤其不能因为方便就让AI帮你拼数据库连接串或者把密码写进配置文件。这个项目里我在配置中心里用了环境变量注入数据库密码、Redis密码、短信接口密钥全部不落代码和配置文件。审查Agent也会检查代码里有没有硬编码密钥这个在现代企业项目里是底线。上线前我做了两轮数据迁移第一轮从开发库导一批假数据测试流程第二轮由客户提供脱敏后的演示数据导入验证。整个过程我用编写好的迁移脚本脚本是编码Agent生成的我审了一遍。说实话如果是核心交易类系统我不建议用AI生成的脚本直接操作生产库但这个项目业务量不大脚本内容只是insert和update风险可控。4.4 验收演示让客户相信3周能上线验收当天我先准备了一份自动化测试报告展示所有接口测试通过然后按客户核心流程走了一遍新建客户→添加跟进记录→创建订单→修改状态→查看销售报表。整个过程没有卡顿权限验证也正常。客户原来的项目经理很惊讶问我们是不是提前就做过这个项目。我说没有是团队效率高。当然我也留了后手承诺一个月免费维保有问题48小时内响应。这种项目不敢说绝对没坑但是有测试用例兜底加上业务逻辑并不复杂后续Bug率确实低。目前上线运营了三周客户反馈只有一个非核心字段显示错误很快就修掉了。5. 常见问题与排查技巧实录5.1 上下文丢失导致Agent“失忆”怎么办这个问题排在所有问题之首。我在第三周开始处理报表模块时因为涉及的表非常多编码Agent开始出现字段名混淆甚至把客户表的主键id当成订单表的外键customerId来用。排查时发现是它生成代码时忽略了我在上下文里给的表结构。应对方案有两个一个是把所有表结构的公共部分抽成一个“schema.md”每次生成前让它先读另一个是当发现Agent开始混淆时立即拆分任务把它移出到上下文之外只给它当前模块相关的表。还有一点很微妙Agent在长上下文里会“遗忘”最早的信息但同时也会过度关注最新信息。因此每个任务的结尾都不要放关键约束关键约束要放在最前面。5.2 AI幻觉代码里出现不存在的API编码Agent偶尔会“发明”一些不存在的类库方法比如给BasicResultAspect.class.newInstance()这种不存在的东西。虽然不多但每次出现都很头疼因为编译不通过。我的解决方式是用编译错误反推直接把报错信息丢回给编码Agent让它修复。编码Agent通常能自己改正。我还遇到过一次更隐蔽的情况它引用了项目里根本不存在的CommonUtils.isPhone()但代码编译通过了。为什么因为它自己创建了一个CommonUtils类里面的方法也是它自己编的。这种自给自足的幻觉最麻烦因为它会把原本统一的工具变成两个实现。解决办法是让编码Agent“只能用我指定包路径下的类”不能在代码里创建新的工具类。5.3 AI开发项目时安全红线要明确用AI不等于把安全交给AI。我在审查Agent的检查清单里加了几个硬性规则不允许SQL直接拼接字符串必须用参数绑定。不允许使用SELECT *。所有Controller接口必须校验权限除登录接口外一律要求Token。密码存储必须用BCrypt。文件上传必须限制扩展名和大小。日志里不打印手机号、身份证号等敏感信息。这些规则大多数Agent都知道但你不提醒它它经常会“偷懒”。比如密码加密有些AI会生成MD5加盐说这是合理的但现代标准就是BCrypt。我在项目启动第一天就让每个Agent强制读“SAFETY_RULES.md”并在审查流程里逐条核对。5.4 常见问题速查表问题现象可能原因我的处理方式同一个字段被定义成两个名字上下文里表结构信息缺失统一schema.md生成前强制加载接口一直报404Agent生成的URL前缀不一致检查Controller的类级RequestMapping按文档统一分页查询重复数据ORDER BY的字段不是唯一键强制加order by主键或时间id组合数据库表锁死事务范围过大长时间操作未提交拆分事务只对必要的写操作加事务生成代码用错Java版本没有在上下文明确JDK版本在PROJECT_CONTRACT里写死版本号前端调不到后端Session跨域配置缺少allowedOrigins审查Agent检查跨域配置与拦截器排除列表这些问题都是真实发生过的如果你在开发中也遇到类似的可以对号入座。6. 对AI Agent交付模式的深度复盘6.1 这种模式适合什么项目不适合什么项目3周做完一个原计划2个月的项目这件事能成立有前提。这个系统属于典型的“CRUD密集型”企业应用模块多但逻辑简单业务规则清晰没有复杂算法和强领域知识。AI Agent在这种场景下非常擅长批量输出基础代码、测试用例和文档效率能领先传统模式3到4倍。反过来如果项目涉及复杂的并发分布式事务、多人协同编辑、实时流计算、或者需要深度行业经验比如金融风控策略、医疗诊断规则AI Agent目前只能当辅助工具不能当主力交付角色。因为这类系统的难点不在写代码而在做出正确的架构决策和业务权衡AI目前还没有这种“判断力”。我个人的判断标准很简单如果这个模块的代码可以“看着需求直接翻译”那就适合交Agent如果必须先想清楚“为什么这么设计”那就不要交Agent要人工先想透。6.2 人在这个流程里的核心价值在哪可能有人觉得我用AI之后人就没啥事了。其实不是。AI能做的事情是让代码生成和测试执行变快但人至少要承担这么几个工作需求决策客户说“要能查看所有订单”你要决定哪些角色能看、能不能导出、时间范围怎么选。这个Agent做不了。架构边界哪些模块要拆开、哪些数据要独立存储、是否需要消息队列。虽然Agent可以建议但最终拍板的人要承担责任。质量兜底审查Agent的审查报告并不一定全对它偶尔会把正确代码误报为Bug。我需要在最后做人工抽检不能全信。客户沟通项目进度怎么同步、怎么协调客户验收、怎么处理“客户自己也说不清楚需求”的情况。这种软技能AI替代不了。我在项目期间每天会花半小时浏览当天生成的代码重点看Service层、SQL、权限注解、事务逻辑其他代码交给Agent自查。这样既保证项目质量又不至于累成狗。如果有人跟你说AI能全自动开发企业项目不用人工看代码那我建议你离这种人远一点。6.3 给想尝试AI Agent开发的人几点建议第一从小项目开始练手别一上来就拿生产项目试验。你可以先做一个内部工具比如一个库存登记系统或者一个会议室预订模块跑通“规划Agent — 编码Agent — 审查Agent”的流程再上企业级项目。第二把Agent做的每一件事都留痕。我通过Log记录每个任务消耗的token、耗时、输出每次代码生成都做快照。这样如果后面出现问题可以快速回退到上一版本不会因为AI乱改导致代码失控。其实Agent生成的代码版本管理非常重要我用Git做了一个专门分支Agent每次提交都会自动commit这样我随时能看diff。第三一定要给Agent设“边界”。我给三个Agent各写了一份角色行为公约里面明确“不能做什么”。比如编码Agent不能修改全局配置文件、不能擅自新增依赖库、不能改数据库字段审查Agent不能只提出意见不给出修改方案。这些边界能显著降低AI自由度带来的失控风险。第四预算和成本要控制好。用AI生成代码不是免费的尤其是多个Agent编排调用token消耗量会非常大。这次项目我在API调用上大约花了600多块钱换来的是省下2个月的开发成本。对于企业项目来说肯定值但如果你做小项目要注意控制prompt长度避免浪费token。7. 最后再聊一点我的真实感受我做了三年多的AI辅助开发这次3个Agent交付一个企业项目算是我比较成功的一次完整实践。说实话AI Agent没有传说中那么神它更像一个“很聪明但偶尔会走神的实习生”你把任务分得越细它表现越好你让它自由发挥它就给你整出各种烂摊子。但正是这种“像实习生”的特质让我觉得AI Agent特别适合当成团队里的编码主力用只要你把需求和边界定义清楚它就能给你交付一个80分的东西剩下20分靠人补齐。这次项目中规划Agent生成的设计文档、编码Agent写出的接口、审查Agent揪出的权限漏洞给我省下的时间保守估计有30多个工作日。如果你也想尝试用AI Agent交付项目我的建议是先从一次“小步快跑”开始选一个10天左右能完成的模块配一个规划Agent、一个编码Agent、一个审查Agent然后把你的业务流程当成测试数据跑一遍。等你真正跑通这套流程你会感受到那种一个人顶一个小团队的爽感。这个能力在2026年会成为越来越多独立开发者和中小团队的标配。我能用3周做完你也一样可以。
返回列表