用 LLM 做代码审查:自动化检查代码质量与安全风险

举报
云上老码农 发表于 2026/07/25 10:34:28 2026/07/25
【摘要】 用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 在安全漏洞检测上表现突出,可以捕获一些容易被忽视的注入和权限问题。

局限性

  1. 上下文窗口限制:LLM 一次只能审查 8K 左右的代码,超大型 PR 需要分段处理
  2. 项目上下文缺失:LLM 不熟悉项目特有的架构约定和业务规则
  3. 误报率存在:约 15% 的提示需要人工判断是否有效

总结

LLM 代码审查不能完全替代人工审查,但可以用很低的成本覆盖安全检查、代码规范、常见性能问题等常规维度,让人工 reviewer 把精力集中在更有价值的架构和业务逻辑审查上。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。