让 AI 做 Code Review,别把整个项目都扔过去:给它看这 4 份材料就够了

52 阅读10分钟

团队里最怕的一种 AI Code Review,不是它说错了,而是它说得太像对的。

比如你丢给它一整个项目,然后问:

帮我 Review 一下这次改动有没有问题。

它可能会很认真地输出一堆建议:

这里可以抽函数;
这里命名可以优化;
这里建议重构;
这里可以换一种设计模式。

看起来很专业,但你真正关心的可能是:

这次改动有没有破坏旧逻辑?
有没有漏掉异常分支?
接口返回结构有没有变?
权限校验有没有绕过去?
测试有没有覆盖核心路径?
有没有引入线上风险?

AI 做 Code Review 的正确姿势,不是让它“通读整个项目”,而是让它围绕这次 PR 的目标看改动。

我现在更推荐一个很轻的方式:给 AI 准备一份 Review Packet。

ChatGPT Image 2026年5月29日 01_26_33 (2).png

它只包含 4 份材料:

  1. 这次 PR 想解决什么问题
  2. 这次改了哪些文件
  3. 这次真实的 git diff
  4. 测试结果或未测试原因

这样 AI 的注意力会集中很多,也更像一个靠谱的 Reviewer,而不是一个突然兴奋的重构爱好者。


1. 不要让 AI 先看项目,让它先看“改动意图”

Code Review 的第一步不是看代码,而是看目的。

同样一段代码,如果目标不同,Review 结论可能完全不同。

比如这个改动:

if (!user) {
  return null;
}

如果目标是“避免页面崩溃”,这可能是合理兜底。

但如果目标是“登录态校验”,这可能掩盖了权限问题。

所以给 AI 的第一段信息,应该是 PR 目标,而不是代码文件。

可以这样写:

本次 PR 目标:

修复用户进入订单详情页时,偶发出现空白页的问题。

已知现象:
- 用户从消息通知进入订单详情页
- 某些订单状态下接口返回 order 字段为空
- 前端直接读取 order.status 导致页面崩溃

本次修改目标:
- 避免页面崩溃
- 保留原有订单状态展示逻辑
- 不修改后端接口结构
- 不改变路由跳转逻辑

这一段能帮 AI 判断:它应该重点看“空值兜底”“异常展示”“旧逻辑是否保留”,而不是突然建议你重写订单模块。


2. 用 Git 生成最小 Review 材料

如果你用 Git 管理项目,可以先生成几个材料。

查看本次改动文件:

git diff --name-only main...HEAD

查看改动统计:

git diff --stat main...HEAD

生成完整 diff:

git diff main...HEAD > review.diff

如果你是本地还没提交的改动,可以用:

git diff > review.diff

如果已经 git add 了,可以用:

git diff --cached > review.diff

如果想把最近一次提交拿出来给 AI 看:

git show --stat HEAD
git show HEAD > review.diff

这些命令的好处是:AI 看到的是“这次改了什么”,而不是“这个项目所有代码长什么样”。

这对 Review 很关键。

因为真正的代码审查,看的不是项目百科,而是变更影响。


3. 给 AI 的 Review Packet 模板

可以新建一个文件:

touch REVIEW_PACKET.md

把下面内容填进去:

# AI Code Review Packet

## 1. PR 目标

【写清楚这次改动要解决什么问题】

## 2. 背景信息

【用户场景、业务限制、历史兼容逻辑、不能改的地方】

## 3. 改动文件

```text
【粘贴 git diff --name-only main...HEAD 的结果】
```

## 4. 改动统计

```text
【粘贴 git diff --stat main...HEAD 的结果】
```

## 5. 核心 Diff

```diff
【粘贴 review.diff 中与本次问题最相关的部分】
```

## 6. 测试结果

```text
【粘贴 npm test / pnpm test / pytest / go test / mvn test 等结果】
```

## 7. 希望 AI 重点检查

请重点检查:

1. 是否偏离 PR 目标
2. 是否改变原有接口结构
3. 是否漏掉异常分支
4. 是否影响旧数据或历史兼容逻辑
5. 是否有权限、安全、空值、并发风险
6. 测试是否覆盖核心路径
7. 是否存在不必要的大范围重构

## 8. AI 输出要求

请不要直接重写代码。

请按以下格式输出:

1. 总体 Review 结论
2. 必须修改的问题
3. 建议修改但不阻塞的问题
4. 需要人工确认的问题
5. 建议补充的测试用例
6. 如果要改,只给最小 patch 思路

这个模板的重点是最后一句:

请不要直接重写代码。

