返回博客列表

Kev 实战:训练并部署一个 Jev 式的开源决策模型

2026-10-15T23:50:00+08:00
KevJevQwen微调Modal决策模型

Jev 不生成一个字就能回答问题,但它是托管模型,你看不到权重,也改不了它的概率。有人把它重建成了开源的。

提纲

  • Kev 是什么:与 Jev 的关系,以及四个尺寸怎么选
  • 先跑起来:本地起服务,发一个工单过去
  • 微调:把自己的问题绑进模型,顺便把置信度校准
  • 部署:一条命令拿到 HTTPS 端点,并接进现有代码
  • 诚实清单:它不擅长什么

Kev 是什么

Kev 是 Jared Palmer 做的一组小型决策模型,构建在 Qwen3.5 / Qwen3.8 之上,架构依据是 Jev's Architecture Unmasked 一文。它的定位一句话说清:小而可自持的 Jev 式决策模型。仓库 Apache-2.0 协议,目前 9,100+ Star。

它和 Jev 的关系值得先说。Jev 是 TypeSafe 的 System One 托管模型,回答的是带类型的问题——是/否(noul)、多选(choice)、打分(score)——而不是生成 token。这个问题设计有讲究:一次请求可以同时问三个问题,它们共享同一段文本,但彼此读不到对方的答案,避免模型用问题 A 的答案去"推理"问题 B。

Kev 复刻了这套 API,所以它是个 drop-in 替换:TypeSafe 的 Python SDK 指向 Kev 服务器就能直接跑,其余代码一行不改。而它比 Jev 多出来的能力是——你能训练它。

官方一口气放了四个尺寸,版本号统一为 Kev 1.0:

模型 底座(协议) 运行硬件 已验证上下文 公开数据集指数
Kev-0.8B Qwen3.5-0.8B-Base(Apache-2.0) 任意 4GB GPU / 任意 Apple Silicon 8,192 23.3
Kev-4B Qwen3.5-4B-Base(Apache-2.0) L40S / H100 8,192 38.0
Kev-9B Qwen3.5-9B-Base(Apache-2.0) L40S / H100 8,192 41.0
Kev-27B Qwen3.8-27B(后训练版,Apache-2.0) B200 / H200 / H100 80GB 65,536 52.3
Jev 托管 TypeSafe API – 54.0

表格最后一列是社区 Decision Index 在 breadth-v1 测试集上的机会校正指数——14 个公开数据集、五个领域,Kev 训练时一个都没见过。Kev-27B 的 52.3 与 Jev 的 54.0 只差 1.7 个点;换到"新来源"准确率上,Kev-27B 是 0.851、Jev 是 0.857,几乎贴平,而 Kev-4B / 9B 也在四个点以内。作者很克制地加了一句:不知道 Jev 的训练数据,所以这不是两种架构的受控对比。

选型建议也很直白:从 Kev-4B 开始;GPU 更大就上 9B;有 80GB 显卡且追求最高准确率就上 27B;尺寸比准确率重要时用 0.8B。前三者共用一套配方——冻结底座 + 一个小适配器(LoRA),27B 则是全量微调,因此发布的是 51GB 完整权重而非适配器。

先跑起来

本地运行需要 Python 3.12/3.13 和 uv。这里有个坑要提前避开:

PyPI 名称冲突:pip install kev 装的是另一个包——2016 年的 K.E.V. ORM。本项目没有发布到 PyPI,只能从源码安装。

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-4b --port 8009

启动后它自己挑硬件:有 NVIDIA 显卡走 CUDA(含 ROCm),Apple Silicon 走 MLX,都没有才退回 CPU。--device auto 默认会在子进程里先试探一次矩阵乘法,探不通再降级,探不通还超时会有告警——KEV_DEVICE_PROBE_TIMEOUT 控制单次探测上限,默认 30 秒。

另开一个终端,发一张客服工单进去:

curl -s localhost:8009/v1/systemone -H 'content-type: application/json' -d '{
 "state": "Shoes arrived two weeks late and in the wrong size. Also I see two charges on my card.",
 "model": "kev-latest",
 "questions": {
 "department": {"type": "choice", "instructions": "Which team should handle this?",
 "criteria": {"returns": "Exchanges, refunds, wrong or damaged items",
 "shipping": "Delivery status, delays, lost packages",
 "billing": "Charges, invoices, payment problems"}},
 "escalate": {"type": "noul", "instructions": "Does this need urgent human attention?"},
 "frustration": {"type": "score", "instructions": "How frustrated is the customer?",
 "criteria": ["Calm", "Frustrated", "Very angry"]}
 }}'

官方在 Apple M5 上跑 Kev-4B 的返回长这样(节选):

