Skip to content

Agentic Code Review:AI 驱动的代码审查

团队引入 AI agent 做代码审查已经半年了。不是简单的 lint 规则,而是能理解业务逻辑的深度 review。来分享实战经验。

什么是 Agentic Code Review

传统 lint:检查语法、格式、已知规则
AI Review:理解代码意图、发现逻辑问题、建议架构改进

Agentic = AI agent 能自主地:
  1. 读取相关代码上下文
  2. 调用工具获取更多信息
  3. 做出多步推理
  4. 生成结构化的 review 意见

实现方案

ts
// scripts/ai-review.ts
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

interface ReviewResult {
  file: string;
  line: number;
  severity: "error" | "warning" | "suggestion";
  category: string;
  message: string;
  suggestion?: string;
}

async function reviewPR(diff: string, context: string): Promise<ReviewResult[]> {
  const response = await client.messages.create({
    model: "claude-sonnet-4-20250514",
    max_tokens: 8192,
    system: `你是一个资深前端工程师,负责代码审查。
审查维度:
1. 正确性:逻辑错误、边界条件
2. 安全性:XSS、CSRF、数据泄露
3. 性能:不必要的重渲染、大列表、内存泄漏
4. 可维护性:命名、抽象、耦合度
5. TypeScript:类型安全、any 使用

输出格式:JSON 数组,每个元素包含 file, line, severity, category, message, suggestion`,
    messages: [
      {
        role: "user",
        content: `请审查以下代码变更:

## 上下文(相关文件)
${context}

## Diff
${diff}`,
      },
    ],
  });

  const content = response.content[0];
  if (content.type === "text") {
    return JSON.parse(content.text);
  }
  return [];
}

CI 集成

yaml
# .github/workflows/ai-review.yml
name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize]

permissions:
  pull-requests: write

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get changed files
        id: changes
        run: |
          DIFF=$(git diff origin/${{ github.base_ref }}...HEAD)
          echo "diff<<EOF" >> $GITHUB_OUTPUT
          echo "$DIFF" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Run AI Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: npx tsx scripts/ai-review.ts

      - name: Post Review Comments
        uses: actions/github-script@v7
        with:
          script: |
            const review = require('./review-results.json');
            for (const item of review) {
              await github.rest.pulls.createReviewComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                pull_number: context.issue.number,
                body: `**[${item.severity.toUpperCase()}]** ${item.message}\n\n${item.suggestion || ''}`,
                commit_id: context.payload.pull_request.head.sha,
                path: item.file,
                line: item.line,
              });
            }

审查规则示例

tsx
// AI 能发现的典型问题:

// 1. 内存泄漏
function Dashboard() {
  const [data, setData] = useState([]);

  useEffect(() => {
    // 问题:没有 cleanup,组件卸载后还在更新状态
    fetch("/api/data").then((r) => r.json()).then(setData);
  }, []);
}

// AI 建议:
// "useEffect 中的异步操作需要 cleanup,
//  使用 AbortController 取消请求"

// 2. 性能问题
function UserList({ users }: { users: User[] }) {
  return (
    <div>
      {users.map((user) => (
        // 问题:每次渲染都创建新的函数
        <UserCard
          key={user.id}
          user={user}
          onClick={() => navigate(`/users/${user.id}`)}
        />
      ))}
    </div>
  );
}

// AI 建议:
// "onClick 每次渲染都创建新函数,
//  如果 UserCard 使用了 memo,会导致不必要的重渲染"

// 3. 类型安全
async function getUser(id: string) {
  const res = await fetch(`/api/users/${id}`);
  const data = await res.json(); // 问题:any 类型
  return data; // 缺少返回类型
}

// AI 建议:
// "添加返回类型 User,使用 zod 或 io-ts 验证响应"

审查效果

3 个月跟踪数据:
  AI 发现的问题:847 个
  人类确认有效:623 个(73.5%)
  误报:224 个(26.5%)

  最高效类别:
    1. TypeScript 类型问题(有效率 92%)
    2. 安全漏洞(有效率 88%)
    3. 性能问题(有效率 75%)
    4. 代码风格(有效率 70%)
    5. 架构建议(有效率 55%)

  人类补充的审查:
    AI 未发现但人类发现的问题占比 15%
    (主要是业务逻辑和需求理解问题)

小结

  • Agentic Code Review 不是替代人类审查,是第一道筛选
  • AI 擅长发现技术问题(类型、安全、性能),不擅长业务逻辑
  • 设置合理的 severity 阈值,避免 review 噪声太多
  • 把 AI review 意见作为 PR comment 的参考,最终决定权在人类
  • 持续优化 prompt,减少误报率

MIT Licensed