AI辅助开发不只是工具:规则、上下文和评测体系

先来讲一个真实的案例:
一个开发者使用AI开发工具修改订单系统,需要实现的功能是优惠逻辑:新客户首单满100元减20元。
Vibe Coding速度很快,开发完成后看起来合理,通过了简单的手动测试。但是合并代码上线后,客服很快就收到了投诉——会员用户的折扣消失了。
经排查发现,AI在添加新客户优惠时,调整了折扣计算函数的执行顺序,会员折扣被新客户优惠覆盖。旧客户端调用的接口返回结构也变了,导致一部分用户看到的价格和实际支付不一致。
这个安全并不是说AI"不够聪明"——它根本不知道这个系统有会员折扣叠加规则、有不能改动返回结构的旧API、有一套需要覆盖边界金额的回归测试。
换一个更强的模型也许也不能解决这类问题,根本原因就是没有人告诉AI什么不能改,没有给它足够的相关代码和约束,生成之后也没有用真实的构建和测试去验证结果。
接下来我们讲讲,在使用AI编程工具时,用一套可验证的工程流程来保持开发质量——不管你用的是Cursor、Codex、Claude Code、Copilot还是其他工具。
先想清楚任务标准
上面这个反面的示例,开发者给AI的指令是"给新客户加一个首单满100减20的优惠"。这句话对项目同事来说可能够用,因为同事了解项目背景,会主动去看相关代码。但对AI来说,这就是它收到的全部信息。
在动手修改之前,需要先回答几个问题:这次改动影响哪些模块?哪些行为绝对不能变?怎样判断改动成功了?
具体到这个订单优惠的例子:新客户首单优惠只在没有其他折扣的情况下生效,还是和会员折扣可以叠加?旧客户端使用的 /api/v1/order/price 接口返回结构能不能改?退款流程是否需要感知这种新优惠?满99.9元算不算满100元?
这些问题的答案就构成了这次任务的完成标准。它们不是AI能自己推断出来的,需要开发者或产品经理基于业务要求明确写出来。不写清楚,后面所有的生成和验证都缺少判断依据。
规则和上下文的区别
完成标准确定之后,下一步是让AI获得正确的信息。
这里有一个容易混淆的区分:什么信息应该作为项目规则长期存在,什么信息只和当前这次任务有关。
比如:
这个项目使用TypeScript和Express框架;
所有价格计算必须使用整数分而不是浮点数;
公开API的返回结构变更必须发新版本;
提交前必须通过
npm run test和npm run lint。
这些规则不会因为今天改优惠逻辑还是明天改退款流程而变化。
基本上主流的AI编程工具都提供了把这类规则写进项目的方式。有的用仓库根目录的指令文件,有的用路径级别的配置,有的在IDE设置中维护。具体的文件名和格式因工具而异——Codex使用AGENTS.md,GitHub Copilot使用仓库自定义指令文件,Cursor使用Rules——但核心思路相同:把项目的架构约定、构建命令、测试要求和重要边界写成AI可以读取的规则,而不是每次任务都口头重复。
规则需要维护: 团队换了构建工具、升级了框架版本、增加了新的代码规范,规则文件也应该同步更新。一份写了就不管的规则文件,半年后可能比没有还糟——AI按照过时的约束生成代码,开发者还以为它遵守了当前规范。
改订单优惠逻辑,AI需要看到的是:折扣计算模块的入口函数和调用链、现有的会员折扣实现、旧API的返回结构定义、相关的单元测试和集成测试、以及这次需求的完成标准。这些信息和"项目用什么框架"不同,它们只在这次任务中重要,下一次任务会有完全不同的上下文。
一个常见的错误是把整个代码仓库一次性提供给AI,觉得"信息越多越好"。实际上恰好相反。当上下文中塞满了不相关的代码、文档和配置,模型需要在大量信息中找到真正相关的部分,这个过程中很容易被无关内容干扰,或者在相似但不同的代码段之间搞混。提供相关而精准的上下文,比提供海量但模糊的上下文更有效。
给AI准备当前任务上下文的方式,类似于给一个新来的同事交代一项具体工作:不需要让他读完整个仓库,而是告诉他这次要改哪个模块、涉及哪些调用关系、有哪些测试覆盖了相关逻辑、哪些文件不能动。入口文件、调用链、关联测试、失败日志和相关Issue,通常比压缩后的仓库摘要更有用。
先理解再动手,分小步修改
有了规则和上下文,AI可以开始工作了。但怎样工作同样重要。
一种常见的模式是:开发者给出一个任务,AI一次性生成几百行代码的改动。变更面一大,出错概率就高,出了错也难以定位。更可靠的方式是让AI先理解当前的代码结构和调用关系,给出一个修改计划,然后分步执行。
回到订单优惠的例子。一个合理的修改计划可能是:
先找到折扣计算的入口函数,理解当前的折扣执行顺序和会员折扣的位置。
检查现有测试对折扣计算的覆盖情况,如果缺少边界测试(比如满99.9元、会员叠加),先补上。
在不改变现有折扣逻辑的前提下,添加新客户首单优惠的判断。
确认旧API的返回结构没有变化。
运行全部相关测试。
每一步的范围是收敛的,改完之后可以立刻验证这一步有没有引入问题。
相比之下,如果一步到位地修改折扣函数、添加新逻辑、调整接口返回和更新测试,当测试失败时,开发者甚至不知道该从哪里开始排查。
另一个值得注意的习惯是:不要在这次任务中"顺手"重构无关代码。AI有时候会在修改的过程中优化它觉得不够好的代码风格、重命名变量或调整文件结构。这些改动可能每一个单独看都合理,但混在业务改动里,会让代码评审变得困难,也会增加引入意外问题的风险。
一次任务只做一件事。
当然有时候任务也有大有小,如果任务边界清晰、任务复杂度不高,虽然改动代码比较多,也可以当作一次任务来完成,特别是能力比较强,上下文比较长的模型,这个没有完全标准的答案,具体实践中可能有依赖个人经验。
把"我完成了"换成证据
AI生成了代码,报告说"改动完成,新客户首单优惠逻辑已添加"。到这一步,很多开发者会浏览一下代码,觉得看起来没问题,就准备提交了。
这是最容易出事的环节。
"看起来没问题"不是验证。验证需要真实的证据:构建是否通过、测试是否全部绿灯、关键的边界情况是否被覆盖。
具体到这次改动,需要检查的至少包括:
满100元的新客户是否得到了20元优惠。
满99元的订单是否正确地没有触发优惠。
会员用户的折扣是否仍然正常计算。
新客户同时是会员时,两种优惠的叠加或互斥逻辑是否符合业务要求。
退款流程是否正确处理了带有首单优惠的订单。
旧客户端调用的接口返回结构是否完全一致。
这些检查不能靠AI在聊天窗口里说"测试已通过"来确认。AI说测试通过,可能是它理直气壮地"认为"应该通过,也可能是它运行了测试但忽略了某个失败的用例。验证必须来自真实的命令输出——npm run test 的运行结果、构建日志、接口返回的实际数据。
这里有一个容易混淆的区分:代码测试和AI评测不是同一件事。
代码测试(单元测试、集成测试、端到端测试)验证的是软件行为——折扣函数在输入100元时是否返回80元,接口在收到特定请求时是否返回预期结构。这是确定性的:同样的输入应该产生同样的输出。
AI评测验证的是另一个层面的问题:当你让AI完成一组类似的改动任务时,它是否能持续遵守项目规则、正确定位需要修改的代码、生成符合约束的变更、不引入无关改动?这类评测需要准备一组有代表性的任务,定义每个任务的成功标准,让AI分别执行,然后检查结果是否达标。
代码测试和AI评测可以同时存在。前者保证软件本身的正确性,后者帮助团队了解AI在他们的项目中有多可靠、在哪类任务上容易出错,从而调整规则、上下文或任务拆分方式。
差异评审
测试全部通过之后,代码还不应该直接合并。下一步是评审——看AI实际改了什么。
审查diff是这个环节的核心。开发者需要逐个文件看AI的改动,关注几个问题:
改动是否超出了这次任务的范围?有没有出现无关的重命名、格式调整或结构变化?
业务逻辑是否符合完成标准?新客户的判断条件是否准确,优惠金额是否写对了?
是否有隐藏的兼容性变化?比如函数签名变了、返回类型变了、异常处理逻辑变了,但调用方没有同步更新。
是否有安全影响?比如新增的接口缺少权限检查,或者用户输入没有做校验。
AI可以辅助这个过程。一些工具已经支持AI代码评审功能:把项目规则和变更内容提供给AI,让它按照规则检查改动并报告发现。这在大面积改动时很有效率——AI可以在短时间内标记出可能违反规则或约定的地方。
但AI评审有两个局限:
一是它可能产生误报——标记了一些实际上没有问题的地方。
二是它可能遗漏深层的架构或业务影响——它能看到代码字面上的变化,但不一定能判断这个变化在三个月后会不会导致另一个模块的行为异常。
最终的合并决定必须由人类做出。AI提供发现和建议,开发者判断这些发现是否成立,承担合并后的责任。这不是对AI能力的不信任,而是对工程流程的基本要求——代码进入生产环境后的后果,需要有人负责。