AI 很容易从 Review 变成“帮你重构一下”。
但 Review 的目标不是让代码变得“更像 AI 喜欢的样子”,而是判断这次改动能不能安全合并。

ChatGPT Image 2026年5月29日 01_26_33 (3).png


4. 一个更适合掘金读者的 AI Review 提示词

你可以直接复制这段:

你现在是一个严格但克制的 Code Reviewer。

请基于我提供的 REVIEW_PACKET 做代码审查。

审查规则:

1. 只围绕本次 PR 目标和 diff 做判断
2. 不要提出和本次目标无关的大范围重构
3. 不要因为“风格更好”就建议改动
4. 优先发现会导致线上问题的风险
5. 对不确定的地方标注“需要人工确认”
6. 如果建议修改,请说明原因、影响范围和最小改法
7. 如果测试不足,请给出应该补充的测试场景

输出格式:

## 总体结论

一句话说明是否建议合并。

## 阻塞问题

列出必须修改的问题,没有就写“暂无”。

## 风险点

列出可能影响线上行为、历史兼容、权限、安全、数据一致性的风险。

## 测试建议

列出建议补充的测试用例。

## 非阻塞建议

只列真正有价值的建议,不要泛泛建议重构。

这个提示词比“帮我 Review 一下”稳定很多。

因为它提前限制了 AI 的角色、范围和输出格式。


5. 一个真实一点的例子

假设你这次改的是一个订单详情页。

原代码:

function getOrderStatusText(order: Order) {
  return statusMap[order.status] || "未知状态";
}

export function OrderDetail({ order }: { order: Order }) {
  return (
    <div>
      <h1>订单详情</h1>
      <p>{getOrderStatusText(order)}</p>
    </div>
  );
}

为了修复空白页,你改成:

function getOrderStatusText(order?: Order | null) {
  if (!order) {
    return "订单不存在";
  }

  return statusMap[order.status] || "未知状态";
}

export function OrderDetail({ order }: { order?: Order | null }) {
  return (
    <div>
      <h1>订单详情</h1>
      <p>{getOrderStatusText(order)}</p>
    </div>
  );
}

你直接问 AI:

帮我看看这样改有没有问题。

它可能会说:

建议把 getOrderStatusText 改成 useMemo,或者封装成独立组件。

这不一定错,但不是最关键的问题。

如果你用 Review Packet,它更可能检查到:

  • order 为空时展示“订单不存在”是否符合产品预期
  • 是否应该区分“订单不存在”和“接口加载中”
  • 是否会影响原来必须传入 Order 的组件类型约束
  • 上层调用方是否也需要处理 loading / error 状态
  • 是否需要补一个 order 为 null 的测试用例

这才是 Code Review 真正有价值的地方。


6. 可以顺手加一个小脚本

如果你经常让 AI 做 Review,可以写一个简单脚本自动生成基础材料。

新建:

touch make_review_packet.sh
chmod +x make_review_packet.sh

写入:

#!/usr/bin/env bash

set -e

BASE_BRANCH=${1:-main}
OUT_FILE=${2:-REVIEW_PACKET.md}

echo "# AI Code Review Packet" > "$OUT_FILE"

echo "" >> "$OUT_FILE"
echo "## 1. PR 目标" >> "$OUT_FILE"
echo "" >> "$OUT_FILE"
echo "请在这里填写本次 PR 要解决的问题、业务背景和限制条件。" >> "$OUT_FILE"

echo "" >> "$OUT_FILE"
echo "## 2. 改动文件" >> "$OUT_FILE"
echo "" >> "$OUT_FILE"
echo '```text' >> "$OUT_FILE"
git diff --name-only "$BASE_BRANCH"...HEAD >> "$OUT_FILE" || true
echo '```' >> "$OUT_FILE"

echo "" >> "$OUT_FILE"
echo "## 3. 改动统计" >> "$OUT_FILE"
echo "" >> "$OUT_FILE"
echo '```text' >> "$OUT_FILE"
git diff --stat "$BASE_BRANCH"...HEAD >> "$OUT_FILE" || true
echo '```' >> "$OUT_FILE"

echo "" >> "$OUT_FILE"
echo "## 4. 核心 Diff" >> "$OUT_FILE"
echo "" >> "$OUT_FILE"
echo '```diff' >> "$OUT_FILE"
git diff "$BASE_BRANCH"...HEAD >> "$OUT_FILE" || true
echo '```' >> "$OUT_FILE"

echo "" >> "$OUT_FILE"
echo "## 5. 测试结果" >> "$OUT_FILE"
echo "" >> "$OUT_FILE"
echo "请粘贴测试命令和结果,例如 pnpm test、npm test、pytest、go test ./... 等。" >> "$OUT_FILE"

