类Jev项目Kev从入门到实战(5):如何训练:从数据构造到评测的完整管线

PART 5|如何训练:从数据构造到评测的完整管线

数据格式:一个 JSONL 搞定

一行一个请求,与 API 请求同形状,每个问题多一个 label:

jsonl 复制代码
{"state": {"subject": "Charged twice", "body": "I see two charges for order #4411."},
 "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 的 label 是选项名,noul 是 true/false,score 是等级序号(从 0 起)。留 10--20% 做评测。

最重要的一条:从 released checkpoint 出发要 --init_from

从底座 base 起训会把 Kev 已有能力全部扔掉。官方引用的一个实测:836 条支持工单数据上,base 起训在 Kev 自己的评测集掉到 0.33,而同样的数据 --init_from 保住 0.83 且新域到 0.88。

bash 复制代码
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 时学习率要降(2e-5 起步);--base 必须与 checkpoint 匹配(trainer 会校验底座、revision、LoRA rank、head size);--batch 1 --accum 8 bf16 下 0.8B 只要 4GB 显存。Mac 上一次只跑一个训练任务。

实战管线:我在知识图谱项目里的完整流程

复制代码
图谱元数据 ──▶ 自产训练数据(五任务,train/heldout/eval 三集样本严格不相交)
        │
        ▼
分段微调(Qwen3-0.6B-Base + LoRA r=16,lr 2e-4,bf16 + 梯度检查点,
          batch 1 × accum 8,state.json 记进度、任意中断零损失续跑)
        │
        ▼
统一评测(acc / confidence / ECE / AUROC / 延迟,同一把尺量所有模型)
        │
        ▼
kev.serve 接入业务决策层

数据构造四条纪律(比训练超参重要得多)

  1. 标签只取客观元数据,绝不用系统自身输出做标签------否则是自证循环(用共现分数标签训练,模型学到的就是你的召回偏置)。
  2. 任务设计成低基数(5 选 1 或二元)。高基数分类上,这类选项打分模型会塌------我测过 77 类的分类任务直接崩掉。
  3. 训练与运行的问题措辞逐字同源。强烈建议定义一个共享常量,两边 import,绝不复制粘贴。这是我从 0.400 到 1.000 的那条修正。
  4. 任务行数不均衡时,交错后必须洗牌。固定种子的 shuffle。我踩过的坑:数据不均衡 + 顺序交错,导致训练尾段 40% 全是同一任务,把另一个任务灾难性遗忘(0.925 → 0.215);等量数据时此 bug 完全不可见。

主结果

任务 零样本底线 微调后
朝代归属(5 选 1) 0.185(随机线 0.2) 0.925(AUROC 0.89,ECE 0.018)
下一跳选择(5 选 1,问法对齐后) 0.215 1.000(rank 对照 20/20)
作者归属(5 选 1) 0.145 0.32--0.34(AUROC 0.64)
体裁归属(5 选 1) 0.185 +0.000(选项描述口径缺陷所致)
作者判定(二元 noul) 0.475 0.6B 学不动(重设计数据后仍随机)

三个可迁移的结论:

  • 微调增益与任务性质强相关:纯形式可判的(朝代/体裁线索)增益大或受数据质量限制,需要实体知识的(作者判定)小模型学不动------先升级到 4B,或在 state 里注入知识,而不是加数据。
  • 零样本全随机是常态不是异常 :我在诗歌域测的多个类 Jev 模型(含 Kev)零样本全部落在随机线附近。这类模型的价值在微调之后,选型时别被零样本 demo 迷惑。
  • 评测口径要统一且固定:choice 看 picked==answer;noul 的 AUROC 用 Mann-Whitney U(逐阈值扫描在量化分数上会塌成 0);ECE 用 |mean(conf) − acc| 简化口径。所有模型同一份数据同一把尺。

LoRA 无 resume 的解法:分段训练

kev.train 的 --resume 只支持 full_ft 模式。LoRA 中断续跑的解法是把训练切成 N 段(--steps-per-seg),每段结束存 checkpoint,下一段 --init_from 上一段输出,外层脚本用 state.json 记进度------中断后重跑同一条命令即可续。每段约 5 分钟,对沙箱/CI 强杀长进程的场景零损失。

相关推荐
liferecords1 小时前
专家池 8→128 只慢 5%:Ai2 开源万亿参数 MoE 训练框架 Olmo-core 3
人工智能·开源·大模型·moe
海盗12341 小时前
微软技术日报 2026-10-02:微软首发流式转录模型,Win11 26H2 悄悄省内存
人工智能·microsoft·机器人·aigc
飞塔老梅子1 小时前
16. M5 Max 128GB内存能支持的最大模型 (2) ❀ 老梅子学AI
人工智能·flash·本地大模型·lm studio·qwen3.8
jimmyleeee1 小时前
大模型安全之三十八:AI 中的 DoS 攻击:当“拒绝服务”变成“拒绝钱包”
人工智能·安全
miofly1 小时前
openJiuwen X-Router:自演进模型路由技术,让 Agent 成本降 50%
人工智能
Cosolar1 小时前
云端部署阿里 Qwen-Image-2.1 保姆级教程
人工智能·后端·github
Python大数据分析1 小时前
开源免费、AI 驱动的 Web 打印设计器 OpenPrint:从拖拽设计到 ERP 对接全流程实战
前端·人工智能·开源
唐维康1 小时前
昆明理工大学817通信工程考研名额一年比一年少
人工智能·考研·昆明理工大学·昆明理工大学通信考研
Sammyyyyy1 小时前
结构化决策模型 Jev 实战笔记,3 个原语、4 个限制、5 个落地场景
人工智能·笔记·开发工具·编程语言