八道题覆盖第 2~8 章主干,每题标注出处章节与难度(★ 入门 / ★★ 进阶 / ★★★ 综合)。先自己动手,卡住再展开提示;多数题在本书正文的代码上小改即可完成。所有题目 CPU 即可完成,除第 8 题需一次小规模训练。
给定任意一份 messages JSONL,扩展 2.1 的 check_messages.py:除四种基础脏数据外,再检出"assistant 回答以免责腔开头""回答与提问完全相同""末轮不是 assistant"三类问题,输出各类问题的计数与前三条例子。
提示:免责腔与自问自答的判定规则在 2.2 的 rule_filter 里现成;统计口径按"每行每类最多记一次"设计,避免一条坏样本刷爆计数。
用 3.1 的两次渲染求差法对 20 条样本构造 labels,统计"非 -100 的 token 占比",验证落在 3.3 提示的 20%~60% 区间;对占比最高的样本打印 token 与 label 对照,解释它为什么高。
提示:占比 = labels 中不等于 -100 的个数除以总长度;占比过高通常意味着 user 消息极短而回答极长——这是数据的正常形态而不是 bug。
从一次 SFT 运行中取 3 个 checkpoint(早/中/末),用 5.1 的三固定探针对每个各跑一遍,把同一问题的三个回答并排贴成一页"能力成长日志",标出格式期→停止期→指令期的分界。
提示:贪心解码(do_sample=False)保证三次可比;若三档差异不明显,把 max_new_tokens 放大到 100 再看停止行为。
把 4.1 的 startswith 断言与 4.3 的三板斧(前 50 token、终止符 id、模板哈希)合并成一个 preflight.py,对任意模型目录输出 PASS/FAIL,并故意制造一次"换了模板"的错位,验证它真能抓到。
提示:制造错位最简单的方法:临时用另一个 tokenizer 的 chat_template 渲染同一段 messages——模板哈希对比应立刻报警。
用 5.2 的六维 rubric 给 20 条模型回答打分(自己打一遍、LLM 裁判打一遍),统计六维各自的"人机一致率",找出一致率最低的维度并改写它的锚点描述,复测一轮。
提示:一致率最低的通常是"真实性"——裁判并不知道事实对错。锚点里补上"无法核实的事实陈述按 1 分处理",往往能显著收敛。
对同一冻结题库(10 题即可),分别用 f16、Q8_0、Q4_K_M 三个 GGUF 生成回答(贪心解码),按 5.2 台账格式记录六维均分差与致命零分率,给出你的选档结论。
提示:差异未必体现在分数上——先把三组回答并排人眼读一遍再打分;Q4_K_M 的典型劣化是措辞与流畅度,而非事实错误。
录一段 10 秒左右的中文提问,分别用 tiny/base/small 三档转写,记录各档耗时与错字数,按 7.2 的实时性预算表决定你的闭环该用哪一档。
提示:计时用 time.perf_counter() 包住 transcribe 调用;注意 CPU 与 GPU 下的结论可能完全不同——按你的部署环境测,别照抄别人的选档。
用同一 124M 基座做两组小规模 SFT:A 组纯中文数据 2000 条,B 组中文 1400 条 + 英文 600 条(约 70/30)。训练后用 5.2 题库的中英对照层各评一轮,验证 8.1 的配比主张:B 组英文层掉分更少,且中文层不显著弱于 A 组。
提示:2000 条量级下差异不会巨大——重点练的是"控制变量 + 同尺测量"的流程本身;把两组的训练配置逐项对齐(同 lr、同 epoch、同种子),比结论更重要。
做完八题,第 2~8 章的工程闭环就都过了一遍手。下一个练习场在 《深入理解 AI Agent:设计原理与工程实践》第 7 章——对齐训练见。