文档导航

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-256 15639f79…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-adapter 0.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。