摘要:2025 年,Cursor 和 Copilot 已经成为 IDE 的标准配置。代码产出快了 3 倍,但 Code Review 的时间预算没变。结果就是:一个 900 行的 AI PR 塞到 Reviewer 面前,1.5 小时后合入——上线当天 3 笔金额计算错误,因为 float 存了钱、导入了一个 AI 编出来的 SDK。这不是个别案例。本文不讨论"要不要用 AI 写代码",而是拆解 AI 编程引发的三个连锁问题:代码缺陷类型变了审查流程必须重建工程规范需要新契约。你会得到一份 8 项审查清单、一套预提交 + CI 自动化门禁脚本、PR 模板、以及四周团队落地路线图。


目录


一、3× 速度差:当 Review 跟不上生成

五年前,一个开发者一天产出 100-300 行,Reviewer 花 20 分钟看完。现在 Cursor 的 Tab 补全 + Copilot Chat 一问一答,一天 500-1000 行稀松平常。

但 Review 的时间预算完全没变。

指标 AI 前 AI 后 变化
人均日产出 100-300 行 500-1000 行
单 PR 平均大小 200-400 行 600-1200 行
每人日 Review 量 2-4 个 PR 3-6 个 PR +50%
每 PR 审查时间 15-30 min 10-15 min(被迫压缩)
新型 Bug 种类 逻辑错误 / 边界遗漏 幻觉 API / 规模盲区 / 风格漂移 新增

核心矛盾不是"AI 写的代码更差",而是"产出的速度远超审查的速度"。

2024 年 GitClear 对 1.5 亿行代码的分析显示:AI 辅助编程后,代码重复率上升 31%,“代码变动频繁度”(同一段代码反复修改)上升 17%。这些反复修改的大部分,正是 Review 没来得及发现的隐患。

什么时候不该用 AI 写代码?

场景 建议
安全认证/授权模块 人工编写 + 安全专家 Review
金融结算/金额计算 人工编写,AI 辅助写测试
涉及外部 API 签约协议的集成 查文档后手写
对现有核心库的重构 理解上下文后再动手,不要让 AI “猜”

二、六类 AI 代码特征性缺陷

2.1 规模盲区

AI 的训练数据以 Demo 和单文件逻辑为主,天然不关心"这张表有 1000 万行时会怎样"

# AI 生成 — 3 条数据完美,100 万条 OOM + 超时
@app.get("/api/users")
async def list_users():
    rows = db.execute("SELECT * FROM users").fetchall()        # ❌ 全表
    return [UserSchema.from_orm(r) for r in rows]              # ❌ 全量加载

审查要点: 看到 SELECT *、无 LIMIT、无分页、无超时 → 直接打回。附带问一句:“100 万条数据时,这段代码需要多少内存?”

2.2 幻觉依赖

四种最常见的幻觉类型:

类型 表现 发现手段
包幻觉 from payment_sdk import Gateway — 包不存在 pip install 报错
配置幻觉 settings.REDIS_CLUSTER — 配置 key 不存在 全局搜索该 key
API 幻觉 client.upload_v2(file) — 方法不存在 IDE Go to Definition
版本幻觉 Flask>=5.0 — 这个版本不存在 查 PyPI 真实版本

关键认知: AI 幻觉不是"偶尔出错",而是"在不确定时会自信地编造"。幻觉依赖 = 代码能通过语法检查,但运行时报 ModuleNotFoundError

2.3 过度工程

AI 默认"完成任务"优先于"简洁完成"。

# Prompt: "判断列表是否为空"
# AI 输出: 类型检查 + 异常 + 多分支 → 8 行

def is_empty(data: list) -> bool:
    if not isinstance(data, list):
        raise TypeError(f"Expected list, got {type(data)}")
    return len(data) == 0

# 实际需要: return not data if data is not None else True — 1 行

规则: 如果一段代码像"教科书示例"或"面试标准答案",大概率是 AI 过度发挥。

2.4 安全漏洞