这张图展示的是AI辅助开发的工程闭环。
从需求和完成标准开始,项目规则提供长期约束,任务上下文提供当前事实,AI基于这些信息理解、计划并分步修改,修改后经过构建、测试、运行检查和差异评审验证真实结果。
图中有两条反馈路径:如果验证失败,问题可能出在需求不够清楚或上下文不够完整,需要回到前面的环节补充,而不是反复要求AI重新生成。
反复出现的项目约束应该沉淀为规则或测试,而不是永远留在一次聊天记录里。
更新文档,过程持久化
一次任务完成后,很容易直接跳到下一件事。但如果这次改动中发现了一些值得保留的信息,建议你写回项目(文档),而不是只留在AI对话的聊天窗口里。
这次订单优惠的改动中,团队可能发现了几件事:折扣之间的叠加规则之前没有文档化,旧API的兼容性约束之前没有写进规则文件,边界金额的测试之前不够充分。这些都应该在改动完成后同步更新。
具体来说:
如果发现了新的项目约束(比如"折扣之间的执行顺序不能随意调整"),把它加入规则文件。
如果这次改动暴露了测试覆盖的盲区,补上对应的回归测试。
如果Issue或文档中缺少关于优惠叠加的说明,补充上去。
提交记录应该清楚说明这次改了什么、为什么改、有哪些注意事项,让未来的开发者(无论是人类还是AI)能快速理解背景。
这些记录不是行政负担,而是下一次AI改动的上下文来源。如果团队三个月后再改折扣逻辑,AI可以读到上一次的规则、测试和提交记录,而不是从零开始猜测这个系统有什么约束。
下面这个是一套完整的可以持续改进的开发过程闭环:
需求明确完成标准
规则提供长期约束
上下文聚焦当前任务
AI先理解再分步修改
构建和测试提供真实证据
评审确认变更范围和影响
记录沉淀回项目供下次复用。
工具会更新换代,这些环节的逻辑不会因为换了一个AI编程工具就失效。
动手实践
如果你想把AI编程工具用得更可靠,不需要一次性建立完整体系。可以从最有杠杆效应的几步开始:
为你的项目写一份规则文件,把构建命令、测试命令、架构约束和不允许改变的行为写清楚。
给AI分配任务时,附上入口文件、调用链和相关测试,而不是只给一句话的需求。
要求AI先给出修改计划,确认后再分步执行。
每次改动后运行完整的构建和测试,看真实输出而不是AI的报告。
合并前审查diff,关注无关改动和隐藏的兼容变化。
站内已有不少关于具体工具的使用方法和配置技巧:
工具选择可以参考2025-2026年AI编程工具全面对比。
Rules的实践可以阅读Cursor不用Rules会让你的项目失控。
更多使用技巧在AI开发工具使用技巧大全。
上下文的概念可以参考Cursor几个入门基本概念。
关于AI应用从任务到评测的整体框架,可以阅读《AI应用开发的核心链路:模型、上下文、工具、记忆和评测》。
参考文献
Codex AGENTS.md文档 — 仓库可以用分层指令告诉编码Agent项目约定、命令和边界。
GitHub Copilot仓库自定义指令 — 仓库和路径级指令可提供项目结构、构建、测试和验证要求。
Codex Code review — 开发过程中应在提交或推送前审查变更,并按优先级处理发现。
Anthropic: Demystifying evals for AI agents — 评测需要任务、试验、评分器和轨迹,模型声称完成不等于环境结果正确。
OpenAI Evals文档 — 评测需要任务、输入、评价标准和迭代分析。