Kev-0.8B
模型摘要
Kev-0.8B 是一个决策模型。它读取一份文档(状态)和一组关于它的带类型问题,并在一次前向传播里返回每个问题所带选项上的校准概率分布,不生成文本。它实现 TypeSafe 公开的 System One API(POST /v1/systemone),所以 TypeSafe SDK 可以原样对它使用。它是最小的 Kev:Qwen3.5-0.8B-Base 上的一个 LoRA 适配器和一个指针头,能跑在笔记本或 4 GB GPU 上。它适用于内存或成本排除了更大规模的场景,且任务与它训练过的相似;域外它明显不如 Kev-4B 准确。本卡描述 Kev 1.0 中的这个 checkpoint,首次发布于 2026-09-24。
模型详情
| 开发者 | Jared Palmer(github.com/jaredpalmer/kev) |
| 模型类型 | 决策模型:把因果语言模型主干只做 prefill,配一个在选项上的指针头 |
| 主干 | Qwen/Qwen3.5-0.8B-Base(revision dc7cdfe2):24 层,18 个 Gated DeltaNet(线性注意力)和 6 个完全注意力;冻结 |
| 适配器 | LoRA,rank 16,α 32,作用于注意力、MLP 和 DeltaNet 投影(11.3M 参数) |
| 指针头 | 指针头:两个投影把每个选项的收尾 token 与问题的末尾 token 打分;softmax 给出概率 |
| 精度 | 用 bf16 autocast 在 fp32 权重上训练;以 bf16 服务(加载时把适配器合并进基座);以 fp32 评测 |
| 上下文 | 服务最多 65,536 tokens 的 state,另外每个问题至少 8,192 tokens。训练 state 最多 7,552 tokens。 |
| 已验证上下文长度 | 8,192 tokens(见 长期文档) |
| 校准 | 单个温度,T = 2.35,存在 head.pt 中,加载时施加 |
| 语言 | 英语 |
| 许可证 | Apache-2.0(适配器与指针头);基座模型为 Apache-2.0 |
| 版本 | Kev 1.0:jaredpalmer/kev-0.8b 的 main,revision 9a45d25e(发布于 2026-09-24) |
| 之前的版本 | Hub tag night2-du-release 和 v7-base |
输入。 一个 state(文本,或渲染为带标签文本的 JSON 对象或数组)和任意数量的具名问题,每个问题属于三种类型之一:
| 类型 | 选项 | 输出 |
|---|---|---|
choice |
1–255 个具名选项,每个带可选描述 | 每个选项一个概率、最可能的选项和一个置信度 |
score |
1–255 个有序档位 | 每个档位一个概率和期望档位索引 |
noul |
是 / 否,带可选描述 | 为是的概率 |
每个问题都作为它自己的一行作答,从共享 state 续接,所以问题之间不能相互影响;state 只计算一次并缓存。
预期用途
- 与它训练家族相近的带类型决策(文档分类、路由、基于明示规则的政策检查),跑在装不下 Kev-4B 的硬件上:笔记本、L4 或 4 GB GPU。
- 在训练成本重要的场景下,作为在用户自己标签上微调的起点(
kev.train --init_from jaredpalmer/kev-0.8b)。 - 在转向更大的 Kev 之前,对着 System One API 做原型。
范围外用途
- 文本生成、对话、摘要或开放式问答。模型只对它被给出的选项打分。
- 工具调用路由(是否调用工具、请求缺失参数还是拒绝):它的 When2Call 准确率低于随机(见 局限)。
- 未经人工复核、对人有法律、医疗、金融、雇佣或类似后果的全自动决策。
- 知识密集型问题、日期算术、超过 65,536 tokens 的 state,以及英语以外的语言。
如何使用
用 Kev 仓库服务它。在 CUDA 上它以 bf16 运行,带融合 DeltaNet 内核和 CUDA graphs(一张 L4 就够);在 Apple Silicon 上同一命令会通过 MLX 服务它,自动选择。
git clone https://github.com/jaredpalmer/kev.git && cd kev && uv sync --extra serve
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-0.8b --port 8008 # Kev 1.0 (this card)
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-0.8b@v1.0 --port 8008 # the same weights, pinned
from typesafe_sdk import Choice, Noul, TypeSafeClient
client = TypeSafeClient(api_key="local", base_url="http://127.0.0.1:8008", model="kev-latest")
response = client.system_one(
state="I was charged twice for order 1182. Please refund one of the charges.",
questions={
"team": Choice(instructions="Which team should handle this?",
criteria={"billing": "Charges and refunds", "shipping": "Deliveries", "returns": "Exchanges"}),
"urgent": Noul(instructions="Does this need a reply today?"),
},
)
print(response.choices["team"].choice, response.nouls["urgent"].noul)
校准温度默认施加;KEV_TEMPERATURE=1.0 返回原始概率。KEV_DTYPE=fp32 选择用于评测的确切路径。超过 65,536 tokens 的 state 会被拒绝,返回 422 并给出其 token 数。
训练数据
| 阶段 | 记录数 | 内容与标签 |
|---|---|---|
基础配方(decision-v7) |
12,576 | 来自十个公开分类数据集的 10,000 条记录(各 1,000,列在本卡的元数据里)及其原生标签;896 条覆盖九个模板家族的生成的策略最小对;1,680 条来自 60 个随机生成规则结构的记录,四种渲染;标签由代码计算 |
| 日期与缺失证据 | 1,425 | 生成:900 个带日期的政策案例(普通、带一句天数计数、或带 date_facts 字段);255 个去掉决定句并配均匀目标的案例,外加 270 个完整对照 |
| 文档与技能,一个阶段 | 16,539 | documents-v1 train:5,219 条美国消费金融投诉叙述(CFPB,最多约 7k tokens),配 7,488 个问题,标签在两个开放权重教师与消费者自己的申报一致时才保留。hard-v1 train:6,000 条程序化标注的记录,分七个技能家族(长政策、权衡、概率、多跳、日期与算术、评判一个提议答案、缺事实弃答),模板 0–3。devtools-v1 train:5,320 条来自 CodeReviewer、CommitPackFT、FlakeFlagger 和 Aegis 的记录,各用其数据集自身的标签 |
两个微调阶段分别回放 decision-v7 的 2,000 和 6,000 条记录。没有使用任何 Jev(TypeSafe 的托管决策模型)的输出。CodeReviewer 和 FlakeFlagger 来自 Zenodo;CFPB 叙述是美国政府作品;逐来源许可证和 revision 记录在套件 manifest 里。下面的评测专用套件(breadth-v1、tasksource-heldout-v1、transfer-v4、longdoc-v1,以及 devtools-v1 的 When2Call 和 prompt-injection 来源)从不进入训练。
训练流程
- 基础配方。 从基座在
decision-v7上两个 epoch:LoRA rank 16,α 32;学习率 1e-4,one-cycle 调度;batch 8;bf16 autocast;seed 2。损失是在每个问题的选项上的交叉熵。选项顺序打乱,随机插入「none of the above」选项和干扰项,另有四分之一的 choice 记录产生一个最小对(带「none of the above」选项的那个问题,一次把正确选项放进去、一次把它移除)。 - 日期与缺失证据。 从阶段 1 起一个 epoch,学习率 4e-5,回放 2,000 条记录。
- 文档与技能。 从阶段 2 起,在三个训练集上一起一个 epoch,学习率 2e-5,回放 6,000 条记录;batch 4 × 2 累积;state 最多 7,552 tokens;梯度 checkpointing;seed 1;2,818 个优化器步。
- 校准。 单个温度,T = 2.35,在阶段 3 试验的
decision-v7开发行(1,264 个问题)上最小化负对数似然。这些是一个训练语料的留出条目。在留出数据集上的一次重拟合经过评测但未采用(见 校准)。
评测
方法。 除非另有说明,每个数字都是发布温度下的 fp32 评测路径。开发划分用于选择;测试划分为本 checkpoint 读过一次;transfer-v4 测试是锁定的(每个候选读一次),并对照事先固定的门槛评判。配对区间是 95 % bootstrap,重采样整条记录(2,000 次重采样),所以共享同一 state 的问题一起移动。差值以百分点(pp)计。Jev(TypeSafe 的托管模型,经 Vercel AI Gateway 查询)只在与它读过同一批条目的地方给出。套件如下:
- breadth-v1:五个领域(知识、语言、检索、工具、艺术)的 14 个留出公开数据集,从未训练。
- tasksource-heldout-v1:一个公开多任务集合的 24 个整任务家族,从未训练(家族名不公开)。
- transfer-v4:来自六个从未训练的公开来源(QNLI、SciQ、TweetEval-offensive、PAWS、MMLU、Emotion)的域外决策,加上留出的政策和规则结构。
- hard-v1:上述技能家族;测试划分留出已训练生成器的模板。
- devtools-v1:来自六个经许可证核查的来源的开发者工具决策(四个训练,两个仅评测)。
- documents-v1 / documents-v2:CFPB 投诉叙述;v2 是私有的留出测试集。
- longdoc-v1:CUAD 商业合同和生成的协议包,state 4k 到 64k tokens。
标为「audited(审计)」的头条面板排除标签审计认为不健全的条目¹;每次排除都会从比较双方移除相同的行。
留出数据(从未训练)。
| 面板(问题数) | Kev-0.8B | Jev |
|---|---|---|
| 留出公开数据集,breadth-v1 开发,审计,10 个数据集(2,475) | 0.653 | – |
| breadth-v1 开发,全部 14 个数据集(3,075) | 0.597 | 0.757 |
| breadth-v1 测试,全部 14 个数据集(3,089) | 0.586 | 0.757 |
| breadth-v1 测试,随机校正指数² [95 % CI] | 23.3 [21.2, 25.9] | 54.0 [51.2, 57.0] |
| 留出任务家族,tasksource-heldout-v1 开发,审计,17 个家族(1,993) | 0.515 | – |
| tasksource-heldout-v1 开发,全部 24 个家族(2,788) | 0.513 | – |
| 域外,transfer-v4 开发(656):准确率 / Brier | 0.648 / 0.430 | 0.857 / 0.211 |
| 域外,transfer-v4 锁定测试(656):准确率 / Brier | 0.697 / 0.397 | – |
| transfer-v4 锁定测试:ECE / ≤ 5 % 误差下的覆盖率 | 0.045 / 0.274 | – |
| MMLU-Pro,10 个选项(transfer-v9 开发) | 0.230 | 0.840 |
| 以 p ≥ 0.9 作答的无法回答条目(越低越好) | 0.00 | 0.09 |
已训练家族(留出条目与模板)。
| 面板(问题数) | Kev-0.8B | Jev |
|---|---|---|
| documents-v1 开发(920) / 测试(936) | 0.842 / 0.851 | 0.868 / – |
| documents-v2,私有留出测试(953) | 0.848 | – |
| hard-v1 开发(1,083) / 测试(1,088) | 0.594 / 0.665 | 0.777 / – |
| devtools-v1 开发,审计来源(772) | 0.633 | – |
| devtools-v1 开发(1,072) / 测试(1,071),全部来源 | 0.602 / 0.637 | 0.713 / – |
| decision-v7 开发(1,264) / 锁定测试(1,200) | 0.827 / 0.838 | 0.845 / – |
| 生成决策的留出领域,ood-v2(4,988) | 0.661 | – |
Jev 的 devtools-v1 数字是在全部 1,074 个开发问题上;Kev 的行去掉了一个被套件构建器复用到两条记录(2 个问题)上的 CodeReviewer id。
对照上一版本(tag night2-du-release,在其自身温度 2.41 下;注册的判据,每个测试读一次):
| 面板 | Δ [95 % CI] |
|---|---|
| documents-v1 测试 | +24.4 [+21.3, +27.6] |
| documents-v2 | +23.2 [+19.9, +26.4] |
| hard-v1 测试 | +26.9 [+23.4, +30.4] |
| devtools-v1 测试 | +16.4 [+13.1, +19.4] |
| hard-v1 + devtools-v1 测试,合并 | +21.7 [+19.5, +24.0] |
| transfer-v4 锁定测试 | +1.2 [−1.1, +3.7] |
长期文档。
- 已验证上下文长度:8,192 tokens,即训练长度。16k 桶超出容差:其下界为 −8.5 pp,低于 −3 pp,所以没有更长的长度被验证。
- 规则,读数之前固定:已验证长度是从 16,384 tokens 起向下的最大桶的名义大小,使得它以及它与 8,192 之间的每个桶都在容差内。在容差内意味着与 8k 桶(state 6,553–7,618 tokens,即训练长度)相比 CUAD 准确率差,在同一合同、重复和问题上配对,其 95 % 下界至少为 −3 pp,且每条记录都被作答。若 16k 桶失败,已验证长度为 8,192 tokens。
按名义 state 长度的 CUAD 准确率、ECE 和与 8k 桶的配对差(longdoc-v1 开发):
| 名义 state 长度 | CUAD 问题数 | 准确率 | ECE | 相对 8k 的 Δ,pp [95 % CI] |
|---|---|---|---|---|
| 4k | 443 | 0.779 | 0.128 | – |
| 8k | 453 | 0.711 | 0.066 | 参考 |
| 16k | 452 | 0.659 | 0.047 | −5.2 [−8.5, −2.1] |
| 32k | 454 | 0.663 | 0.055 | −6.0 [−9.5, −2.5] |
| 64k | 452 | 0.637 | 0.038 | −7.9 [−11.8, −4.2] |
在发布温度 T = 2.35 下的 ECE。Δ 在两种长度上问及同一合同的 445–447 个问题上配对。4k 桶装着不同的合同,不是该规则的参考。来源:runs/r28-readout/context.json(第 28 轮注册的读数,runs/r28-08b-r15-longdoc)。
校准(期望校准误差,ECE,在发布温度 T = 2.35 下;越低越好):
| 面板 | ECE |
|---|---|
| breadth-v1 开发,审计 / 全部 14 个数据集 | 0.022 / 0.032 |
| breadth-v1 测试,全部 14 个数据集 | 0.042 |
| tasksource-heldout-v1 开发,审计 | 0.096 |
| transfer-v4 开发 / 锁定测试 | 0.049 / 0.045 |
| hard-v1 开发 / 测试 | 0.112 / 0.125 |
| devtools-v1 开发,审计 | 0.092 |
| documents-v1 开发 / 测试 | 0.059 / 0.071 |
| decision-v7 开发(拟合行) | 0.033 |
| ood-v2 | 0.123 |
发布的温度是在一个训练语料的留出条目上拟合的,项目规则已不再允许用于新发布。在来自留出数据集的 648 个问题上的一次注册重拟合(transfer-r3 的校准划分,八个来源,加 200 个 MMLU-Pro 问题)给出 T = 2.52(90 % bootstrap 区间 [2.19, 2.83])。在 4,468 个审计过的 breadth-v1 和 tasksource-heldout-v1 开发问题上它校准更好:ECE 0.037 对 0.048,Brier 低 0.0020 [0.0014, 0.0025]。它在已训练家族上更差,各自都超出注册容差 0.005:hard-v1 ECE 0.124 对 0.112,devtools-v1(审计)0.099 对 0.092,documents-v1 0.078 对 0.059。因此这次重拟合不合格,T = 2.35 保留。工作负载更像留出公开数据集而非 Kev 训练家族的用户,可以用 KEV_TEMPERATURE=2.52 以重拟合值服务它;答案不依赖 T。
其他结果。
| 套件 | Kev-0.8B | Jev |
|---|---|---|
日期算术,deadline 政策(transfer-v9 开发) |
0.35 | 0.95 |
| MMLU,4 个选项(transfer-v9 开发) | 0.425 | 0.90 |
| 留出政策结构,最小对两兄弟都答对(transfer-v4 开发) | 0.422 | – |
| When2Call,开发 / 测试(仅评测来源) | 0.167 / 0.133 | – |
| Prompt 注入,开发(仅评测来源) | 0.547 | 0.893 |
| SemIf(144 个手写决策;对更大的模型接近饱和,仅报告) | 0.722 | 0.965 |
| JevBench 公开条目,全部 231 / hard 档 111(ECE) | 0.636 / 0.360 (0.181) | – |
服务。 CUDA,bf16 配融合内核和 CUDA graphs,在一张 L4 上;每个请求的模型时间(20 次中位数),新 state / 重复 state:短 state 六个问题 22.7 / 16.1 ms,2,200-token state 五个问题 108.6 / 32.3 ms;64 个客户端下 62.8 请求/s。常驻 GPU 显存 3.8 GB。在 280 个问题上,服务的概率与 fp32 评测路径保持在 0.017 以内,有 1 个答案改变。
Apple Silicon(MLX,bf16,32 GB 的 M5;三个问题,其中一个问一个种在 60 % 深度的事实;state 以 1,024-token 块预填充):
| state tokens | 新 state | 缓存 state | MLX 峰值(1.5 GB 权重) | 进程占用 | 种入事实 (p) |
|---|---|---|---|---|---|
| 8,192 | 1.4 s | 74 ms | 2.7 GB | 5.3 GB | 正确 (0.68) |
| 16,384 | 3.2 s | 94 ms | 3.0 GB | 6.1 GB | 正确 (0.68) |
| 32,768 | 8.0 s | 134 ms | 3.1 GB | 6.3 GB | 正确 (0.70) |
| 65,000 | 21.2 s | 202 ms | 3.8 GB | 5.4 GB | 正确 (0.62) |
与同样请求下 CPU 上的 fp32 PyTorch 相比,MLX 的答案在 8k 时最多差 0.0076、在 16k tokens 时差 0.0052,没有答案改变。在 100 个短 state 问题上,MLX 路径与 fp32 评测路径保持在 0.020 以内,有 1 个答案改变。
¹ 从审计面板中排除:四个 breadth-v1 数据集(routerbench,其 state 缺少所问的信息;cfcolor 和 humicroedit,对每个系统都处于随机水平;chessbench,对每个系统都处于下限);七个标签无效或无法恢复的 tasksource-heldout-v1 家族(名字不公开);两个 state 无法决定其标签的 devtools-v1 任务(flakeflagger、commit 变更类型)。
² 社区 Decision Index 0.2 的随机校正指数:每个数据集 (score − chance) / (1 − chance),在每个领域内取平均,然后 100 × 五个领域的均值。Jev 的指数来自对同一批测试条目的单独一次读取。
局限与取舍
- 域外它是一个 sub-1B 模型。 在 transfer-v4 开发上它落后 Jev 21 个点,在 breadth-v1 指数上落后 31 个点;知识(MMLU-Pro 0.230)和复述接近未训练的基座。准确率重要时请用 Kev-4B。
- 它的增益在分布内。 documents-v1、hard-v1 和 devtools-v1 的训练划分就在其训练数据里;在 JevBench 公开 hard 档这个分布外检查上,documents-and-skills 阶段让它 +2.7 pp [−1.8, +7.2],与零不可区分。
- 工具调用路由变差了。 When2Call 这个仅评测来源,在开发上从 0.260 掉到 0.167,在测试上从 0.233 掉到 0.133,低于其四个选项中四分之一的猜测率。不要用它做工具调用路由。
- 一个 devtools-v1 结果无法解释。 FlakeFlagger 在开发上从 0.500 变到 0.520,但在测试上从 0.507 变到 0.813,每个划分 150 个问题;把它当作无法解释,而非一项技能。
- 日期算术是它最弱的家族:在
deadline政策问题上 0.35,对 Jev 的 0.95;KEV_DATE_FACTS=1预处理器对更大的模型帮助比对它更大。 - 规则组合很弱:留出政策最小对的两兄弟都答对 0.422 的时间。
- 校准是一个分布内温度(见 校准)。它无法重排置信度顺序:域外 ≤ 5 % 误差下的覆盖率为开发上的 0.145,对 Jev 的 0.70,所以在严格误差预算下能自动化的决策很少。
- 未训练的长度。 训练 state 最多 7,552 tokens。更长的 state 可服务到 65,536 tokens;准确率保持多远就是上面的已验证上下文长度。
- 选项顺序可能改变答案;问题隔离并不能阻止这一点。
偏见、风险与伦理考量
- 校准概率可能制造不当的信任。温度是在训练分布的开发行上拟合的,不迁移到每个工作负载;在设阈值之前,在你自己的标注样本上测量准确率与校准,并在那里重拟合温度(
python -m kev.calibrate)。 - 准确率和校准会随领域变化而偏移,在这个规模上比在更大规模上更明显。请监控生产错误率,而不是依赖上面的数字。
- 未经人工复核,不要用它做关于人的有后果的自动决策。基座模型和训练数据的偏见(包括其他模型产生的标签)未被测量。
- state 可能包含个人或机密数据。自托管把输入留在你自己的硬件上;除非设置了
KEV_API_KEY,服务器是开放的,所以请应用你自己的访问控制与数据处理策略。
算力
- 基础配方:在一张 NVIDIA H100 上约 20 分钟。日期阶段:9 分钟。
- 文档与技能阶段:在一张 NVIDIA H200 上 52 分钟(峰值 23.9 GB)。
- 评测与服务检查:Modal 上的单张 H100 / H200 / L4 GPU;MLX 测量在一台 Apple M5 上。
溯源与可复现性
- 代码、套件与评测报告:github.com/jaredpalmer/kev。发布数字:
runs/release/kev-08b-r15.json(scripts/release_numbers.py --release kev-08b-r15),锁定读数runs/locked/kev-08b-r15-ungated/,2026-09-30 家族读数runs/fam-08b-breadth/、runs/fam-08b-breadthtest/和runs/fam-breadth-test-report/,校准重拟合runs/r28-readout/round28.json,服务runs/serve-08b-l4/、runs/mlx-long-states/、runs/mlx-full-0.8b/。 - 阶段:基础试验
q35-08b/02-trial-2(tagv7-base);日期night2-08b-du2/00-trial-0(tagnight2-du-release);文档与技能第 15 轮r15-08b/00-trial-0(experiments/round15/joint.json,规则experiments/rounds/r15.json)。校准重拟合:第 28 轮臂08b-r15(experiments/rounds/r28.json)。 - 发布的权重:Hub revision
9a45d25e;适配器 sha2569b908623…,head.ptsha256f400bd12…(T = 2.3511)。 - 发布历史:2026-09-24 作为第 15 轮确认的候选发布;在 Kev 1.0 中原样包含。它是如何被选出的记录,包括此后作为不健全而退役的套件(scienthoon、WANLI-v2、TypeSafe),是 Hub revision
9a45d25e上的 README 和 git tagresearch-archive-2026-09-24上的PLAN.md。
引用
@misc{palmer2026kev08b,
title = {Kev-0.8B: a calibrated decision model on Qwen3.5-0.8B},
author = {Palmer, Jared},
year = {2026},
howpublished = {\url{https://huggingface.co/jaredpalmer/kev-0.8b}},
note = {Kev 1.0}
}
联系
问题与 issue:github.com/jaredpalmer/kev/issues。