问题 特征 严重性
命令注入 os.system(f"cmd {user_input}") 🔴
SQL 注入 f"SELECT * FROM t WHERE name='{name}'" 🔴
密钥硬编码 api_key = "sk-abc123def" 🔴
路径遍历 open(f"/data/{filename}") 未经校验 🟠
异常吞没 except: pass 🟡

AI 写代码时没有"安全意识"——它只是尽量让代码能跑、能通过测试。安全审查是 Reviewer 的专属责任。

2.5 风格漂移

同一个开发者用 AI 连续生成三段代码,得到三种风格:

文件 A: async def get_user(id: int) -> User:     ← async + 类型注解
文件 B: def create_order(data):                   ← 同步 + 无类型
文件 C: def process_payment(order_id: str) -> Dict:  ← 同步 + typing.Dict

审查要点: 一个 PR 内不一致 → 打回。可以配置 black / ruff 在 pre-commit 统一格式化,但命名风格和 async/sync 的选择需要人工判断。

2.6 测试假覆盖

AI 写测试的典型特征:行覆盖率 100%,边界覆盖率 0%

# AI 写的测试 — 全绿色,零价值
def test_divide():
    assert divide(10, 2) == 5
    assert divide(100, 10) == 10
    # 除以 0?负数?浮点精度?极大值?→ 全没测

审查要点: 看到测试只覆盖正常路径 → 要求补充:空值、边界、异常、并发场景。

2.7 缺陷速查表

┌─ AI 代码缺陷速查(Review 前对照)────────────────────────────┐
│                                                              │
│  🚩 SELECT * / 无 LIMIT              → 规模盲区              │
│  🚩 import 不存在的包/调用不存在的方法  → 幻觉依赖              │
│  🚩 教科书式过度设计                    → 过度工程             │
│  🚩 f-string 拼接 SQL / 命令行          → 安全漏洞             │
│  🚩 同一 PR 内命名/async 不统一          → 风格漂移             │
│  🚩 测试只有正常路径                     → 测试假覆盖           │
│                                                              │
└──────────────────────────────────────────────────────────────┘

三、审查流程 2.0

3.1 8 项 AI 专项审查清单

在标准 Review 流程之上,追加这 8 项:

┌─ AI 代码专项审查清单 ───────────────────────────────────────┐
│                                                            │
│  □ [规模] 100 倍数据量/并发量下是否安全?                    │
│  □ [依赖] 所有 import 的包/配置 key 都真实存在?             │
│  □ [安全] 无命令注入 / SQL注入 / 路径遍历 / 硬编码密钥?    │
│  □ [边界] null / 空串 / 0 / 负数 / 大数 是否处理?          │
│  □ [异常] 所有 except 块都有处理逻辑(不是 pass)?          │
│  □ [简化] 有更简单的实现吗?AI 是否过度工程了?              │
│  □ [风格] 与项目现有代码风格一致?                           │
│  □ [测试] 覆盖了"AI 可能遗漏的异常场景"吗?                  │
│                                                            │
└────────────────────────────────────────────────────────────┘

3.2 审查时序重构

【传统流程】
  写代码 → 自测 → 提 PR → 人工 Review → 合入

【AI 代码流程】(★ 为新增环节)
  写 Prompt → AI 生成 → ★ 开发者逐行理解 + 验证
      ↓
  跑测试 + 边界探索 → ★ 标注 AI 参与部分
      ↓
  提 PR → ★ 自动门禁(lint + security + dep check)→ ✅
      ↓
  ★ 检查 AI 声明是否完整 → Reviewer 查 8 项清单 → 合入
      ↓
  ★ 归档:Prompt + 审查记录 + AI_BUGS(如有)

三个核心变化:

  1. "开发者理解"是硬性门槛 — 不能"AI 生成我就交"。如果你解释不了某行代码为什么在那,不要提交
  2. 自动门禁前置到人工审查之前 — lint、安全扫描、依赖检查在 Reviewer 拿起 PR 前已跑完,不浪费人的时间
  3. 问题必须归档 — AI 代码的问题有"重复模式"。归档 AI_BUGS.md,团队共享,避免重复踩坑

