代码审查是团队协作中最耗时但也最有价值的环节。然而人工审查难以覆盖每次提交,且标准不一致。本文介绍如何用 Claude API 构建一个自动化代码审查机器人,支持本地 Git 钩子、GitHub PR 评论、以及 GitLab MR 集成。全程提供可复制脚本,零基础也能十分钟跑通。

在这里插入图片描述

一、方案优势

对比项 人工审查 Linter 工具 Claude 审查
理解业务逻辑
发现逻辑错误
检查代码规范 ⚠️ 不统一
耗时 30-60 分钟/PR 秒级 30-秒级
成本 人力成本 免费 $0.01-0.05/次

二、准备工作

2.1 获取 Claude API Key

官方申请需境外信用卡。如无法自行办理,可通过 gpt108.com 获取(支持支付宝/微信,自助充值)。

2.2 安装依赖

pip install anthropic pygithub python-gitlab

三、核心脚本:通用代码审查器

创建 code_reviewer.py

#!/usr/bin/env python3
import os
import sys
import subprocess
import anthropic

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

def get_git_diff(base="main"):
    """获取当前分支与 base 分支的差异"""
    result = subprocess.run(
        ["git", "diff", base, "--unified=3"],
        capture_output=True, text=True
    )
    return result.stdout

def review_code(diff_text: str) -> str:
    """调用 Claude 进行审查"""
    prompt = f"""请审查以下代码变更(Git diff 格式),输出:
1. **严重问题**(可能导致运行时错误、安全漏洞、性能严重下降)
2. **建议改进**(可读性、性能微调、最佳实践)
3. **正面亮点**(可选)

每个问题需指明文件(若 diff 中包含)和具体行号。
输出使用 Markdown 格式,清晰分段。

Diff 内容:

{diff_text}

"""
    response = client.messages.create(
        model="claude-3-7-sonnet-20250219",
        max_tokens=2000,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

if __name__ == "__main__":
    base = sys.argv[1] if len(sys.argv) > 1 else "main"
    diff = get_git_diff(base)
    if not diff.strip():
        print("No changes to review.")
        sys.exit(0)
    review = review_code(diff)
    print(review)

3.1 本地使用

export ANTHROPIC_API_KEY="sk-ant-xxx"
python code_reviewer.py main

输出示例:

## 严重问题

- **文件 `src/auth.py` 第 23 行**:使用 `eval()` 处理用户输入,存在远程代码执行风险。建议改用 `ast.literal_eval()` 或 JSON 解析。

## 建议改进

- **文件 `src/utils.py` 第 45 行**:函数 `parse_date` 未处理无效格式,会抛出未捕获异常。建议添加 try/except。

四、集成到 Git Pre-commit 钩子

.git/hooks/pre-commit 中调用审查脚本,阻止有严重问题的提交。

#!/bin/bash
echo "Running AI code review..."
python3 code_reviewer.py --base main
read -p "Continue commit? (y/n) " -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    exit 1
fi

注意:pre-commit 钩子会拖慢提交速度,建议只检查关键问题或使用异步模式。

五、集成到 GitHub Actions(PR 自动评论)

创建 .github/workflows/ai-review.yml

name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - name: Install dependencies
        run: pip install anthropic PyGithub
      - name: Get PR diff
        run: git diff origin/${{ github.base_ref }}...HEAD > pr.diff
      - name: Run AI review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: python ci_review.py pr.diff > review.md
      - name: Post comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review.md', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.payload.pull_request.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## 🤖 AI 审查报告\n\n${review}`
            });

其中 ci_review.py 略作修改,读取 diff 文件而非 git 命令。

六、集成到 GitLab CI(MR 评论)

创建 .gitlab-ci.yml

stages:
  - review

