Chico Notes
AI Engineering

AI 代码审查实践:如何让模型帮你发现真实问题

把 AI 用在代码审查中,重点不是让它泛泛点评,而是围绕变更意图、风险边界、测试证据和上线影响发现真实问题。

持续修订的工程笔记

AI 很适合做第一轮代码审查,但前提是审查任务被设计好。直接把 diff 扔给模型,让它“帮我 review 一下”,通常会得到格式化建议、命名建议和一些看似正确但价值不高的提醒。真正有用的 AI Review,要让模型围绕变更意图、风险边界和验收证据工作。

核心判断

好的 AI Review 不是评论更多,而是更早发现真实风险:行为回归、权限绕过、边界条件、数据兼容、安全泄露、测试缺口和部署风险。

审查链路

AI 应该介入三处:提交前自查、PR 初审、合并前复核。提交前适合发现低级错误;PR 初审适合补充审查视角;合并前复核适合确认测试、风险和发布说明是否齐全。

给模型什么输入

不要只给 diff。更好的输入结构是:

请按代码审查方式检查这个变更。

变更目标:
- [这次改动想解决什么问题]

风险边界:
- 不能破坏的公开 API / URL / 数据格式
- 不能修改的权限、计费、审计、配置逻辑

检查材料:
- git diff
- 相关文件
- 测试结果
- 构建结果

输出要求:
- 只列真实风险,不要泛泛建议
- 按严重程度排序
- 每条问题给文件位置、原因、影响和建议修复
- 如果没有发现问题,说明剩余风险和缺失测试

审查维度

维度重点问题
行为是否改变了已有用户可见行为、路由、接口、默认值。
数据是否影响持久化格式、迁移、空值、兼容性。
权限是否绕过 ACL、租户隔离、角色校验、对象级权限。
安全是否暴露密钥、日志敏感信息、SSRF、注入、XSS。
并发是否有竞态、重复提交、幂等性、锁和重试问题。
性能是否引入 N+1 查询、无界循环、过大上下文、缓存击穿。
测试是否覆盖成功路径、失败路径、边界条件和回归场景。

Prompt:提交前自查

你是严格的代码审查者。请检查当前 diff,只关注可能导致真实线上问题的点。

优先级:
1. 行为回归
2. 安全和权限
3. 数据兼容
4. 错误处理和边界条件
5. 测试缺口

请不要输出风格建议,除非风格问题会导致 bug。

这个 Prompt 适合开发者在本地提交前使用。它能减少无意义反馈,把模型注意力收束到风险上。

Prompt:PR 初审

请像资深 reviewer 一样审查这个 PR。

上下文:
- PR 目标:...
- 相关业务约束:...
- 已运行检查:...

请输出:
1. 必须修复的问题
2. 建议修复的问题
3. 需要作者确认的问题
4. 缺失的测试
5. 如果可以合并,请说明剩余风险

限制:
- 不要重复描述代码做了什么
- 不要提出无关重构
- 每条发现必须能映射到具体代码或测试缺口

PR 初审的价值不是代替人工 approve,而是帮助 reviewer 更快定位需要重点看的地方。

Findings 格式

要求模型使用固定格式,能显著提高可用性:

[Severity] 文件:行号
问题:...
影响:...
建议:...
需要测试:...

例如:

[High] src/auth/checkAccess.ts:42
问题:只校验了用户是否登录,没有校验 document.tenantId 是否等于 currentTenantId。
影响:多租户场景下可能读取到其他租户文档。
建议:在返回前加入租户校验,并补充跨租户访问测试。
需要测试:tenant A 用户访问 tenant B 文档应返回 403。

让 AI 少说废话

AI Review 常见问题是啰嗦、重复、过度建议。可以用三个约束控制:

人和 AI 的分工

角色负责内容
AI快速扫 diff、列风险、找边界条件、建议测试。
作者解释变更意图、补测试、修复问题、说明取舍。
Reviewer判断风险是否真实、决定是否阻塞合并。
CI用类型检查、测试、构建和安全扫描提供客观证据。

不要让 AI 决定“能不能合并”。它可以提供审查候选项,但最终判断必须由熟悉业务边界的人做。

合并前门禁

确认 PR 描述包含目标、范围、测试和风险。
让 AI 对最终 diff 做一次风险复核。
人工检查 AI 标出的高风险点。
确认 CI、类型检查、构建和关键测试通过。
如果涉及数据、权限、计费、发布配置,必须有人工二次确认。

实用结论

AI 代码审查的正确定位是“风险放大镜”,不是“自动盖章器”。把输入上下文、风险分类、输出格式和门禁流程固定下来,它能稳定帮助团队发现真实问题;如果只是让它泛泛 review,通常只会制造更多噪音。

讨论

继续讨论这篇笔记

有问题、补充案例或不同观点,可以通过 GitHub Discussions 继续交流。

On this page