四、工程规范新契约

4.1 PR 模板(含 AI 声明)

<!-- .github/PULL_REQUEST_TEMPLATE.md -->

## 变更概述


## AI 辅助声明(如适用)
- [ ] 本 PR 包含 AI 生成的代码
- AI 参与比例:___%(估计)
- 关键 Prompt:

[粘贴最核心的 prompt]

- [ ] 我已逐行理解所有 AI 生成的代码,能解释其逻辑

## 自检清单
- [ ] [规模] 大数据量/高并发下安全
- [ ] [依赖] 本次新增的依赖已加入项目依赖文件
- [ ] [安全] 无硬编码密钥 / 命令注入 / SQL 注入
- [ ] [边界] 空值、边界值已处理
- [ ] [测试] 已补充 AI 可能遗漏的异常场景测试

## 审查重点
> [标注 AI 最容易出错的部分,帮助 Reviewer 聚焦]

4.2 提交粒度与 Prompt 归档

规范 AI 时代标准 为什么
单 PR 行数 ≤ 300 行 AI 代码需要比手写代码更细的审查
单次 AI 生成 ≤ 100 行 超出则拆成多次 Prompt,每次单独提交
文件变更数 ≤ 5 个 防止 AI 一次"重构"整个项目
Prompt 归档 必须 prompts/,与代码同版本管理

Prompt 归档示例:

# prompts/2024-07/user-search.md
- 日期: 2024-07-15
- 生成文件: api/routes/users.py:120-165
- Prompt: "在 FastAPI 中实现 GET /api/users/search 支持分页和模糊搜索"
- 生成行数: 45 行
- 审查结果: 通过 8 项清单, [规模] 已加 LIMIT, [测试] 补充了空搜索测试

为什么归档 Prompt 而不是注释? Prompt 记录的是"生成意图",设计文档记录的是"设计意图"。Prompt 归档补足了 AI 代码最缺失的东西:开发者当时到底想让 AI 做什么


五、自动化门禁

5.1 预提交钩子

#!/bin/bash
# scripts/pre-commit.sh
# 安装: cp scripts/pre-commit.sh .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit

echo "=== AI Code Pre-Commit Check ==="
HAS_ERROR=0

# 1. 硬编码密钥
if git diff --cached -U0 | grep -qE '^\+.*(api_key|secret|password|token)\s*=\s*"[^"]{8,}"'; then
    echo "🔴 发现硬编码密钥,请移入环境变量。"
    HAS_ERROR=1
fi

# 2. 危险函数
if git diff --cached -U0 | grep -qE '^\+.*(os\.system|shell=True|eval\(|exec\()'; then
    echo "🟡 发现危险函数调用(os.system / eval / exec),请确认。"
fi

# 3. 空 except
if git diff --cached -U0 | grep -A2 'except' | grep -qE '^\+\s*(pass|\.\.\.)\s*$'; then
    echo "🟡 发现空 except 块,请添加日志或注释。"
fi

# 4. 疑似幻觉依赖
CHANGED=$(git diff --cached --name-only --diff-filter=ACM | grep '\.py$' || true)
for f in $CHANGED; do
    [ -f "$f" ] || continue
    grep -E '^\s*(import |from )' "$f" | sed 's/.*import //;s/from //;s/\..*//' | sort -u | while read pkg; do
        [ -z "$pkg" ] && continue
        if ! python -c "import $pkg" 2>/dev/null; then
            echo "🟡 $f: '$pkg' 可能不存在(幻觉依赖?)"
        fi
    done
done

[ "$HAS_ERROR" -eq 1 ] && echo "❌ 提交被阻止" && exit 1
echo "✅ 检查通过"

5.2 CI 安全流水线

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

