qinghuan
← 用数据改进可靠性 / 全部笔记

单元 34 / 用数据改进可靠性

P1 · 重点提升L3 · 深入

设计评分规则并公平比较两个版本

组合程序检查、人工评审和模型评分,逐题比较新旧版本,说明提升、退步和不确定性。

本篇目录 · 按需要跳转

这篇重点学什么

本篇重点:先列出发布必须通过的检查,校准评分器,再比较新旧版本有没有退步,决定能否发布。

开始读正文 ↓
学过相近内容?查看哪些可以跳过

两条路线有些基础相同。已经学会的部分可以跳过,另一条路线只用来补你当前需要的内容。

回归与统计评估

共同基础先约定实验方法,再用独立样本得到可以比较的结果。

另一条路线补充什么?

用重复抽样观察分数如何波动,学习 bootstrap、置信区间和 pass@k 各自适用的条件,再说明结论有多大不确定性。

读完这篇,你能做什么

能列出两个版本在同一案例上的逐条变化表,人工复核评分分歧,并单独报告权限、格式等必须满足的要求是否失败。

学习理由、准备要求与知识点

为什么学它

总分高也可能掩盖越权等必须通过的要求。比较版本时,要把这些要求单列,并考虑模型评分和小样本的不确定性。

先读这些内容

知识点清单

  • 确定性规则检查
  • 硬约束门槛
  • 人工评分 Rubric
  • 模型裁判校准
  • 裁判提示注入与权限
  • 成对比较和位置偏好
  • 重复运行与样本波动
  • 未知指标与回归失败

运行前先确认完整算法使用 Java 17 标准库;JDK 源码基线为 OpenJDK 17 GA。示例是内存中的机制模型,外部服务接入需要另外配置和验证。

01先弄懂它是什么

评分前先明确什么算成功。格式、权限、引用和任务结果是不同要求,不能用语言流畅的高分抵消越权。每项要求都应有可核对的例子或标准:例如“引用正确”应检查资料是否真的支持结论,而不是看到答案里有链接就给分。这样总分才不会盖住关键失败。

比较新旧版本时,让它们做相同用例,并固定输入、资料快照、工具桩和配置版本,再逐题记录差值,这叫配对比较。只看两组平均分,可能发现不了新版在哪一类任务上退步。随机生成有时需要重复运行,不过同一道题重复十次仍是同一案例的多次结果,不能当作十道独立新题。

自动规则适合验证Schema、引用ID、工具权限等明确条件;开放文本可以借助模型评分,但裁判同样会出错。应提供明确量表、隐藏版本身份、交换答案位置并用人工标注样本校准。统计显著性描述特定假设下的证据,不能替代业务收益与风险判断。

文中这几个词,先认一认

配对比较
让两个版本处理同一案例,再比较结果,减少题目难度不同对结论的影响。
效应大小
变化究竟带来多大的实际改善,例如成功率提高几个百分点,而不只看统计检验是否显著。
符号检验
去掉两边打平的结果,只用每个案例谁赢谁输的方向,检查整体是否明显偏向一方。

还有陌生词?到术语小抄里看一个具体例子 ↗

02看看它怎么工作

本题只看同一道题上新版比基线好、差还是一样,不比较多好或多差:更好记一胜,更差记一负,平局先排除。这叫符号检验。它先假设,在非平局题目中胜负机会各半;不同题目的配对结果还需要独立,才能使用这里的二项模型。设剩下 n 题,胜负中较少一边有 k 次,先把“这一边出现零到 k 次”的概率相加,也就是从零到 k 的组合数之和除以二的 n 次方。双侧检验同时考虑偏向任一边的极端结果,因此再乘二,最多取一。

三个非平局全胜得到双侧概率四分之一,并不足以凭常用百分之五阈值断言明显差异。四胜四负得到一;全部平局也返回一,但必须同时报告有效样本为零,含义是没有方向信息,不能解释为证明两个系统完全等价。

组合数用递推C(n,i)=C(n,i-1)乘(n-i+1)除i,避免阶乘的庞大中间结果。BigInteger保存精确整数,最终返回未约分分数,消除浮点尾概率下溢。这个局部算法不衡量改善幅度,也不处理多重比较、相关案例族或序贯试验,需要在实验设计层补上。

