jevbooks

← 全部设计模式

漏斗

级联 · Funnel

便宜的先筛,贵的最后

把判断按单价排成一队,每个对象停在第一个能定它的那一级。

规则放行放行LLM200308

问题

你在做一个代码评审工具:一次交给团队评审的改动有 200 个文件,你把每一个都发给大模型,问它这儿有什么问题。

一个文件几秒钟、一分钱,一轮下来五分钟、几块钱。扎心的是其中 190 次回来的是「这里没事」—— 九成的钱和等待,买了一堆「看着还行」。

反方向的坑也有人踩:一个命令行守卫每条命令都问一遍模型,连「列一下目录里有什么」都要等 400 毫秒。一行名单就能放过去的东西,被送去做了一次语义判断。

解决方案

漏斗模式说:把判断按单价排成一队 —— 免费的代码规则在最前,Jev 在中间,贵的那个(大模型,或者人)在最后 —— 每个对象停在第一个能定它的那一级。

免费那一级只许朝「错了也便宜」的方向短路。命令守卫的白名单只放行、永不拒绝:sudo、eval、重定向一律往上送。评审工具的免费级只跳过压根不用看的文件。

中间那级让 Jev 用几道存在性题把剩下的筛一遍,每个对象一次便宜的请求,只把过线的往上送,而且有条数上限。最后那一级只看幸存者。每个对象是哪一级判的,要记下来,否则事后你没法解释任何一个结论。

问 · 答 · 拍

  1. 一条命令进来,白名单先看一眼;名单定不了的,才连同它会执行的脚本一起送出去,配几道安全题。
  2. 其中最危险的那道回来是 0.62。
  3. 过了 0.45 但没到 0.8,既不自动拒也不自动放:弹给人确认,同时记下一行 —— 这条是第二级判的。

名字从哪来

漏斗。上面口大下面口小,粗的东西在上面就被拦住,只有细的往下走。没有哪一层需要拦住一切,每一层只做它这一层最便宜的那件事。

什么时候用

对象很多,其中大多数能便宜地排除掉;而且各级弄错的代价不对称 —— 放错和拦错,后果不一样重。

什么时候别用

筛子会漏多少你没量过 —— 80 个真故障它抓出 63 个,当筛子就意味着永久丢掉 17 个。或者上一级和下一级的短路方向一样,那是两级在干同一件事。

做这件事的项目

  • jev-axi — 为 TypeSafe 的 Jev 提供的 CLI:从 shell 快速获得校准判断。
  • jev-review — 由 Jev 把关的分阶段代码审查工作流与本地仪表盘。
  • abide — 让编码代理通过 Jev 检查遵守项目规则。

用这种模式的全部项目 →

看谁的代码
想看代码
for (const cmd of commands) {
  if (ALLOWLIST.test(cmd) && !RISKY.test(cmd)) { log(cmd, "tier0-allow"); continue; }  // 免费:只放行
  const { answers } = await jev({ command: cmd, scripts: readScripts(cmd) }, SAFETY);  // 便宜的筛子
  const risk = Math.max(...Object.values(answers).map((a) => a.p));
  if (risk < 0.45) { log(cmd, "tier1-allow"); continue; }
  const verdict = risk >= 0.8 ? "deny" : await askPerson(cmd, answers);                // 贵的:只看剩下的
  log(cmd, verdict);
}
jevbooks 怎么认出它

我们怎么知道一个项目用没用这一招?拿它的 README 问 Jev 一句话,Jev 给个百分比,数字越高说明越像。你要抄这道题,记住一点:别问「这个项目好不好」,要问「有没有讲到这一件具体的事」。

questions.json · 每份 README 都发这道题
{
  "cascade": {
    "type": "noul",
    "instructions": {
      "what": "Does the text describe a cheaper stage deciding which items reach a costlier one, such as code rules or an allowlist before Jev, or a Jev screen whose positives go to an LLM or a person?",
      "not_for": "Every item going through the same single stage."
    },
    "criteria": {
      "true": "The text explicitly describes this. One sentence is enough; other content does not cancel it.",
      "false": "The text does not describe this."
    }
  }
}

用 Jev 做一个 →