你不需要一个“会聊天”的 AI 审查器,你需要一个能阻断坏改动进主干的风险闸门。

这篇给一套可上线的最小方案:OpenAI Responses 负责生成结构化审查结论,GitHub Actions 负责分级阻断,发现高风险时自动回滚到安全提交。

目标与适用场景

适合以下团队:

  • PR 数量多,人工 review 容易漏掉高风险变更
  • 已有 CI,但缺少“语义层”质量门禁(例如 API 兼容性、隐私泄露、越权风险)
  • 希望把 AI 结果限定为可审计 JSON,避免“模型自由发挥”

保守目标:先拦住明显高风险改动,不追求一次性覆盖所有质量问题。

总体架构(保守可回退)

流水线分三层:

  1. 静态硬规则层:lint/test/secret scan(传统 CI)
  2. AI 语义评测层:Responses 输出结构化风险报告
  3. 策略决策层:根据风险等级执行 pass/warn/block

建议风险等级:

  • low:放行
  • medium:放行但强制 reviewer 确认
  • high:阻断并提示修复项
  • critical:阻断 + 自动触发一键回滚脚本

Step 1:定义可执行的风险 Schema

先把“主观判断”变成机器可执行字段。

{
  "risk_level": "low|medium|high|critical",
  "summary": "string",
  "findings": [
    {
      "type": "security|compatibility|data-loss|performance|compliance",
      "severity": "low|medium|high|critical",
      "file": "string",
      "evidence": "string",
      "fix": "string"
    }
  ],
  "confidence": 0.0,
  "block": true,
  "rollback_recommended": false
}

关键点:

  • blockrollback_recommended 必须由策略层二次确认,不能盲信模型
  • confidence < 0.6 时降级为 medium,避免误杀

Step 2:在 GitHub Actions 中调用评测

下面是一个最小 workflow 片段(可直接改造):

name: pr-risk-gate

on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  gate:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4

      - name: Collect PR diff
        run: |
          git fetch origin ${{ github.base_ref }} --depth=1
          git diff --unified=0 origin/${{ github.base_ref }}...HEAD > pr.diff

      - name: AI risk evaluation
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          python3 scripts/eval_pr_risk.py \
            --diff pr.diff \
            --schema scripts/risk_schema.json \
            --out risk.json

      - name: Decide gate policy
        run: python3 scripts/gate_decision.py --in risk.json

Step 3:策略层做“分级阻断”

gate_decision.py 建议规则:

  • critical:exit 2(强阻断)
  • high:exit 1(阻断)
  • medium:exit 0 + PR comment + required reviewer
  • low:exit 0

示例:

python3 scripts/gate_decision.py --in risk.json
code=$?
if [ "$code" -eq 2 ]; then
  echo "critical risk, trigger rollback plan"
  bash scripts/rollback_to_last_green.sh
  exit 1
elif [ "$code" -eq 1 ]; then
  echo "high risk, block merge"
  exit 1
fi

Step 4:一键回滚(仅在主干受影响时触发)

回滚要满足两个条件:

  1. 当前部署对应 commit 来自本次高风险变更
  2. 最近一次绿色构建 commit 可追溯
#!/usr/bin/env bash
set -euo pipefail

LAST_GREEN_SHA=$(cat .ci/last-green.sha)

git fetch origin --depth=20
git checkout main
git reset --hard "$LAST_GREEN_SHA"
git push origin main --force-with-lease

注意:只在明确事故流程里开放 force-with-lease,并保留审计日志。

常见错误与排障

1) 误报太多,团队开始绕过闸门

原因:prompt 太泛 + schema 不收敛。
修复:减少风险类型,先只保留 security/compatibility/data-loss 三类。

2) 模型延迟高,PR 等待时间过长

原因:把整仓代码喂给模型。
修复:只传增量 diff + 关联文件摘要,限制 token 预算。

3) 高风险阻断后没有可执行修复

原因:只报问题不报落地步骤。
修复:强制 fix 字段输出可执行命令或补丁建议,缺失则自动降级为 medium

最小可行落地清单(MVP)

  1. PR diff 抽取脚本
  2. 结构化风险 schema
  3. gate 决策脚本(含分级 exit code)
  4. PR comment 模板(让 reviewer 快速确认)
  5. 回滚脚本 + last-green 记录机制

先把这 5 项跑通,你就有一个真正可运营、可审计、可回退的 AI 风险闸门。

总结

OpenAI Responses + GitHub Actions 的正确打开方式,不是“AI 替你做决策”,而是让 AI 提供可验证证据,再由策略层做最终裁决。这样才稳,才敢长期用。