ai-review:
  stage: review
  script:
    - apk add git python3 py3-pip
    - pip install anthropic python-gitlab
    - git diff origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME...HEAD > pr.diff
    - python ci_review.py pr.diff > review.md
    - |
      python -c "
      import os
      import gitlab
      gl = gitlab.Gitlab('https://gitlab.com', private_token=os.environ['GITLAB_TOKEN'])
      project = gl.projects.get(os.environ['CI_PROJECT_ID'])
      mr = project.mergerequests.get(os.environ['CI_MERGE_REQUEST_IID'])
      with open('review.md') as f:
          mr.notes.create({'body': f.read()})
      "
  only:
    - merge_requests

七、进阶:自动修复简单问题

让 Claude 不仅能指出问题,还能生成补丁。修改 code_reviewer.py,增加 --fix 参数。

def generate_fix(diff_text: str) -> str:
    prompt = f"""根据以下 diff 中指出的问题(仅限格式化、未使用变量、简单语法错误),生成一个 unified diff 格式的补丁。不要改变逻辑,只修复问题。如果无可自动修复的问题,返回空字符串。
{diff_text}
"""
    response = client.messages.create(
        model="claude-3-5-haiku-20241022",
        max_tokens=1500,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

if __name__ == "__main__":
    # ... 获取 diff 和 review ...
    if "--fix" in sys.argv:
        patch = generate_fix(diff)
        if patch.strip():
            with open("auto_fix.patch", "w") as f:
                f.write(patch)
            print("Patch generated: auto_fix.patch. Run `git apply auto_fix.patch` to apply.")

然后在 CI 中自动应用补丁并提交。

八、成本控制与优化

场景 模型建议 单次平均成本
小型 PR (<200 行) claude-3-haiku $0.005
中型 PR (200-1000 行) claude-3-sonnet $0.02
大型 PR (>1000 行) claude-3-7-sonnet $0.10
仅自动修复 haiku $0.003

优化技巧

  • 只审查新增行(git diff --cached --diff-filter=AM
  • 缓存已审查过的 diff hash,避免重复
  • 使用环境变量控制是否启用(如 SKIP_AI_REVIEW=1

九、自定义审查规则(通过 .ai-review-rules.yml

项目根目录创建规则文件,让 Claude 读取:

# .ai-review-rules.yml
rules:
  - pattern: "print\\("
    severity: warning
    message: "生产环境禁止使用 print,请使用 logging"
  - pattern: "except\\s*:\\s*pass"
    severity: error
    message: "禁止空 except,至少记录日志"
  - pattern: "password\\s*=\\s*['\"]\\w+['\"]"
    severity: error
    message: "禁止硬编码密码"

然后在 prompt 中追加规则内容。

十、常见问题及处理

问题 解决方法
Git diff 获取不到内容 确保 --fetch-depth 0 或 CI 中拉取完整历史
API 返回 429 限流 添加重试退避,或使用 tenacity
评论内容超过 GitHub 限制 分段发表,或只输出关键问题
中文乱码 设置环境变量 PYTHONIOENCODING=utf-8

十一、完整项目模板

.
├── .github/workflows/ai-review.yml
├── .gitlab-ci.yml
├── .ai-review-rules.yml
├── code_reviewer.py
├── ci_review.py
└── requirements.txt

requirements.txt

anthropic>=0.40.0
PyGithub>=2.0.0
python-gitlab>=4.0.0

十二、总结

通过 Claude API + Git 钩子/CI,你可以用极低的成本为团队引入 7x24 小时的 AI 代码审查员。它不仅能发现 Linter 无法捕捉的逻辑错误,还能沉淀团队的规范。最重要的是,整个过程不需要改变现有开发流程。

十三、参考来源

文中使用的 Claude API Key 可通过 gpt108.com 获取(支持支付宝/微信,自助充值,无需提供账号密码)。笔者已在多个项目中应用上述方案,累计审查 500+ PR,效果显著。

所有脚本和配置文件已打包,评论区可获取下载链接。欢迎分享你的使用体验和自定义规则。

更多推荐