jevbooks

← 全部设计模式

体检

实测校准 · Check-up

题目也要量血压

先检查每道题的输出分布,再用人工标签与独立验证样本衡量错误,最后决定如何改题或调阈值。

01合成分布示意

问题

以下是教学情境,不是 Jev 实测结果:你把十四条团队规则用于每次代码改动。某道题标了十次,人工复核后只有两次真违规。这批带标签的复核才确认了问题,光看概率做不到。

你做了一张表,记录触发比例、中位数、最高概率。它能提示异常分布,却不能识别误报:如果这批样本本来全部违规,全部触发也可能完全正确。最高值偏低也可能只是这一批没有违规。

二十个近期改动可以帮助排查题目和评估脚本,却不是可靠性保证。反复改措辞直到同一批样本看起来不错,也不能说明题目能处理新的改动。

解决方案

体检模式先看分布。记录输入、题目措辞、响应中的模型版本和动作阈值,再看触发比例、中位数与最高值。没有人工标签时,只能报告「分布诊断」并检查意外案例;不能把触发得多直接叫作「噪音题」,也不能把安静的题叫作「好题」。

有了每个输入是否真违规的标签,再数正确标记、误报和漏报。Precision(精确率)是标记中真违规的比例,recall(召回率)是真违规中被抓到的比例。Brier 是 (概率 − 标签)² 的平均值,标签取 0 或 1,越低越好;常数基线用调参集的正例比例提前固定,不能看完验证标签再定。Brier 衡量概率误差,单靠它不能证明概率校准良好,也不能证明动作策略可以上线。

用一组样本改措辞、选阈值,冻结后再用另一组留出样本验证;相近或重复改动放在同一组,避免泄漏。正例、普通样本都要有,报告样本数量,并逐步扩大二十条排错试点。看完验证错误又改了题,下次就要新的验证集。下方是纯离线算术示例,概率和标签均为虚构,不是模型评测;无法计算的指标返回 null,不当成零,全违规样本无法衡量误报率。

问 · 答 · 拍

  1. 问离线教学示例:先固定 0.7 阈值与 0.5 常数基线,再对另一组虚构验证样本计算:概率 [0.9, 0.8, 0.6, 0.1],标签 [1, 0, 1, 0]。
  2. 答标了两次,对了一次;真实违规两次,抓到一次:precision 为 0.5、recall 为 0.5,Brier 为 0.205,基线为 0.25。
  3. 拍这四个虚构样本上的概率误差优于基线,但一半标记仍是误报,所以这里只演示计算,不能据此认定规则可以上线。

名字从哪来

体检:异常读数告诉你该检查什么,读数本身不是诊断。触发比例是读数,带标签的案例才告诉你哪些决定对了、哪些错了。

什么时候用

你需要判断一道题或一个阈值是否适合自己的任务。先用小批样本排错,再标注有代表性的案例,留出足够的独立验证样本,衡量真正关心的错误。

什么时候别用

只有未标注的概率时,用它检查分布,不能认证正确性。少量标签能揭露错误,却无法证明罕见错误的发生率;整个工具的比分也不能定位是哪道题出了问题。

做这件事的项目

  • abide — 用 Jev 强制编码代理遵守项目规则。
  • huncho — 在 System One 模型上将决策作为代码:类型化问题、滞回、日志、校准。
  • snifftest — 散文检查器,用可计数规则和一个判断模型找出 AI 写作痕迹。

用这种模式的全部项目 →

看谁的代码
  • abidepackages/cli/src/lib/calibration.ts:20-34

    源码核验,非本站实跑:实现会在无标签时把触发比例达到 0.6 的题叫作 noisy。这是该项目的检查启发式,不能证明误报多。

  • hunchosrc/calibrate.ts:142-159

    源码核验:计算 Brier,并用这批已标注记录自身的正例比例算常数基线。本站离线示例另外区分调参与验证,在调参集上固定基线后再评估验证集。

  • snifftestdocs/eval-notes.md:181-214

    作者报告的实验,2026-09-17、Jev 1.13:调参 seed 上改措辞后从 58/80 变成 63/80,留出 seed 为 60/80。作者说明每条规则八个缺陷样本很少;本站未复跑。

想看代码
// Save /examples/measured-calibration.mjs beside this demo.mjs; run: node demo.mjs
// Synthetic inputs only: no API calls or measured model results.
import { evaluate } from "./measured-calibration.mjs";
const tuningLabels = [1, 0, 1, 0];
const baselineRate = tuningLabels.reduce((a, b) => a + b, 0) / tuningLabels.length;
const fixed = { threshold: 0.7, baselineRate }; // illustrative; freeze before validation
// Three separate validation examples; no tuning on these labels:
console.log(evaluate([0.9, 0.8], fixed)); // distribution-only
console.log(evaluate([0.9, 0.8], { ...fixed, labels: [1, 1] })); // precision = recall = 1
console.log(evaluate([0.9, 0.8, 0.6, 0.1], { ...fixed, labels: [1, 0, 1, 0] }));

下载下方使用的离线评估函数(无依赖、无需 API 调用)

jevbooks 怎么认出它

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

questions.json · 每份 README 都发这道题
{
  "measured-calibration": {
    "type": "noul",
    "instructions": {
      "what": "Does the text describe measuring the questions themselves: fire rate, Brier score, precision on historical samples, or an A/B against another model?",
      "not_for": "Anecdotal claims of accuracy."
    },
    "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 做一个 →