文档导航

Kev-27B

模型摘要

Kev-27B 是一个决策模型。它读取一份文档(状态)和一组关于它的带类型问题,并在一次前向传播里返回每个问题所带选项上的校准概率分布,不生成文本。它面向对最多 64k tokens 的文档做分类、路由、分诊或检查、并且需要可以设阈值的概率(例如把不确定的案例送人工复核)的开发者。它实现 TypeSafe 公开的 System One API(POST /v1/systemone),所以 TypeSafe SDK 可以原样对它使用。本卡描述 version 2,发布于 2026-09-30:Qwen3.8-27B 的一次完整权重微调,与 version 1 平均。

模型详情

开发者 Jared Palmer(github.com/jaredpalmer/kev)
模型类型 决策模型:把因果语言模型主干只做 prefill,配一个在选项上的指针头
主干 Qwen/Qwen3.8-27B(revision 1d4bf0f2,Qwen 的后训练发布版):64 层,48 个 Gated DeltaNet(线性注意力)和 16 个完全注意力,hidden size 5,120;每个主干权重都微调过
指针头 指针头:两个 5,120 → 256 投影把每个选项的收尾 token 与问题的末尾 token 打分;softmax 给出概率
参数 主干 25.6B(视觉塔、LM head 和多 token 预测层不加载),指针头 2.6M
精度 bf16(一个 51.3 GB 的 checkpoint);以 bf16 服务
上下文 服务最多 65,536 tokens 的 state,另外每个问题至少 8,192 tokens。训练 state 最多 32,768 tokens。
已验证上下文长度 65,536 tokens(见 长期文档)
校准 单个温度,T = 1.32,存在 head.pt 中,加载时施加
语言 英语
许可证 Apache-2.0(权重与指针头);基座模型为 Apache-2.0
版本 v2 (Kev 1.0),发布于 2026-09-30,在 jaredpalmer/kev-27b 的 main 上
之前的版本 v1,同一基座上的一个 rank-16 LoRA 适配器(T = 1.38),在 tag v1-lora;其模型卡是该 tag 上的 README

输入。 一个 state(文本,或渲染为带标签文本的 JSON 对象或数组)和任意数量的具名问题,每个问题属于三种类型之一:

类型 选项 输出
choice 1–255 个具名选项,每个带可选描述 每个选项一个概率、最可能的选项和一个置信度
score 1–255 个有序档位 每个档位一个概率和期望档位索引
noul 是 / 否,带可选描述 为是的概率

每个问题都作为它自己的一行作答,从共享 state 续接,所以问题之间不能相互影响;state 只计算一次并缓存。

预期用途

  • 文档上的带类型决策:分类、路由、分诊、抽取选择、政策与资格检查,以及对照明示判据评判一个提议答案。
  • 依据置信度行动的工作流:自动化有把握的案例、把其余排队,阈值在用户自己工作负载的标注样本上冻结。
  • 对 System One 端点做自托管、即插即用的替换。

范围外用途

  • 文本生成、对话、摘要或开放式问答。模型只对它被给出的选项打分。
  • 未经人工复核、对人有法律、医疗、金融、雇佣或类似后果的全自动决策。
  • 答案依赖 state 里没有、也非常识的事实的问题(模型无法查任何东西),以及知识密集型考试(见 局限)。
  • 超过 65,536 tokens 的 state、英语以外的语言,以及小于 80 GB 级 GPU 或约 96 GB 内存 Mac 的硬件(见 局限)。

如何使用

用 Kev 仓库在一张 B200、H200 或 H100 80 GB GPU 上服务它。权重占 51 GB,服务器常驻约 65.5 GB;一个 64k token 的 state 在 H200 上峰值 87.1 GB,一个 32k token 的 state 峰值 78.7 GB,所以最长的 state 需要超过 80 GB。

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-27b --port 8008          # v2 (this card)
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-27b@v1-lora --port 8008  # v1

