主题
实战案例: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}请从以下维度审查,只指出确实存在的问题:
- Bug(逻辑错误)
- 安全漏洞
- 性能问题
- 代码规范
如果没有问题,说"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 成本较高,优化策略:- 只审查变更的文件(不在未修改文件上浪费 Token)
- 跳过自动生成的文件
- 跳过测试文件(可选)
- 用 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)