一、为什么要做 AI Code Review
代码审查是开发流程中最耗时但也最重要的环节。一个中等规模的 PR,人工 Review 下来少则 15 分钟,多则半小时。而且人的注意力是有限的——看多了难免漏掉边界情况、空指针、日志泄露等问题。
所以我用 LangChain + GPT-4o 搭了一个自动化代码审查 Agent。它能做到:
对提交的代码做静态分析(风格、命名、空指针、异常处理)
给出逐行的改进建议
生成 Review Summary(含严重等级评分)
支持自定义审查规则(比如禁止 System.out.println、强制日志规范)
最终效果:一个 PR 的 Review 时间从 20 分钟降到 30 秒。
二、整体架构
关键设计思路:
按文件处理而不是一次性丢整个 PR 给 LLM,避免超出上下文窗口
增量分析:只 Review Diff 变更行,不加载无关代码
规则注入:通过 Prompt 模板注入团队的 Coding 规范
三、核心代码实现
3.1 审查 Agent 的核心 Prompt

review_prompt.py

from langchain_core.prompts import ChatPromptTemplate

REVIEW_TEMPLATE = “”"你是一个资深的 Java / Python 代码审查专家。
请严格审查以下代码差异,按下面分类输出:

1. 严重问题(Severity: HIGH)

  • 空指针、线程安全问题、SQL 注入、严重性能缺陷

2. 一般问题(Severity: MEDIUM)

  • 异常吞没、资源未关闭、日志不规范

3. 建议优化(Severity: LOW)

  • 命名不规范、缺少注释、代码冗余

输出格式

每一条的格式:

  • [HIGH] 文件名:行号 — 问题描述
  • [MEDIUM] 文件名:行号 — 问题描述
  • [LOW] 文件名:行号 — 问题描述

代码差异(diff):
{diff_content}

团队规范(仅当违反时才指出):
{team_rules}
“”"

prompt = ChatPromptTemplate.from_template(REVIEW_TEMPLATE)
3.2 审查引擎

reviewer.py

import os
import subprocess
from langchain_openai import ChatOpenAI
from review_prompt import prompt

class CodeReviewAgent:
def init(self, model=“gpt-4o”, api_key=None):
self.llm = ChatOpenAI(
model=model,
api_key=api_key or os.getenv(“OPENAI_API_KEY”),
temperature=0.1, # 代码审查要确定性高
)
self.chain = prompt | self.llm

def get_diff(self, repo_path, base_branch="main"):
    """获取当前分支相对于 base 分支的差异"""
    result = subprocess.run(
        ["git", "diff", base_branch, "--", "*.java", "*.py"],
        capture_output=True, text=True, cwd=repo_path
    )
    return result.stdout

def review_diff(self, diff_content: str, team_rules: str = "") -> str:
    """对 diff 进行审查"""
    if not diff_content.strip():
        return "本次提交无代码变更,跳过审查。"

    # 如果 diff 太长,按文件拆分
    files = self._split_diff_by_file(diff_content)
    results = []

    for file_diff in files:
        resp = self.chain.invoke({
            "diff_content": file_diff,
            "team_rules": team_rules
        })
        results.append(resp.content)

    return self._merge_results(results)

def _split_diff_by_file(self, diff_content: str):
    """按 diff --git 分割,返回每个文件的 diff 列表"""
    import re
    pattern = r'(diff --git a/.*?)(?=diff --git|\Z)'
    return re.findall(pattern, diff_content, re.DOTALL)

def _merge_results(self, results: list) -> str:
    """汇总所有文件的审查结果"""
    header = "## 🤖 AI Code Review 结果\n\n"
    header += f"审查文件数:{len(results)}\n\n"
    header += "---\n\n"
    return header + "\n\n".join(results)

3.3 FastAPI 服务入口

main.py

from fastapi import FastAPI, Request
from reviewer import CodeReviewAgent

app = FastAPI(title=“AI Code Review Service”)
agent = CodeReviewAgent()

@app.post(“/webhook/github”)
async def github_webhook(request: Request):
“”“接收 GitHub PR 事件的 Webhook”“”
payload = await request.json()
action = payload.get(“action”)

if action not in ("opened", "synchronize"):
    return {"status": "ignored", "reason": f"action={action} 不需要审查"}

repo_name = payload["repository"]["full_name"]
pr_number = payload["pull_request"]["number"]
clone_url = payload["pull_request"]["head"]["repo"]["clone_url"]
branch = payload["pull_request"]["head"]["ref"]

# 1. 克隆代码
local_path = f"/tmp/repos/{repo_name.replace('/', '_')}_{pr_number}"
os.system(f"git clone --depth 1 --branch {branch} {clone_url} {local_path}")

# 2. 获取差异
base = payload["pull_request"]["base"]["ref"]
diff = agent.get_diff(local_path, base)

# 3. 执行审查
review_result = agent.review_diff(diff)

# 4. 将结果写到 PR 评论
print(f"PR #{pr_number} 审查完成,结果如下:")
print(review_result)

return {"status": "ok", "pr": pr_number}

四、实测效果对比
维度 人工 Review AI Agent Review
耗时 15-30 分钟 30 秒 - 2 分钟
一致性 因人而异 稳定输出
漏检率 10-20%(疲劳时更高) 约 5%(边界情况稳定)
覆盖范围 仅代码逻辑 逻辑 + 风格 + 安全 + 规范
成本 高级开发时间 GPT-4o API 约 ¥0.05/次

注意:AI Agent 适合做 第一轮快速扫描,人工 Review 做 第二轮深度审核。AI 先筛掉明显问题,人只关注逻辑和架构——这才是最高效的配合方式。

五、进阶玩法
5.1 结合 Git Hooks 做本地预审

.git/hooks/pre-push

#!/bin/bash
echo “🔍 正在执行 AI 代码预审…”
python3 reviewer.py --local
if [ $? -ne 0 ]; then
echo “❌ 代码审查未通过,禁止推送”
exit 1
fi
5.2 自定义审查规则
team_rules = “”"

  1. 禁止使用 System.out.println,必须用 Logger
  2. 所有 Controller 接口必须添加 @Operation 注解
  3. SQL 语句必须使用参数化查询,禁止拼接字符串
  4. 方法超过 50 行必须拆分子方法
  5. 所有抛出的异常必须携带业务错误码
    “”"
    5.3 支持多语言
    用 --ext 参数指定需要审查的文件后缀,内置了对 Java、Python、Go、TypeScript 的支持。
    六、踩坑记录
    Context Window 管理:一个大的 PR Diff 可能超过 GPT-4o 128K 的上下文。按文件拆分后完美解决。
    Token 成本控制:设置 temperature=0.1 而不是默认的 0.7,输出更稳定且 Token 消耗减少约 30%。
    误报处理:AI 有时会过度审查(比如对测试代码也要求严格命名规范)。加了一个 review_tests=False 参数跳过测试目录。
    七、总结
    AI Agent 不是一个替代人工 Review 的工具,而是一个 增强人工效率 的辅助角色。它把 80% 的机械性审查工作自动化了,让开发者的精力只集中在真正有价值的地方。
    如果你也有类似的工具在实践,欢迎评论区交流。下次我会分享如何把这个 Agent 集成到 GitLab CI/CD 中,实现提 PR 自动审查。
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