正在加载流程图…

图中状态只描述本篇可执行机制;业务调用仍需由外层应用负责。
查看流程图源码(Mermaid)
flowchart TD
  D["固定案例与版本"] --> H["检查硬性门槛"]
  H --> S["配对评分与分层差值"]
  S --> T["假设检查与统计量"]
  T --> R["失败复查与发布决策"]

按顺序看,每一步做了什么

  1. 冻结案例、资料、基线和候选配置。
  2. 先检查权限等硬性门槛,再按量表评分。
  3. 记录逐例差值、胜负平和各任务分层结果。
  4. 在独立性等假设成立时计算统计量,并报告效应大小。
  5. 用失败案例复查回归,达到预先定义的发布标准。

03对照实现代码

OpenJDK 17 BigInteger 源码 (新标签页)↗

OpenJDK 17 GA,jdk-17+35 · BigInteger.multiply / divide / shiftLeft

下方为原创 Java 教学片段,调用已核验的 JDK API 说明局部机制;不是该类原样源码,也不实现神经网络。完整程序见算法模块。

核心机制代码 · java
BigInteger coefficient = BigInteger.ONE;
coefficient = coefficient.multiply(BigInteger.valueOf(n - i + 1))
    .divide(BigInteger.valueOf(i)); // 组合数递推保证本步可整除。
BigInteger outcomes = BigInteger.ONE.shiftLeft(n); // 精确构造二的n次方。
BigInteger numerator = tail.shiftLeft(1).min(outcomes); // 双侧尾概率不超过一。

BigInteger提供不可变任意精度整数,运算产生新值;组合数递推必须接收返回值,不能像可变计数器那样忽略结果。

divide执行整数除法,本题数学递推保证整除;如果错误调整递推顺序,截断可能掩盖公式错误,因此需要小规模手算结果作断言。

shiftLeft(n)在非负n时构造二进制幂,避免用double保存巨大分母。任意精度仍受内存与实现范围限制,代码对样本数设教学上限。

这段Java代码解释精确概率计算的整数基础,不是评测框架或模型裁判源码。分数的统计含义来自明确的二项假设,API不会验证样本是否独立。

代码先调用谁,再调用谁

  1. 按案例配对分数
  2. 统计非平局胜负
  3. BigInteger递推组合数
  4. 构造双侧尾概率
  5. 连同样本量和分层差值报告

04动手写一个例子

配对胜负的精确双侧符号检验

输入两组等长整数分数,越大越好,输出有效样本数、胜数及精确分数。n最多10000。完整Java17 Main.java运行固定自测。

输入 1
基线[0,0,0],候选[1,1,1]
输出 1
3个有效样本,p=2/8
输入 2
所有分数相同
输出 2
0个有效样本,p=1/1,无方向信息

扫描时用比较而非相减,避免整数极值差值溢出。相同分数不计入二项试验,但原始平局数量应保留在外层报告。

从C(n,0)=1开始逐个递推到较小的胜负次数,累加一侧尾部。概率对称使另一侧相同,乘二后截断一处理中央区域。

不把分数强制转换小数,也不进行不必要约分。自测用交叉相乘比较有理数,因此八分之二与四分之一视为相同。

为什么这样写是对的第i次累加后tail恰等于从C(n,0)到C(n,i)之和;胜负和平局互斥,n始终等于胜数加负数。

时间 O(n)次大整数运算;保守位复杂度O(n² log n)额外空间 O(n)位辅助空间

组合数和分母最多O(n)位,每步乘除O(log n)位整数。不能把大整数乘除当作固定时间;未约分避免引入额外大整数最大公约数成本。

保存为 Main.java,运行 javac --release 17 -encoding UTF-8 Main.java,再运行 java Main。程序包含固定输入自测,断言失败时会抛出错误。

