问题
你在做一个文风检查器。文章一段一段发过去,每段问十条团队文风的题,超过 0.7 的标出来。跑了好几个月,一直挺好。
直到有个作者把截图编码贴进草稿,文本接口又把这串编码当正文传了过去。设想请求成功,十道题全部落在 0.48 到 0.53 之间:你的线在 0.7,于是这份材料被悄悄算成了合格文字。
你把线降到 0.45 想兜住它,这下所有不确定的答案都成了违规。两条线都没解决原来的错误:接近 0.5 既不能证明文字合格,也不能证明它违规,更不能告诉你输入有没有发对。
解决方案
灰区模式说:在中间专门留出一段,落进去的答案不算答案。它既不是弱一点的「是」,也不是软一点的「否」,它是一次缺席,你代码里任何一个分支都不许吃到它。
拿有代表性的输入重复跑,按实测来定这一段,0.4 到 0.6 可以作为起点。然后按题计数:落进来的比例升高,就检查措辞是否含糊、信息是否缺失、输入格式是否有误、模型版本是否变了。
最后,调用前先校验工具接受什么。文风检查器可以在本地拒绝编码文件、超出自身预算的长文本;要判断截图,就用 assets 和实验图片请求头构造正确的图像请求,别把 base64 编码冒充正文。
问 · 答 · 拍
- 问把一段正文(发给 Jev 看的那份材料,术语叫 state)和一条文风规则放进去,问它这一段违不违反这条规则。
- 答0.52。
- 拍落在中间那一段里,既不标记也不放过。这一段被记成「没判出来」,原样留着;要是一批里超过三成落在这儿,这次跑出来的不是报告,是一条报警。
名字从哪来
想想一张黑白照片。纯黑是「是」,纯白是「否」,中间那片灰哪边都不是。你当然可以硬把灰四舍五入到一边去,可照片上本来就没有那个信息——你只是编了一个答案,然后自己信了。
什么时候用
你问的是「有没有」这类是非题,而且输入有可能是模型读不了的东西,或者这套东西要长期跑、模型会在你脚底下换版本。
什么时候别用
你问的是「几档」这类等级题——那里中间那一档是真的中等,不是缺席。单选题也要换一种规则:查看选项分布与 confidence,选项数量不同,0.5 的含义也不同。
看谁的代码
- snifftest
src/jev.ts:82-83落在 0.4 到 0.6 之间的一律标成「没判出来」:既不能变成一条标记,也不能算通过。
- snifftest
src/jev.ts:311-334这个文本检查器在本地拒绝图片 data URI、编码文件与超长文本,先守住自己的输入约定,再调用模型。
- huncho
src/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 给个百分比,数字越高说明越像。你要抄这道题,记住一点:别问「这个项目好不好」,要问「有没有讲到这一件具体的事」。
{
"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."
}
}
}