你不需要一个“会聊天”的 AI 审查器,你需要一个能阻断坏改动进主干的风险闸门。
这篇给一套可上线的最小方案:OpenAI Responses 负责生成结构化审查结论,GitHub Actions 负责分级阻断,发现高风险时自动回滚到安全提交。
目标与适用场景
适合以下团队:
- PR 数量多,人工 review 容易漏掉高风险变更
- 已有 CI,但缺少“语义层”质量门禁(例如 API 兼容性、隐私泄露、越权风险)
- 希望把 AI 结果限定为可审计 JSON,避免“模型自由发挥”
保守目标:先拦住明显高风险改动,不追求一次性覆盖所有质量问题。
总体架构(保守可回退)
流水线分三层:
- 静态硬规则层:lint/test/secret scan(传统 CI)
- AI 语义评测层:Responses 输出结构化风险报告
- 策略决策层:根据风险等级执行 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
}
关键点:
block与rollback_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 reviewerlow: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:一键回滚(仅在主干受影响时触发)
回滚要满足两个条件:
- 当前部署对应 commit 来自本次高风险变更
- 最近一次绿色构建 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)
- PR diff 抽取脚本
- 结构化风险 schema
- gate 决策脚本(含分级 exit code)
- PR comment 模板(让 reviewer 快速确认)
- 回滚脚本 + last-green 记录机制
先把这 5 项跑通,你就有一个真正可运营、可审计、可回退的 AI 风险闸门。
总结
OpenAI Responses + GitHub Actions 的正确打开方式,不是“AI 替你做决策”,而是让 AI 提供可验证证据,再由策略层做最终裁决。这样才稳,才敢长期用。