我用 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)。
importsubprocessdefget_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.stdoutreturn{"stat":stat,"diff":diff}defget_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.stdoutreturn{"stat":stat,"diff":diff}模块 2:AI 代码审查
把 diff 喂给 AI,让它从多个维度审查。
fromopenaiimportOpenAI 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 后自动触发代码审查 """importsubprocessimportsysimportos# 添加项目路径sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(__file__))))fromreview_toolimportget_latest_diff,review_code,generate_reportdefmain():print("🔍 AI 代码审查开始...")# 1. 获取 diffdiff_data=get_latest_diff()ifnotdiff_data["diff"].strip():print("没有代码变更,跳过审查")returnprint(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-commitchmod+x .git/hooks/post-commit# 之后每次 git commit 都会自动审查模块 5:GitHub Actions 集成(PR 自动审查)
如果用 GitHub,可以通过 Actions 在 PR 创建时自动审查。
# .github/workflows/ai-review.ymlname:AI Code Reviewon:pull_request:types:[opened,synchronize]jobs:review:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4with:fetch-depth:0-name:Set up Pythonuses:actions/setup-python@v5with:python-version:'3.12'-name:Install dependenciesrun:pip install openai-name:Run AI Reviewenv:OPENAI_API_KEY:${{secrets.OPENAI_API_KEY}}run:python review_tool.py-name:Comment PRuses:actions/github-script@v7with: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 处理不了。
你的团队有代码审查流程吗?用什么工具?评论区交流。