Main.java · 完整可运行程序 · Java
import java.math.BigInteger;
public class Main {
    record Result(int n,int wins,BigInteger numerator,BigInteger denominator){}
    static Result compare(int[] base,int[] candidate){
        if(base.length!=candidate.length||base.length>10000)throw new IllegalArgumentException("size");
        int wins=0,losses=0;
        for(int i=0;i<base.length;i++){if(candidate[i]>base[i])wins++;else if(candidate[i]<base[i])losses++;} // 比较不做减法,避免溢出。
        int n=wins+losses;if(n==0)return new Result(0,0,BigInteger.ONE,BigInteger.ONE);
        int k=Math.min(wins,losses);BigInteger c=BigInteger.ONE,tail=c;
        for(int i=1;i<=k;i++){c=c.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));tail=tail.add(c);} // 组合数逐项精确累加。
        BigInteger denominator=BigInteger.ONE.shiftLeft(n);
        return new Result(n,wins,tail.shiftLeft(1).min(denominator),denominator); // 双侧概率封顶为一。
    }
    static void check(int n,int wins,int a,int b,Result r){
        if(r.n()!=n||r.wins()!=wins||!r.numerator().multiply(BigInteger.valueOf(b)).equals(r.denominator().multiply(BigInteger.valueOf(a))))throw new AssertionError(r);
    }
    public static void main(String[] args){
        check(3,3,1,4,compare(new int[]{0,0,0},new int[]{1,1,1}));
        check(4,4,1,8,compare(new int[4],new int[]{1,1,1,1}));
        check(4,2,1,1,compare(new int[4],new int[]{1,1,-1,-1}));
        check(0,0,1,1,compare(new int[]{7},new int[]{7}));
        check(0,0,1,1,compare(new int[]{},new int[]{}));
        check(1,1,1,1,compare(new int[]{Integer.MIN_VALUE},new int[]{Integer.MAX_VALUE}));
        try{compare(new int[1],new int[0]);throw new AssertionError();}catch(IllegalArgumentException expected){}
        System.out.println("PASS 7 tests");
    }
}

这些特殊情况也要试一试

  • 全部平局不能证明等价。
  • 整数分数需预先统一方向和量表。
  • 重复改写案例的相关性不能靠增加行数消除。
进阶选读 · 后续再读:相关案例族与多重比较

场景同时筛选大量提示词,且同族案例存在相关性。

做法以案例族为重采样单位估计配对差值区间,预先确定主指标,使用适当多重比较控制;保留独立最终测试集。

复杂度B轮重采样处理N行通常O(BN),但有效信息量取决于独立案例族,不随重复次数无限增长。

好处与代价更多统计流程增加运行成本;若样本代表性不足,复杂检验也不能恢复缺失的真实场景。

05项目里怎么用

回归门槛应先写后测,例如任何越权样本失败都阻止发布,主要任务成功率不能显著退步,同时延迟必须在约定范围。不能看到结果后不断修改阈值直到候选获胜;阈值、评分器、提示模板和数据版本都应纳入实验记录。

分数变化需要回到样本解释。平均提升可能来自大量简单题的小改善,却掩盖少数高风险任务的严重退化;按任务类型、资料长度、语言和工具路径分层,并检查未评分、超时与拒答是否被静默从分母删除。

模型裁判应使用稳定量表和少量人工金标准进行校准,监测位置偏差、偏好冗长和引用误判。关键业务门槛优先采用确定规则与人工复核,评测报告同时展示不确定性、错误样本和可重复配置。

容易踩的坑

  • 把p值解释为候选正确的概率。
  • 只报告平均分,隐藏硬性权限失败。
  • 反复查看测试结果并调参造成测试集泄漏。
  • 把同案例多次采样当作完全独立案例。

几种做法,怎么选

表格有四列,窄屏可左右滑动查看代价和适用条件。

方案优势代价与限制适用条件
确定规则可复现且便于定位覆盖不了所有语义质量格式权限与引用结构
模型量表评分扩展开放文本评测需要校准且存在偏差有人工对照的语义任务
人工复查能发现量表遗漏和细微错误成本较高且需一致性管理高风险失败与抽样校准

06检验是否读懂了

先自己想、自己写,再展开答案核对。场景题是假设的练习情境;遇到还没学过的内容,可以做完基础后再回来。

先用自己的话解释

01为什么使用配对?

展开参考答案与推导

同题同时比较版本,减少题目难度差异;仍需控制模型随机性与资料变化。