{
 "answers": {
 "department": { "type": "choice", "choice": "returns", "confidence": 0.21,
 "probabilities": { "returns": 0.47, "shipping": 0.28, "billing": 0.25 } },
 "escalate": { "type": "noul", "noul": 0.93 },
 "frustration": { "type": "score", "score": 1.44,
 "probabilities": { "0": 0.00, "1": 0.56, "2": 0.44 } }
 },
 "latency_ms": 495
}

注意 department 那一项:top-1 是 returns,但置信度只有 0.21——因为它同时看到了退货、延迟、扣款三条线索。这正是 Kev 返回概率分布而不是单一标签的原因:你的代码可以放行高置信度的,剩下的转人工。

微调:把问题绑进模型

发布版是在公开数据上训练的。如果你的问题长得不一样——自己的路由分类、自己的升级规则、另一种语言——官方给的建议是微调,而且"通常比改 prompt 更有效"。

微调带来的不只是准确率,还有校准:训练过程中会在留出切片上拟合温度参数(temperature)写进检查点,于是你拿来设阈值的那个置信度,是在你自己的标签上测出来的。托管模型做不到这一点,这就是全部论点。

先看它有多大用。官方的示例工作负载(客服工单、三个问题、1,050 条生成记录、H100 上 15 分钟、约 1 美元):

  • 准确率 67.7% → 73.6%(95% 置信区间 +2.3 到 +9.7 点)
  • Brier 分数 0.402 → 0.330
  • 5% 错误预算下可自动化的决策占比 34% → 48%

真实数据上更明显:一份 5,219 条标注的消费金融投诉,训练一个 epoch 后 Kev-4B 在没见过的投诉上从 0.804 升到 0.904。

但有个前提——数据集得够大。同样是那个示例工作负载,400 条记录的提升完全埋在噪声里(+0.6 点,置信区间 ±6 点)。所以官方脚本里专门有一个 plan_size.py,把"以 80% 检验力检出 +5 点提升"翻译成记录数,通常三个问题、每问题约 1,000 条。

用 coding agent 跑完整循环

最省事的方式是让 agent 来干:

npx skills add jaredpalmer/kev@kev-finetune

然后跟它说"fine-tune Kev on my support tickets"。这个 skill 会:访谈你、在你的代码库里找出已经在问的问题、转换你现有的标签或生成足够的数据、在 Modal 上从发布版检查点微调、在留出切片上拟合温度、和未微调的模型对比打分、部署端点,最后把资源全部清理掉。整个过程不需要本地 GPU,也不需要克隆仓库。一次 Kev-4B 训练在 H100 上大约 $1。

手动跑

把例子写成 JSONL,每行一条请求,形状和 API 请求一样,只是每个问题多一个 label:

{"state": {"subject": "Charged twice", "body": "I see two charges for order #4411. Please refund one."},
 "questions": {
 "team": {"type": "choice", "instructions": "Which team should handle this ticket?",
 "criteria": {"billing": "Payments and refunds", "shipping": "Delivery problems", "access": "Login and account access"}, "label": "billing"},
 "angry": {"type": "noul", "instructions": "Is the customer angry?", "label": false},
 "priority": {"type": "score", "instructions": "How urgent is this ticket?", "criteria": ["low", "normal", "high"], "label": 1}}}

标签规则要记牢:choice 填选项名,noul 填 true/false,score 填从 0 开始的层级下标。留 10–20% 出来做评估。

uv run python -m kev.train --data train.jsonl --base Qwen/Qwen3.5-4B-Base --init_from jaredpalmer/kev-4b \
 --epochs 2 --lr 2e-5 --batch 1 --accum 8 --dtype bf16 --checkpointing 1 --device cuda --out runs/mine

uv run python -m kev.benchmark --run runs/mine --data heldout.jsonl --out runs/mine-eval
uv run --extra serve python -m kev.serve --run runs/mine --port 8009

这里最关键的是 --init_from。它会先加载发布版的适配器和指针头再训练,等于保留 Kev 已经会的东西,在上面叠你的领域。直接从头训练会把这些丢掉——官方引用了一位用户的测试:836 条支持工具决策上,从底座微调的模型在 Kev 自己的评估集上只有 0.33,而发布版是 0.84;同样的数据加上 --init_from,保住了 0.83,在新领域还达到了 0.88。学习率也要比从头训练更小,2e-5 是个好起点。

训练完该看哪些数

跑出来的表格别只看准确率,官方给了四个读数:

  • accuracy / brier 是头条,bootstrap 置信区间告诉你这个提升在开发集上是不是真的
  • ece 和"自信的错误"是校准故事:校准后必须比原始差,且微调模型的自信错误不能超过基线——否则不要部署
  • coverage at 5% error 是业务数字:这个错误预算下能自动化多少比例的决策,以及该用的置信度阈值
  • 公开记录上的回退要在 2 个点以内,超过说明模型忘了旧技能(降 --lr、保留 --replay)

部署:一条命令拿到 HTTPS 端点

