☰
AI辅助开发实战:提示词工程与代码审查,把AI变成编程搭档
2026/10/20 12:50:19 网站建设 项目流程

说实话,我属于那种对AI写代码这件事持怀疑态度的老派工程师。早年编程语言之争、低代码平台兴起,每一轮“新技术要颠覆开发”的浪潮我都经历过,最后大多不了了之。直到前阵子我手上撞上一个排期特别紧的存量系统改造:一个对外接口要梳理参数校验、日志链路、配置下发,光捋需求就花了两天。我抱着试试看的心态打开了IDE里的AI编程助手,把背景、目标、约束往对话框里一贴,几轮对话下来,它真的给出一套能跑的改造方案。我又花了半天审它的代码,砍掉一半生成逻辑,补了三个边界条件。

这个“它能做一半,剩下一半必须人把关”的真实比例,让我彻底改变了对AI辅助开发的态度。后来我花了大概两周时间,把AI编程助手塞进自己的日常开发流程,踩了好多坑,也总结出一套相对固定的写法。这篇文章想把这段实践中的体会完整记录下来,既有能直接沾光使用的提示词套路,也有代码审查方面的判断标准,希望对正在观望AI编程工具的同行有点参考价值。

1. 先看清这是个什么水平的助手:能补全代码,但不负责交付

1.1 从“这不行”到“原来要用对地方”的转变

我第一次用AI编程助手时,感受相当分裂。让它写个工具函数,它写得又快又像样;让它去改一个涉及多处调用的核心模块,它立刻开始瞎发挥,甚至在你没要求的地方自作主张重构结构。这种分裂感一度让我觉得这工具就是“会背答案的搜索引擎”,只能给点参考,不能进生产环境。

但真实项目里有一类活,恰好是AI的舒适区:结构明确、套路固定、内容重复的代码。比如DTO对象的字段映射、标准CRUD接口、常用配置类、测试用例骨架。这些任务在存量系统里特别多,但写起来又特别消耗耐心和精力。我之前一直亲手敲,嫌弃AI“答非所问”,后来发现问题的根源不在AI,而在我的提问方式:什么都没说清楚就直接要答案,不出偏才怪。

拿一个我自己的例子来说。某次系统对接要新增一个配置读取模块,我只给AI说了一句“帮我写配置读取逻辑”,结果它给我生成了一整套新类,把原有的默认值回退策略整个扔了。不是它能力不够,是我没告诉它“必须保留默认值回退行为”。从那以后我意识到,跟AI协作,第一门要修的手艺是把需求“喂明白”。

1.2 用一张表划清边界,哪些活能交给它,哪些必须自己扛

两周实践下来,我按任务类型给AI适用性分了个档。这张表也是我平时分派工作时参考的依据,分享出来给大家一个直观参照:

任务类型AI适用性你需要做的把关
样板代码、结构类代码生成高给足字段定义、命名规范和约束条件
存量模块的定点重构中高明确新旧行为差异,保留原逻辑回归点
编写单元测试用例中高让它先列测试维度清单,再生成具体代码
跨系统接口对接改造中贴全双方协议差异、版本号、异常处理要求
复杂业务规则、关键链路设计低人工推导、评审,AI只能做辅助查漏
涉及权限与资损的敏感逻辑低必须人肉把关逻辑,不盲信生成结果

从这里能看出一个基本判断:AI擅长的是“从明确输入到明确输出”的映射式工作,而真正复杂的工作需要的是“在模糊条件下做取舍”。这后一种能力,目前还得靠人。许多关于“AI会不会取代工程师”的争论,就是把这两类工作混为一谈了。

与其纠结能不能取代,不如先把精力花在“哪类任务交给AI写、哪类坚决自己写、哪类需要混合推进”上。这样安排,效率的提升会是实打实的。

2. 上下文工程:把需求说清楚,比敲键盘值钱得多

2.1 失败对话复盘:需求没说边界,AI顺着你的话茬自嗨

我一开始和AI编程助手配合不顺,回头复盘,绝大多数问题出在“提示词给了个方向,但没给边界”。比如我让它“把模块的日志补全”,它会把每个方法都塞进try/catch,再在每个catch里打日志,看起来热热闹闹,实际上把有用的异常堆栈全吞了。这口锅一半是我的:我没有说“日志要保留原始异常,不要捕获后吞掉,不要给普通业务分支打堆栈”。

