Skip to content

实战案例:AI 代码审查

用 AI 自动审查代码,找出 Bug、安全漏洞和性能问题。

功能目标

  • 自动审查 Pull Request 的代码
  • 指出问题并给出修改建议
  • 支持多种语言(Java、Python、JS)
  • 可集成到 GitHub Actions

方案选型

方案优点缺点
GitHub Copilot Chat简单,集成好需手动触发
Claude Code理解深,质量高需 API Key
自建(OpenAI API)灵活,可定制需开发

这里介绍自建方案(最灵活)。

实现:代码审查脚本

核心脚本

python
import os
from openai import OpenAI

client = OpenAI()

def review_code(file_path, file_content):
    """用 AI 审查单个文件"""

    prompt = f"""
你是一位资深代码审查专家。请审查以下代码,从以下维度给出意见:

1. 正确性(有无 Bug)
2. 安全性(有无漏洞,如 SQL 注入、XSS)
3. 性能(有无优化空间)
4. 可维护性(命名、结构、注释)

代码文件:{file_path}

```{file_path.split('.')[-1]}
{file_content}

请按以下格式输出:

问题 1

  • 位置:第 X 行
  • 严重程度:高/中/低
  • 问题:...
  • 建议:...

如果没有问题,输出"代码质量良好,暂无问题"。 """

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": prompt}]
)

return response.choices[0].message.content

使用示例

result = review_code( "UserService.java", open("UserService.java").read() ) print(result)


### 集成到 PR 流程(GitHub Actions)

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

```yaml
name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Get changed files
        id: changed-files
        run: |
          echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }})" >> $GITHUB_OUTPUT

      - name: Run AI Review
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          python scripts/ai_review.py ${{ steps.changed-files.outputs.files }}

更高级:用 Claude(理解更好)

python
from anthropic import Anthropic

client = Anthropic()

def review_with_claude(file_path, file_content, diff):
    """用 Claude 审查,传入 diff 更有上下文"""

    message = client.messages.create(
        model="claude-3-5-sonnet",
        max_tokens=4096,
        messages=[
            {
                "role": "user",
                "content": f"""
请审查这个 PR 的代码变更。

文件名:{file_path}

变更内容(diff):
```diff
{diff}

完整文件内容:

{file_content}

请从以下维度审查,只指出确实存在的问题:

  1. Bug(逻辑错误)
  2. 安全漏洞
  3. 性能问题
  4. 代码规范

如果没有问题,说"LGTM"(Looks Good To Me)。 """ } ] )

return message.content[0].text

## 输出格式优化

让 AI 输出结构化 JSON,方便程序处理:

```python
prompt = """
审查以下代码,以 JSON 格式返回结果:

```json
{{
  "issues": [
    {{
      "file": "文件名",
      "line": 行号,
      "severity": "high/medium/low",
      "type": "bug/security/performance/style",
      "description": "问题描述",
      "suggestion": "修改建议"
    }}
  ]
}}

如果没有问题,issues 为空数组。 """


## 成本优化

每次 PR 都调用 AI 成本较高,优化策略:
  1. 只审查变更的文件(不在未修改文件上浪费 Token)
  2. 跳过自动生成的文件
  3. 跳过测试文件(可选)
  4. 用 GPT-4o Mini 做初筛,有问题再用 GPT-4 深入分析

## 相关工具(开箱即用)

如果不想自己开发,可以用现成工具:

| 工具 | 说明 |
|------|------|
| [CodeRabbit](https://coderabbit.ai) | AI 代码审查,GitHub App |
| [Bito AI](https://bito.ai) | AI 代码审查 |
| [GitHub Copilot Chat](https://github.com/features/copilot) | 手动触发 |

## 相关资源

- [OpenAI API](https://platform.openai.com/docs)
- [GitHub Actions](https://docs.github.com/en/actions)