文章目录
为什么要让 AI 做 Code Review?
传统代码审查面临几个痛点:
- 审查积压:工程师忙,PR 等待 24 小时以上才有人看很常见
- 质量参差不齐:不同审查者标准不同,新人审查经验不足
- 重复劳动:大量时间花在指出格式问题、命名不规范等低价值工作上
- 时区问题:跨时区团队等待审查效率极低
AI Code Review 的价值在于:
- 即时响应:PR 创建后秒级给出反馈,无需等待
- 标准统一:不受情绪、疲劳影响,规则执行一致
- 覆盖全面:同时分析逻辑、安全、性能、可读性
- 减轻人工负担:让人类审查者专注于业务逻辑和架构决策
AI Code Review 的三种模式
模式一:本地 AI 辅助(开发阶段)
在代码写完、提交之前,借助 IDE 插件让 AI 实时提示问题。
代表工具:
- GitHub Copilot(VS Code / JetBrains)
- Cursor
- Continue(开源,支持本地模型)
适用场景: 个人开发时的实时辅助,不进入团队流程。
模式二:PR 自动审查机器人(团队协作)
每次提交 PR,AI 自动分析 Diff 并在 PR 页面发布评论。
代表工具:
- CodeRabbit(最成熟,支持中文)
- Qodo Merge(前身 PR-Agent,开源可自托管)
- Sourcery(Python 专项)
- GitHub Copilot Code Review(GitHub 官方,beta)
适用场景: 团队协作,嵌入现有 GitHub / GitLab 工作流。
模式三:CI/CD 集成自定义审查(完全可控)
在 CI 流水线中调用 AI API,自定义审查规则和输出格式。
代表工具: OpenAI API / Claude API + GitHub Actions
适用场景: 需要高度定制化,或有数据安全要求的团队。
方案一:接入 CodeRabbit(推荐新手)
CodeRabbit 是目前最易用、功能最全的 AI Code Review 工具,支持 GitHub 和 GitLab,对开源仓库免费。
安装步骤
- 访问 coderabbit.ai
- 用 GitHub 账号登录,授权仓库访问权限
- 在目标仓库安装 CodeRabbit GitHub App
- 完成,下次创建 PR 自动触发
配置文件
在仓库根目录创建 .coderabbit.yaml:
# .coderabbit.yaml
language: "zh-CN" # 使用中文审查
reviews:
profile: "assertive" # 审查风格:chill(宽松)/ assertive(严格)
request_changes_workflow: true # 发现严重问题时请求修改
high_level_summary: true # 生成 PR 摘要
auto_review:
enabled: true
drafts: false # 草稿 PR 不触发
base_branches:
- main
- develop
# 自定义审查规则
instructions: |
请重点关注以下几点:
1. 函数单一职责原则
2. 错误处理是否完整
3. 是否存在 SQL 注入或 XSS 风险
4. 关键操作是否有日志记录
5. 新增代码是否有对应的单元测试
# 忽略特定文件
path_filters:
- "!**/*.lock"
- "!**/dist/**"
- "!**/__snapshots__/**"
- "!**/vendor/**"
chat:
auto_reply: true # 自动回复评论中的问题
效果展示
接入后,每个 PR 会自动收到类似如下的 AI 评论:
## CodeRabbit 审查摘要
### 🔴 需要修改
- `src/auth/login.ts:42` — 密码比较使用了非恒定时间比较,
存在时序攻击风险,建议使用 `crypto.timingSafeEqual()`
### 🟡 建议优化
- `src/utils/format.ts:18` — 此函数圈复杂度为 12,超过推荐值 10,
建议拆分为多个小函数
### 🟢 总体评价
代码逻辑清晰,测试覆盖率良好。主要需处理上述安全问题。
方案二:Qodo Merge(开源可自托管)
Qodo Merge(原 PR-Agent)是开源项目,可以完全自托管,适合对数据安全有要求的团队。
GitHub Actions 集成
# .github/workflows/ai-review.yml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
issue_comment:
types: [created] # 支持通过评论命令触发
jobs:
review:
runs-on: ubuntu-latest
if: |
github.event_name == 'pull_request' ||
(github.event_name == 'issue_comment' &&
startsWith(github.event.comment.body, '/review'))
steps:
- name: AI Code Review
uses: Codium-ai/pr-agent@main
env:
OPENAI_KEY: ${{ secrets.OPENAI_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
github_action_config.auto_review: "true"
github_action_config.auto_describe: "true"
github_action_config.auto_improve: "true"
支持的评论命令
在 PR 评论中输入以下命令可触发对应功能:
| 命令 | 功能 |
|---|---|
/review |
重新触发代码审查 |
/describe |
生成 PR 描述和摘要 |
/improve |
给出代码改进建议 |
/ask 你的问题 |
针对 PR 提问 |
/test |
生成单元测试建议 |
/changelog |
生成变更日志条目 |
方案三:自建 AI 审查流水线(完全定制)
如果需要完全控制审查逻辑,可以在 CI 中直接调用 AI API。
完整实现
# scripts/ai_review.py
import os
import sys
import json
import subprocess
import anthropic
def get_pr_diff():
"""获取 PR 的代码变更"""
base = os.environ.get("GITHUB_BASE_REF", "main")
result = subprocess.run(
["git", "diff", f"origin/{base}...HEAD"],
capture_output=True, text=True
)
return result.stdout
def review_with_claude(diff: str) -> str:
"""调用 Claude API 进行代码审查"""
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
system_prompt = """你是一位资深软件工程师,正在做代码审查。
请分析提供的 Git Diff,从以下维度给出结构化反馈:
1. **安全问题**(最高优先级):SQL注入、XSS、硬编码密钥、权限检查缺失等
2. **逻辑错误**:边界条件、空指针、并发问题、错误处理缺失
3. **性能问题**:N+1查询、不必要的循环、内存泄漏
4. **代码质量**:函数过长、命名不清、重复代码、注释缺失
5. **测试覆盖**:新增逻辑是否有对应测试
输出格式为 JSON:
{
"summary": "总体评价(1-2句话)",
"severity": "APPROVE | REQUEST_CHANGES | COMMENT",
"issues": [
{
"level": "error | warning | info",
"file": "文件路径",
"line": 行号或null,
"category": "security | logic | performance | quality | test",
"message": "问题描述",
"suggestion": "修改建议"
}
]
}
只返回 JSON,不要有其他文字。"""
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=4096,
system=system_prompt,
messages=[
{
"role": "user",
"content": f"请审查以下代码变更:\n\n```diff\n{diff[:12000]}\n```"
}
]
)
return message.content[0].text
def post_github_comment(review_result: dict):
"""将审查结果发布为 GitHub PR 评论"""
import urllib.request
token = os.environ["GITHUB_TOKEN"]
repo = os.environ["GITHUB_REPOSITORY"]
pr_number = os.environ["PR_NUMBER"]
# 构建 Markdown 评论内容
severity_emoji = {
"APPROVE": "✅",
"REQUEST_CHANGES": "🔴",
"COMMENT": "💬"
}
level_emoji = {
"error": "🔴",
"warning": "🟡",
"info": "🔵"
}
body = f"## 🤖 AI Code Review\n\n"
body += f"{severity_emoji.get(review_result['severity'], '💬')} **{review_result['summary']}**\n\n"
if review_result["issues"]:
body += "### 发现的问题\n\n"
for issue in review_result["issues"]:
emoji = level_emoji.get(issue["level"], "🔵")
file_ref = f"`{issue['file']}`" + (f":{issue['line']}" if issue.get("line") else "")
body += f"{emoji} **{file_ref}**\n"
body += f"> {issue['message']}\n"
if issue.get("suggestion"):
body += f"\n💡 建议:{issue['suggestion']}\n"
body += "\n"
else:
body += "✨ 未发现明显问题,代码质量良好!\n"
body += "\n---\n*由 Claude AI 自动审查,仅供参考,最终决策由人工审查者负责。*"
# 发送评论
url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments"
data = json.dumps({"body": body}).encode()
req = urllib.request.Request(
url,
data=data,
headers={
"Authorization": f"token {token}",
"Content-Type": "application/json",
"Accept": "application/vnd.github.v3+json"
}
)
urllib.request.urlopen(req)
def main():
diff = get_pr_diff()
if not diff.strip():
print("没有代码变更,跳过审查")
sys.exit(0)
print("正在进行 AI 代码审查...")
raw_result = review_with_claude(diff)
try:
review_result = json.loads(raw_result)
except json.JSONDecodeError:
print(f"解析 AI 响应失败:{raw_result}")
sys.exit(1)
post_github_comment(review_result)
print(f"审查完成,结论:{review_result['severity']}")
# 如果有严重问题,CI 标记失败
error_count = sum(1 for i in review_result["issues"] if i["level"] == "error")
if error_count > 0:
print(f"发现 {error_count} 个严重问题,请修复后重新提交")
sys.exit(1)
if __name__ == "__main__":
main()
对应的 GitHub Actions 配置
# .github/workflows/ai-review.yml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
ai-review:
runs-on: ubuntu-latest
permissions:
pull-requests: write # 需要写评论权限
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 需要完整历史来 diff
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: 安装依赖
run: pip install anthropic
- name: 运行 AI 审查
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
PR_NUMBER: ${{ github.event.number }}
GITHUB_BASE_REF: ${{ github.base_ref }}
run: python scripts/ai_review.py
各方案对比
| 维度 | CodeRabbit | Qodo Merge | 自建方案 |
|---|---|---|---|
| 上手难度 | ⭐ 极简 | ⭐⭐ 简单 | ⭐⭐⭐⭐ 复杂 |
| 定制灵活性 | 中 | 高 | 完全可控 |
| 数据安全 | 代码发送至第三方 | 可自托管 | 完全自控 |
| 费用 | 开源免费,商业付费 | 开源免费 | 按 API 用量付费 |
| 中文支持 | ✅ 原生支持 | ✅ 支持 | ✅ 取决于模型 |
| 适合场景 | 快速起步、中小团队 | 需要自托管的团队 | 大型企业、高度定制 |
最佳实践
1. AI 审查不能替代人工审查
AI 擅长发现规则性问题(安全漏洞、代码风格、常见错误模式),但对业务逻辑合理性、架构决策的判断仍需要人类。建议的工作流:
AI 审查(立即)→ 开发者修复明显问题 → 人工审查(专注逻辑)→ 合并
2. 控制 AI 的「话痨」倾向
AI 倾向于给出大量建议,可能淹没真正重要的问题。通过配置过滤噪音:
# CodeRabbit 配置:只报告高优先级问题
reviews:
profile: "chill" # 减少低优先级评论
path_instructions:
- path: "**/*.test.ts"
instructions: "测试文件只关注测试覆盖率,忽略风格问题"
- path: "migrations/**"
instructions: "数据库迁移文件重点检查数据安全和回滚方案"
3. 建立反馈机制
对 AI 的评论点「👍」或「👎」,帮助工具学习你团队的偏好,随着时间推移审查质量会提升。
4. 保护敏感代码
对于涉及核心算法、商业机密的代码,配置排除规则,不发送给第三方 AI:
path_filters:
- "!src/core/algorithm/**"
- "!src/billing/**"
总结
| 如果你是… | 推荐方案 |
|---|---|
| 个人开发者 / 小团队,想快速上手 | CodeRabbit 免费版 |
| 中型团队,需要自托管 | Qodo Merge 自部署 |
| 大型企业,需要完全定制 + 数据安全 | 自建 CI 调用 AI API |
| 已有完善 CI/CD,想低成本接入 | GitHub Actions + Qodo Merge |
AI Code Review 的最终目标不是取代人类审查者,而是让机器处理机械性工作,让人类专注于真正需要智慧的决策。从今天就可以开始——安装 CodeRabbit 只需要 5 分钟。
📚 参考资源:
评论