跳到主要内容

AI 代码审查(AI Code Review)

AI 代码审查指的是:把代码变更(diff)、相关上下文(项目约束、运行结果、需求说明)交给大模型,让它像“资深同事”一样帮你做问题发现风险提示修改建议。它不会替代人工评审,但非常适合在 PR 阶段提前扫一遍:把明显问题、遗漏的边界条件、潜在的构建/依赖风险尽早暴露出来。

这篇文章会重点结合前端“构建工具”场景:package.json、锁文件、Vite/Webpack 配置、CI 脚本等内容,讲清楚如何把 AI 用在代码审查上,并给出可直接复制的提示词模板。

一、AI 代码审查能做什么(以及不能做什么)

1.1 典型收益

  • 更快的首轮筛查:先把“低垂的果子”捞出来(明显的 bug、遗漏的 null 判断、未处理的异常分支)。
  • 更稳定的评审覆盖面:按 checklist 系统性扫一遍(安全、性能、兼容性、可维护性、测试)。
  • 更擅长“文本密集型”变更:例如构建配置、依赖升级、脚本调整、文档改动,它能快速总结影响面。
  • 更好的知识补位:你不熟悉的工具/配置项(如 Vite/webpack 某个选项),AI 可以先给出解释与风险点,帮助你再做验证。

1.2 需要警惕的边界

  • 它不会替你运行代码:能推理,但无法保证“跑起来就对”。最终要靠测试/构建结果确认。
  • 它可能会“编造”不存在的原因或 API:尤其当上下文不足时;你必须要求它“基于 diff 证据回答”。
  • 安全结论不能只靠 AI:涉及鉴权、加密、供应链、命令执行等高风险问题,AI 的结论只能当线索,必须再用安全工具与人工复核。
  • 隐私与合规:不要把密钥、个人信息、商业敏感代码直接贴给不受控的模型/平台。

二、最适合用 AI 审查的前端构建类变更