echo "" >> "$OUT_FILE"
echo "## 6. 希望 AI 重点检查" >> "$OUT_FILE"
echo "" >> "$OUT_FILE"
echo "- 是否偏离 PR 目标" >> "$OUT_FILE"
echo "- 是否改变原有接口结构" >> "$OUT_FILE"
echo "- 是否漏掉异常分支" >> "$OUT_FILE"
echo "- 是否存在权限、安全、空值、并发风险" >> "$OUT_FILE"
echo "- 是否需要补充测试用例" >> "$OUT_FILE"

echo "Generated $OUT_FILE"

运行:

./make_review_packet.sh main REVIEW_PACKET.md

如果你的主分支叫 master

./make_review_packet.sh master REVIEW_PACKET.md

生成后,你只需要补上 PR 目标和测试结果,就可以发给 AI 做 Review。


7. 这套方法适合哪些场景

比较适合:

前端组件改动;
接口返回结构调整;
表单校验逻辑;
Node.js / Java / Go / PHP 后端接口;
React / Vue / Next.js 页面逻辑;
测试用例补充;
小范围重构;
PR 合并前自查。

不太适合直接交给 AI 决策:

权限系统大改;
支付链路;
数据库迁移;
生产部署脚本;
核心加密逻辑;
复杂并发问题;
跨服务链路改造。

这些不是不能让 AI 看,而是不能让 AI 直接拍板。

AI 可以帮你列风险,但最终合不合,要人来判断。


8. AI Review 最容易踩的 3 个坑

坑 1:让 AI 追求“更优雅”

很多 AI Review 会倾向于让代码更抽象、更整洁。

但真实项目里,有些“不优雅”是历史兼容。

比如旧接口不能改字段名,老用户数据不能清理,某些 if 判断是为了兼容早期版本。

所以你要明确告诉 AI:

不要因为代码风格不够优雅就建议重构。除非它会导致 bug、风险或维护困难。

坑 2:不告诉 AI 测试结果

只看 diff,不看测试结果,Review 容易停在表面。

至少告诉 AI:

pnpm test 是否通过
npm run build 是否通过
接口测试是否通过
手动验证了哪些路径
哪些路径还没测

尤其是“哪些路径还没测”,对 AI 很重要。

它可以帮你补测试清单。

坑 3:让 AI 直接改最终代码

我更建议让 AI 先输出 Review 结论,再由你决定是否修改。

如果确实要它改,也要限制:

只针对阻塞问题给出最小 patch,不要顺手重构,不要改无关文件。

AI 写代码很快,但线上事故不会因为“是 AI 写的”就少背锅。


9. 关于工具本身

这套方法不绑定某一个工具。

你用 ChatGPT、Claude、Cursor、Kiro 都可以。Cursor 更适合结合编辑器和 diff 继续处理;Claude / ChatGPT 更适合先做 Review 分析;Kiro 适合把需求、任务和改动边界拆清楚。

如果你长期使用 ChatGPT Plus、Claude Pro、Grok、Gemini Advanced、Cursor、Kiro 这类工具,也可以顺手了解 gpt68.com。它是 AI会员充值平台,可以作为 AI 工具订阅充值入口之一。

但还是那句话:工具只是入口,真正决定效果的是你给 AI 的材料质量。


10. 验证范围说明

上面的 Git 命令属于常规 Git 工作流命令,适用于已经初始化 Git 仓库的项目。

脚本逻辑做了语法检查,使用场景如下:

项目必须是 Git 仓库;
本地需要安装 Git;
默认对比 main 分支;
如果主分支是 master,需要手动传参;
如果当前分支没有相对 main 的改动,生成的 diff 会为空;
如果项目没有提交历史,部分命令可能没有输出。

实际项目中,建议生成 REVIEW_PACKET.md 后人工看一眼,尤其注意不要把敏感信息、内部域名、真实 token、用户数据放进去。


11. 总结

AI 做 Code Review,不是把整个项目扔过去让它“自由发挥”。

更稳的方式是:

告诉它这次 PR 要解决什么;
只给它看本次改动;
补充测试结果;
限制它不要乱重构;
让它重点找风险、边界和遗漏测试。

很多时候,AI 不是不懂代码,而是你给它的信息太散。

把 Review Packet 准备好,它就更像一个认真看 PR 的同事;
不准备上下文,它就更像一个刚进项目、但话很多的新人。

对开发者来说,这可能才是 AI 编程时代最值得练的能力:不是让 AI 写更多代码,而是让 AI 更准确地参与工程判断。