jevbooks

← 全部设计模式

灰区

无判断带 · Grey zone

0.5 不是中等,是不知道

落在中间那一段的答案当成根本没答:不算过,不算挂,只记一笔。

0.51不知道

问题

你在做一个文风检查器。文章一段一段发过去,每段问十条团队文风的题,超过 0.7 的标出来。跑了好几个月,一直挺好。

直到有个作者把截图编码贴进草稿,文本接口又把这串编码当正文传了过去。设想请求成功,十道题全部落在 0.48 到 0.53 之间:你的线在 0.7,于是这份材料被悄悄算成了合格文字。

你把线降到 0.45 想兜住它,这下所有不确定的答案都成了违规。两条线都没解决原来的错误:接近 0.5 既不能证明文字合格,也不能证明它违规,更不能告诉你输入有没有发对。

解决方案

灰区模式说:在中间专门留出一段,落进去的答案不算答案。它既不是弱一点的「是」,也不是软一点的「否」,它是一次缺席,你代码里任何一个分支都不许吃到它。

拿有代表性的输入重复跑,按实测来定这一段,0.4 到 0.6 可以作为起点。然后按题计数:落进来的比例升高,就检查措辞是否含糊、信息是否缺失、输入格式是否有误、模型版本是否变了。

最后,调用前先校验工具接受什么。文风检查器可以在本地拒绝编码文件、超出自身预算的长文本;要判断截图,就用 assets 和实验图片请求头构造正确的图像请求,别把 base64 编码冒充正文。

问 · 答 · 拍

  1. 问把一段正文(发给 Jev 看的那份材料,术语叫 state)和一条文风规则放进去,问它这一段违不违反这条规则。
  2. 答0.52。
  3. 拍落在中间那一段里,既不标记也不放过。这一段被记成「没判出来」,原样留着;要是一批里超过三成落在这儿,这次跑出来的不是报告,是一条报警。

名字从哪来

想想一张黑白照片。纯黑是「是」,纯白是「否」,中间那片灰哪边都不是。你当然可以硬把灰四舍五入到一边去,可照片上本来就没有那个信息——你只是编了一个答案,然后自己信了。

什么时候用

你问的是「有没有」这类是非题,而且输入有可能是模型读不了的东西,或者这套东西要长期跑、模型会在你脚底下换版本。

什么时候别用

你问的是「几档」这类等级题——那里中间那一档是真的中等,不是缺席。单选题也要换一种规则:查看选项分布与 confidence,选项数量不同,0.5 的含义也不同。

做这件事的项目

  • snifftest — 散文检查器,用可计数规则和一个判断模型找出 AI 写作痕迹。
  • huncho — 在 System One 模型上将决策作为代码:类型化问题、滞回、日志、校准。
  • jev-axi — 为 TypeSafe 的 Jev 提供的 CLI:从 shell 快速获得校准判断。

用这种模式的全部项目 →

看谁的代码
  • snifftestsrc/jev.ts:82-83

    落在 0.4 到 0.6 之间的一律标成「没判出来」:既不能变成一条标记,也不能算通过。

  • snifftestsrc/jev.ts:311-334

    这个文本检查器在本地拒绝图片 data URI、编码文件与超长文本,先守住自己的输入约定,再调用模型。

  • hunchosrc/compose.ts:65-97

    一个叫 uncertain() 的小函数给中间那段起了名字,0.5 附近的数从此读作「不知道」,不再读作「中等」。

想看代码
const BAND = [0.4, 0.6];
const verdict = (p) => (p > BAND[1] ? "yes" : p < BAND[0] ? "no" : null);   // null = 没有答案
let blank = 0;
for (const [id, a] of Object.entries(answers)) {
  const v = verdict(a.p);
  if (v === null) { blank++; continue; }            // 只记一笔,绝不据此行动
  act(id, v);
}
if (blank / Object.keys(answers).length > 0.3) alarm("检查题目、输入与模型版本");
jevbooks 怎么认出它

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

questions.json · 每份 README 都发这道题
{
  "no-judgment-band": {
    "type": "noul",
    "instructions": {
      "what": "Does the text describe treating probabilities near 0.5, or inside an uncertain band, as 'unknown' that neither pass nor fail?",
      "not_for": "Reading 0.5 as a medium score."
    },
    "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 做一个 →