jobs:
  gate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Security Scan (bandit)
        uses: actions/setup-python@v5
        with: { python-version: '3.12' }
      - run: pip install bandit && bandit -r . -ll -f txt -o bandit.txt
      - run: |
          if grep -q "Severity: High" bandit.txt 2>/dev/null; then
            cat bandit.txt
            echo "::error::High severity security issues found"
            exit 1
          fi
          echo "✅ 安全检查通过"

      - name: Check AI Declaration
        env: { GH_TOKEN: ${{ github.token }} }
        run: |
          BODY=$(gh pr view ${{ github.event.number }} --json body -q .body)
          echo "$BODY" | grep -q "AI 辅助声明" \
            && echo "✅ AI 声明已填" \
            || echo "::warning::建议填写 AI 辅助声明"

      - name: PR Size Check
        env: { GH_TOKEN: ${{ github.token }} }
        run: |
          ADD=$(gh pr view ${{ github.event.number }} --json additions -q .additions)
          [ "$ADD" -gt 500 ] && echo "::warning::PR $ADD 行,>500 行审查质量下降"

      - uses: psf/black@stable
        with: { options: "--check --diff", src: "." }

六、团队落地:四周计划 + 度量

动作 产出 验收
1 团队分享:展示 6 类缺陷真实案例,达成共识 PR 模板上线 ≥ 3 个 PR 使用新模板
2 安装 pre-commit 钩子 + 试用 8 项清单 门禁运行 至少拦截 1 个真实问题
3 接入 CI 安全检查 + 依赖扫描 + 格式检查 CI 全量运行 100% PR 通过自动门禁
4 统计数据:AI PR vs 普通 PR 问题率 数据报告 根据数据决定是否调整清单

四个核心原则:

  • 不禁用 AI — 禁止 = 偷偷用 = 没有任何防护 = 风险更大
  • AI 不审查 AI — 当前 AI 做 Code Review 的假阴性率过高,核心逻辑必须人审
  • 审查时间预算 ×2 — AI 的 300 行需要比人写的 300 行多一倍时间
  • AI_BUGS.md — 记录团队遇到的 AI 典型 Bug 及其产生原因,新人入职必读

度量指标(可选,建议引入):

指标 计算方式 目标
AI PR 返修率 AI PR 中收到 change request 的比例 < 30%
门禁拦截率 pre-commit/CI 拦截的提交占比 > 5%
幻觉依赖发现量 每月发现的不存在 import 次数 持续下降
安全漏洞发现量 bandit 每月报出的 High 级别 0

七、总结:一张表记住全部

┌──────────────────────────────────────────────────────────────────┐
│                  AI 辅助编程 — 审查与规范速查                      │
├─────────────────┬──────────────────┬─────────────────────────────┤
│   缺陷识别(6类) │   审查升级         │    工程规范                │
├─────────────────┼──────────────────┼─────────────────────────────┤
│ 规模盲区/幻觉依赖  │ 8 项专项审查清单    │ PR 含 AI 声明 + Prompt     │
│ 过度工程/安全漏洞  │ 门禁前置到人工之前   │ 提交 ≤300 行 / ≤5 个文件    │
│ 风格漂移/测试假覆盖│ 逐行理解是提交通行证  │ Prompt 归档到 prompts/     │
│                 │ 问题归档 AI_BUGS.md │ pre-commit + CI 双层防护    │
├─────────────────┴──────────────────┴─────────────────────────────┤
│ 黄金法则:                                                       │
│ 1. AI 写代码,人担责任 — 提 PR 的人必须能解释每一行               │
│ 2. 审查 AI 代码 = 常规审查 + 安全审查 + 幻觉审查                  │
│ 3. 自动化门禁要在 Reviewer 之前运行,节省人的时间                  │
│ 4. 归档产生的问题 = 团队共同成长 — AI_BUGS.md 是最好的培训材料      │
└──────────────────────────────────────────────────────────────────┘

落地包:将本文第 3、4、5 节的清单 + 模板 + 脚本整合,即为一套可直接使用的「AI 辅助编程工程规范 v1.0」。

参考Google Code Review · GitClear AI 代码分析报告 · OWASP AI Security · Bandit

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