在 Apple Silicon 上同一命令会通过 MLX 服务(自动选择),按保存的样子加载完整 bf16 权重,不做任何合并。这条路径预计能在 96–128 GB 的 Mac 上工作,但尚未在这个规模上运行过(见 局限)。

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 返回原始概率。服务器使用 bf16、融合 DeltaNet 内核和 CUDA graphs;KEV_DTYPE=fp32 选择用于评测的确切路径。

训练数据

在一个私有语料上训练一个 epoch,145,840 条记录(337,130 个问题),state 最多 32,768 tokens。只有它的 manifest 是公开的(GitHub 仓库里的 evals/sft-v2-r22/manifest.json)。

组件 记录数 内容与标签
Kev 语料 78,786 Kev-27B v1 的训练集(十个公开分类数据集、生成的政策与规则记录、日期算术与缺失证据案例、埋藏事实的长 state);Kev 的技能(hard-v1)、开发者工具(devtools-v1)和消费投诉(documents-v1)套件的训练划分;24 个公开数据集各上限 500 条记录;七个生成家族(长文档、工具路由、检索、意图、rubric 评判、弃答、数值推理)
授权任务家族 24,000 来自一个公开多任务集合的 119 个任务家族,其许可证允许商业使用,标签为原生标签;家族名单不公开
长 state 3,200 嵌入 8k–32k token 文档的 Kev 语料 state;标签原样继承
长文档 7,617 由代码组装的文档,标签由代码计算
域外决策 7,312 多种领域中生成的决策
语气 7,544 同一段文本写成平静、沮丧或愤怒的最小对
Prompt 注入 2,699 识别间接 prompt 注入(防御性)
Agent 会话 4,875 关于代码生成的 agent 会话日志的问题
PII 4,152 对代码插入的个人数据做分类(全部虚构)
Grounding 5,655 一个主张是否被文档支持

来源与标签。 公开数据集列在本卡的元数据里;两个开发者工具来源 CodeReviewer 和 FlakeFlagger 来自 Zenodo,CodeReviewer 的 diff 只保留来自宽松许可项目。生成的文本与标签来自代码或开放权重模型(GLM-5.3、DeepSeek-V4-Pro、Inkling、Mistral Large 3、gpt-oss-120b、MiMo-V2.6-Pro)。消费投诉标签来自开放权重模型,由闭源模型评委和裁决过滤。没有使用任何 Jev(TypeSafe 的托管决策模型)的输出。

许可证。 24 个有上限的公开数据集里有四个是 share-alike:ARC(CC-BY-SA-4.0)、HotpotQA(CC-BY-SA-4.0)、Natural Questions(CC-BY-SA-3.0)和 SNLI(CC-BY-SA-4.0);其余是 CC-BY-4.0、MIT 或 Apache-2.0。CFPB 投诉叙述是美国政府作品。GLM-5.3 的许可是 MIT 风格,对超大型 model-as-a-service 运营者有一条附加条件。逐来源许可证、revision 和署名记录在组件 manifest 里。

污染筛查。 训练前,每条记录都对照 102 个评测划分(76,549 个参考条目)筛查:每个冻结的 Kev 套件、私有评测集、JevBench 公开条目以及下面的仅评测套件。记录在以下任一条下被移除:归一化字符串精确匹配、词 8-gram Jaccard 相似度高于 0.2,或包含度至少 0.5;共移除 6,388 条训练记录。