在“构建工具”类仓库/目录下,AI 审查尤其适合以下几类 PR:

  1. 依赖升级与锁文件变更package.jsonpnpm-lock.yamlnpmrcpnpm-workspace.yaml
    • 关注:破坏性升级、peerDependencies 冲突、重复依赖、postinstall 脚本风险、license 风险。
  2. 构建配置调整vite.config.tswebpack.config.jstsconfig.json、Babel/PostCSS 配置
    • 关注:开发/生产差异、sourcemap 泄露、tree-shaking 失效、别名/路径解析、插件顺序、副作用包处理。
  3. CI/脚本修改:GitHub Actions、scripts/*package.json#scripts
    • 关注:缓存失效、Node 版本变化、构建产物路径变化、环境变量注入、命令执行安全。
  4. 性能相关变更:代码分割、压缩、图片处理、bundle 分析策略
    • 关注:首屏体积、缓存命中、长缓存策略、source map 与错误上报的平衡。

三、推荐工作流:AI 放在“CI 之后、人工之前”

把 AI 当作“预审”,最常见也最有效的摆放方式如下:

这样做的好处是:先用 CI “证伪”明显错误(编译不过、测试挂了),再让 AI 做结构化审查,最后由人工把关“业务正确性 + 架构取舍 + 风险接受”。

四、给 AI 的上下文清单:越具体,越少胡扯

你可以把下面这份清单当作固定模板(建议每次 PR 都尽量补齐):

  • 变更目标:这次改动要解决什么问题?验收标准是什么?
  • 影响范围:影响开发环境还是生产环境?影响哪些页面/模块?
  • 关键文件:把本次 diff 里最关键的文件片段贴出来(不要只贴标题)。
  • 项目约束:Node/包管理器版本、框架版本、是否 monorepo、是否 SSR 等。
  • 运行证据:CI 日志(关键报错段)、本地构建/测试命令与输出。
  • 你想让 AI 重点看什么:例如“重点审查安全与供应链风险”“重点看 Vite 构建产物体积”。

一个可直接复制的“上下文头部”示例:

项目背景:
- 前端:React + TypeScript
- 构建:Vite(生产构建)/ Webpack(遗留包)
- 包管理:pnpm
- Node:>= 20

本次目标:
- 升级依赖以修复漏洞,并调整构建配置减少产物体积

请你基于以下 diff 做 AI 代码审查,输出:
1) 变更摘要(3-5 条)
2) 风险点(按严重度:阻塞/重要/建议)
3) 具体修改建议(尽量给出可直接应用的代码片段或补丁)
4) 需要补充的测试/验证命令
5) 你仍不确定、需要我补充的信息

五、审查维度 Checklist(构建类 PR 版本)

下面这个表可以直接作为“提问清单”,让 AI 按项输出。

维度你要检查什么适合问 AI 的问题
正确性配置是否写错、拼写是否错误、逻辑是否自洽“这段配置在 Vite/Webpack 里是否有效?有没有拼写错误或互斥选项?”
兼容性Node/浏览器/依赖版本兼容、破坏性升级“升级是否有 breaking change?对 Node 20/浏览器支持是否有影响?”
构建产物tree-shaking、sourcemap、chunk、资源路径“这会不会导致 tree-shaking 失效或产物变大?sourcemap 是否可能泄露源码?”
依赖与供应链postinstall、二进制依赖、license、重复依赖“新增/升级依赖是否引入脚本执行风险?是否可能产生重复依赖或 peer 冲突?”
安全注入、命令执行、路径遍历、敏感信息泄露“是否存在可被用户输入影响的命令执行/路径拼接?是否把敏感配置打进包?”
可维护性可读性、可配置性、可观测性“有没有更清晰的写法?需要补充注释/文档吗?”
测试与验证该怎么验证变更有效且无回归“给出最小验证步骤:哪些命令、看哪些指标/日志?”

六、提示词模板(直接可用)

6.1 通用 PR 审查模板(强烈推荐)

你是一个严谨的代码审查员。请基于我提供的 diff 审查代码,不要臆测仓库里不存在的文件或逻辑。

输出格式必须包含:
1) 变更摘要(要点列表)
2) 问题与风险(按严重度:阻塞 / 重要 / 建议)
3) 可操作的修改建议(给出具体代码片段;能给补丁更好)
4) 需要补充的测试与验证步骤(可复制命令)
5) 需要我补充的上下文问题(如果信息不足)

额外要求:
- 如果你指出问题,请引用对应的文件名与代码片段(来自 diff)。
- 不要泛泛而谈;每条建议都要说明“为什么”和“怎么做”。

6.2 构建配置变更(Vite/Webpack)专项模板

请专项审查本次构建配置相关变更(Vite/Webpack/TSConfig/CI)。
重点关注:
1) 开发 vs 生产的行为差异
2) tree-shaking / code splitting 是否可能失效
3) sourcemap、环境变量、路径别名是否可能导致泄露或构建失败
4) 插件/loader 顺序是否合理,是否有互斥或重复
5) 缓存策略与构建耗时:是否会让 CI 变慢

请输出:
- 风险清单(阻塞/重要/建议)
- 推荐的验证命令(例如 build、bundle 分析、产物体积对比)
- 如需修改,给出可直接复制的配置片段

6.3 依赖升级 + 锁文件变更专项模板

请审查依赖升级(package.json + 锁文件)相关风险:
1) 是否存在 breaking changes、peerDependencies 冲突
2) 是否引入新的 postinstall/prepare 脚本或二进制依赖
3) 是否可能导致重复依赖、包体积增大、构建速度下降
4) 是否需要同步更新 Node 版本、构建脚本或 CI 缓存键

请输出:
- 风险点(按严重度)
- 推荐的验证命令(install/build/test)
- 如果需要锁定版本/加 overrides/resolutions,请给出示例

6.4 安全与供应链专项模板(高风险变更时使用)

请以安全审查视角审查本次 diff,重点看:
1) 是否出现命令执行(child_process/exec)、危险脚本(postinstall)
2) 是否出现把敏感信息打包进前端(env、token、密钥)
3) 是否存在路径拼接、正则、反序列化等高风险点
4) 依赖引入是否可疑(来源不明、权限过大、脚本过多)

输出:
- 高风险点(阻塞)
- 中风险点(重要)
- 低风险点(建议)
- 需要进一步确认的证据/信息(例如 CI 日志、依赖来源说明)

七、让 AI 的输出“更像一个可合并的 Review”

建议你强制 AI 用结构化输出,减少“长篇大论但不可用”的情况:

  • 严重度分级:阻塞(必须改)/重要(强烈建议改)/建议(可选优化)
  • 建议必须落到动作:给出具体代码片段、配置项、验证命令
  • 遇到不确定就提问:让它列出“我还缺什么信息才能下结论”

一个常用的 Review 输出骨架(你可以要求 AI 复用这个格式):

变更摘要:
- ...

阻塞:
- [文件] 片段:...
原因:...
建议:...

重要:
- ...

建议:
- ...

验证步骤:
- pnpm install
- pnpm build
- (可选)产物体积对比:...

需要补充的信息:
- ...

八、实战示例:一次“依赖升级 + 构建配置调整”的 AI 审查

你可以把下面的 diff(示例)连同“输出格式要求”一起交给 AI,让它按 checklist 输出:

diff --git a/package.json b/package.json
@@
"dependencies": {
- "vite": "^5.0.0",
+ "vite": "^6.0.0",
"react": "^19.0.0"
},
"scripts": {
+ "postinstall": "node scripts/check-env.js",
"build": "docusaurus build"
}

diff --git a/vite.config.ts b/vite.config.ts
@@
export default defineConfig({
build: {
+ sourcemap: true,
rollupOptions: {
output: {
manualChunks: undefined
}
}
}
})

你期望 AI 能至少指出这些点(不代表全部):

  • vite 大版本升级是否可能有 breaking change(需要看迁移指南/实际构建结果验证)
  • 新增 postinstall 脚本的供应链风险与可维护性(是否必要、是否会影响 CI、是否需要文档说明)
  • build.sourcemap: true 在生产环境可能带来的源码泄露风险(是否只对内部环境开启、是否上传到错误平台后再删除)
  • manualChunks: undefined 的真实效果是否如预期(是否反而让拆包策略失控)

九、把 AI 审查接入团队(可选)

常见接入方式(从低成本到高自动化):

  1. 本地使用(个人):提交 PR 前把 diff 贴给 AI,先修一轮。
  2. PR 机器人评论(团队):CI 拉取 PR diff,调用模型产出结构化评论(注意脱敏与权限控制)。
  3. 与规则工具结合:AI 负责“理解与建议”,规则工具负责“证据与拦截”(lint、单测、SAST、依赖扫描等)。

关键原则:AI 的输出不要直接自动合并(除非你有非常强的约束与回滚机制),它更适合“辅助决策”而不是“自动决策”。

十、常见误区与最佳实践

  • 误区 1:把 AI 当成权威结论:正确做法是把它当“线索生成器”,再用测试/构建/工具验证。
  • 误区 2:只给一句话让它猜:正确做法是贴 diff + 约束 + 目标 + 输出格式。
  • 误区 3:输出太泛,落不了地:正确做法是强制它给“可执行建议”(代码片段/命令/清单)。
  • 误区 4:忽视数据安全:正确做法是脱敏、最小必要信息、使用受控模型与权限审计。

十一、面试高频问答

  1. AI 代码审查能替代人工 Code Review 吗?为什么?
    不能。AI 缺少真实运行与业务语境,可能出现幻觉;最终责任需要由工程师承担。AI 更适合做首轮筛查与结构化建议。
  2. AI 审查和 lint/静态检查的关系是什么?
    lint/静态检查是规则驱动、可证伪;AI 是语义驱动、善于发现“规则之外的问题”。最佳实践是“规则工具兜底 + AI 提升覆盖面 + 人工做关键决策”。
  3. 如何降低 AI 幻觉带来的误导?
    给足上下文(diff/约束/日志),要求“引用证据回答”,并让它列出不确定项与需要补充的信息。
  4. 把 AI 放在流程的哪个位置最合适?
    通常是 CI 之后、人工评审之前:先用 CI 过滤硬错误,再用 AI 输出结构化风险清单,最后人工聚焦关键点。
  5. 依赖升级时,AI 审查最该关注什么?
    breaking changes、peerDependencies 冲突、postinstall/二进制依赖风险、重复依赖与体积/构建耗时变化、Node/CI 兼容性。
  6. 构建配置(Vite/Webpack)变更时,AI 审查最该关注什么?
    开发/生产差异、tree-shaking 与拆包策略、sourcemap 与 env 泄露、插件/loader 顺序与副作用、缓存与构建耗时。
  7. 为什么说“安全结论不能只靠 AI”?
    因为安全需要证据链与可验证手段(扫描/复现/审计)。AI 的强项是提示可疑点与推演攻击路径,但结论必须复核。
  8. 如何评估 AI 审查在团队中的效果?
    看可量化指标:评审耗时是否下降、回归缺陷是否减少、阻塞问题提前发现率、误报率、开发者满意度等。
  9. AI 审查输出太长、不可执行怎么办?
    在提示词里强制输出格式(摘要/风险分级/可执行建议/验证命令/待确认问题),并限制每个部分条数。
  10. 团队接入 AI 审查时,最重要的风险是什么?
    数据泄露与权限滥用(把私有代码/密钥发到不受控平台),以及“自动化过度”导致未经验证的建议被直接采纳。