Kev-0.5B — 原型(已被取代)
Kev-0.5B 是一个决策模型。它接收一份文档(状态)和一组带类型的问题,在一次前向传播里为每个问题返回一个概率分布。它不生成文本。
它是在 Qwen/Qwen2.5-0.5B 之上的一个 LoRA 适配器加一个小指针头。它复现了 Archer Hume 在 Jev’s Architecture Unmasked 里为 TypeSafe 的 Jev 推断出的架构,并服务 TypeSafe 公开的 /v1/systemone API 契约。
这个 checkpoint 是最早的原型,2026 年 9 月在一台笔记本上训练,用来证明这个机制能跑通。它已被 Kev-0.8B、Kev-4B 和 Kev-9B 取代,后者使用 Qwen3.5 基座、冻结且带校验和的套件,以及一套经过约 110 次受控试验找到的配方;在同一批域外条目上(transfer-v4 dev),本模型得 0.561,而它们分别为 0.643 / 0.794 / 0.812.620 / 0.790 / 0.796。它留在 Hub 上供参考和复现;其他用途请用当前家族。
- Hub:jaredpalmer/kev-0.5b(tag
v0.1) - 代码、训练配方、评测与演示:github.com/jaredpalmer/kev
- 权重:GitHub release
v0.1.0,kev-0.5b.tar.gz(38 MB;LoRA 适配器adapter_model.safetensors、指针头head.pt、tokenizer 文件、eval.json、训练日志)。SHA-25615639f79…6e12f8,完整摘要在 sidecar.sha256里。解包到runs/kev/。权重不提交进 git。
模型详情
| 开发者 | Jared Palmer,与 Devin (Cognition) 合作 |
| 模型类型 | 因果 transformer,只做 prefill,块因果分支掩码,指针读出 |
| 基座模型 | Qwen/Qwen2.5-0.5B(494M 参数,冻结) |
| 适配器 | LoRA rank 16,alpha 32,dropout 0.05,作用于 q_proj k_proj v_proj o_proj gate_proj up_proj down_proj(全部 24 层) |
| 指针头 | 两个线性映射 896 → 256(query 来自 <decide>,key 来自每个 </opt>),缩放点积,在选项上做 softmax |
| 可训练参数 | 9.3M(LoRA 8.8M + 指针头 0.46M),占主干的 1.9% |
| 精度 | fp32(在 Apple MPS 上训练与服务) |
| 训练时使用的上下文 | ≤ 384 个 state token,每个问题分支 ≤ 1,024 tokens |
| 服务时允许的上下文 | 每个分支 8,192(主干支持 32k) |
| 问题类型 | noul(是/否)、choice(2–255 个选项)、score(2–255 个有序档位) |
| 语言 | 英语 |
| 许可证 | 适配器与指针头为 Apache-2.0。基座模型在 Qwen 许可证下(Qwen2.5-0.5B 为 Apache-2.0)。数据集各有自己的许可证。 |
| 版本 | Kev-0.5B v0.1,训练于 2026-09-17 |
预期用途
预期。 决策模型研究:直接概率读出的校准、共享 state / 隔离问题的注意力、选项顺序敏感性,以及与 TypeSafe 的 System One 契约在 API 层面的兼容性。本地演示与教学。
非预期。 任何会影响人的生产决策:内容审核、欺诈、信贷、招聘、医疗或法律路由。模型的知识受限于一个 0.5B 主干,其校准只在该训练分布上验证过,在不熟悉任务上的输出尚未测量。
模型如何使用
输入是一条打包的 token 序列:
<state> …state… <q> instr <opt> o1 </opt> <opt> o2 </opt> … <decide> <q> … <decide> …
- 注意力掩码让一个问题 token 只能看到 state 和它自己的分支。问题之间互相看不到。
- 每个分支在 state 之后重新开始 position id。
- 对每个问题,指针头把每个
</opt>隐状态与<decide>隐状态打分,再做 softmax。 - 应用代码把分布转成 API 答案:Choice 给
choice/confidence,Noul 给p(yes),Score 给期望档位。
保留 token 是 Qwen 已有的特殊 token(<|fim_prefix|>、<|fim_middle|>、<|box_start|>、<|box_end|>、<|fim_suffix|>)。用户文本会被清洗,无法产生它们。
用 python -m kev.serve --run runs/kev 服务并调用 POST /v1/systemone,或用 typesafe-sdk 配 base_url="http://127.0.0.1:8009"。
训练数据
六个公开数据集,转换成 TypeSafe 形状的请求,并用与服务时相同的代码路径渲染(api.to_record())。从标准的 train 划分里每个来源采样 1,500 条记录,共得 9,000 条记录和 13,500 个问题(4,500 个 Choice、6,000 个 Noul、3,000 个 Score)。
| source | split | 转换为 | 备注 |
|---|---|---|---|
| Banking77 | train | Choice,K = 77 | 意图名作为选项键;模板化描述,50% 为 null |
| BoolQ | train | Noul | 段落作为 state;40% 带 true/false 判据 |
| AG News | train | Choice K = 4 + 2 个 Noul | 派生的是/否问题与主题问题打包在一起 |
| MNLI | train | Choice K = 3 | 前提作为 state,假设放在指令里 |
| SST-5 | train | Score,5 个档位 | |
| Yelp Review Full | train | Score 5 个档位 + Noul | 文本截断到 220 词;recommend = 星级 ≥ 4 |
转换时施加的渲染变化:约 30% 的选项描述为 null,约 10% 为结构化 {"what": …} 描述,约 15% 为结构化 {"question", "focus"} 指令,约 32% 的 state 包成对象或数组({"document"}、{"ticket": {"channel","body"}}、[{"role","content"}])。
编码前对每条记录施加一次增强:选项顺序打乱;以 0.10 的概率把真选项替换为 other: None of the above;以 0.15 的概率加入一个无关的干扰选项。
没有 LLM 生成的数据。除原始数据集外没有人标注。
训练流程
| 目标 | 在选项上做交叉熵,对一条记录内的问题取平均 |
| 优化器 | AdamW,lr 2e-4,weight decay 0.01,OneCycle 调度(10% 预热) |
| Batch | 每步 1 条记录,梯度累积 8,梯度裁剪 1.0 |
| Epoch | 2(2,250 个优化器步) |
| 硬件 | Apple M5,32 GB 统一内存,PyTorch 2.8 MPS 后端 |
| 墙钟时间 | 约 1h45m(每条记录约 0.29 s) |
| Seed | 0 |
| 最终训练损失 | 0.27 |
这个 checkpoint 早于两个现在是 kev/train.py 默认值的损失项:Score 的 ordinal 项(--ord_w)和 Choice 的置换一致性 KL(--perm_kl)。要精确复现这个 checkpoint:
uv run python -m kev.train --n_per_source 1500 --epochs 2 --accum 8 --perm_kl 0 --ord_w 0 --out runs/kev
注意,增强现在是每个 epoch 重新施加,而不是在编码时固定,所以重跑不会逐 bit 相同。
评测
同一批六个来源的留出 test / validation 划分,每个来源 150 条记录,1,350 个问题,seed 1。完整结果在 runs/kev/eval.json。
准确率与校准
| source | K | zero-shot 基座 | zero-shot Instruct | Kev-0.5B |
|---|---|---|---|---|
| acc / ECE | acc / ECE | acc / ECE / NLL | ||
| banking77 | 77 | – | – | 0.860 / 0.057 / 0.56 |
| agnews | 4 | 0.813 / 0.069 | 0.787 / 0.160 | 0.940 / 0.028 / 0.22 |
| agnews yes/no | 2 | 0.780 / 0.103 | 0.853 / 0.062 | 0.960 / 0.017 / 0.10 |
| boolq | 2 | 0.427 / 0.274 | 0.607 / 0.084 | 0.753 / 0.136 / 0.63 |
| mnli | 3 | 0.460 / 0.225 | 0.433 / 0.390 | 0.747 / 0.100 / 0.63 |
| sst5 | 5 | 0.373 / 0.083 | 0.447 / 0.344 | 0.533 / 0.121 / 1.17 (MAE 0.59 levels) |
| yelp | 5 | 0.313 / 0.043 | 0.353 / 0.078 | 0.553 / 0.118 / 0.95 (MAE 0.54 levels) |
| yelp yes/no | 2 | 0.833 / 0.129 | 0.833 / 0.066 | 0.887 / 0.084 / 0.33 |
| 全部 | 0.799 / 0.065 |
基线:Qwen/Qwen2.5-0.5B(原始)和 Qwen/Qwen2.5-0.5B-Instruct(chat 模板),同样的渲染文本,在选项字母 A–H 上取下一 token logits;K = 77 未跑。ECE 在最高概率上用 10 个等宽分箱。
温度缩放
在偶数索引记录上拟合,在奇数索引记录上测试:T = 1.47。留出 NLL 0.505 → 0.481,ECE 0.057 → 0.031。模型在缩放前轻微过度自信。
机制测试
| 测试 | 结果 |
|---|---|
| 隔离(秘密置于兄弟问题 / 缺失 / 置于 state) | p = 0.03 / 0.03 / 0.99 |
| 打包 vs 分开,最大概率绝对差 | 3.7e-6(打包快 2.0×,每请求约 2.7 个问题) |
| 置换,4 种顺序,Choice K ≥ 3 | argmax 翻转 7.4%;p(correct) 平均离散 0.065,p90 0.25 |
| IIA,追加一个无关选项 | top-2 的 |Δ log-odds| 均值 = 0.13,p90 0.34 |
| 边界伪造,选项文本带假分隔符 | 选项数不变;伪造选项 p ≤ 0.09 |
局限
- 仅限分布内。 上面所有数字都在训练数据集的留出划分上。这个 checkpoint 的跨来源泛化尚未测量。
- 主干小。 0.5B 参数。在 TypeSafe 文档的结构化判据示例上,模型选
return_policy,而 Jev 选return_status。阅读理解(BoolQ 0.75、MNLI 0.75)远低于当前水平。 - 任务覆盖窄。 六个数据集和约十个指令模板。代码、表格、多轮对话、算术和多步条件均未训练。
- 顺序敏感性仍在。 选项重排下 argmax 翻转 7%,p(correct) 的 p90 离散 0.25。接近决策边界的阈值可能改变动作。
- Score 置信度由服务代码计算,不由 checkpoint 计算。写这张卡时它是
1 − E|level − mode| / (L − 1);现在是max(0, 1 − E|level − mode| / D),D 是档位上均匀分布的绝对平均偏差,与 TypeSafe 的参考适配器(system-one-adapter0.2.1)一致。 - 校准不是保证。 在这些来源上温度缩放后 ECE 0.03,并不能说明在新工作流上的校准。合适的评分规则给出正确的激励;它们不能消除对结果数据的需求。
- 继承的局限来自 Qwen2.5-0.5B 和数据集,包括其标签噪声、人口偏斜(如 Yelp、银行意图)和仅英语覆盖。
偏见、风险与建议
训练集带着其来源的偏见:以美国为中心的新闻类别、英语银行术语、餐厅评论和众包 NLI 标签。模型会照搬它们。
直接的概率输出看起来很有权威。这个模型给出的 confidence: 0.92 是关于它自己在三个选项上分布的一个统计量,不是为正确的已验证概率。在没有先在你自己的标注结果上测量校准之前,不要对有后果的决策拿它设阈值。
问题隔离这一性质是真实的安全特性(一个问题的文本无法操纵另一个问题的答案),并且已验证。分隔符伪造防护已针对五个保留 token 验证。通过 state 文本进行的其他 prompt 注入路径尚未研究。
环境影响
一次训练:在单台 Apple M5 笔记本 SoC 上约 1.75 小时,功耗约 30–40 W,即约 0.06 kWh。评测和冒烟运行再加相近的量。这很小。
引用
@software{kev2026,
title = {kev: a laptop-scale reconstruction of a Jev-style decision model},
author = {Palmer, Jared},
year = {2026},
url = {https://github.com/jaredpalmer/kev}
}
@misc{hume2026jev,
title = {Jev's Architecture Unmasked},
author = {Hume, Archer},
year = {2026},
url = {https://archerhume.com/posts/jevs-architecture-unmasked}
}
联系
在 github.com/jaredpalmer/kev 开 issue。