# 使用 LLM API 构建自动化代码审查系统
## 背景介绍
代码审查是软件开发中的必经环节,但人工审查效率低、反馈慢的问题一直困扰着开发团队。在快速迭代的项目中,等待代码审查反馈可能需要数小时甚至数天,这种延迟不仅影响开发效率,还可能导致问题代码被合并到主分支。
大语言模型的出现改变了这个局面。LLM 不仅能理解代码语法,还能分析逻辑问题、安全风险和性能瓶颈。通过调用 LLM API,开发者可以在提交代码后立即获得审查意见,大幅缩短反馈周期。
本文介绍如何基于 LLM API 构建自动化代码审查系统,使用 Python 实现,兼容 OpenAI、Anthropic、通义千问等主流 API 提供商。
## 问题描述
人工代码审查存在几个实际问题:
效率低下是首要问题。一次代码提交可能涉及数百行变更,人工审查需要花费大量时间,而且容易遗漏问题。
标准不一致也让人头疼。不同审查者的标准和偏好不同,同类型问题可能得到不同反馈,给开发者造成困惑。
反馈周期过长更是影响效率。在很多团队中,代码审查是兼职进行的,开发者往往需要等待很长时间才能获得反馈。
另外,多语言项目难以找到熟悉所有语言的审查者。某些特定领域的代码需要专业知识才能正确评估。
基于这些痛点,我们可以用 LLM 构建自动化代码审查系统来解决这些问题。
## 详细步骤
系统实现分为六个步骤:
### 第一步:环境准备
安装必要的 Python 依赖:
“`bash
pip install openai requests python-dotenv
“`
### 第二步:配置 LLM API
设置 API 访问凭证,可通过环境变量或配置文件管理。
### 第三步:设计提示词模板
提示词是 LLM 审查能力的关键。需要设计结构化模板,引导 LLM 从多维度审查代码。
### 第四步:获取代码变更
使用 git diff 命令提取代码变更内容,包括新增、删除和修改的行。
### 第五步:调用 LLM API
将代码变更封装成提示词,调用 API 进行分析。需处理网络超时、API 限额等错误。
### 第六步:解析展示结果
将 LLM 返回结果解析为结构化格式,按严重程度分类展示。
## 完整代码示例
以下是系统的完整 Python 实现:
“`python
import os
import json
import subprocess
from typing import List, Dict, Any, Optional
from dataclasses import dataclass
from openai import OpenAI
@dataclass
class CodeReviewResult:
“””代码审查结果数据类”””
severity: str # critical, warning, suggestion
line: Optional[int]
category: str # bug, security, performance, style, best_practice
message: str
suggestion: Optional[str] = None
class LLMCodeReviewer:
“””基于 LLM 的代码审查器”””
def __init__(self, provider: str = “openai”):
self.provider = provider
self.client = self._init_client()
self.review_template = self._load_review_template()
def _init_client(self) -> OpenAI:
if self.provider == “openai”:
return OpenAI(
api_key=os.getenv(“OPENAI_API_KEY”, “”),
base_url=os.getenv(“OPENAI_BASE_URL”, “https://api.openai.com/v1”)
)
elif self.provider == “qwen”:
return OpenAI(
api_key=os.getenv(“DASHSCOPE_API_KEY”, “”),
base_url=”https://dashscope.aliyuncs.com/compatible-mode/v1″
)
else:
raise ValueError(f”不支持的 LLM 提供商: {self.provider}”)
def _load_review_template(self) -> str:
return “””你是一个专业的代码审查专家。请审查以下代码变更并提供详细的审查意见。
代码变更(git diff):
{diff}
请从以下几个维度进行审查:
1. 潜在 Bug:逻辑错误、空指针、数组越界等
2. 安全问题:SQL 注入、XSS、认证授权等
3. 性能问题:循环嵌套、重复计算、内存泄漏等
4. 代码风格:命名规范、注释、代码结构等
5. 最佳实践:异常处理、资源释放、并发安全等
请以 JSON 数组格式返回审查结果,每个元素包含以下字段:
– severity: 严重程度,取值为 “critical”, “warning”, “suggestion”
– line: 问题所在行号(如果适用)
– category: 问题类别,取值为 “bug”, “security”, “performance”, “style”, “best_practice”
– message: 问题描述
– suggestion: 改进建议(可选)
只返回 JSON 数组,不要包含其他内容。”””
def get_git_diff(self, file_path: Optional[str] = None) -> str:
try:
if file_path:
result = subprocess.run(
[“git”, “diff”, “–no-color”, file_path],
capture_output=True,
text=True,
check=True
)
else:
result = subprocess.run(
[“git”, “diff”, “–cached”, “–no-color”],
capture_output=True,
text=True,
check=True
)
return result.stdout
except subprocess.CalledProcessError as e:
return f”获取 diff 失败: {str(e)}”
def review_code(self, diff_content: str, model: str = “gpt-4o”) -> List[CodeReviewResult]:
if not diff_content or diff_content.strip() == “”:
return []
prompt = self.review_template.format(diff=diff_content)
try:
response = self.client.chat.completions.create(
model=model,
messages=[
{“role”: “system”, “content”: “你是一个专业的代码审查专家。”},
{“role”: “user”, “content”: prompt}
],
temperature=0.2,
max_tokens=4096
)
content = response.choices[0].message.content
return self._parse_review_results(content)
except Exception as e:
print(f”API 调用失败: {str(e)}”)
return []
def _parse_review_results(self, content: str) -> List[CodeReviewResult]:
results = []
try:
start_idx = content.find(“[“)
end_idx = content.rfind(“]”) + 1
if start_idx != -1 and end_idx != 0:
json_str = content[start_idx:end_idx]
items = json.loads(json_str)
for item in items:
results.append(CodeReviewResult(
severity=item.get(“severity”, “suggestion”),
line=item.get(“line”),
category=item.get(“category”, “best_practice”),
message=item.get(“message”, “”),
suggestion=item.get(“suggestion”)
))
except json.JSONDecodeError as e:
print(f”解析结果失败: {str(e)}”)
return results
def format_review_output(self, results: List[CodeReviewResult]) -> str:
if not results:
return “✅ 未发现代码问题”
output_lines = [“📋 代码审查结果:\n”]
critical = [r for r in results if r.severity == “critical”]
warning = [r for r in results if r.severity == “warning”]
suggestion = [r for r in results if r.severity == “suggestion”]
if critical:
output_lines.append(“🔴 严重问题:”)
for r in critical:
line_info = f” (第 {r.line} 行)” if r.line else “”
output_lines.append(f” • [{r.category}]{line_info} {r.message}”)
if r.suggestion:
output_lines.append(f” 建议: {r.suggestion}”)
output_lines.append(“”)
if warning:
output_lines.append(“🟡 警告:”)
for r in warning:
line_info = f” (第 {r.line} 行)” if r.line else “”
output_lines.append(f” • [{r.category}]{line_info} {r.message}”)
if r.suggestion:
output_lines.append(f” 建议: {r.suggestion}”)
output_lines.append(“”)
if suggestion:
output_lines.append(“🔵 建议:”)
for r in suggestion:
line_info = f” (第 {r.line} 行)” if r.line else “”
output_lines.append(f” • [{r.category}]{line_info} {r.message}”)
if r.suggestion:
output_lines.append(f” 建议: {r.suggestion}”)
output_lines.append(“”)
return “\n”.join(output_lines)
def main():
os.environ.setdefault(“OPENAI_API_KEY”, “your-api-key-here”)
reviewer = LLMCodeReviewer(provider=”qwen”)
diff = reviewer.get_git_diff()
if not diff or diff.startswith(“获取 diff 失败”):
print(“未发现待审查的代码变更”)
return
print(“正在进行代码审查…”)
results = reviewer.review_code(diff, model=”qwen-coder-turbo”)
output = reviewer.format_review_output(results)
print(output)
if __name__ == “__main__”:
main()
“`
这段代码实现了完整的代码审查功能:使用数据类定义审查结果结构;通过配置支持多 API 提供商;提示词模板引导多维度审查;完善的错误处理保证稳定性。
## 运行结果
实际运行后,系统会输出如下审查结果:
“`
📋 代码审查结果:
🔴 严重问题:
• [security] (第 23 行) 直接使用字符串拼接构建 SQL 查询,存在 SQL 注入风险
建议: 使用参数化查询或 ORM 框架
• [bug] (第 45 行) 未对用户输入进行空值检查,可能导致空指针异常
建议: 添加 null 检查或使用 Optional 处理
🟡 警告:
• [performance] (第 78 行) 在循环中进行数据库查询,可能导致 N+1 问题
建议: 使用批量查询或预加载相关数据
• [style] (第 102 行) 方法命名不符合驼峰命名规范
建议: 将方法名改为 getUserInfo
🔵 建议:
• [best_practice] (第 15 行) 建议添加方法注释
建议: 使用 JSDoc 格式添加方法说明
• [style] (第 67 行) 魔法数字建议提取为常量
建议: 定义常量 MAX_RETRY_COUNT = 3
“`
系统识别出了安全漏洞、性能问题、代码风格问题等各类问题,每条都标注了具体行号和改进建议,非常便于开发者修复。
## 总结
本文展示了如何用 LLM API 构建自动化代码审查系统。该系统的优势很明显:审查速度快,每次只需几秒钟;标准一致,不因审查者而异;支持全天候响应;覆盖多种编程语言。
系统还有不少改进空间。可以集成到 CI/CD 流程中实现自动化触发;可以增加自定义规则引擎;可以添加学习功能,根据团队反馈优化审查质量。
LLM 代码审查是个值得关注的方向。随着技术进步,自动化审查的准确性和实用性会持续提升。建议开发团队尝试引入这类工具,让开发者专注更有创造性的工作。