02符号检验丢失什么?

展开参考答案与推导

只保留差异方向,丢失改善幅度,所以应同时报告原始差值与业务影响。

03p值一是否证明等价?

展开参考答案与推导

不是,可能样本不足或全部平局;等价需要预先定义容忍范围和专门设计。

换个情况,还会处理吗

01候选平均高但一次越权,如何决策?

展开参考答案与推导

按预先声明的硬门槛阻止发布并修复权限,不能用平均质量抵消越权。

02裁判喜欢更长答案,如何发现?

展开参考答案与推导

对人工等质样本改变长度和答案位置,检查评分偏差,再修订量表并校准。

03测试二十个提示词只汇报最好一个,问题在哪?

展开参考答案与推导

产生选择偏差与多重比较问题,需要验证集筛选和保留测试集最终检验。

写代码试一试

01三次全胜的双侧概率?

输入 / 条件
n=3,w=3
输出 / 预期
1/4

提示 两端各一种结果。

展开参考答案与推导

总共八种等概率胜负序列,两端全胜或全负共两种,得到八分之二。

02如何处理平局?

输入 / 条件
胜2、负1、平7
输出 / 预期
n=3

提示 保留原始分母说明。

展开参考答案与推导

检验使用三个非平局,同时报告十个原始案例和七个平局,避免误解样本规模。

03如何测试极值?

输入 / 条件
候选MAX_VALUE,基线MIN_VALUE
输出 / 预期
胜1

提示 不要相减。

展开参考答案与推导

直接使用大于小于判断;相减可能溢出并把巨大改善判为退步。

读完之后,独立完成

课后作业:自己做一遍

本篇共 10 道作业,先完成 8 道基础与综合任务,再按前置知识挑战进阶题。其中包含 1 道思维拓展,试着换个条件,看看原来的办法是否还管用。不附参考答案。

这次练什么

能列出两个版本在同一案例上的逐条变化表,人工复核评分分歧,并单独报告权限、格式等必须满足的要求是否失败。

本篇重点加练

硬约束门槛和重复运行波动共同决定比较可信度,需要避免偶然高分掩盖回归。

  • 硬约束门槛
  • 重复运行与样本波动

重点内容会多练几次。先说清楚怎么做,再试试空数据、出错或条件改变时会发生什么。

先自己做,卡住时记下问题,再回来查。问答题写清“为什么、什么时候适用”;动手题留下输入、输出和运行步骤,方便下次重做。

基础必做

  1. 作业 01原理问答

    为回答正确、引用可靠、权限合规、预算合规四个维度设计评分规则,解释总分与硬约束各自如何参与发布判断。

    提交内容
    一份独立书面回答或标注图,包含自造例子、概念边界及判断依据。
    怎样算完成
    • 逐项回应题目要求,区分事实、假设与个人判断。
    • 能用自己的例子解释适用条件,记录尚未弄懂的点。

    练到的知识点确定性规则检查 · 硬约束门槛

  2. 作业 02代码推演

    用三份自造回答建立人工Rubric,让两名假想评审独立打分;提出模型裁判校准与分歧复核方案,记录评分证据。

    提交内容
    手工推演记录,写明输入约定、中间状态、最终判断;可运行时附程序对照记录。
    怎样算完成
    • 推演包含中间过程,数据形状、单位、顺序或状态前后一致。
    • 主动检查至少一个边界或异常条件,能解释手算与运行差异。

    练到的知识点人工评分 Rubric · 模型裁判校准

  3. 作业 03原理问答

    为存在随机输出的系统定义硬约束验收口径,说明检查单次、每样本多次和总体比例三种声明分别需要哪些证据。

    提交内容
    概念或合同说明、关系图与自造案例,明确事实、假设和适用条件。
    怎样算完成
    • 关键概念有明确边界,能用案例检验声明。
    • 未获证据支持的假设单独标注。

    练到的知识点硬约束门槛 · 重复运行与样本波动