AI有一个特性:它的生成逻辑里有很强的“迎合倾向”。你说要日志,它就给你塞满日志;你说要健壮,它就给你包一堆防御;你说要灵活,它就给你上一个抽象层。它不会主动问你“这个度要多大”,除非你在提示词里写清楚。

所以现在我跟AI协作时,默认把提示词分成五个部分:背景、目标、约束、期望产出、验证方式。下面是我常用的模板:

【背景】系统当前是什么状态,改这块代码的前因后果。 【目标】这一轮对话希望产出什么,只解决什么问题。 【约束】不允许做什么,必须保留什么,依赖哪些版本,遵循什么规范。 【期望产出】希望给出完整代码/改动说明/测试列表。 【验证】如何确认改动没有破坏原有行为。

别小看这个格式,它能极大降低AI“自由发挥”的概率。有一次我让它改一个解析逻辑,背景里特意写明“输入可能存在空值和重复字段”,约束里写了“不允许变更对外字段名,原有异常类型必须保留”,结果它给出的方案直接就覆盖了这几个边界,省了我大量返工时间。

2.2 一套好用的提示词公式:背景-目标-约束-产出-验证

光有模板还不够,还得往每个部分填有效信息。我拿一个真实工作场景举例。需求是给某个接口增加入参校验,我经过几次调整后,最后用的提示是这样:

背景:下单接口目前缺少入参校验,脏数据会直接进入业务逻辑。 目标:在进入业务处理前完成参数校验,非法请求统一返回错误码。 约束:不引入新的第三方校验库;不改动对外字段名;错误消息使用现有统一格式。 期望产出:校验函数代码、调用位置说明、覆盖空值和类型异常的单测。 验证:通过接口层调用用例验证,确认业务逻辑不变。

这样一段话喂进去,AI产出的东西基本是能直接进代码评审的。而如果我只写“给下单接口加点校验”,它大概率只会给我一个if判断草草了事。

这里有个重要的细节:“约束”部分的优先级比“目标”更高。很多时候AI跑偏,不是因为目标没写清楚,而是因为它居然在满足目标的过程中顺手改了不该改的地方。所以“不要做什么”写得越具体,生成结果越好。

2.3 掌握给 AI 提供上下文的“颗粒度”

有人可能会想:既然AI需要背景,那我把整个项目文档、整个模块都丢给它,它不就能做出正确决策了吗?我试过,效果并不好。大语言模型对上下文的接受窗口是有上限的,塞进去的信息越多,它在关键点上的注意力就越容易被稀释,反而更泛泛而谈。

更实用的做法是“精准喂食”。在代码库里工作,我会把这几样东西粘进提示词:当前要改的接口签名、相关实体定义、被调用方的协议要求、历史报错信息。选择性粘贴要比“全仓库扫描”可靠得多,因为过长的对话或多文件内容会让AI在各处引用的边界模糊化。

另外,项目里的命名习惯也很重要。你随手粘过去的代码,AI会顺着你的命名风格写,而你光用嘴描述“这个变量叫啥”,它就容易用自己的习惯造出另一种风格。这是AI辅助开发里很微妙的一件事:粘代码比打描述更准。

3. 我踩过的四个大坑,以及对应的解法

3.1 幻觉API:它说“有这个方法”,编译时一问三不知

AI编程助手最坑的一点是幻觉,也就是它自信地生成了一些看起来合理、实际不存在的接口或配置项。我在某个日志组件上栽过跟头:它给了一段配置,说在某个版本之后有现成开关支持,我按着敲进去,系统启动直接报错,回去一查文档,那个配置项压根不存在。

后来我学乖了,凡是AI给出的API调用、配置项、SDK方法名,默认当作“待验证信息”处理。排查的顺序是:先编译,再看运行时日志,最后回官方文档确认。遇到报错,直接把报错信息粘回给AI,让它解释原因。这个过程本身其实也是效率提升点——以往我得自己翻StackOverflow翻半天,现在至少AI能把范围缩小很多。

3.2 过时代码:训练数据里的“旧版本世界”

训练数据有截止时间,AI写出来的代码很可能“长期停留”在某个旧版本认知里。我有一次让它生成某个服务的连接配置,它用的是老一套初始化方式,在我现在的项目环境里已经废弃。代码跑起来并不报错,但行为不符合预期,排查起来比编译报错更费劲。

