人工代码审查有两个痛点:一是耗时,Senior工程师的时间本来就紧张,PR排队等审查是常态;二是容易遗漏,人眼看diff看久了注意力会下降,容易漏掉一些隐蔽的问题;
AI审查不能替代人工审查,但它能当第一道筛子——把明显的Bug、安全漏洞、风格问题先挑出来,人工审查者只需要关注架构和设计层面。两者结合效率最高;
方案设计
整体流程:开发者提PR→GitHub Actions触发→获取PR的diff→调用大模型审查→审查结果作为PR评论发布;
整个过程全自动,开发者提PR后几分钟内就能收到AI的审查意见;
GitHub Actions配置
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get PR diff
id: diff
run: |
DIFF=$(gh pr diff ${{ github.event.pull_request.number }})
echo "diff<<EOF" >> $GITHUB_OUTPUT
echo "$DIFF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: AI Review
run: |
pip install openai
python scripts/ai_review.py << 'REVIEW_INPUT'
${{ steps.diff.outputs.diff }}
REVIEW_INPUT
env:
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}
审查脚本
import sys, os
from openai import OpenAI
def review(diff: str) -> str:
client = OpenAI(
base_url=os.getenv("LLM_BASE_URL", "http://localhost:11434/v1"),
api_key=os.getenv("LLM_API_KEY", "ollama")
)
if len(diff) > 30000:
diff = diff[:30000] + "\n... (truncated)"
resp = client.chat.completions.create(
model=os.getenv("LLM_MODEL", "deepseek-r1:7b"),
messages=[
{"role": "system", "content": """你是代码审查专家。审查以下diff,按维度分类:
1. 🐛 Bug风险:可能导致运行时错误的代码
2. 🔒 安全问题:注入、泄露、鉴权遗漏等
3. ⚡ 性能问题:不必要的计算、内存泄漏风险等
4. 📖 可读性:命名、结构、注释等
格式:
### [维度 emoji] 问题
- [严重程度: 高/中/低] 描述(文件:行号)
建议:修复方案
如果没有问题,简短确认即可。不要编造问题。"""},
{"role": "user", "content": f"```diff\n{diff}\n```"}
],
temperature=0.3
)
return resp.choices[0].message.content
if __name__ == "__main__":
diff = sys.stdin.read() if len(sys.argv) < 2 else sys.argv[1]
print(review(diff))
本地测试
git diff HEAD~1 | python scripts/ai_review.py
提升审查质量的技巧
提示词要明确审查维度,减少遗漏。temperature设0.3保证输出稳定。限制diff长度避免超出上下文窗口。如果项目有代码规范文档,把它加到system prompt里,AI审查时会参考。
写在最后
AI审查的价值不在于"替代人工",而在于"减轻人工负担"。让AI处理格式、安全、Bug这些机械性问题,人专注于架构和设计——这是最高效的分工方式。