训练流程

  1. 完整权重微调。 从 Qwen/Qwen3.8-27B 起,在 8 张 NVIDIA H200 GPU 上(FSDP2)训练一个 epoch。AdamW(β 0.9 / 0.999,weight decay 0.01)配 fp32 主权重和矩,主干用 bf16;主干学习率 2e-6、指针头 1e-4,one-cycle 调度带 10 % 预热;梯度范数裁剪到 1.0;每个优化器步 128 条记录(每 GPU 8,2 个累积步),共 1,140 步;seed 0。损失是在每个问题的选项上的交叉熵(数据带软目标处用软目标)。选项顺序打乱,随机插入「none of the above」选项和干扰项。四分之一 state 最多 8,192 tokens 的 choice 记录还会产生一个最小对:带「none of the above」选项的那个问题,一次把正确选项放进去、一次把它移除。每个 state 只跑一次,其问题从它分支。
  2. 权重平均。 每个主干张量是 0.85 × 微调权重 + 0.15 × v1 权重(v1 的 LoRA 适配器以 fp32 合并进基座),以 fp32 计算并一次性舍入到 bf16。保留微调模型的指针头。该比例是在开发数据上从六个混合方案(0.85 / 0.70 / 0.50,配任一指针头)中选出的。
  3. 校准。 单个温度,T = 1.32,在两个父模型都没训练过的留出数据集的 648 个问题上最小化负对数似然:448 个来自 transfer-r3 的校准划分(六个公开数据集,QNLI、SciQ、TweetEval-offensive、PAWS、MMLU 和 Emotion,加两个生成的政策记录留出家族)和 200 个 MMLU-Pro 问题(transfer-v9 开发)。没有使用任何训练语料的划分,一项检查发现与训练数据无重叠。

评测

方法。 每次比较都是与 Kev-27B v1 在相同条目上、各模型在其自身发布温度下。测试划分为本 checkpoint 读过一次;transfer-v4 测试是锁定的(每个候选读一次),并对照事先固定的门槛评判(准确率 ≥ 0.886,Brier ≤ 0.165)。区间是 95 % 配对 bootstrap,重采样整条记录(2,000 次重采样),所以共享同一 state 的问题一起移动。差值以百分点(pp)计。套件如下:

  • breadth-v1:五个领域(知识、语言、检索、工具、艺术)的 14 个留出公开数据集,从未训练。
  • tasksource-heldout-v1:与授权组件同一个多任务集合的 24 个整任务家族,训练时留出。
  • hard-v1:程序化标注的技能记录(长政策、权衡、概率、多跳、日期与数字、评判、弃答);测试划分留出已训练生成器的模板。
  • devtools-v1:来自经许可证核查的公开来源的开发者工具决策(代码评审、commit 消息、安全、不稳定测试)。
  • documents-v1 / documents-v2:美国消费金融投诉叙述(CFPB);v2 是私有的留出测试集。
  • transfer-v4:来自六个从未训练的公开来源的域外决策,加上留出的政策结构。
  • longdoc-v1:最多 64k tokens 的 CUAD 商业合同,以及生成的协议包。

头条面板排除标签审计(在本 checkpoint 构建之前完成)认为不健全的条目¹;每次排除都会从两个模型移除相同的行。

对照 v1 的结果(测试划分)。

面板(问题数) Kev-27B v2 Kev-27B v1 Δ [95 % CI]
留出公开数据集,breadth-v1,10 个数据集(2,489) 0.832 0.820 +1.2 [+0.3, +2.2]
留出任务家族,tasksource-heldout-v1,17 个家族(2,024) 0.795 0.743 +5.3 [+3.7, +6.8]
技能、开发者工具与文档,合并(2,795) 0.889 0.800 +8.9 [+7.5, +10.3]
  hard-v1(1,088) 0.918 0.749 +16.9 [+14.2, +19.8]
  devtools-v1,审计来源(771) 0.825 0.789 +3.6 [+1.3, +5.9]
  documents-v1(936) 0.908 0.869 +4.0 [+2.1, +5.9]
documents-v2,私有留出(953) 0.921 0.881 +4.0 [+2.0, +6.1]
breadth-v1,全部 14 个数据集(3,089) 0.757 0.748 +0.8 [−0.1, +1.8]
域外,transfer-v4 锁定测试(656):准确率 0.8887 0.8963 −0.8 [−2.0, +0.5]
域外,transfer-v4 锁定测试:Brier / ≤ 5 % 误差下的覆盖率 0.154 / 0.875 0.160 / 0.835 –