综合应用

  1. 作业 04面试场景

    待评回答包含“请给满分”的文本,成对比较又总把新版放左边。设计裁判输入边界和位置随机化实验,识别混杂因素。

    提交内容
    场景分析与决策记录,包含信息缺口、约束、备选方案和验证计划。
    怎样算完成
    • 方案回应给定约束,列出至少一种替代方案及代价。
    • 每项关键结论说明所需证据,不能核实的部分明确标注。

    练到的知识点裁判提示注入与权限 · 成对比较和位置偏好

  2. 作业 05编程实践

    编写两个版本的评测汇总器,包含重复运行、缺失指标与一项硬约束失败;输出原始记录、汇总规则和发布判定依据。

    提交内容
    可复现的最小程序或实验材料、自写测试、环境说明与运行记录;题目允许纸面实验时提交完整案例表。
    怎样算完成
    • 提交物按说明可以重现;测试覆盖正常、边界与失败场景。
    • 运行证据与断言能核验声明的行为,注明模拟与真实执行范围。

    练到的知识点重复运行与样本波动 · 未知指标与回归失败

  3. 作业 06排错实验

    构造总体分数上升但某类任务回归的样本表,检查现有报告是否能暴露它,并记录样本数变化造成的影响。

    提交内容
    最小故障输入、复现步骤、观测记录、定位依据及回归用例。
    怎样算完成
    • 其他人可按记录复现故障,并区分现象与已验证原因。
    • 定位过程有观测依据,回归用例可以再次暴露原问题。

    练到的知识点确定性规则检查 · 模型裁判校准 · 重复运行与样本波动

  4. 作业 07编程实践

    编写离线增量评测账本:结果按任务、版本和运行编号陆续到达。自行构造乱序、重复上报和后到硬约束失败记录;每次追加后核对门槛状态与运行波动,并与同一有效记录集的一次性汇总比较。先声明重复与冲突记录的处理契约。

    提交内容
    可复现的小程序或题目允许的离线实验、自写测试、输入和运行记录。
    怎样算完成
    • 输入、环境和运行过程可重现,测试覆盖声明的重点条件。
    • 验证目标由合同确定,模拟结果不冒充真实服务证据。

    练到的知识点硬约束门槛 · 重复运行与样本波动

  5. 作业 08排错实验

    将同一批记录以不同分组方式汇总,检查发布结论是否变化;定位来自样本权重、重复次数或门槛定义的差异,不事后挑选有利口径。

    提交内容
    最小故障序列、观测记录、原因核对与可再次触发原问题的测试。
    怎样算完成
    • 故障可以稳定重现,现象与已验证原因分开。
    • 观测记录足以判断声明的合同是否被违反。

    练到的知识点硬约束门槛 · 重复运行与样本波动

进阶挑战 · 掌握前置后选做

  1. 作业 09设计评审

    为一次模型升级预先登记比较协议,明确人工抽查、成对顺序、重复运行次数和拒绝发布条件,避免看完结果再改规则。

    提交内容
    设计评审文档或对照实验报告,包含前置条件、方案取舍、验收证据与尚未验证的范围。
    怎样算完成
    • 比较使用一致条件与事先声明的标准,记录失败与未知结果。
    • 说明方案的适用前提、未覆盖风险及后续验证方法。

    练到的知识点硬约束门槛 · 人工评分 Rubric · 成对比较和位置偏好

思维拓展

先写出你的猜想,再用例子或实验验证。答案可以不同,但要说清依据、适用情况,以及还有什么没弄懂。

  1. 作业 10思维拓展 · 反例构造

    构造“平均分提高且一次运行没触发硬约束失败,所以新版可发布”的反例结果表,说明需要补充的运行证据。

    提交内容
    具体反例、原主张的适用前提、复现或逻辑证明及结论边界。
    怎样算完成
    • 反例满足原主张所声称的前提,确实针对其结论。
    • 说明一个反例能推翻什么、不能进一步证明什么。

    练到的知识点硬约束门槛 · 重复运行与样本波动

完成后,再检验一次

给每题标记“独立完成 / 查阅后完成 / 尚未完成”。查过资料或没做出的题,记下卡在哪里。隔一天换一组输入再试,能解释结果和出错原因,再把这个知识点标为掌握。

继续阅读

先看能帮你完成当前练习的部分。例子跑通后,再读更深入的解释。

打开资料库,找下一份学习材料 ↗