不想自己修服务器的话,有 Modal 账号就够了,不需要这个仓库:

pip install modal && modal setup
curl -LO https://raw.githubusercontent.com/jaredpalmer/kev/main/skills/kev-deploy/scripts/kev_serve.py
KEV_API_KEY=$(openssl rand -hex 24) modal deploy kev_serve.py

它会在 Modal 上起一个容器,加载检查点,并按 TypeSafe 的 System One 协议提供服务(POST /v1/systemone、GET /v1/models),地址形如 https://<your-workspace>--kev-api.modal.run,空闲时自动缩容到零。

尺寸与成本的对照(Modal 官方实测):

KEV_MODEL 自动选用的 GPU 单价($/小时) 冷启动(权重已缓存)
kev-0.8b L4 0.80 ~40 s
kev-4b(默认) L40S 1.95 ~35 s
kev-9b H100 3.95 ~55 s
kev-27b B200 6.25 ~50 s

两个容易被忽略的坑:一定要设 API key,否则拿到 URL 的任何人都能烧你的 GPU 时间;一定要用同一个 HTTP client 复用连接,而且建议用 KEV_REGION 把容器钉在调用方附近的区域——官方实测一个没钉区域的 Kev-4B 落在了法兰克福,从美国过去每次往返多约 150ms。

部署完先热身(冷启动期间 Modal 会返回 303 重定向,所以要跟重定向):

curl -sL --max-time 900 $KEV_URL/v1/models -H "authorization: Bearer $KEV_API_KEY"
curl -s $KEV_URL/v1/models -H "authorization: Bearer $KEV_API_KEY"   # 返回服务的检查点、温度、已捕获的 CUDA graph 数

接进现有代码只需要换 base URL 和 key:

client = TypeSafeClient(api_key=KEV_API_KEY, base_url=KEV_URL, model="kev-latest")   # 原来: TypeSafeClient(api_key=TYPESAFE_KEY)

注意一个命名差异:问题类型写 "noul",不是 "boolean"。另外训练时用的指令文本和选项名称,必须和生产环境发的一模一样——微调就是把这些字符串绑进模型的。

跑完要收摊:

modal app stop kev                # URL 立即失效
modal volume delete kev-hf-cache  # 可选:缓存权重,下次部署会重新下载

整个流程串起来是这样:

flowchart TB
    A["workload.json
decision + questions"] --> B["plan_size.py
how many records"] B --> C["convert_data / generate_data
labelled records"] C --> D["split_data.py
train / calibration / dev"] D --> E["kev_modal.py train
LoRA warm-start + temperature fit"] E --> F["result.json + errors.jsonl
baseline vs fine-tuned"] F --> G["modal deploy
HTTPS System One endpoint"] G --> H["TypeSafe SDK / raw HTTP
swap base_url only"] F -->|"iterate on errors"| C

诚实清单:它不擅长什么

一份好的开源发布应该自己把丑话说在前面,Kev 的 1.0 发布说明做到了:

  • 训练内提升不等于泛化提升。 过去一年那些大涨都发生在训练集包含在该套件训练数据里的场景。在完全没训练过的数据集上,Kev-27B 比 Jev 低 1.7 个指数点,小尺寸要低 13–31 点。
  • 上下文长度别用服务上限。 Kev-0.8B/4B/9B 只训练到 7,552 token,27B 训练到 32,768,但服务层接受 65,536。看已验证上下文,不看服务上限——小尺寸在 16k 就已经跌破 3 个点的容差。
  • 27B 在长合同上反而更差、而且过度自信(CUAD 测试集 ECE 0.053,对比 v1 的 0.007)。做合同审查请用 @v1-lora,或者自己在文档上重新拟合温度。
  • 0.8B 不要用来做工具路由。 它的 When2Call 准确率在文档与技能阶段后跌到 0.133,比随机还低。
  • 日期算术是最弱的一族,27B 以下每个尺寸都弱(deadline 策略准确率 0.35 / 0.65 / 0.725,Jev 是 0.95),KEV_DATE_FACTS=1 能帮上忙。
  • 知识量由底座决定,MMLU-Pro 在 0.230–0.675 之间,Jev 是 0.840。Kev 是决策模型,不是知识库。
  • 一个模型只有一个温度,它无法重排置信度顺序——所以在 5% 错误预算下,域外能自动化的决策数会比 Jev 少。

参考链接

  1. Kev 仓库 README
  2. kev-finetune SKILL.md
  3. kev-deploy SKILL.md
  4. Kev 1.0 发布说明与已知限制
  5. 在线试用(Hugging Face Space)
  6. Kev 模型集合(0.8B · 4B · 9B · 27B)
  7. Jev's Architecture Unmasked
  8. TypeSafe System One API 文档

作者: itech001 来源: 公众号:AI人工智能时代(the-ai-era) 网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友