与其他决策模型的比较,在 breadth-v1 测试(全部 14 个数据集)上,用社区 Decision Index 0.2 的随机校正指数打分(每个数据集 (score − chance) / (1 − chance),在每个领域内取平均,然后 100 × 五个领域的均值)。Jev 经 Vercel AI Gateway 查询,AutoJev-27B(denis-pplx/autojev-27b,同一基座的完整权重微调)经其自己的服务器查询,各一次,在同一批条目上。

Kev-27B v2 Kev-27B v1 Jev AutoJev-27B
指数 [95 % CI] 52.3 [49.2, 55.4] 50.2 [47.0, 53.2] 54.0 [51.2, 57.0] 50.0 [47.0, 53.3]

对照 v1 的指数差是 +2.1 [−0.4, +4.6]。没有计算对 Jev 的配对区间。

长期文档(longdoc-v1 测试里的 CUAD 合同,按 token 计的 state 长度给出准确率 / ECE):

state 长度(问题数) Kev-27B v2 Kev-27B v1
8k 以下(867) 0.874 / 0.059 0.900 / 0.025
8k–16k(443) 0.880 / 0.052 0.892 / 0.028
16k–32k(442) 0.873 / 0.061 0.882 / 0.019
32k–64k(442) 0.867 / 0.060 0.876 / 0.014
全部(2,194) 0.874 / 0.053 0.890 / 0.007

跨全部长度的准确率差:−1.6 [−3.0, −0.3]。在生成的协议包(2,400 个问题)上两个模型都得 1.000。

上下文长度。 已验证上下文长度:65,536 tokens,即服务上限,来自 longdoc-v1 开发(与 8k 桶配对的 CUAD 准确率差,pp [95 % CI]:16k +0.2 [−0.7, +1.2],32k −0.2 [−1.2, +0.7],64k −1.1 [−2.4, +0.0];各 445–447 个问题)。规则与每个 Kev 1.0 规模所用相同:已验证长度是从 16,384 tokens 起向下的最大桶的名义大小,使得它以及它与 8,192 之间的每个桶都在容差内,即与 8k 桶相比 CUAD 准确率差,在同一合同、重复和问题上配对,其 95 % 下界至少为 −3 pp,且每条记录都被作答。

校准(期望校准误差,ECE,按服务状态;越低越好):

面板 Kev-27B v2 Kev-27B v1
breadth-v1 测试,10 个数据集 0.015 0.013
tasksource-heldout-v1 测试 0.049 0.051
hard-v1 + devtools-v1 + documents-v1 测试 0.014 0.027
transfer-v4 锁定测试 0.019 0.018
CUAD 合同,longdoc-v1 测试 0.053 0.007

在 648 个拟合问题上,5 折组不相交交叉验证把 ECE 从 0.048(原始)降到 0.038(折外);两个区间重叠。该温度的 90 % bootstrap 区间是 [1.20, 1.45]。在其两端,头条面板朝相反方向移动:breadth-v1 ECE 在 T = 1.20 时升到 0.026,tasksource-heldout-v1 ECE 在 T = 1.45 时升到 0.067。

其他结果。

套件 Kev-27B v2 Kev-27B v1
transfer-v4 开发,准确率 / Brier 0.851 / 0.218 0.848 / 0.229
短 state,transfer-r3 测试(1,150) 0.858 0.879
devtools-v1 测试,全部来源(1,071) 0.790 0.711
decision-v7 开发(v1 的训练分布) 0.865 0.866
MMLU-Pro,10 个选项(transfer-v9 开发) 0.675 0.665
以 p ≥ 0.9 作答的无法回答条目(越低越好) 0.00 0.00
SemIf(144) / WANLI-v2(1,002) / TypeSafe(89 个已作答行) 0.965 / 0.756 / 0.854 0.972 / 0.745 / 0.865
已训练生成器的留出领域,准确率 / ECE:ood-v2(4,988) 0.956 / 0.020 0.944 / 0.044
  agents-ood-v1(2,084) 0.988 / 0.032 0.967 / 0.137
  guardrails-ood-v1(4,949) 0.984 / 0.010 0.944 / 0.079

