我用 AI Agent 做了自动代码审查:从提交到反馈,全程零人工(附 Python 实现)
我用 AI Agent 做了自动代码审查:从提交到反馈,全程零人工(附 Python 实现)
适合团队有代码审查流程、但 CR 效率低或者没有专人负责的开发者。
本文用 Python + AI Agent 搭了一套自动代码审查系统,代码提交后自动审查并给出修改建议。
背景:代码审查是瓶颈
很多团队的代码审查流程是这样的:
- 开发写完代码,提 PR
- 等 reviewer 有空来看(可能等半天)
- reviewer 给几个评论
- 开发修改,再提 PR
- 再等 reviewer 确认
整个流程可能耗时 1-3 天。对于小团队或者独立开发者,经常没有 reviewer,代码直接合并,质量全靠自觉。
我用 AI Agent 搭了一套自动审查系统,代码提交后 30 秒内给出审查意见。
系统架构
代码提交 → Git Hook 触发 → 提取 diff → AI 审查 → 输出报告
4 个环节,下面逐个实现。
模块 1:提取代码变更
从 Git 仓库提取最新提交的代码变更(diff)。
import subprocess
def get_latest_diff(repo_path="."):
"""获取最新一次提交的代码变更"""
result = subprocess.run(
["git", "diff", "HEAD~1", "HEAD", "--stat"],
cwd=repo_path,
capture_output=True,
text=True
)
stat = result.stdout
result = subprocess.run(
["git", "diff", "HEAD~1", "HEAD"],
cwd=repo_path,
capture_output=True,
text=True
)
diff = result.stdout
return {"stat": stat, "diff": diff}
def get_pr_diff(repo_path="."):
"""获取当前分支相对 main 的所有变更"""
result = subprocess.run(
["git", "diff", "main", "--stat"],
cwd=repo_path,
capture_output=True,
text=True
)
stat = result.stdout
result = subprocess.run(
["git", "diff", "main"],
cwd=repo_path,
capture_output=True,
text=True
)
diff = result.stdout
return {"stat": stat, "diff": diff}
模块 2:AI 代码审查
把 diff 喂给 AI,让它从多个维度审查。
from openai import OpenAI
client = OpenAI()
REVIEW_PROMPT = """你是一个资深代码审查员。请审查以下代码变更,从 5 个维度给出意见:
1. **Bug 风险**:有没有明显的逻辑错误、空指针、边界条件问题
2. **安全问题**:有没有 SQL 注入、XSS、硬编码密钥等安全隐患
3. **代码质量**:命名是否清晰、函数是否过长、有没有重复代码
4. **性能问题**:有没有不必要的循环、内存泄漏、N+1 查询
5. **最佳实践**:是否遵循项目约定、是否缺少错误处理
代码变更:
```diff
{diff}
请按以下格式输出:
审查结果
严重问题(必须修改)
- [文件:行号] 问题描述 → 修改建议
建议优化(推荐修改)
- [文件:行号] 问题描述 → 修改建议
优点(值得保持)
- 描述代码中做得好的地方
总结
一句话总结本次审查结论。“”"
def review_code(diff, max_diff_chars=8000):
“”“AI 审查代码”“”
# 截取过长的 diff
truncated_diff = diff[:max_diff_chars]
if len(diff) > max_diff_chars:
truncated_diff += f"\n\n… (截断,原始 diff 共 {len(diff)} 字符)"
prompt = REVIEW_PROMPT.format(diff=truncated_diff)
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.3 # 低温度保证审查一致性
)
return response.choices[0].message.content
## 模块 3:生成审查报告
```python
from datetime import datetime
def generate_report(review_result, diff_stat, output_path="review_report.md"):
"""生成 Markdown 格式的审查报告"""
report = f"""# 代码审查报告
**审查时间**: {datetime.now().strftime('%Y-%m-%d %H:%M')}
**审查方式**: AI 自动审查
**变更统计**:
{diff_stat}
{review_result}
---
*本报告由 AI Agent 自动生成,仅供参考。关键决策仍需人工确认。*
"""
with open(output_path, "w", encoding="utf-8") as f:
f.write(report)
print(f"审查报告已生成: {output_path}")
return output_path
模块 4:Git Hook 集成
在代码提交后自动触发审查。
#!/usr/bin/env python3
"""
.git/hooks/post-commit 文件内容
每次 git commit 后自动触发代码审查
"""
import subprocess
import sys
import os
# 添加项目路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
from review_tool import get_latest_diff, review_code, generate_report
def main():
print("🔍 AI 代码审查开始...")
# 1. 获取 diff
diff_data = get_latest_diff()
if not diff_data["diff"].strip():
print("没有代码变更,跳过审查")
return
print(f" 变更统计:\n{diff_data['stat']}")
# 2. AI 审查
print(" AI 审查中...")
result = review_code(diff_data["diff"])
# 3. 生成报告
report_path = generate_report(result, diff_data["stat"])
print(f"✅ 审查完成,报告: {report_path}")
if __name__ == "__main__":
main()
安装 Git Hook:
# 把上面的代码保存为 .git/hooks/post-commit
chmod +x .git/hooks/post-commit
# 之后每次 git commit 都会自动审查
模块 5:GitHub Actions 集成(PR 自动审查)
如果用 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.12'
- name: Install dependencies
run: pip install openai
- name: Run AI Review
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: python review_tool.py
- name: Comment PR
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const report = fs.readFileSync('review_report.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: report
});
踩坑记录
坑 1:diff 太长,AI 处理不了
症状:一次提交改了 50 个文件,diff 有 5 万字符,AI 超时。
原因:上下文窗口有限,太长的 diff 塞不进去。
解决:只审查 .py、.js、.ts 等代码文件,忽略 .json、.lock、.min.js。diff 超过 8000 字符就截断。
坑 2:AI 审查太严格,到处都是"问题"
症状:AI 把每一行都标记为"建议优化",开发者看了直接崩溃。
原因:prompt 里没有区分严重程度。
解决:prompt 里明确要求分为"严重问题"和"建议优化"两级,严重问题必须改,建议优化可选。
坑 3:AI 不了解项目上下文
症状:AI 建议"用 ORM 替代原生 SQL",但这个项目就是用原生 SQL 的。
原因:AI 不知道项目的技术栈和约定。
解决:在 prompt 里加上项目的技术栈说明,或者把 README.md 的内容也喂给 AI。
坑 4:审查结果不一致
症状:同一个 diff 审查两次,结果不一样。
原因:temperature 太高。
解决:temperature 设为 0.3 以下,保证输出稳定。
坑 5:API 费用累积
症状:每天 10 次 commit,每次调 GPT-4 花 0.5 元,一个月 150 元。
解决:非关键文件用 GPT-3.5-turbo(便宜 10 倍),核心逻辑文件才用 GPT-4。
效果数据
用了 2 周后的真实数据:
| 指标 | 人工审查 | AI 自动审查 | 变化 |
|---|---|---|---|
| 审查耗时 | 2-24 小时 | 30 秒 | 快 200 倍+ |
| 审查覆盖率 | 约 60%(reviewer 看不完) | 100%(每行都看) | +40% |
| 发现问题数 | 平均 2 个/PR | 平均 4 个/PR | +100% |
| 误报率 | 极低 | 约 20% | 需人工筛选 |
核心结论:AI 审查速度快、覆盖率高,但有 20% 误报。最佳实践是 AI 先审 + 人终审。
总结
3 条核心经验:
-
AI 审查是"第一道筛",不是最终决策。它能快速发现明显问题,但复杂的设计决策还是需要人来判断。
-
prompt 里加项目上下文。把技术栈、代码规范、项目约定写进 prompt,AI 的审查意见会更准确。
-
diff 要过滤和截断。只审查代码文件,忽略配置和锁文件。超过 8000 字符就截断,否则 AI 处理不了。
你的团队有代码审查流程吗?用什么工具?评论区交流。
更多推荐
所有评论(0)