jevbooks

← 全部设计模式

验货

契约校验 · Inspection

缺件不补零

动手之前先检查答案回来得齐不齐、像不像话;不合格的当成「没答」,绝不当成 0。

答案Σp = 1c ∈ opts0≤p≤1

问题

你在给一个聊天应用做审核门。每条消息发给 Jev,问一道题——这条消息在辱骂人吗——超过 0.7 就拦下。取答案的时候,你顺手加了个小保险:要是取不到,就当 0。

某天夜里,返回里没有这道题的答案。你的代码读到 0,意思是「肯定不是辱骂」,于是满怀信心地把这条消息放了出去。没有任何一处报警。监控上也干干净净:请求全是 200,响应全是合法的,延迟也正常。

你的第一反应是给那行包一层「出错就兜住」。可这里根本没有错可兜——服务好好的,响应也是规规矩矩的,只是少了一块。那句「就当 0」从来不是什么保险,它是你的代码替模型编了一个它没说过的答案,而且编在了最自信的那一头。

解决方案

验货模式说:把回来的答案当成一箱货,签收之前先点数。你问了四道题,箱子里就该有四个答案。少一个不是小毛病,是这箱货有问题。

然后一件件看。是非题的答案必须是 0 到 1 之间的数。多选题选中的那个必须出自你给的选项,每个选项都该有一个数,所有数加起来该约等于 1,而且被选中的那个数得是最大的。选中的不是最大的那个,那就不是一个答案,是上游某处出了 bug。

不合格的东西不叫 0,它叫「没答」,是第三种值,绝不以「一个很低的概率」的身份混进决策。它走另一条路——你事先就替这种时候选好的那条路。

问 · 答 · 拍

  1. 问把一条聊天消息(发给 Jev 看的那份材料,术语叫 state)放进去,问它这条消息在不在辱骂人。
  2. 答什么也没有。返回里根本没这道题。
  3. 拍没答不等于 0,所以这条消息不能按「安全」处理。它走你事先写好的那条路——先拦住,并在日志里记一句:这次检查根本没做成。

名字从哪来

签收快递。箱子里少了一个零件,签收单上写的是「缺件一个」,不是「零件数量:0」。写成 0,下一个经手的人就会以为这台机器本来就不需要那个零件。

什么时候用

总是。这不是建议,是别的事情的前一步:只要你系统里有任何东西会拿这个数去做事,这个数就得先验。

什么时候别用

没有——不存在「不验比验更安全」的情形。只要说清楚它的边界就行:它验的是答案的形状,不是含义。一个数完全可以形状规规矩矩,却什么也没说。

做这件事的项目

  • jev-ultrafast — 浏览器代理:Jev 决定每个动作和元素,仅在输入文本时调用语言模型。
  • snifftest — 散文检查器,用可计数规则和一个判断模型找出 AI 写作痕迹。
  • fast-jev-compaction — 用 Jev 裁剪上下文而非摘要的 Claude Code 插件。

用这种模式的全部项目 →

看谁的代码
  • jev-ultrafastjev_ultrafast/model.py:30-45

    点一下之前先查六件事:选中的在给出的选项里、每个选项都有数、所有数加起来约等于一、选中的那个数最大。有一样不对,就什么也不点。

  • snifftestsrc/jev.ts:384-417

    缺的、不是数字的、超出范围的答案一律丢掉,不换成 0——「根本没答」和「答了个很低的数」就是这样分开的。

  • fast-jev-compactionsrc/request.ts:66-80

    只要不是一个正常的数就当场抛错,工具随即退回自带的摘要办法,而不是瞎猜。

想看代码
function noulOf(answers, id) {
  const p = answers[id]?.p;
  return typeof p === "number" && p >= 0 && p <= 1 ? p : null;   // null = 没答,绝不当 0
}
const p = noulOf(answers, "abusive");
if (p === null) return onMissing();      // 走事先选好的那条路,不进决策
if (p >= 0.7) return hold(message);
jevbooks 怎么认出它

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

questions.json · 每份 README 都发这道题
{
  "contract-validation": {
    "type": "noul",
    "instructions": {
      "what": "Does the text describe checking Jev's answer shape before acting, such as choice in candidates, probabilities summing to one, or discarding out-of-range values?",
      "not_for": "Trusting the response as-is."
    },
    "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 做一个 →