这篇重点学什么
本篇重点:先列出发布必须通过的检查,校准评分器,再比较新旧版本有没有退步,决定能否发布。
开始读正文 ↓学过相近内容?查看哪些可以跳过
两条路线有些基础相同。已经学会的部分可以跳过,另一条路线只用来补你当前需要的内容。
回归与统计评估
共同基础先约定实验方法,再用独立样本得到可以比较的结果。
另一条路线补充什么?
用重复抽样观察分数如何波动,学习 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["失败复查与发布决策"]按顺序看,每一步做了什么
- 冻结案例、资料、基线和候选配置。
- 先检查权限等硬性门槛,再按量表评分。
- 记录逐例差值、胜负平和各任务分层结果。
- 在独立性等假设成立时计算统计量,并报告效应大小。
- 用失败案例复查回归,达到预先定义的发布标准。
03对照实现代码
OpenJDK 17 GA,jdk-17+35 · BigInteger.multiply / divide / shiftLeft
下方为原创 Java 教学片段,调用已核验的 JDK API 说明局部机制;不是该类原样源码,也不实现神经网络。完整程序见算法模块。
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不会验证样本是否独立。
代码先调用谁,再调用谁
- 按案例配对分数
- 统计非平局胜负
BigInteger递推组合数- 构造双侧尾概率
- 连同样本量和分层差值报告
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(log n)位整数。不能把大整数乘除当作固定时间;未约分避免引入额外大整数最大公约数成本。
保存为 Main.java,运行 javac --release 17 -encoding UTF-8 Main.java,再运行 java Main。程序包含固定输入自测,断言失败时会抛出错误。
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 道思维拓展,试着换个条件,看看原来的办法是否还管用。不附参考答案。
能列出两个版本在同一案例上的逐条变化表,人工复核评分分歧,并单独报告权限、格式等必须满足的要求是否失败。
本篇重点加练
硬约束门槛和重复运行波动共同决定比较可信度,需要避免偶然高分掩盖回归。
- 硬约束门槛
- 重复运行与样本波动
重点内容会多练几次。先说清楚怎么做,再试试空数据、出错或条件改变时会发生什么。
先自己做,卡住时记下问题,再回来查。问答题写清“为什么、什么时候适用”;动手题留下输入、输出和运行步骤,方便下次重做。
基础必做
- 作业 01原理问答
为回答正确、引用可靠、权限合规、预算合规四个维度设计评分规则,解释总分与硬约束各自如何参与发布判断。
- 提交内容
- 一份独立书面回答或标注图,包含自造例子、概念边界及判断依据。
- 怎样算完成
- 逐项回应题目要求,区分事实、假设与个人判断。
- 能用自己的例子解释适用条件,记录尚未弄懂的点。
练到的知识点确定性规则检查 · 硬约束门槛
- 作业 02代码推演
用三份自造回答建立人工Rubric,让两名假想评审独立打分;提出模型裁判校准与分歧复核方案,记录评分证据。
- 提交内容
- 手工推演记录,写明输入约定、中间状态、最终判断;可运行时附程序对照记录。
- 怎样算完成
- 推演包含中间过程,数据形状、单位、顺序或状态前后一致。
- 主动检查至少一个边界或异常条件,能解释手算与运行差异。
练到的知识点人工评分 Rubric · 模型裁判校准
- 作业 03原理问答
为存在随机输出的系统定义硬约束验收口径,说明检查单次、每样本多次和总体比例三种声明分别需要哪些证据。
- 提交内容
- 概念或合同说明、关系图与自造案例,明确事实、假设和适用条件。
- 怎样算完成
- 关键概念有明确边界,能用案例检验声明。
- 未获证据支持的假设单独标注。
练到的知识点硬约束门槛 · 重复运行与样本波动
综合应用
- 作业 04面试场景
待评回答包含“请给满分”的文本,成对比较又总把新版放左边。设计裁判输入边界和位置随机化实验,识别混杂因素。
- 提交内容
- 场景分析与决策记录,包含信息缺口、约束、备选方案和验证计划。
- 怎样算完成
- 方案回应给定约束,列出至少一种替代方案及代价。
- 每项关键结论说明所需证据,不能核实的部分明确标注。
练到的知识点裁判提示注入与权限 · 成对比较和位置偏好
- 作业 05编程实践
编写两个版本的评测汇总器,包含重复运行、缺失指标与一项硬约束失败;输出原始记录、汇总规则和发布判定依据。
- 提交内容
- 可复现的最小程序或实验材料、自写测试、环境说明与运行记录;题目允许纸面实验时提交完整案例表。
- 怎样算完成
- 提交物按说明可以重现;测试覆盖正常、边界与失败场景。
- 运行证据与断言能核验声明的行为,注明模拟与真实执行范围。
练到的知识点重复运行与样本波动 · 未知指标与回归失败
- 作业 06排错实验
构造总体分数上升但某类任务回归的样本表,检查现有报告是否能暴露它,并记录样本数变化造成的影响。
- 提交内容
- 最小故障输入、复现步骤、观测记录、定位依据及回归用例。
- 怎样算完成
- 其他人可按记录复现故障,并区分现象与已验证原因。
- 定位过程有观测依据,回归用例可以再次暴露原问题。
练到的知识点确定性规则检查 · 模型裁判校准 · 重复运行与样本波动
- 作业 07编程实践
编写离线增量评测账本:结果按任务、版本和运行编号陆续到达。自行构造乱序、重复上报和后到硬约束失败记录;每次追加后核对门槛状态与运行波动,并与同一有效记录集的一次性汇总比较。先声明重复与冲突记录的处理契约。
- 提交内容
- 可复现的小程序或题目允许的离线实验、自写测试、输入和运行记录。
- 怎样算完成
- 输入、环境和运行过程可重现,测试覆盖声明的重点条件。
- 验证目标由合同确定,模拟结果不冒充真实服务证据。
练到的知识点硬约束门槛 · 重复运行与样本波动
- 作业 08排错实验
将同一批记录以不同分组方式汇总,检查发布结论是否变化;定位来自样本权重、重复次数或门槛定义的差异,不事后挑选有利口径。
- 提交内容
- 最小故障序列、观测记录、原因核对与可再次触发原问题的测试。
- 怎样算完成
- 故障可以稳定重现,现象与已验证原因分开。
- 观测记录足以判断声明的合同是否被违反。
练到的知识点硬约束门槛 · 重复运行与样本波动
进阶挑战 · 掌握前置后选做
- 作业 09设计评审
为一次模型升级预先登记比较协议,明确人工抽查、成对顺序、重复运行次数和拒绝发布条件,避免看完结果再改规则。
- 提交内容
- 设计评审文档或对照实验报告,包含前置条件、方案取舍、验收证据与尚未验证的范围。
- 怎样算完成
- 比较使用一致条件与事先声明的标准,记录失败与未知结果。
- 说明方案的适用前提、未覆盖风险及后续验证方法。
练到的知识点硬约束门槛 · 人工评分 Rubric · 成对比较和位置偏好
思维拓展
先写出你的猜想,再用例子或实验验证。答案可以不同,但要说清依据、适用情况,以及还有什么没弄懂。
- 作业 10思维拓展 · 反例构造
构造“平均分提高且一次运行没触发硬约束失败,所以新版可发布”的反例结果表,说明需要补充的运行证据。
- 提交内容
- 具体反例、原主张的适用前提、复现或逻辑证明及结论边界。
- 怎样算完成
- 反例满足原主张所声称的前提,确实针对其结论。
- 说明一个反例能推翻什么、不能进一步证明什么。
练到的知识点硬约束门槛 · 重复运行与样本波动
完成后,再检验一次
给每题标记“独立完成 / 查阅后完成 / 尚未完成”。查过资料或没做出的题,记下卡在哪里。隔一天换一组输入再试,能解释结果和出错原因,再把这个知识点标为掌握。
继续阅读
先看能帮你完成当前练习的部分。例子跑通后,再读更深入的解释。
- 必读参考文档英文
scikit-learn:模型评估与评分 (新标签页)↗
按任务查阅 precision、recall、排序指标和聚合方法,先明确分母及样本范围再报告分数。
- 实践实践指南英文
Spring AI:Evaluation Testing (新标签页)↗
阅读
EvaluationRequest、相关性与事实评估接口,理解模型评分的输入并配合独立人工标注。 - 深入实践指南英文
scikit-learn:数据泄漏与常见陷阱 (新标签页)↗
阅读数据泄漏、先划分数据及随机性管理;把相同原则用于提示选择和保留测试集。
- 深入参考文档英文
OpenJDK 17 BigInteger 源码 (新标签页)↗
按指定版本定位
BigInteger.multiply/ divide /shiftLeft;对照源码分析理解实际调用边界。 - 深入参考文档英文
SciPy binomtest 官方说明 (新标签页)↗
阅读二项试验、双侧假设及返回值定义;本篇在p等于二分之一的特例上实现精确整数计算。