应对方法是把所有版本信息写在提示词最前面,越具体越好。比如“当前项目使用某框架2.5版,某SDK已升级到v3,旧版工厂方法已移除”,这些信息直接决定了AI输出的准确性。如果AI仍然给出旧写法,把它当作一次新线索,继续追问“当前版本推荐做法是什么”,通常它能改正自己的答案。

3.3 代码能跑,但安全基础很薄弱

这是我最担心的一类问题。AI生成的代码往往能跑通“正常流程”,但它在边界处理上能省则省。尤其是一些涉及外部输入的接口,它可能直接拿参数放进业务逻辑,跳过校验和转义,看起来功能正常,实际把安全隐患埋下了。

我拿一个简化例子说一下。比如让它写一个接口的入参处理,它可能给你这样的东西:

// 伪代码:某接口创建订单逻辑 async function createOrder(ctx) { const { userId, amount } = ctx.request.body; const result = await orderDB.insert(userId, amount); return { code: 0, data: result }; }

这段代码功能上没问题,但它没做几件事:必填字段校验、金额类型校验、恶意参数处理、异常后的统一错误处理。单独看不致命,一旦暴露在公网环境,这就是很大的隐患。

我的对策是:在提示词开头就写明安全要求,而不是放在结尾。例如“所有外部输入都不可信;必须先做类型和边界校验;数据库操作必须参数化;错误信息不得泄露内部细节”。把安全要求前置之后,AI生成代码明显收敛了很多。

3.4 好心办坏事的“过度设计”

AI从训练数据里学到不少优雅的设计模式,于是它特别喜欢用。你让它改一个五分钟能搞定的小逻辑,它给你上一个抽象工厂加策略模式,代码结构确实漂亮,但维护成本直接翻倍。

有一次我让它封一个简单的配置读取,它引入了一个接口、两个实现类、一个工厂。我审完代码直接给砍了,换成一个普通函数,总共十几行。这不算AI“错了”,而是我没有在约束里写“优先使用最简单实现,不要引入设计模式”。

后来我再写提示词,都会刻意加上一句:“用最简单直接的方式实现,不要过度设计,不引入不必要抽象。”如果它还是给出一堆类,我会追问:“如果只用函数实现,行不行?”这种方法能让它收敛不少。

4. 从“手写”到“驾驶”:我把AI塞进日常开发流的三个位置

4.1 定点重构:让AI拆方法,我自己定验收线

大部分重构工作的难点不是“怎么写”,而是“怎么在改的同时不破坏现有行为”。最开始我不敢用AI做重构,就怕它一边改一边“顺手优化”,把逻辑全带沟里了。后来摸索出一套更稳的流程,核心思路是把重构目标切成小步,每次只动一小块。

具体步骤是这样的:先选一个过长的函数,把目标定成“把它拆成三个职责清晰的小函数,不改任何外部行为”。提示词里我会写明原函数入口、参数、返回结构,以及“拆分后的每个函数必须有单独注释说明职责”。AI给出的拆分结果,我只做两件事:一是逐行审读,确认逻辑没变;二是跑一遍相关单测和调用验证,保证行为一致。

这个方法对我的日常开发帮助很大。以往拆一个600行的方法,光对照逻辑就得小半天,现在AI先把拆分结果的骨架给出来,我只需要在细节上校对和调整,至少省一半时间。

4.2 补测试:让AI先列测试维度,再转代码

让AI写单元测试这件事,一开始我觉得很鸡肋。它生成的测试用例,基本全是“输入正常值、断言返回正常结果”,覆盖率看起来好看,但对真实业务没有任何保护。后来我发现问题出在提问方式上——我直接让它“写测试”,它当然按最省事的方式写。

后来我调整了顺序:先让AI列测试维度,再让它转成代码。比如对某个对象解析函数,我先问“它潜在有哪些边界条件需要覆盖”,它会列出空值、类型错误、极端长度、重复字段等情况。我再让它按这张维度清单逐条生成测试,质量立刻上了一个台阶。

如果你也遇到AI生成测试形同虚设的情况,可以试试这个办法:第一步生成维度,第二步生成用例,第三步自己再补两条想到的漏网之鱼。整个过程AI负责跑量,你负责把关覆盖是否到位,配合起来很顺畅。

4.3 排障时把AI当“信息梳理器”,让它还原链路而不是瞎改

线上问题排障时,AI的作用被我定位为“线索整理员”,而不是“修复者”。它会从日志片段里找出可疑的调用顺序、错误堆积点、超时节点,然后给你一个排查方向的整理。这比人类一行行盯日志快出不少。