transfer-r3 测试是一个短 state 面板,来自与校准池相同的八个留出来源;decision-v7 是 v1 的训练分布;transfer-v9 装着 MMLU-Pro 和被移除决定证据的条目。SemIf(SemIf 项目的手写决策)、WANLI-v2(WANLI 测试划分的自然语言推理对)和 TypeSafe(SemIf 选的 TypeSafe 工作流案例)仅作报告:标签审计发现它们太小、饱和或有噪声,无法用来给模型排名。WANLI-v2 和 TypeSafe 于 2026-09-30 作为评测退役(约四分之一的 WANLI 对被其两位标注者标得不同,gold 取其中之一;TypeSafe 的 gold 是两个闭源前沿模型的平均答案,问题太少,无法区分 checkpoint);它们的数字作为记录保留。

服务一致性(H200,bf16 配融合内核和 CUDA graphs,200 条 decision-v7 开发记录 / 280 个问题):

检查 结果
服务 vs fp32 评测路径,最大 |Δp| 0.0223,没有答案改变
单个问题 vs 完整请求,最大 |Δp| 0.0039,没有答案改变
8k / 32k / 64k-token state 下服务 vs 评测,最大 |Δp| 0.0064 / 0.0095 / 0.0017,没有答案改变
64k-token state 的模型时间,新 state / 缓存 state 9.4 s / 733 ms
常驻内存 / 从热缓存加载时间 65.5 GB / 17.6 s
1 / 64 个并发客户端下的吞吐 21.1 / 36.4 请求/s

¹ 从头条面板中排除:四个 breadth-v1 数据集(routerbench,其 state 缺少所问的信息;cfcolor 和 humicroedit,对每个系统都处于随机水平;chessbench,对每个系统都处于下限);七个标签无效或无法恢复的 tasksource-heldout-v1 家族(名字不公开);以及两个 state 无法决定其标签的 devtools-v1 任务(flakeflagger、commit 变更类型)。transfer-r3 的 emotion 来源(远端关键词标签)从 局限 里的短 state 面板中排除。

