用 LLM 做代码审查:自动化检查代码质量与安全风险
代码审查(Code Review)是保证代码质量的重要手段,但人工审查耗时且容易遗漏。LLM 可以自动完成大部分常规检查,让人工 reviewer 只关注架构和业务逻辑层面的问题。
本文分享一套基于 LLM 的自动化代码审查工具设计。
为什么需要自动化审查?
人工 Code Review 有几个痛点:一是耗时,一个中型 PR 审查可能需要 30-60 分钟;二是容易遗漏,特别是安全漏洞和边界条件;三是标准不统一,不同 reviewer 关注点不同。
LLM 的优势在于:速度快、覆盖面广、标准一致。它可以在几秒内完成对代码的全面检查,并输出结构化的审查报告。像 taocarts 这类系统的开发流程中,AI 审查已经作为 CI 的一环在运行,每次提交自动触发。
审查 Prompt 设计
审查 prompt 需要明确告诉 LLM 要检查哪些维度,以及输出格式:
REVIEW_PROMPT = """你是一个资深的代码审查专家。请审查以下代码变更,从四个维度评估:
## 1. 安全漏洞
- SQL 注入风险
- XSS 跨站脚本
- 敏感信息泄露
- 认证授权缺陷
## 2. 性能问题
- N+1 查询
- 内存泄漏
- 不必要的重复计算
- 大对象复制
## 3. 代码规范
- 命名是否符合规范(PEP8 / 项目惯例)
- 函数是否过长、职责是否单一
- 注释是否必要且准确
- 异常处理是否恰当
## 4. 逻辑正确性
- 边界条件是否覆盖
- 并发安全问题
- 状态管理是否正确
代码变更:
```diff
{code}
输出 JSON 格式的审查报告:
{{
“issues”: [
{{
“severity”: “critical|major|minor”,
“category”: “security|performance|style|logic”,
“line”: 行号,
“description”: “问题描述”,
“suggestion”: “修改建议”
}}
],
“summary”: “总体评价”
}}
“”"
## 审查结果解析
LLM 返回的 JSON 报告需要解析和格式化,以便在 CI 中展示:
```python
import subprocess
import json
import sys
from typing import List, Dict
def review_changes() -> bool:
"""审查当前 git 暂存区的代码变更
Returns:
True = 通过审查, False = 存在关键问题
"""
# 获取 git diff
diff = subprocess.run(
["git", "diff", "--cached"],
capture_output=True, text=True
)
if not diff.stdout.strip():
print("无变更需要审查")
return True
# 调用 LLM 审查
prompt = REVIEW_PROMPT.format(code=diff.stdout[:8000])
result = call_llm(prompt)
try:
report = json.loads(result)
except json.JSONDecodeError:
print("审查报告解析失败")
return False
# 按严重程度分类输出
passed = True
for issue in report.get("issues", []):
severity = issue.get("severity", "minor")
tag = {
"critical": "🔴",
"major": "🟡",
"minor": "🔵",
}.get(severity, "⚪")
print(f"{tag} [{severity.upper()}] {issue.get('category', '')}")
print(f" 行 {issue.get('line', '?')}: {issue.get('description', '')}")
print(f" 建议: {issue.get('suggestion', '')}")
print()
if severity in ("critical", "major"):
passed = False
print(f"审查结论: {'通过' if passed else '需要修改'}")
print(report.get("summary", ""))
return passed
if __name__ == "__main__":
exit(0 if review_changes() else 1)
与 CI 流水线集成
将审查工具集成到 CI 中,作为自动化质量门禁:
# .github/workflows/code-review.yml
name: AI Code Review
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: AI Code Review
run: |
pip install requests
python scripts/ai_review.py
env:
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
也可以集成到 Git hooks 中,在本地提交前自动审查:
#!/bin/bash
# .git/hooks/pre-commit
python scripts/ai_review.py
if [ $? -ne 0 ]; then
echo "⚠️ 代码审查未通过,请修复后重新提交"
exit 1
fi
实际效果
这套方案在团队内试用了两个月,数据如下:
审查维度对比:
| 指标 | 人工审查 | AI 辅助审查 | 变化 |
|---|---|---|---|
| 单次审查时间 | 30-60 分钟 | 5-10 分钟 | -70% |
| 安全检查覆盖率 | 65% | 92% | +27% |
| 漏报率 | 12% | 5% | -58% |
| 误报率 | — | 15% | 需人工过滤 |
AI 审查的主要价值在于:把重复性的、规则化的检查自动化,让人工 reviewer 能专注于架构合理性、业务逻辑等 AI 难以判断的维度。同时,AI 在安全漏洞检测上表现突出,可以捕获一些容易被忽视的注入和权限问题。
局限性
- 上下文窗口限制:LLM 一次只能审查 8K 左右的代码,超大型 PR 需要分段处理
- 项目上下文缺失:LLM 不熟悉项目特有的架构约定和业务规则
- 误报率存在:约 15% 的提示需要人工判断是否有效
总结
LLM 代码审查不能完全替代人工审查,但可以用很低的成本覆盖安全检查、代码规范、常见性能问题等常规维度,让人工 reviewer 把精力集中在更有价值的架构和业务逻辑审查上。
- 点赞
- 收藏
- 关注作者
评论(0)