按是否涉及认证、数据库迁移、加密、并发等风险信号对PR分级,低风险走廉价模型,高风险才上最强模型,在保证安全的同时显著降低推理成本。
上个月我写了一篇关于给 Pull Request 添加解释门控的文章,目的是让 AI 生成的代码在没有人类可读的理由说明之前永远不会合入。本文是其自然延续:既然你已经接受每个 AI 辅助的 PR 都需要 review,那么下一个问题就是 review 的经济学——用最强的模型跑每个 diff 是浪费,用最弱的模型跑一切又是鲁莽。我反复回归的答案是一个无聊、老派的想法——分诊(triage)——应用到模型选择上。
更新、更便宜、同时能力令人惊讶的模型不断出现,定价变化比我侧边项目的发布还快。所以我没有押注任何特定模型,而是构建了一个小型路由层,把"哪个模型来 review 这个 diff?"当作一个我可以测试、记录和更改的决策来对待。下面是这个工作流、一个可运行的产物,以及它真正失效的场景清单。
给每个 diff 评分,检测风险信号(是否触碰了认证?迁移?加密?并发?巨大的行数?)。低风险 diff 走廉价或免费模型层。高风险 diff 升级到你能访问的最强模型——但只针对那些需要升级的。你用很小一部分的成本和延迟,获得了"用最强模型 review 所有内容"的大部分安全性,同时保留了一份日志,让你能够审查路由本身是否正常工作。
这是一个自包含的 Python 脚本(仅用标准库,所以你可以在任何地方运行——包括在你控制的免费服务器上)。它本身不调用任何模型 API;它生成路由决策加上一份 review 提示词,这样你可以接入任何你喜欢的 provider。
#!/usr/bin/env python3
"""route_diff.py — decide which model tier should review a diff.
Usage:
git diff main...HEAD | python3 route_diff.py
Exit codes:
0 -> routed to 'fast' tier (cheap/free model is fine)
2 -> escalated to 'strong' tier (use your best model)
The script prints a JSON decision to stdout so CI can log it.
This is a heuristic gate, not a security scanner. Tune the weights
for your own codebase.
"""
import json
import re
import sys
# Path patterns that should always escalate. Edit for your repo.
HIGH_RISK_PATHS = [
r"(^|/)auth/",
r"(^|/)(migrations|schema)/",
r"(^|/)crypto",
r"payment|billing|invoice",
r"\.env", r"secret", r"credential",
r"dockerfile", r"\.github/workflows",
]
# Content signals inside the diff body.
HIGH_RISK_CONTENT = [
r"\beval\(", r"\bexec\(",
r"subprocess|os\.system|shell=True",
r"SELECT .*;|DROP TABLE|DELETE FROM", # raw SQL
r"async def|threading|multiprocessing", # concurrency
r"jwt|bcrypt|argon2|hmac",
r"TODO|FIXME|HACK", # AI left homework
]
WEIGHTS = {
"path": 5, # per risky file path hit
"content": 3, # per risky content hit
"size": 1, # per 100 changed lines
}
ESCALATE_AT = 5 # tune with your own logs (see below)
def score(diff_text: str) -> dict:
files = re.findall(r"^diff --git a/(\S+)", diff_text, re.M)
added = len(re.findall(r"^\+(?!\+\+)", diff_text, re.M))
removed = len(re.findall(r"^-(?!--)", diff_text, re.M))
path_hits = sorted({
f for f in files
for pat in HIGH_RISK_PATHS if re.search(pat, f, re.I)
})
content_hits = sorted({
pat for pat in HIGH_RISK_CONTENT
if re.search(pat, diff_text, re.I)
})
total = (
WEIGHTS["path"] * len(path_hits)
+ WEIGHTS["content"] * len(content_hits)
+ WEIGHTS["size"] * ((added + removed) // 100)
)
return {
"tier": "strong" if total >= ESCALATE_AT else "fast",
"score": total,
"changed_lines": added + removed,
"risky_paths": path_hits,
"risky_signals": content_hits,
}
def build_prompt(decision: dict, diff_text: str) -> str:
focus = (
"This diff touched high-risk areas: "
+ ", ".join(decision["risky_paths"] or decision["risky_signals"])
+ ". Review for correctness, injection, and auth bypass first."
if decision["tier"] == "strong"
else "Routine review: logic errors, edge cases, naming."
)
return f"{focus}\n\n```
{% endraw %}
diff\n{diff_text}\n
{% raw %}
```"
if __name__ == "__main__":
diff = sys.stdin.read()
d = score(diff)
print(json.dumps(d, indent=2))
with open("review_prompt.md", "w") as fh:
fh.write(build_prompt(d, diff))
sys.exit(2 if d["tier"] == "strong" else 0)
在使用前用你自己的历史记录测试它:
# 路由器是否升级了你后来发现 bug 的那个 PR?
git show <bugfix-commit>^..<bugfix-commit> | python3 route_diff.py
echo $? # 你*希望*对修复了真实事件的提交返回 2
最后这一步很重要。一个从不校准的路由门控只是带配置文件的迷信。
两个运营商提供的事实让这个方案的运行成本比以往更低:MonkeyCode 目前提供免费模型访问和免费服务器选项,这意味着路由脚本和快速层的 review 调用都可以在没有付费计划的情况下运行。
声明:本文是作为 MonkeyCode 产品推广的一部分准备的。
在我的设置中,免费层处理"快速"通道:路由脚本在免费服务器上的 CI 中运行,常规 diff(重命名、测试、文档、UI 调整)由免费层模型 review。升级的 diff——约占 10–20% 触发风险信号的——当月走我有权证的、最强的模型。我有意不在脚本或流水线中硬编码模型名称,因为便宜/强大的格局在不断重新洗牌;路由器的工作是将这种切换保持为一行的配置变更,而不是工作流的重新编写。如果你在评估这个模式的工具,MonkeyCode 免费层是一个低承诺的地方,可以在接入任何付费服务之前原型化快速通道。
我有两个没有假设的事情,你也不应该假设:
持久性和配额。"免费"描述的是今天的报价,不是保证。路由器将每个决策记录到 JSON,这样如果免费层消失或收紧,我能准确看到我需要转移多少量以及会花多少钱。
能力。我从未假设免费层模型"足够好"——我测量了它(见下一节)。
只有当你验证了廉价层而不是信任它时,这个工作流才有效。我的方法是:
取 30–50 个历史 PR,其中人类 reviewer(或生产事故)发现了真正的问题。
用路由器生成的提示词,将每个 PR 通过快速层模型运行。
如果模型标记了同一类问题,则记录为命中。
如果快速层错过了超过约 15–20% 的常规通道问题,收紧 ESCALATE_AT 或将更多路径模式提升到 HIGH_RISK_PATHS——不要只是希望。
这是一个小样本的自我审计方法,不是基准测试。你的数字会特定于你的代码库和你的模型,这正是日志文件比任何供应商声明都更重要的原因。
它是一个启发式方法,不是安全边界。一个蓄意的恶意 diff 可以躲过每一条正则表达式。对于任何升级的内容保留人类 review,并将快速通道视为"辅助 review",而不是"不 review"。
基于正则表达式的风险信号会腐坏。框架约定会变化;每个季度花五分钟检查 HIGH_RISK_PATHS 是这个方案的一部分。
如果你的代码库足够小,用最强模型 review 所有内容的成本低于你每月一小时的时间;如果你的环境受监管,每个变更都需要有据可查的人类 review;或者如果你的 diff 主要由生成内容/锁文件噪音主导——大小信号会误导你——请完全跳过这个方案。
免费层是起点,不是架构。设计成失去免费层只是一个配置变更,而不是一次故障。
持久的技能不是在这个月选对模型——而是构建路由、记录和校准循环,让你随着市场变化切换模型。对 diff 进行分诊,只在有风险的地方花强模型 token,并保留收据,这样你就能证明廉价通道正在挣得它的位置。
如果你尝试这个,你最有价值分享的不是你的阈值数字——而是你的校准集教会了你关于你自己代码库风险画像的什么。这是没有任何模型能告诉你的部分。