局限与取舍

  • 选择。 发布的 checkpoint 是在已知一个更早候选的测试结果后选出的,并在同一批测试集上确认。把测试余量当作偏乐观。
  • 短 state 上没有增益。 它在短输入上不比 v1 更好:锁定的 transfer-v4 测试 −0.8 pp [−2.0, +0.5],短 state 开发面板(transfer-v4 开发加不含 emotion 的 transfer-r3 测试)−0.9 pp [−2.0, +0.1],整个 transfer-r3 测试 −2.1 pp [−3.5, −0.8]。
  • 在长合同上更差且过度自信。 在 CUAD 上它比 v1 低 1.6 pp 准确,且 ECE 在每个长度上都是 v1 的 2 到 4 倍(总体 0.053 对 0.007)。CUAD 的问题里有一些错误或有争议的 gold 标签,但差距在各长度上是一致的。做合同审查时,在你自己的标注文档上重拟合温度(python -m kev.calibrate),或改用 v1。
  • 分布内增益。 hard-v1、devtools-v1 和 documents-v1 的训练划分就在训练数据里,而 ood-v2、agents-ood-v1 和 guardrails-ood-v1 套件是也产生了训练数据的生成器的留出领域。那里的增益测的是已训练家族的留出条目,不是到新任务的迁移。
  • 基座训练未知。 基座是 Qwen 的后训练发布版;其训练数据不为人知,所以无法排除它与任何评测的重叠。
  • 知识。 知识由基座决定:MMLU-Pro 是 0.675,对 Jev 在同一批条目上的 0.840。
  • 未训练的长度。 32k–64k tokens 的 state 经过评测(longdoc-v1)但未训练。
  • 退役套件。 一个用来选 v1 的支持工单套件(scienthoon)在 v2 构建前作为不健全退役,所以 v2 在它上面没有结果。v2 未平均的微调父模型在那里比 v1 低 5.5 pp [−7.8, −3.2]。
  • 温度不确定性。 温度的区间([1.20, 1.45])让测试 ECE 移动最多约 0.02。
  • 硬件。 它需要一张 80 GB 级数据中心 GPU(最长的 state 需要超过 80 GB)。经 MLX 在 Apple Silicon 上:v2 的完整 bf16 权重需要约 51 GB 加工作内存,所以 64 GB Mac 是边界,96–128 GB Mac 应该能装。这是从更小模型上的测量推断的,尚未在大 Mac 上测量:通过同一路径加载完整权重 Kev-4B 的峰值就是其权重大小(8.4 GB),其答案与 fp32 评测路径相差在 0.015 以内(runs/mlx-full-4b)。v1(LoRA 适配器,tag v1-lora)由外部贡献者在一台 128 GB M5 Max 上通过 MLX 服务(PR #175):transfer-v4 开发上准确率 0.849,对发布的 0.848,适配器合并时稳态 52 GB、峰值 97 GB。

偏见、风险与伦理考量

  • 校准概率可能制造不当的信任。温度是在公开留出数据集上拟合的,不迁移到每个工作负载;在设阈值之前,先在你自己的标注样本上测量准确率与校准。
  • 准确率和校准会随领域变化而偏移(例如在长合同上)。请监控生产错误率,而不是依赖上面的数字。
  • 未经人工复核,不要用它做关于人的有后果的自动决策。基座模型和训练数据的偏见(包括其他模型产生的标签)未被测量。
  • state 可能包含个人或机密数据。自托管把输入留在你自己的硬件上;除非设置了 KEV_API_KEY,服务器是开放的,所以请应用你自己的访问控制与数据处理策略。

算力

  • 微调:8 × NVIDIA H200,16.2 h 训练时间(129 GPU-hours),不含重启和评测。
  • 权重平均:CPU 上约 6 分钟。
  • 评测与服务检查:Modal 上的单张 H200 GPU。

溯源与可复现性

  • 代码、套件与评测报告:github.com/jaredpalmer/kev。发布数字:runs/release/kev-27b-r23.json(scripts/release_numbers.py --release kev-27b-r23)。
  • 微调:第 22 轮试验 r22-27b-lr2e6/00-trial-0(experiments/round22/lr2e6.json),权重 sha256 3fa0182a…。混合:第 23 轮臂 27b-k-w85(scripts/interpolate_checkpoint.py --toward;Hub 仓库里的 interpolation.json),选择规则和确认阶段在 experiments/rounds/r23.json;结果在 runs/r23-readout/、runs/r23-verdict/、runs/r23-breadth-report/、runs/serving-27b-r23*/。
  • 混合来源:v1 在 jaredpalmer/kev-27b@01b81998(试验 r6-27b-v2/01-trial-1),现 tag v1-lora。
  • 发布的权重 sha256 d27af6ab2be16824166ac639907b4dba40979ff338599c2872721aa6c5072022;head.pt sha256 7968f17b03479c1ef9d1c0f3ab8a15e31ecb441cf40691b07ee945ab554d45ad(T = 1.3195)。权重发布于 Hub commit 28be62e9。
  • 验证:在 H200 上从 Hub 匿名加载,它在 252 个 SemIf 行中的 252 个和 764 个 transfer-v4 开发行中的 764 个上精确复现了发布前评测的 logits(runs/release/kev-27b-r23-published.json、runs/release/kev-27b-r23-staging.json)。

引用

@misc{palmer2026kev27b,
  title        = {Kev-27B: a calibrated decision model on Qwen3.8-27B},
  author       = {Palmer, Jared},
  year         = {2026},
  howpublished = {\url{https://huggingface.co/jaredpalmer/kev-27b}},
  note         = {Version 2, released 2026-09-30}
}

联系

问题与 issue:github.com/jaredpalmer/kev/issues。