去年我接手一个遗留Python项目,代码量八万行。接手前我担心要先花两周做代码审查,结果同事丢给我一句话:用Trae写一套审查提示词,让AI先扫一遍再人工复核。半信半疑试了一下,从此就回不去了——现在每次合并代码前,我的例行流程都是先让AI过一遍,再处理真正需要人判断的问题。
这篇文章是我在Trae提示词开发实战系列里的第十一篇,不聊虚的,直接拆解AI辅助代码审查这个场景。标题说效率提升10倍,有人觉得夸张,但如果你做大范围代码走查,10倍这个数字一点都不浮夸。我会把这个过程拆成几块:设计思路、提示词模板、真实操作和避坑心得。不管你正被代码审查搞得焦头烂额,还是刚接触Trae想找个落地场景,这篇文章都应该能帮到你。
1. 先理清思路:AI代码审查到底审什么
1.1 为什么"审查"比"写代码"更适合AI
先说一个容易被忽视的事实:AI写代码是发散性任务,审查代码是收敛性任务。开放式生成经常让AI自由发挥,写到后面越来越飘;但审查不一样,它的目标非常明确——找出问题、给出修复建议。这种任务AI反而比人类更有优势,因为它的知识面广、阅读速度快、不累不烦躁,而且不会因为代码量太大而跳过细节。
我刚接触提示词工程的时候,总想着让AI一步到位把功能写完。结果发现模型越到后面越容易跑偏,真正稳定落地的场景反而是代码审查、代码解释、测试用例生成这类结构清晰的任务。审查的本质是"拿标准去套代码",标准是固定的,代码是输入,输出是问题清单。这正好是AI最擅长的工作方式。
另外一个关键点是:代码审查的产出可以结构化。一条审查意见包含问题描述、所在位置、严重程度、修复建议。只要提示词里把输出格式约束好,AI返回的结果就能直接对照处理,不需要二次加工。这一点对后续落地到团队流程非常重要。
1.2 审查的五个维度:比你想的要多得多
很多人以为代码审查就是看看有没有bug,这是最大的误区。我自己的经验是,一份合格的审查报告至少要覆盖五个方面,缺一个都可能出事。
| 审查维度 | 关注点 | Python里常见的坑 |
|---|---|---|
| 正确性 | 逻辑错误、边界条件、异常处理、并发安全 | 动态类型导致运行时类型错误、except Exception裸捕获、整数除法和浮点除法的混用 |
| 安全性 | 注入攻击、敏感信息泄漏、不安全的反序列化、危险函数调用 | 用 f-string 拼接 SQL、把密码哈希返回给前端、pickle.loads处理不可信数据、eval执行外部输入 |
| 性能 | 时间复杂度、数据库访问次数、内存占用、资源释放 | 循环内查询数据库(N+1问题)、大列表做无谓拷贝、文件或连接没有关闭 |
| 可维护性 | 命名是否清晰、函数是否过长、代码重复、魔法数字 | 变量名只有一个字母、单函数上百行、同一个常量到处硬编码 |
| 可测试性 | 是否方便Mock、依赖注入是否合理、全局状态 | 函数内直接get_db()连数据库、随机数或时间戳写在业务逻辑里导致不可重复测试 |
我见过太多团队做审查只看前两项,结果线上故障大部分确实由正确性问题引起,但真正让后续开发速度变慢的,是可维护性和可测试性的问题。AI的强项在于它能同时覆盖所有维度,不会因为人的注意力有限而漏掉细节。
1.3 为什么是Trae:你不该开着网页去审查
既然AI能审查代码,那直接用ChatGPT网页版把代码粘贴过去不就行了?可以,但体验差很多。Trae这类AI IDE的优势是"代码就在编辑器里",选中即分析,上下文天然充足。
Trae有几个具体好处:第一,它能直接读取项目结构,给AI提供的不只是一段孤立的代码,而是整个上下文;第二,它在编辑器侧边栏常驻,审查完立刻就能改,不用来回切换窗口;第三,Trae对中文场景和国内网络环境做得比较友好,这对我这种要天天用的人来说很关键。单独的网页对话工具适合临时提问,但如果要把审查变成日常流程,一个集成在IDE里的AI助手才是正确选择。
2. 提示词模板:把资深工程师的审查经验"写"下来
2.1 "能用"和"好用"的提示词,差别到底在哪
同样是让AI审查代码,有人输入的是"检查一下这段代码",有人输入的是接近一页纸的结构化提示词。前者AI也能给你回话,但结果多半是一堆正确的废话:"这段代码整体质量良好,但有一些可以改进的地方,例如考虑使用异常处理。"这种回答你看了等于没看。
我打个比方。提示词就像你给临时工布置任务。你跟他说"打扫一下屋子",他可能只把客厅擦了擦;你要是跟他说"把客厅、厨房、卫生间各擦一遍,垃圾倒掉,物品归位,最后拍照给我看",结果完全不一样。AI也是这样,它不会主动揣摩你的潜台词,你给它多大的边界,它就干多大的活。
好用的审查提示词,必须包含五块内容:角色设定、审查范围、审查维度、输出格式、代码上下文。角色设定让AI知道调取哪类知识库,审查范围告诉它看哪里,维度是检查清单,输出格式决定了结果能不能直接干活,上下文则是让它结合项目实际情况而不是空谈。
2.2 一个可以复制就能用的Python审查提示词模板
下面这个模板就是我平时在Trae里用的,保留了核心结构,你复制过去改成自己的项目描述就能用。这一段看起来很长的提示词,其实就是把资深工程师的审查习惯固化下来。
你是资深Python代码审查专家,精通Python 3.10+,熟悉FastAPI、Flask、Django、 SQLAlchemy、async/await并发编程,了解PEP8和Google Python Style Guide。 项目背景:这是一个使用FastAPI + SQLAlchemy + PostgreSQL开发的后端服务, 代码风格遵循PEP8,但未强制使用类型注解。请基于这个背景审查代码。 请从以下维度审查这段代码: 1. 正确性:逻辑是否有漏洞,边界条件是否处理,异常分支是否缺漏 2. 安全性:是否存在注入、敏感信息泄漏、危险函数调用、权限绕过风险 3. 性能:是否存在不必要的重复计算、N+1查询、资源未释放等问题 4. 可维护性:命名、函数长度、重复代码、魔法数字、过度耦合 5. 可测试性:是否方便单元测试,外部依赖是否能轻松Mock 输出要求: - 按严重程度分为三档:严重(必须修复)、建议(建议优化)、提示(可选) - 每个问题必须包含:问题描述、对应代码片段或行号、具体修复建议 - 如果某个维度没有问题,请明确写"未发现明显问题",不要为了凑数而硬挑错 - 最终给出一句话总结这里我特别要解释两个容易被忽略的设计。
第一是"如果某个维度没有问题,请明确写'未发现明显问题',不要为了凑数而硬挑错"。这一句非常关键。大模型有很强的讨好倾向,你不做限制,它会想尽办法给你找几个毛病,哪怕那个写法根本没问题,反而干扰了你的判断。加了这句话之后,审查报告会清爽很多。
第二是"项目背景"这一部分。你告诉AI这是一个FastAPI+SQLAlchemy项目,它就会用web服务的标准来审查;你不说,它可能拿一个数据科学脚本的标准来判断,结果给出的建议完全对不上号。上下文对审查准确性影响极大,后面我还会细说。
2.3 提示词里必须写清楚的三件事
除了上面模板里的内容,还有三个小细节我建议一定写进去,否则后续处理起来会非常痛苦。
一是要求给出行号或代码片段。AI审查完之后,你要能快速定位。如果它只说"这个函数存在问题",你还得自己去翻代码,效率凭空少了一半。所以我在输出要求的第二条明确写了"对应代码片段或行号"。
二是要求区分严重级别。没有分级的话,AI会把"变量命名可以更清晰"和"SQL注入漏洞"放在同一个优先级里,你会被噪音淹没。分三级以后,先处理严重项,再批量看建议项,节奏就舒服多了。
三是明确输出内容的边界。很多人忽略"如果某个维度没问题,请明确说没有"这句话。AI在默认情况下有"报喜不报忧"的反面——它倾向于显得自己工作认真,因此会强行挑刺。加上这句话以后,报告里的每一条意见分量都会更足。
3. 实操演示:用Trae审查一个真实Python模块
3.1 我准备的一个问题代码示例
文档里讲一百遍,不如实操一遍。我准备了一段典型的"带病"Python代码,里面埋了多种问题,我们直接拿它来走一遍完整流程。这是我在模拟一个用户服务模块时写的,函数不多,但该踩的坑都踩了。
# user_service.py import sqlite3 import hashlib def get_db(): conn = sqlite3.connect('app.db') return conn def login(username, password): db = get_db() cursor = db.cursor() query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'" cursor.execute(query) result = cursor.fetchone() db.close() if result: return {"id": result[0], "username": result[1]} return None def transfer(from_account, to_account, amount): db = get_db() cursor = db.cursor() cursor.execute("UPDATE accounts SET balance = balance - ? WHERE acc_id = ?", (amount, from_account)) cursor.execute("UPDATE accounts SET balance = balance + ? WHERE acc_id = ?", (amount, to_account)) db.commit() db.close() return True这段代码是我故意按照新手常犯的错误来写的,但说实话,我在真实项目里见过更严重的版本。它至少有四类典型问题:
- 登录函数直接拼接SQL,这是教科书级的SQL注入漏洞;
- 密码用明文拼接进数据库查询,既没加密也没有用参数化查询;
- 转账函数没有在事务中对两条UPDATE做一致性判断,前面成功后面失败会导致账目不平;
- amount字段没有任何合法性校验,负数、零值都能传进来。
3.2 在Trae里发起审查的完整操作步骤
打开Trae,创建或打开一个Python项目,把上面的代码放进去。接下来按这几个步骤走:
- 在编辑器中打开
user_service.py,用鼠标选中整个文件内容,或者把光标停在文件内,让AI知道你要分析的对象是这个文件。 - 调出Trae的AI对话框(一般就是侧边栏那个AI助手按钮),把上面那份审查提示词粘贴进去。
- 在提示词末尾补充一句"请审查以下代码:",然后把选中的代码粘贴进去(如果是用Ctrl+A全选,某些情况下Trae会直接把选区作为上下文,不需要重复粘贴)。
- 回车发送。等待AI输出审查报告。
这个流程我建议养成肌肉记忆,因为它是另一个场景——AI写代码、AI解释代码、AI补测试用例——的共同底座。你会在Trae里反复使用"选中代码→发指令→收结果→修改"这个循环,所以第一步分子式动作一定要熟练。
3.3 审查输出长什么样,以及怎么变成修改清单
这里我根据多次实测总结一个典型的AI审查报告结构,当然实际输出会有差异,但框架是差不多的。
AI给这份代码返回的问题通常包括:
| 严重程度 | 问题 | 修复建议 |
|---|---|---|
| 严重 | SQL注入:username和password直接拼接查询语句,可被输入' OR 1=1 --绕过 | 使用参数化查询:cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password)) |
| 严重 | 明文密码比对:数据库存明文密码,等于没有认证 | 使用bcrypt或argon2存储密码哈希,登录时对输入做哈希再比对 |
| 严重 | 转账逻辑没有事务保证:两条UPDATE之间如果发生异常,会导致账目不平衡 | 在try/except中包裹事务,失败时rollback |
| 建议 | amount没有做合法性校验:负数、零值可以正常转账 | 增加if amount <= 0: raise ValueError |
| 提示 | get_db()每次新建连接,未使用连接池 | 使用连接池或SQLAlchemy engine来管理连接 |
| 提示 | 函数无类型注解,维护困难 | 增加参数与返回值类型注解 |
拿到这份清单以后,我的处理流程是:先把"严重"级别的问题逐条改掉,改完看diff;然后把"建议"级别的问题批量过一遍,能改的顺手改;"提示"级别的先放着,攒到一定数量再统一处理。这样一来,审查报告直接变成了一张待办清单,落地的效率比手动从零开始看代码高太多了。
这里还有一个小技巧:你可以让AI把每个问题对应的修复代码直接写出来,不只是给建议。把提示词里"具体修复建议"改成"对每个问题给出可直接替换的修复代码",AI通常就会给出before/after对照。再配合Trae里AI修改功能的预览确认,基本上所有机械性的修改都能一键完成。
4. 常见问题与避坑指南
4.1 AI误报怎么处理:它说有问题,就一定有吗
我遇到过很多次AI信誓旦旦地说这个代码有问题,实际检查下来,要么是它没看懂上下文导致误判,要么是它拿一个不适用于当前场景的"最佳实践"硬套。比如它曾经警告我某个FastAPI路由函数没有设置超时时间,但实际上网关已经全局处理了超时,这个警告没有意义。另外,有的版本里AI会坚持认为if __name__ == "__main__":必须存在于每个文件里,其实这完全看场景。
处理误报的基本原则是:严重级别越高,越要人工复核。特别是安全问题,AI说存在SQL注入,一定要自己确认一下数据流,确认后再修,不要闭眼直接改。对于"建议"和"提示"级别的问题,如果AI的建议和你的代码上下文冲突,以你的上下文为准。AI是辅助工具,不是权威本身。
4.2 超大项目怎么审:一次丢一万行代码进去,AI根本扛不住
很多人在我第一次推荐AI审查时,会把整个项目几万个文件丢给AI,然后抱怨AI回复得乱七八糟,或者只分析了其中一小部分。这是对上下文窗口的误解。AI不是无限的,即使支持很长的上下文,输出质量和专注度也会随着长度下降。
正确做法是"分而治之"。把一个大模块拆成文件级别审查,文件太长的再按函数或类审查。我通常一个提示词只审一个文件,最多加几个紧密相关的函数。另外,有一个非常实用的策略:增量审查。如果有git diff,直接把diff内容发给AI,让它只审变更的部分,这比全量审查效率高得多,也是代码审查的标准姿势。
你还可以给AI提供足够的上下文。比如审查一个FastAPI项目,在提示词里写上"这个文件属于app/api/v1模块,依赖services层,配置在settings.py里",AI的判断就会更符合实际。它知道当前代码的"地位",就不会随便把工厂模式之类的多余建议塞给你。
4.3 怎么让AI记住团队规范:把规范写进提示词,而不是指望它自觉
每个团队都有自己的一套代码规范,有人强制类型注解,有人不强制;有人用black格式化,有人坚持某一种缩进风格;有人要求所有数据库查询走ORM,有人允许部分场景用原生SQL。这些规范AI不可能自己知道,但不告诉它,它就按照训练语料里的通用习惯来,这未必符合你的团队。
解决方式很简单:在审查提示词里加一段"团队约束条件"。比如:
团队约定: - 强制使用类型注解 - 禁止在业务代码中直接使用原生SQL,必须通过SQLAlchemy ORM - 所有新增函数必须附带docstring - 外部API访问必须经过services层,不直接在routes层写业务逻辑加完之后,AI就能根据这些规则做针对性审查,而不是泛泛而谈。我建议每个团队维护一份这样的"团队审查提示词",作为代码评审的标配工具。Trae里可以把它保存成一个固定文件或常用短语,每次粘贴即可,非常省事。
4.4 效率提升的量化:10倍是怎么算出来的
标题说效率提升10倍,这里我把账算清楚,免得有人觉得是营销话术。我自己测过的数据是:人工审查一个800行的Python文件,仔细一点需要40到60分钟;用AI辅助走一遍,AI出报告5分钟,我逐条复核和修复大约15分钟,合计20分钟以内。这是2到3倍的提升,还不算10倍。
10倍发生在什么场景呢?是"全量代码走查"或者"新人熟悉项目"的时候。八万行的老项目,一个人从头到尾人工审,不加班的话至少4到6个工作日;我用AI按文件批量过一遍,同时把严重问题列成清单,再针对清单做人工确认,一天到一天半就能完成全部走查。这就是10倍的由来。
需要泼一盆冷水的是:这个场景不是万能的。如果代码高度敏感、完全不能离开内网,或者项目里全是那种没有任何注释、几千行一个文件的老旧模块,AI审查效果会打折扣。它擅长的是"规则明确、上下文完整"的审查,而不是"一团乱麻里抽丝剥茧"的考古工作。
另外我建议不要只把AI审查用在"提交前"这一步,它完全可以前置到开发过程中。我在Trae里写完一个函数,经常顺手选中它,让它快速过一遍有没有低级错误,然后再提交。单个函数只有几行,审查对话来回不到一分钟,但能避免很多低级错误流到集成测试阶段。日常高频小剂量使用,比月底集中大扫除更有价值。
5. 结语:让AI审查从"能用"变成"靠谱"的心得
最后说几点我自己这几年反复调整提示词后沉淀下来的体会,希望能让你少走点弯路。
第一,提示词要持续迭代。我前面给的模板不是一次成型的,最开始我的提示词只有"帮我审查代码"六个字,后来逐步加上维度、输出格式、项目背景、团队规范,经过四五次调优才变成现在这个样子。每次发现AI在某类问题上判断不准,我就把它加进上下文或约束条件里,它下次就很少再犯。
第二,不要把AI的输出当成最终结论。AI的审查报告是一张高质量的问题清单,但"哪些要改、哪些不用改、怎么改、改完怎么验证",这些决策必须由人来完成。越是严重的问题,越要人工确认存在性后动手。我踩过最大的坑,就是有一次想当然按AI建议改了一个"严重性能问题",结果那其实是一个特殊业务逻辑的故意实现,改完之后反而引入了缺陷。从那以后我就养成了习惯:AI的"严重"级别,我要亲自看代码确认才肯动手。
第三,AI审查最难以替代的价值是"教学"。对于刚开始接触Python的新人,AI给出的审查意见比很多文档都直观生动,它会告诉你为什么这里不安全、那里会泄漏连接。我团队里新来的同事第一次看完AI的审查报告,脱口而出"原来代码里会有这么多隐藏问题"。这个价值,虽然不在效率数字里,但长期来看比提高10倍效率更重要。
如果你看完也想把AI审查接入自己的工作流,我的建议是别急着搞复杂的东西。先从一个小文件开始:复制一份上面的提示词模板,把你手头最想清理的那个Python文件丢给Trae,看看返回的审查报告,再亲手把里面的"严重"问题修掉。跑完一次,你就知道下一步该怎么做了。