有一次某个外部接口频繁超时,我把自己手里的调用日志、上下游超时配置全贴给AI,它迅速指出可能是连接池配置不合理,还罗列了三个可以验证的点。我按它的方向查下去,果然定位到连接池参数的问题。但整个过程里我没有让它直接改生产代码,只是让它在既定范围内输出分析结论。

如果你要用AI辅助排障,建议在提示词里明确说“只分析原因,不要给修改代码”,避免它越界发挥。等定位完问题,再开一个新会话,让AI在约束明确的前提下给出修复方案。把“分析”和“修复”分开,比混在一个会话里更安全、更可控。

5. 当补全不再稀缺,真正稀缺的是判断力

5.1 架构决策:为什么现在还轮不到“全自动设计”

AI能生成单个函数、单个模块,但在“架构该往哪个方向演进”这件事上,它给不出真正有价值的判断。原因在于架构决策依赖的是业务现状、团队结构、存量技术债、未来演进路径的复杂权衡,这些信息往往都不在模型能掌握的上下文里。

比如某模块是继续维护还是推倒重来,AI无论怎么分析,也很难理解“现有团队只有两个人会维护这个老框架,新人上手成本极高”这类隐性约束。这些属于组织内部知识,不写进提示词它根本不知道,写进提示词它也只是替你把方案摆出来,最后拍板还得是人。

所以我的态度是:架构级讨论可以用AI做参考,帮自己补几个没想到的维度,但设计取舍必须有工程师自己拿主意。一个系统真正难的地方,不是某个接口怎么写,而是为什么这个系统要长成这个样子。

5.2 读懂业务逻辑,而不是只读代码逻辑

AI生成代码的前提是“需求已经明确”,但在真实业务里,需求往往是模糊的、矛盾的、不断变化的。比如计费规则,产品经理说“老用户按旧规则,新用户按新规则,过渡期有特殊处理”,这句话拆到代码层面,涉及无数条件分支和状态变化。AI理解不了这些规则背后“为什么这样设计”的业务背景。

我在日常工作中越来越发现,代码可以被AI生成,但“这段逻辑到底对不对”这件事,永远得靠人对业务的理解去校验。如果工程师只满足于把AI给的代码调通,而不去追问规则背后的原因,那他就真的做成了“翻译机”,随时可能被AI替代。

反过来,正因为AI能把重复的代码搬运活干完,工程师反而能腾出更多时间去聊业务、看数据、怼需求、理流程。这些事是AI暂时替不了的。

5.3 我的“编辑模式”工作法:让AI先产,我用评审清单把关

现在我日常工作流基本是一个“编辑模式”:AI是初稿撰写者,我是编辑兼审校。我给它上下文和约束,它负责写初稿,我负责把稿子改成能上线的东西。这个模式能不能跑通,关键在于审校质量。下面是我长期使用的一份代码评审清单,也分享给需要的人:

  • 意图一致性:生成的代码是否真的在解决提示词里的目标,还是绕到别处炫技了。
  • 边界与异常:输入为空、超长、类型不符、并发冲突时,代码表现如何。
  • 资源与生命周期:连接是否关闭、缓存是否回收、异常是否吞掉原始信息。
  • 影响范围:改动了哪些文件,被哪些现有调用依赖,需不需要同步更新其他模块。
  • 测试与回归:新增代码有没有测试保护,已有测试是否被破坏,关键链路是否需要手工回归。

每个准则不需要每次都长篇大论地套,但至少要有意识地在评审时过一遍。特别是“影响范围”这项,是我踩过最多的坑。AI改了一个函数,它不会自动告诉你“这个函数还被另外三个模块调用着”,这个信息只能靠人自己查清楚。

我还有一个用顺手的小技巧:每次会话结束前,让AI输出两个清单,一是“我改了哪些文件”,二是“哪些现有用例可能受影响”。如果它列不出来,说明它对变更的影响面没有底,那这份改动就更得小心验证。这个习惯后来变成了我的固定动作,强烈推荐大家也试试。

我也一直在调整跟AI编程助手的配合方式,从最初的“让它多写点”,慢慢变成“让它想清楚再写”。说实话,这个过程本身就是一种成长。当我花在“读懂代码为什么这么写”上的时间,开始多于“把代码敲出来”的时间,我反而觉得,这个行业里的核心竞争力并没有变,还是理解问题、拆解问题、做出取舍的能力。只是在AI时代,这种能力的价值,被放得更大了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询