上个季度我接了一个内部使用的数据看板项目,需求说大不大,说小也不小:要对接三个业务系统的数据,做清洗和聚合,提供实时看板和每日定时报表,前端还得支持非技术人员自助配置指标。按我以前的习惯,这种项目从需求梳理到上线,少说也得三到四周,每天泡在IDE里敲代码,中间还要应付需求变更、联调、部署环境这些破事。但这一次我换了个思路,全程用AI来端到端交付,从需求文档、架构设计、SQL编写、前端页面、后端接口、测试用例到Docker部署,几乎没手写几行业务代码。项目最终提前一周上线,整体代码量大概六千多行,我亲手敲的估计不到两百行,其余都是AI生成的,我只做审查、调整和集成。
这篇文章我就把整个过程摊开讲,包括我用了哪些AI工具、怎么设计人机协作的流程、每条关键提示词长什么样、AI生成的代码怎么保证质量、以及踩过的那些坑。如果你也准备用AI去交付一个完整项目,这篇文章应该能帮你少走很多弯路。
1. 为什么敢让AI端到端交付一个项目
1.1 先说清楚这个项目到底是什么
这个项目是一个运营数据中台的前端展示层加报表系统。核心功能大概有四块:第一,接入三个不同来源的业务数据库,每天凌晨定时抽取数据;第二,对原始数据进行清洗和聚合,比如去除重复记录、按维度汇总、计算同比环比;第三,通过Web界面展示趋势图、排行榜和关键指标卡;第四,支持用户在界面上自定义指标公式,并生成日报和月报的PDF导出。
整体的技术栈是我和AI一起定的:后端用Python FastAPI,数据库用PostgreSQL,缓存用Redis,定时任务用Celery,前端用React加Ant Design,部署用Docker Compose。为什么选这套组合?因为FastAPI写API效率高,自带OpenAPI文档,AI训练语料里对这种组合的覆盖密度非常大,生成的代码质量明显比冷门框架高。这个选择对后续整个流程的顺利程度起了决定性作用。
1.2 我评估过风险,而且留了后手
说完全不担心是假的。AI写代码最大的问题不是“写不出来”,而是“写得很像但跑不起来”,尤其是跨文件的接口对接和复杂业务逻辑。所以在开工之前我就定了几条原则:
- 所有AI生成的代码必须经过我的人工审查,不允许直接合入主干。
- 每个模块必须先让AI写测试,再写实现代码,至少保证核心函数有测试覆盖。
- AI只负责实现,不负责做技术决策,遇到架构分叉点必须停下来问我。
- 我保留随时手动介入的能力,关键模块的代码量控制在可读范围内,防止AI生成过于抽象的封装。
这些原则不是限制AI的发挥,而是给我的工作流兜底。我见过太多人把提示词一贴,生成的代码直接粘进项目,结果线上出了事故还不知道问题出在哪。用AI交付项目的核心,不是“把活扔给AI”,而是“建立一个能让AI稳定产出、同时人能有效监督的流水线”。
1.3 我对“端到端”的理解
有人觉得端到端就是从写第一行代码到项目能跑起来,但我认为真正的端到端交付必须覆盖“需求澄清—系统设计—代码实现—测试验证—部署上线—文档交付”整个链条。这次我刻意让AI参与了每个环节,包括需求文档拆解和部署脚本编写。
比如需求阶段,我没有自己写PRD,而是把和业务方的聊天记录、会议纪要、零散的Excel表头一次性丢给AI,让它帮我整理成结构化的用户故事和验收标准。这个过程中的核心体会是:AI能不能做出高质量的需求分析,取决于你给它的信息的完整度,以及你后续对产出物的审校能力。别指望AI能凭空猜出业务规则,它只能把你给的信息变成更规范的形式。
2. 工具链选型和协作模式设计
2.1 我实际用到的AI工具清单
这次项目我用了四个主要工具,分别负责不同环节,它们之间形成了互补关系:
| 工具 | 承担角色 | 使用场景 |
|---|---|---|
| ChatGPT / Claude | 架构咨询与需求分析 | 整理PRD、设计数据模型、讨论技术方案 |
| Cursor(内置AI) | 主力编码环境 | 生成后端接口、前端组件、SQL查询逻辑 |
| GitHub Copilot | 内联补全 | 在Cursor生成结果上进行微调、变量重命名、小函数补全 |
| 自建脚本 + AI API | 批量任务处理 | 让AI批量审查代码风格、生成测试数据、做合规检查 |
这里面我特别想强调一下多AI协作的意义。不同模型擅长的方向不一样,Claude在长上下文和代码审查上表现很好,ChatGPT在整体架构讨论上更稳,Cursor的AI在IDE里对项目上下文理解更强。我经常做的一件事是:让Cursor生成完一段代码后,复制到Claude里做一次“第四方代码审查”,让Claude从安全性、边界条件、代码风格三个角度挑毛病。这比我自己逐行读代码要高效得多。
2.2 为什么不用一个AI全干到底
很多人问,为什么不直接用一个Agent从头跑到尾?我试过,但结论是现阶段完全自动化不现实。单Agent在上下文窗口内可以完成单一任务,但跨模块协作时经常出现“忘记需求”“重复生成同类代码”“生成与已有代码风格完全不同”的问题。
我这次采用的是“人做导演、AI做演员”的模式。项目的整体架构、模块拆解、接口约定、任务优先级由我定,AI负责在每个具体任务里发挥。任务的粒度被控制在“一个API端点”“一个React组件”“一条复杂SQL”这个级别,每个任务都有明确的输入和验收条件。这样即使AI偶发生成错误代码,我也能快速定位和修正,不会出现“整个模块重写”的灾难。
2.3 我设计的三级质量门禁
为了确保AI产出的代码不会带崩项目,我在流程里设置了三级质量门禁:
第一级是前置上下文检查。每次给AI派发编码任务前,我必须提供一个完整的任务卡,里面包含需求描述、相关接口定义、数据表结构、返回示例、验收标准。缺任何一个信息,AI就开始猜,一猜就会出问题。
第二级是自动化测试门禁。所有AI生成的业务逻辑代码,必须先配上单元测试。我用pytest组织测试用例,要求AI生成的每个函数都必须覆盖正常路径、异常路径和边界值。没有测试的代码我一律不合并。
第三级是人工抽查门禁。虽然我不逐行看代码,但我会重点检查几个风险点:数据库连接是否泄漏、权限校验是否遗漏、敏感信息是否被硬编码、异常是否被吞掉。这四个点是历史上AI代码最容易翻车的地方。
我算过一笔账:设计这三级门禁大概花了两个半天,但整个项目过程中的返工率至少降低了一半。如果你打算用AI交付项目,我强烈建议你在项目一开始就建立这套机制,而不是等AI代码出问题后再补救。
3. 核心环节实操:我是怎么一步步交付的
3.1 需求澄清:把聊天记录变成PRD
项目开始时,业务方给我发了一段七十多字的语音,加一张Excel截图,加几条微信零散留言,大意是“我们要看一下每天的转化情况,最好能按渠道分,以前那个报表太慢,领导想看实时的”。这种需求在真实世界太常见了,模糊、口语化、隐含大量未说出口的细节。
我没有急着写代码,而是把已有信息全部贴给AI,然后用了这样一套提示词框架:
你是一名熟悉数据产品和Web系统的高级产品经理。下面是我们业务方提供的原始需求碎片,请帮我整理成一份结构化的PRD,包含以下内容:背景与目标、用户角色、核心功能列表(标注优先级P0/P1/P2)、每个功能的详细描述、数据指标定义、页面原型文字描述、验收标准、疑问清单。对于信息不足的地方,请用[待确认]标注,不要自行假设。
AI输出的PRD出乎意料地完整,甚至帮我把“转化情况”拆成了“整体转化率”“渠道转化率”“分时趋势”三个角度,还列出了可能需要业务方确认的十个问题。我拿着这份PRD和业务方开了一个小时的会,确认了八个问题的答案,补上了两个之前根本没提到的维度(新老客拆分和地域维度)。
这一步给我的启示是:AI做需求整理的价值不在于替你思考,而在于把散乱信息结构化的速度极快。它的前提是你得把原始材料尽量完整地投喂给它,同时你有足够的判断力去筛选和纠正它的输出。如果原始需求是几句话,AI最终给你的PRD大概率也存在大量“幻觉式补充”。
3.2 架构设计:让AI做选择题,我来做决策
需求明确后,下一步是架构设计。我没有直接让AI说“给我设计一套架构”,因为那样得到的答案全是教科书模板。我采用的方式是把约束条件全部列清楚,让AI在约束范围内提供方案对比。
我当时给的约束包括:团队目前只有我一个开发;部署环境是一台4核8G的ECS;数据量预估是每天新增50万条记录;用户总数不超过30人;不需要复杂的实时流处理;开发周期只有两周。然后让AI比较三种方案:单体FastAPI应用加Celery、微服务拆分成数据服务和API服务、引入ClickHouse做OLAP查询。
AI给的对比表格非常清晰,从开发成本、运维复杂度、查询性能、扩展性几个维度分析了一轮。最终我选了方案一,加了一层物化视图和Redis缓存来应对查询性能问题,理由也很简单:这个项目最核心的瓶颈不是技术方案多高级,而是我必须用两周时间交付一个稳定可靠系统。ClickHouse很好,但我没有时间去维护第二个数据组件。
在这个过程中,我最大的体会是:AI适合做“方案枚举和利弊分析”,但最终决策必须由人来做。AI不会知道你的团队现状、运维能力、客户关系,这些是决策中最重要的隐变量。我见过有人完全听AI的推荐,选了一套三天都搭不起来的技术栈,回头怪AI不靠谱,其实是把决策权让渡错了。
架构设计阶段的产出物是四份文档:系统架构图说明、数据模型设计(共12张表)、API接口清单(共28个端点)、部署方案。这些文档全都由AI生成初稿,我审查修订后作为后续编码任务的唯一依据。这保证了所有AI生成的代码能对接到同一套设计蓝图上,不出现“各写各的”的混乱。
3.3 数据模型和SQL:让AI处理脏活累活
数据模型设计是这次AI表现最亮眼的环节之一。原始数据有三个来源:一个MySQL库、一个SQL Server库、一个CSV文件每日导入。这三份数据的字段命名和类型完全不同,比如“用户ID”在MySQL里叫user_id,在SQL Server里叫MemberID,在CSV里叫“会员编号”。我要做的就是把它们统一到PostgreSQL里的一张宽表。
我把三份数据的样例各抽了100条,连同字段说明表一起交给AI,要求它设计一套ETL映射规则。AI不仅给出了字段映射关系表,还帮我生成了大部分清洗SQL,包括去除重复、统一日期格式、处理NULL值、金额单位换算(有的系统存分,有的系统存元)。这部分SQL如果我自己写,大概需要一整天,AI加我审校三小时就搞定了。
但这里也有一个很大的坑:AI生成的SQL会在边缘情况下出错。比如它生成的去重逻辑用的是ROW_NUMBER() OVER(PARTITION BY ...),逻辑本身没问题,但我测试时发现有一个业务系统的同一个订单会被两个系统分别记录,导致事实上的“重复”是业务合法的,不能简单去重。这种业务知识AI不了解,只能靠人发现。
所以我的操作习惯是:AI生成SQL后,我一定要在真实数据样本上跑一遍,并且自己构造几个极端情况测试。比如把日期字段传成NULL、金额字段传成负数、来源系统传一个不存在的ID,看SQL会不会炸。AI写SQL的时候很少会自己考虑这些异常输入,审查时你必须把它当成一个刚入职的新人,既要用它的生产力,又要给它的产出做质检。
3.4 后端开发:用任务卡驱动AI生成接口
后端有28个API端点,我是按模块分批让AI生成的。每个模块开工前,我会准备一份“任务卡”,里面包含以下内容:
- 功能描述:这个接口解决什么问题,面向什么调用方。
- 请求方法、路径、参数格式(参考已有的OpenAPI规范)。
- 数据表结构:字段名、类型、索引、关联关系。
- 返回结构:统一封装的JSON格式(code、message、data)。
- 异常处理要求:什么情况返回404,什么情况返回400,什么情况返回500。
- 性能要求:预估调用频率、允许的最大响应时间。
- 测试用例要求:至少三个用例,覆盖正常、异常、边界。
举一个具体例子。我需要一个“查询渠道趋势数据”的接口,任务卡里会写清楚:GET /api/v1/trend/channel,参数有start_date、end_date、channel_id、granularity(day/week/month),返回过去一段时间每天的PV、UV、订单量、GMV。然后AI在Cursor里生成对应的路由函数、查询逻辑、参数校验和响应序列化代码。
这个模式下,AI的成功率非常高。大部分接口一次生成就能通过基本测试,偶尔会有一些小问题,比如参数校验漏了枚举值范围、时间参数没有处理时区、分页参数没设上限。这些问题都在人工审查阶段被拦截了。整个过程里我真正动手敲的代码,大概只有几个接口的权限校验装饰器,因为业务方要求不同角色只能看不同渠道的数据,这个权限模型很复杂,AI生成的版本我改了三轮才满意。
3.5 前端开发:AI写组件,我负责交互规范性
前端部分是React加Ant Design,页面数量大概十二个。坦白说,AI写前端组件的能力比我预想的强,尤其是布局工整、功能标准的表单和表格页面。我的做法是先让AI按照设计稿的文字描述生成页面骨架,然后我再逐页检查交互细节。
举个例子,指标配置页面需要支持用户拖拽字段、设置聚合方式、保存配置。AI生成的初版能跑,但下拉框在选项过多时没有搜索功能,表单校验提示的文案不统一,时间选择器默认值容易出闭环问题。这些问题让我一处处改,反而耗时不少。后来我学乖了,在每个前端任务卡里,额外加上一行“交互细节要求”:所有下拉选项超过10个必须支持搜索,所有时间选择器必须包含快捷范围选项,所有删除操作必须弹确认框,所有loading状态必须用骨架屏而不是转圈。
把交互规范写进任务卡之后,AI生成的前端代码质量提升非常明显。这个经验也适用于后端:与其返工让AI修单个问题,不如在任务卡里把“组织级的约定”写清楚,让AI从一开始就按照这些约定写。
3.6 测试与部署:让AI自己给自己找bug
我自己一直有个观点:AI写代码,那就要让AI同时写测试。这次项目中,每个后端功能模块都对应一个测试文件,全部由AI生成。我重点检查的是测试有效性,也就是测试到底有没有真正覆盖到风险逻辑,还是说只是跑了一遍“快乐路径”。
AI生成的测试里有很多无效用例,比如只验证了函数能跑通,没验证返回值正确性。我要求AI在每个测试用例的断言里,必须有具体的期望值,而不是只断言result is not None。这个要求执行后,测试质量上了一个台阶。最终项目的核心模块测试覆盖率从最初的67%提到了89%,已经达到上线标准。
部署脚本也是AI写的。Dockerfile、docker-compose.yml、nginx配置、环境变量模板、数据库初始化脚本,这些东西AI熟得不能再熟。我只做了一件事:把ECS的硬件配置和联通性约束告诉AI,让它调整了worker数量、内存限制、超时时间这些参数。
关于参数,我插一句具体的计算过程:机器是4核8G,后端进程预留2G内存,PostgreSQL预留3G内存,Redis预留512M,还剩大概2.5G给Celery worker使用。我让Celery每个worker最大内存限制为1G,并发数设置为2,同时叠加了连接池上限20、数据库最大连接数50。这些数字都是我和AI反复对过资源预算后定的,过程中AI负责计算和选项罗列,我负责拍板。
整套容器启动后,我在测试环境跑了两天模拟数据,确认定时任务稳定、内存没有持续增长、慢查询数量在合理范围后,才切了正式流量。
4. 踩坑实录:AI项目交付中的典型问题与对策
4.1 AI幻觉:它义正言辞地生成了不存在的函数
这是我遇到最多的问题类型。有一次AI写了一个数据导出功能,用了pandas的to_excel方法,并加了一个engine参数叫'xlsxwriter',看起来挺专业,但实际运行直接报错。原因是我项目里安装的是旧版pandas,xlsxwriter引擎没有启用。AI不会主动检查你当前环境的依赖版本,它只会按照训练数据里的“常见版本”生成代码。
解决这个问题的方法是:要求AI在生成代码的时候标注依赖版本,并主动检查requirements.txt。具体来说,我会在任务卡里加上一句“在生成代码前,请先查看项目根目录的requirements.txt文件,确保你使用的库函数与当前版本匹配”。另外,运行报错时把完整traceback喂给AI,它会自己意识到用了不存在的函数或错误参数。
4.2 上下文丢失:任务一多,AI就“失忆”
多轮对话中,AI经常在前面记住了需求,后面就忘了。比如数据看板首页要求“只显示昨天及之前的数据”,AI在第三轮写趋势图时还记得,写到第五轮的下载功能时就不管了,直接允许导出全部历史数据。这就是典型的上下文丢失。
我的对策是使用一个“项目约定文档”,放在项目根目录的docs/project_conventions.md里。所有跨模块的全局约束,比如时间口径、权限规则、金额精度、分页大小、状态码风格,全部写在这份文档中。然后在每张任务卡的结尾都附上一句:“如果没有特别说明,请严格遵守docs/project_conventions.md中的约定。”
这个办法非常奏效,把AI的短期记忆问题转化成了长期检索问题。AI每次生成代码前都会先读项目文档,相当于给它建了一个“外接硬盘”。
4.3 过度工程化:AI总想给你造一个框架
AI生成代码时有一个隐蔽的毛病:喜欢引入新的抽象层。有一个小的数据转换函数,本来十行if-else就搞定了,AI非要写一个策略模式,定义了三个接口类和一个工厂类。它把简单问题复杂化的能力,有时候比人类还强。
遇到这种情况,我的处理原则是:只要AI生成的代码超过了我的预期复杂度,毫不犹豫地删掉重写。项目里有一处报表导出功能,AI生成的版本有200行封装,我手动改成了60行平铺逻辑。虽然代码风格没那么“优雅”,但可读性和可维护性高,后续业务调整时改动成本低。记住,AI生成代码的默认目标是“看起来完整正确”,不是“最简单好用”。
4.4 慢SQL和潜在性能问题
AI生成的联表查询和聚合SQL经常存在性能隐患,尤其是当它面对复杂数据模型时,容易写出嵌套子查询或者跨表笛卡尔积。我这次项目中有个看板接口,AI生成的SQL在没有数据的情况下响应12秒,让我一度怀疑是网络问题。
排查方式是用EXPLAIN ANALYZE分析SQL执行计划,发现AI在一个小表和大表关联时没有加过滤条件,导致先处理后筛选。我直接把执行计划丢给AI,让它优化。AI给出的优化方案是调整ON顺序、增加复合索引、把子查询改成LATERAL JOIN,修改后响应时间降到了300毫秒以内。这件事让我养成了习惯:凡是AI生成的SQL,必须强制检查执行计划,不能只看返回结果对不对。
4.5 依赖冲突和环境不一致
AI生成的requirements.txt有几个固定版本号,但实际部署到ECS后发现安装包互相冲突。最典型的是pydantic版本和FastAPI版本不兼容,AI生成时没有做全量依赖解析。虽然这个问题不完全是AI的责任,但AI可以帮助解决。
我把报错信息复制给AI,它推荐我用pipdeptree查看依赖树,然后给出了三个调整方案。我选了一个改动最小的方案:锁定FastAPI版本为0.111.0,并把pydantic列进requirements.txt强制降级到2.7.0。整个过程大概半小时,比我自己Google搜一圈快多了。
4.6 权限与安全漏洞
AI生成的代码在权限校验上经常存在漏洞。比如有一个管理员接口,AI只做了登录校验,没有做角色校验;再比如文件导出接口,没有校验用户是否有该渠道的数据权限,只要登录就能导出全部数据。这类问题非常隐蔽,靠单元测试测不出来,只能靠人工review和渗透思路来检查。
我在审查阶段专门准备了“AI代码安全审查四问”:第一,这个接口/函数拿到的用户身份是什么?第二,它是否对用户身份做了最小化权限校验?第三,敏感操作是否有操作审计?第四,异常信息是否会暴露内部细节?每次让AI生成代码前,我都会把这四问写进任务卡,让AI自己先自查一遍。试验后效果明显,AI自查能发现大部分常见安全问题,剩下极少数由我人工兜底。
5. 常见问题速查表与交付清单
5.1 AI项目交付常见问题速查表
| 症状 | 根源 | 对策 |
|---|---|---|
| 生成代码运行报函数不存在 | 依赖版本不一致 | 任务卡要求先看requirements.txt;报错后把堆栈丢给AI让它修改 |
| 多轮对话后逻辑跑偏 | 上下文丢失 | 建立项目约定文档,每个任务卡都引导AI先读文档 |
| 代码过度设计 | AI默认追求“完整架构” | 审查时发现抽象层级过高,直接重写为平铺代码 |
| SQL查询极慢 | 缺少执行计划检查 | 用EXPLAIN ANALYZE分析,把执行计划丢给AI优化 |
| 测试断言太弱 | AI默认只验证不报错 | 要求每个断言必须有具体期望值,否则测试无效 |
| 依赖包冲突 | 缺少全量依赖解析 | 用pipdeptree分析,让AI给出调整方案 |
| 权限校验缺失 | AI不熟悉业务权限模型 | 用“安全审查四问”强制AI自查 |
| 前端交互不规范 | 风格约定没有前置 | 把交互规范写进任务卡,如搜索、确认框、骨架屏 |
| 接口参数边界不校验 | AI习惯信任调用方 | 任务卡明确要求校验枚举值、时间范围、分页上限 |
| 部署环境不一致 | 本地与生产参数未同步 | 环境变量模板和部署脚本都让AI生成,并自动比对差异 |
这张表是我这次项目过程中自己总结的,基本覆盖了AI辅助编码中最常见的十类问题。你在自己的项目里大概率也会遇到其中两三类,遇到时直接对照表格找方案就行。
5.2 上线前我自己过的交付清单
项目正式上线前,我手写了一份交付检查清单,把整个项目从头到尾过了一遍。这份清单不是AI生成的,是我基于过往上线经验总结的,在这里分享给你:
- 每一个API端点都跑通了冒烟测试,且验证了参数校验逻辑。
- 核心报表数据同手工从数据库里查出来的数字对比一致。
- 定时任务连续跑48小时无异常,任务失败有告警通知。
- 所有敏感配置项(数据库密码、API密钥)都放在环境变量里,没有硬编码。
- nginx配置了HTTPS和基本的请求限制,防抖和防重放做了基础处理。
- 数据库全量备份脚本和恢复演练各执行了一次。
- 生产环境的Docker镜像是从CI流水线构建的,不是本地手动打的包。
- 文档补齐了部署手册、接口文档、数据字典、运维FAQ。
每一个检查项通过后,我都会在边上备注当时验证的截图和日志,确保不是“我觉得应该没问题”而是“我已经用结果证明了没问题”。这套清单用了很多年,以前手工开发时适用,AI辅助开发时更加必要,因为AI不会为你的上线负责,只有你会。
6. 复盘:AI端到端交付,我的真实感受
项目交付到现在快一个月了,线上运行稳定,业务方反馈良好,后台的自动报表每天准时推送,没有出过幺蛾子。回过头看这次经历,我最大的感受是:AI并没有取代开发,它改变的是开发的“手速”,但没有改变开发的“脑力”。
那些没有写代码的时间里,我把省下来的精力全部投入到了更重要的事情上:搞清楚业务方真正要什么、设计一个方便后续扩展的数据模型、确定合理的部署架构、做扎实的测试和质量门禁。AI帮我节省的是敲键盘的时间,不是做决策的时间。如果你在项目中感到困惑,多半不是因为代码写得慢,而是因为目标和路径不清晰,AI再好也帮不了你。
最后说一个我自己的实用技巧:每完成一个模块,我会专门留十分钟让AI写一段“给未来维护者的话”,内容包括这个模块为什么这么设计、有哪些潜在的坑、后续改动需要注意什么。这段内容放在代码文件的头部注释里,虽然不会影响运行,但对三个月后的我帮助巨大。AI生成的代码本来就是它的“思路产物”,让AI自己解释思路,远比我在代码里慢慢猜要高效。这个习惯我现在已经带到了所有项目里,建议你也可以试试。