个人网站 nishtahir.com 刊出技术博文《Build your own decision model》,用开源模型 Qwen/Qwen3-1.7B 演示如何把普通语言模型收成“决策模型”:答案限定在固定选项里,一次前向计算就给出选择,并讨论这些概率能不能当作置信度。
作者把文中所说的“System one”决策模型定义为:对每个允许的答案推断,并返回经过校准的概率。
对照日常用法,作者写道,若要用结构化输出(Structured Output)让语言模型打出合法 JSON,输入预填充可以一次完成,但生成仍要对每个 token 做一遍前向。文中举例,得到最终输出需要 11 次传递;该计数没有计入推测解码和其他推理优化。
作者提到 TypeSafe AI 的 Jev 等决策模型则另作假设:答案来自一组固定选项,因此可以很快完成,只需一次前向。演示里把可输出集合收成 A、B、C、D、E,屏蔽词表中的其他 token,模型只能发出这些 token,再取概率最高者作为答案。示意图中,同一次计算给出 B 83.3%、A 5.6%、C 5.6%、D 3.3%、E 2.2%,而“The”“Blue”“Maybe”被标为负无穷。
作者同时写明限制:输出被关在固定选项里,并不保证答案正确。把这些 token 概率当成置信度也很常见,但不经额外训练,它们更可能反映模型对“下一个 token”的把握,而不是答案正确的真实概率。
作者在文中用 Qwen/Qwen3-1.7B 模拟上述行为。脚本取出选项 A–E 各自作为助手首个 token 时对应的 token id,只在这些 logit 上做 softmax,取概率最高者。提示由题干、五个选项和“Answer:”组成,并套用聊天模板,且关闭 thinking。
用一道简单题试跑时,输入问天空是什么颜色,选项为 Red、Blue、Green、Purple 和“I don't know”。输出预测为 B,Blue 的概率为 0.9988,“I don't know”为 0.0012,其余选项约为 0。作者称,模型读懂了输入,并作出与正确答案合理对应的预测。
作者把同一做法放到公开数据集上,使用 CommonsenseQA 的一份随机留出样本,共 1221 题。未微调时,准确率为 725/1221 = 0.5938,macro F1 为 0.5844。分选项来看,A 的 F1 为 0.6382(support 239),B 为 0.6416(255),C 为 0.5922(241),D 为 0.5065(251),E 为 0.5435(235),F1 落在 0.5065 到 0.6416 之间。作者对这一结果的说法是:对 1.7B 模型来说还不差。
在该数据集上做一次快速微调后,准确率为 762/1221 = 0.6241,macro F1 为 0.6234。微调后各选项 F1 为:A 0.6542、B 0.6431、C 0.6102、D 0.5991、E 0.6101,support 仍分别为 239、255、241、251、235。
作者用一道他认为没有明确答案的题说明问题:“Where would you most likely find a bat?”选项为 Cave、Baseball game、Attic、Zoo、Sporting goods store。模型预测 A,给 Cave 的概率为 0.9978,Baseball game 0.0004,Attic 0.0017,Zoo 约 0,Sporting goods store 0.0001。作者称,若把输出概率当作一种“置信度”,模型对这个答案极度过度自信。
把先前那次评测按置信度分箱后,作者认为置信度与准确率对不上,也就是模型没有校准。其中,0.9–1.0 一箱有 809 个样本,平均置信度 0.9855,实际准确率 0.7009;0.8–0.9 一箱有 121 个样本,平均置信度 0.8555,准确率 0.4711。作者写道,模型在 0.9–1.0 一箱极度过度自信,却只对了约 70%;在 0.8–0.9 的置信度上,准确率大约只有 40%,总体上对预测过度自信。其余分箱为:0.2–0.3 共 3 个样本,平均置信度 0.2834,准确率 0;0.3–0.4 共 26 个,0.3761 对 0.2692;0.4–0.5 共 41 个,0.4538 对 0.2683;0.5–0.6 共 70 个,0.5490 对 0.3286;0.6–0.7 共 74 个,0.6476 对 0.3649;0.7–0.8 共 77 个,0.7495 对 0.4286。0.2 以下两箱样本数为 0。
作者采用温度缩放来校准:改变温度,把输出概率分布拉平,使之更接近准确率。文中一张示意在温度 2.2 下对比:未校准(T = 1.0)时期望校准误差为 20.1%,该置信度下实际正确率为 82%;校准到 T = 2.2 后,期望校准误差为 2.9%,该置信度下实际正确率为 61%。作者用曲线拟合把温度对准模型准确率,得到温度值 3.797280788421631。
按这一温度重新分箱后,0.9–1.0 一箱剩 109 个样本,平均置信度 0.9333,准确率 0.9541。作者称这带来好得多的校准。同表其余非空箱为:0.2–0.3 共 82 个,平均置信度 0.2712,准确率 0.2317;0.3–0.4 共 217 个,0.3507 对 0.3917;0.4–0.5 共 199 个,0.4472 对 0.5126;0.5–0.6 共 166 个,0.5475 对 0.5482;0.6–0.7 共 139 个,0.6562 对 0.5827;0.7–0.8 共 140 个,0.7492 对 0.7714;0.8–0.9 共 169 个,0.8507 对 0.7988。
作者在 GitHub 仓库 nishtahir/build-your-own-jev 放了脚本,涵盖建数据集、评估、微调和校准,并鼓励拉下来换更大的模型试。