应用介绍
拿大模型做分类判断这件事一直别扭:把工单丢进去,让它吐一段 JSON,再祈祷格式别崩;想同时问五个问题就得发五次请求,或者塞进一个 prompt 里让它们互相干扰;最后那个
kev 把这条路整个换掉。它是 Qwen2.5-0.5B 上的一个 LoRA 适配器加一个读出头,把文档读一遍,然后一次前向把所有问题的答案同时算出来,全程不解码。文档和每个问题打包进同一条序列,块因果掩码保证每个问题都能看见文档、但看不见旁边的问题;最后一个指针头拿每个选项的隐状态去和决策 token 打分,softmax 出来的分布就是输出。
所以它给的不是「听起来很自信」的一句话,而是真正训练过的概率:交叉熵对着标注结果训,留出集上 ECE 0.065,做一次单参数温度缩放后降到 0.031。隔离也不是嘴上说说——同一批问题打包发和拆开单独发,最大概率差 3.7e-6,而打包那次还快一倍。
它跟着 TypeSafe 的 System One 接口写,
最实在的一点:这东西真的能在笔记本上训。
三种问题类型:
一次编码,多路作答:文档的隐状态只算一次,每个问题作为独立分支挂在后面。问题多了不会线性拖慢,实测打包请求比拆开发快 2 倍。
问题之间严格隔离:掩码保证一个问题看不到兄弟问题的内容。作者做了探针实验:把秘密放在兄弟问题里,模型答对的概率是 0.03;放进文档里就是 0.99。问题的先后顺序也不影响结果,因为每个分支的位置编码都在文档之后重新开始。
「以上都不是」能正常工作:决策 token 排在所有选项之后,模型在打分前已经读完整份选项清单,所以兜底选项不是摆设。选项文本里伪造分隔符也没用,选项数不会被篡改。
本地服务加调试台:带一个 Next.js 写的 playground,可以改文档和问题即时重跑,内置「打包 vs 拆开」「选项换序」两组对照实验。还有一个国际象棋页面——合法着法当作一个 choice 问题的选项,棋盘当作文档,同一个请求里再用 score 给局面打分。
训练脚本是公开的:用 Banking77、AG News、MNLI、BoolQ、SST-5、Yelp 六个公开数据集转成 TypeSafe 形状的请求,9000 条记录、13500 个问题、两轮。一条命令就能从冒烟测试跑到完整训练,也可以指定
评测套件是冻结的:
和 Jev 的对比是公开的,包括输不起的那部分:在训练分布内,kev-0.5b 的微观准确率 79.7%,Jev 81.1%,差距在统计噪声里。但换到完全没训过的八个数据集上,kev 63.3%、Jev 82.3%,落后 19.1 个百分点——作者把这个数字和置信区间直接写进 README 了。校准反而是 kev 更好(ECE 0.052 对 0.075),选项顺序的稳定性则明显不如(翻转率 0.208 对 0.000)。
已知的边界:基座只有 5 亿参数,常识和知识面有限;训练时文档 384 token、分支 1024 token,服务端上限 8192;MPS 上是 fp32、一次一个请求、没有跨请求的 KV 缓存。校准数字来自训练用的那几个数据集,换到新业务上要用自己的标注数据重新校一遍。
跑起来需要什么:Python 3.12 以上、uv,playground 另外需要 Node 20。在 Apple Silicon(MPS)上测过,CUDA 未测。权重在 Hugging Face 的
confidence: 0.9 还是它顺嘴编的,跟真实准确率没关系。kev 把这条路整个换掉。它是 Qwen2.5-0.5B 上的一个 LoRA 适配器加一个读出头,把文档读一遍,然后一次前向把所有问题的答案同时算出来,全程不解码。文档和每个问题打包进同一条序列,块因果掩码保证每个问题都能看见文档、但看不见旁边的问题;最后一个指针头拿每个选项的隐状态去和决策 token 打分,softmax 出来的分布就是输出。
所以它给的不是「听起来很自信」的一句话,而是真正训练过的概率:交叉熵对着标注结果训,留出集上 ECE 0.065,做一次单参数温度缩放后降到 0.031。隔离也不是嘴上说说——同一批问题打包发和拆开单独发,最大概率差 3.7e-6,而打包那次还快一倍。
它跟着 TypeSafe 的 System One 接口写,
POST /v1/systemone 的请求和响应形状一模一样,官方 typesafe-sdk 只改一个 base_url 就能打到本地这台服务上,文档里的示例代码不用动。最实在的一点:这东西真的能在笔记本上训。
kev-0.5b 在一台 Apple M5 上跑完大约 1 小时 45 分,一个六问题的请求返回大概 160 毫秒。软件功能
三种问题类型:
noul 是是非题,choice 支持 2 到 255 个选项,score 是有序等级。三种共用同一个读出头,选项数量由请求决定,不需要为每类任务单独训一个头。一次编码,多路作答:文档的隐状态只算一次,每个问题作为独立分支挂在后面。问题多了不会线性拖慢,实测打包请求比拆开发快 2 倍。
问题之间严格隔离:掩码保证一个问题看不到兄弟问题的内容。作者做了探针实验:把秘密放在兄弟问题里,模型答对的概率是 0.03;放进文档里就是 0.99。问题的先后顺序也不影响结果,因为每个分支的位置编码都在文档之后重新开始。
「以上都不是」能正常工作:决策 token 排在所有选项之后,模型在打分前已经读完整份选项清单,所以兜底选项不是摆设。选项文本里伪造分隔符也没用,选项数不会被篡改。
本地服务加调试台:带一个 Next.js 写的 playground,可以改文档和问题即时重跑,内置「打包 vs 拆开」「选项换序」两组对照实验。还有一个国际象棋页面——合法着法当作一个 choice 问题的选项,棋盘当作文档,同一个请求里再用 score 给局面打分。
训练脚本是公开的:用 Banking77、AG News、MNLI、BoolQ、SST-5、Yelp 六个公开数据集转成 TypeSafe 形状的请求,9000 条记录、13500 个问题、两轮。一条命令就能从冒烟测试跑到完整训练,也可以指定
--holdout 留出某几个数据源做跨源评测。评测套件是冻结的:
evals/decision-v1 把训练、校准、开发、锁定测试四个分区分开,数据集和基座模型的版本都钉死,每条记录带来源信息。实验脚本会记录代码、套件和 git 的哈希,配置超出白名单就拒绝运行,锁定测试集要显式加 --allow-test 才碰得到。和 Jev 的对比是公开的,包括输不起的那部分:在训练分布内,kev-0.5b 的微观准确率 79.7%,Jev 81.1%,差距在统计噪声里。但换到完全没训过的八个数据集上,kev 63.3%、Jev 82.3%,落后 19.1 个百分点——作者把这个数字和置信区间直接写进 README 了。校准反而是 kev 更好(ECE 0.052 对 0.075),选项顺序的稳定性则明显不如(翻转率 0.208 对 0.000)。
已知的边界:基座只有 5 亿参数,常识和知识面有限;训练时文档 384 token、分支 1024 token,服务端上限 8192;MPS 上是 fp32、一次一个请求、没有跨请求的 KV 缓存。校准数字来自训练用的那几个数据集,换到新业务上要用自己的标注数据重新校一遍。
跑起来需要什么:Python 3.12 以上、uv,playground 另外需要 Node 20。在 Apple Silicon(MPS)上测过,CUDA 未测。权重在 Hugging Face 的
jaredpalmer/kev-0.5b,GitHub Release 里也挂了一份。Apache-2.0。

