pplx-decider 评估体系完全解析:11大基准如何测出85.7%,Calibration 门槛与复现限制的真相
pplx-decider 评估体系完全解析:11大基准如何测出85.7%,Calibration 门槛与复现限制的真相
pplx-decider-v1-27b 是 Perplexity 基于 Qwen3.8-27B 微调的决策(decision)模型,它不在单一榜单上刷分,而是用 11 个基准构成的固定考卷测出 85.71% 的总体准确率。这篇文章带你读懂它的评估体系:成绩怎么来的、calibration(校准)为何是硬门槛、以及哪些数字严格来说无法完整复现——这是很多模型卡刻意避开的部分。
先认识 pplx-decider:它不是一个普通聊天模型
pplx-decider-v1-27b 的任务是"做判断"而不是"写回复"。从 README.md 可以看到它基于 Qwen/Qwen3.8-27B(finetune 关系、text-classification 管线),核心机制在 source/src/autojev/model.py:
- 完整可训练的 Qwen 主干 + 一个 255 选项的决策读出头(readout head),把"选择题/是非题"直接输出成概率分布
- 决策选项映射为一套字符代码(A、B、C……JT,共 255 个),定义在 decision_config.json
- 读出头权重单独存放在 readout.safetensors(仅约 2.6 MB),主干权重分 11 个 safetensors 分片,合计约 49 GiB
| 组成 | 文件 | 作用 |
|---|---|---|
| 主干权重 | model-00001-of-00011.safetensors 等 11 片 | Qwen 微调后的语言模型 |
| 决策读出头 | readout.safetensors | 把隐藏状态映射为选项概率 |
| 决策配置 | decision_config.json | 选项代码、token ID、温度参数 |
这种"一个词定胜负"的设计让准确率、校准度都可以被严格量化——这正是它评估体系的基础。
11 大基准成绩单:85.71% 是怎么算出来的
README.md 给出了三方对比:Jev(Perplexity 的决策服务)、原始 Qwen3.8-27B、微调后的 pplx-decider-v1-27b。加粗为每行最高分。
| 基准 | Jev | Qwen3.8-27B | pplx-decider-v1-27b |
|---|---|---|---|
| WinoGrande | 90.70% | 73.10% | 83.30% |
| FinancialPhraseBank | 76.98% | 75.68% | 84.18% |
| RAGTruth | 77.27% | 61.53% | 88.80% |
| JudgeBench | 78.57% | 68.86% | 78.29% |
| BBH | 94.27% | 72.80% | 82.80% |
| JevBench public hard | 73.27% | 72.28% | 70.30% |
| TabFact | 89.80% | 78.60% | 90.60% |
| ContractNLI | 77.45% | 80.78% | 80.78% |
| Circa | 84.60% | 87.00% | 89.20% |
| Belebele | 95.00% | 93.20% | 94.00% |
| TruthfulQA binary | 92.00% | 82.80% | 85.40% |
| Overall | 84.51% | 74.76% | 85.71% |
85.71% 的测量方式:走 Perplexity API,不是本地推理
📌 README 中有一句关键说明:"The pplx-decider-v1-27b results were measured through the Perplexity API." 也就是说,表中 pplx-decider 一列的成绩来自 Perplexity 云端部署的模型,而非你本地下载的这套权重。本地推理结果与 API 结果之间可能存在实现差异——解读 85.71% 时必须记住这一点。
从分布看:微调版在 FinancialPhraseBank(情感分类)、RAGTruth(引用溯源)、TabFact(事实核查)、Circa(时间推理)上明显超过 Jev,但在 BBH、JevBench public hard、TruthfulQA 等硬推理任务上仍落后。整体反超 1.2 个百分点(85.71% vs 84.51%),而相对原始基座则大幅领先 10.95 个百分点(85.71% vs 74.76%)。
Calibration:为什么光看准确率不够
四个指标:Accuracy、ECE、Brier、NLL
评估代码在 source/src/autojev/evaluate.py。metrics() 函数对每条预测计算:
- Accuracy:选对选项的比例
- ECE(Expected Calibration Error):15 个置信度分箱上"平均置信度 − 实际准确率"的加权偏差——衡量"模型说 80% 有把握时,是不是真的对了 80%"
- Brier Score:概率预测的均方误差,越低说明概率分布越贴近真实
- NLL(Negative Log-Likelihood):对正确答案给出的概率取负对数
1% 容忍度的硬门槛
calibration_ok()(evaluate.py#L253-L254)规定:新模型在开发面板上的 ECE 和 Brier 都不能比参考模型(Jev)差超过 0.010(1%)。这是训练过程中检查点筛选的准入门槛,不是事后修饰。
检查点选择逻辑同样透明,见 train.py:每个通过校准门槛的候选,按 selection_key(先比准确率、再比 Brier)择优。最终发布的正是 step 200 检查点,记录在 decision_config.json 的 "step": 200 中,历史训练共 286 个更新、73000 行精挑语料,只训练了 1 个 epoch。
温度校准:一个被单独调出来的 2.2076
概率是否"说真话"很大程度取决于 softmax 温度。fit_temperature()(evaluate.py#L183-L215)的做法相当严谨:
- 在独立的 3500 行温度调优折(temperature fold)上拟合,避免"看了开发集再选温度"的泄漏
- 用黄金分割搜索在固定区间 [0.05, 20] 内最小化硬标签 NLL
- 拟合出的 2.207568021892729 随 decision_config.json 一起发布,推理时默认使用
Bootstrap 配对检验:85.71% 是不是"稳赢"
compare()(evaluate.py#L293-L357)用 10000 次按 family 配对的 bootstrap(固定种子 20260920)重抽样,保持每个基准的既定权重不变,输出准确率差的 95% 置信区间,并区分两个结论:
empirical_target_met:点估计上准确率更高、且 ECE/Brier 不超 1% 容忍度statistically_supported:准确率差的置信下界 > 0,且校准指标同样有统计支撑
这相当于给"85.71% 超过 Jev"配上了统计检验,而非只看一次抽样。
复现限制的真相:四条官方声明
最有价值的部分藏在 source/configs/training.json 的 reproduction_limits 字段——它直接承认了四件事:
| # | 限制 | 影响 |
|---|---|---|
| 1 | 精挑的 73000 行语料及其图片未随仓库打包 | 你无法拿到训练原始数据 |
| 2 | autojev-data 构建的是更早的 96000 行语料,不是最终精挑子集 |
用官方脚本重建的数据 ≠ 训练用数据 |
| 3 | 全新训练脚本使用 update 0 的最终监测面板,与历史评估面板的时间线不一致 | 中途的面板修订无法完全重放 |
| 4 | API 重新生成或数据不同,都不能保证复现记录的指标 | 85.71% 本质上不可逐位复现 |
训练入口 source/configs/train.sh 要求显式传入 7 个参数(训练集、温度折、评估集、Jev 参考、概率诊断集、运行目录、检查点目录),且拒绝覆盖任何已存在的产物——工程上非常干净,但数据本身的缺失让"一键复现"不成立。
官方给出的可验证锚点
虽然数据不可复现,但已发布的产物本身是可验证的:
- release-manifest.json:每个文件(11 个分片、readout、tokenizer、chat_template 等)的字节数与 sha256
- decision_config.json:记录了训练 run(
sft-curated-02)、git commit、以及 train.py / model.py / evaluate.py 等训练代码的 sha256 指纹 - evaluate.py 每次评估还会记录数据集 sha256 和评估脚本自身 sha256(manifest 机制,见 evaluate.py#L464-L466),断点续跑时若协议不符会直接报错拒绝
快速上手:本地跑一次决策
如果你想验证自己的环境,仓库自带的 inference.py 是最短路径:
uvx --from huggingface-hub hf download perplexity-ai/pplx-decider-v1-27b inference.py --local-dir .
uv run inference.py
需要 Python 3.12+ 和能放下约 49 GiB 权重加工作内存的 CUDA GPU。Decider.predict() 支持 choice(多选)与 noul(是/否概率)两类问题,也支持 images= 传图做多模态判断(模型卡中 multimodal 标签的来源)。
总结:如何正确看待这份成绩单
- 85.71% 是 11 个基准的固定组合分,且经 Perplexity API 测得,本地权重跑分可能不同
- 准确率只是入场券:ECE/Brier 不得超过参考模型 1%,否则检查点直接失去资格
- 温度 2.2076 独立拟合、bootstrap 固定种子 20260920、全链路 sha256 指纹——方法学上相当自律
- 训练语料未开源,96000 行重建语料 ≠ 73000 行精挑语料,指标只能"对齐方向",无法逐位复现
对想用它做分类路由、紧急度判断、事实核查的团队来说,这套评估体系传递的信息很明确:这个模型卖的不是最高单项分,而是"准确且概率可信"的决策能力——以及一份诚实交代边界的成绩单。