每学一个概念,都要留下能复现、能测量、能解释失败的证据
怎么使用这张清单
这篇是整个 llm-roadmap 系列的执行表。
前几篇按主题解释了 tokenizer、attention、KV cache、推理系统、数据、后训练、评测和 capstone。本篇把它们压成 34 个项目。每个项目都必须回答五个问题:
- 目标:这个项目解决哪一个真实问题。
- 动手任务:至少要写出什么代码或实验。
- 观察指标:用什么图或数字判断行为。
- 破坏实验:故意拿掉什么,看看系统如何坏掉。
- 产物:最后留下什么,方便以后复查。
不要追求一次性做大。每个项目都应该小到一两天可以完成第一版,大到足以暴露一个核心机制。
1. 从零实现 tokenizer
目标:理解文本进入模型之前如何被切成 token。
动手任务:实现字符级 tokenizer,再实现一个最小 BPE trainer。支持 encode、decode、词表导出、merge 规则导出。
观察指标:vocab_size、平均 token/字符比、不同语言 token 数、代码和 emoji 的切分结果。
破坏实验:用训练时不同的 tokenizer 做推理;删除 special token;把词表缩到很小。
产物:tokenizer 代码、切分可视化、词表大小对序列长度的对比图。
2. One-hot、embedding 与语义几何
目标:理解 token ID 不是语义,embedding 才是模型内部的可学习表示。
动手任务:实现 one-hot 表示、embedding table、cosine similarity 可视化。训练一个小 next-token 模型后观察 embedding 变化。
观察指标:embedding 范数、相似 token 的 cosine similarity、训练前后最近邻变化。
破坏实验:冻结 embedding;随机打乱 token ID;把 embedding 维度降得很小。
产物:embedding 投影图、相似 token 表、冻结/不冻结对比曲线。
3. 实现四种位置方法
目标:理解没有位置时 attention 不知道顺序。
动手任务:实现 learned position、sinusoidal、RoPE、ALiBi。至少在同一个 tiny model 上替换比较两种。
观察指标:训练 loss、验证 loss、超过训练长度后的生成质量、长句顺序错误样例。
破坏实验:完全去掉位置编码;把位置 ID 全设成 0;训练短上下文后推理长上下文。
产物:位置方法对比表、长度外推样例、顺序错误案例。
4. 手写 scaled dot-product attention
目标:把 attention 还原成 Q/K/V、点积、缩放、mask、softmax、加权求和。
动手任务:不用框架封装,手写单头 causal self-attention。
观察指标:attention heatmap、每行 softmax 权重和、未来位置权重是否为 0。
破坏实验:去掉缩放;去掉 causal mask;把 softmax 维度写错。
产物:最小 attention 实现、heatmap、mask 单元测试。
5. 扩展到 multi-head attention
目标:理解多个 head 如何在不同子空间里学习不同关系。
动手任务:实现多 head 并行、concat、output projection。
观察指标:不同 head 的 heatmap 差异、head 数与 loss 的关系、每个 head 的维度变化。
破坏实验:只保留一个 head;让所有 head 共享参数;移除 output projection。
产物:head 可视化、head ablation 表。
6. 构建单个 Transformer decoder block
目标:把 attention、MLP、normalization、residual 组合成 GPT block。
动手任务:实现 pre-norm decoder block,包含 causal MHA、MLP、residual、LayerNorm 或 RMSNorm。
观察指标:forward shape、梯度范数、loss 是否稳定下降。
破坏实验:去掉 residual;改成 post-norm;把 MLP hidden size 改小。
产物:decoder block 代码、shape 注释、稳定性对比。
7. 堆叠成 mini-former
目标:训练一个完整 tiny decoder-only language model。
动手任务:堆多层 block,实现训练循环、验证循环、generate 函数。
观察指标:train loss、val loss、tokens/sec、生成样例随 step 的变化。
破坏实验:数据太少、模型太大;学习率过高;不做验证集。
产物:训练脚本、loss 曲线、生成样例时间线。
8. 对比训练目标
目标:理解 architecture 相似,不代表 objective 相同。
动手任务:在小语料上实现 causal LM、masked LM、prefix LM 或 denoising objective 的最小版本。
观察指标:loss 曲线、补全样例、生成样例、mask 恢复准确率。
破坏实验:让 causal LM 看见未来;mask 比例过高;prefix 边界错误。
产物:目标函数对比表、样例输出、失败解释。
9. 构建 sampling dashboard
目标:理解 logits 到文本之间还有 decoding 策略。
动手任务:实现 greedy、temperature、top-k、top-p、repetition penalty。
观察指标:entropy、候选 token 数、重复率、同 prompt 多次采样差异。
破坏实验:temperature 极低和极高;top-k=1;top-p 太小。
产物:交互式或 notebook dashboard、参数对比样例。
10. 实现 speculative decoding
目标:理解如何用 draft model 提升自回归生成速度。
动手任务:实现 draft 生成、target 验证、接受/拒绝逻辑。
观察指标:接受率、tokens/sec、目标模型调用次数、不同 draft 规模对比。
破坏实验:draft 太弱;一次 draft 太多 token;验证逻辑错误。
产物:spec decoding demo、速度对比图、接受率统计。
11. 实现 KV cache
目标:理解推理时为什么不能每步重算全部历史。
动手任务:写 generate_no_cache 和 generate_with_cache 两个版本。
观察指标:prefill 时间、单 token decode 时间、cache 显存、上下文长度扩展曲线。
破坏实验:cache 位置错位;不同 batch 的 cache 混用;cache 不清理。
产物:KV cache 代码、延迟曲线、显存公式推导。
12. 实现 MQA、GQA,理解 MLA
目标:理解减少 KV head 如何降低 cache 压力。
动手任务:在 attention 里支持 MHA、GQA、MQA 三种 KV head 配置。
观察指标:KV cache 大小、tokens/sec、验证 loss 或小任务指标。
破坏实验:把 KV head 缩到 1;错误广播 K/V;让 query head 与 KV group 不匹配。
产物:MHA/GQA/MQA 对比表、cache 计算表。
13. 滑动窗口 attention 与 attention sink
目标:理解长上下文不是简单调大 block_size。
动手任务:实现 sliding-window attention,并保留开头若干 sink token 的变体。
观察指标:长上下文 latency、远距离信息保持、needle-in-a-haystack 准确率。
破坏实验:窗口太小;去掉 sink token;把关键事实放在窗口外。
产物:长上下文压力测试、准确率曲线、失败样例。
14. RoPE scaling 与上下文扩展
目标:理解位置外推、插值和长上下文微调的关系。
动手任务:比较原始 RoPE、线性 scaling、NTK-style scaling 或 YaRN-style 插值思路。
观察指标:不同长度 perplexity、长文问答准确率、短上下文质量是否退化。
破坏实验:只改配置不做评测;训练长度与推理长度差距过大。
产物:上下文扩展评测表、短长上下文对比。
15. 比较 naive attention、SDPA、FlashAttention
目标:理解同一数学操作为什么工程性能差异巨大。
动手任务:用手写 attention、PyTorch SDPA、FlashAttention 可用实现做 benchmark。
观察指标:latency、peak memory、不同 B/T/C/head 下的变化。
破坏实验:显式 materialize 大 attention matrix;把序列长度翻倍。
产物:性能曲线、显存曲线、瓶颈分析。
16. 建立硬件预算
目标:把参数量、显存、带宽、精度、并发放到同一张表里。
动手任务:写一个表格或脚本,估算权重显存、KV cache、batch 并发、decode 带宽压力。
观察指标:模型大小、上下文长度、并发数、precision 对显存和吞吐的影响。
破坏实验:只看参数显存而忽略 KV cache;只看峰值吞吐而忽略首 token 延迟。
产物:自己的硬件预算模板。
17. 实现 two-expert MoE router
目标:理解 sparse activation 如何增加总参数而不等比例增加每 token 计算。
动手任务:实现两个 expert、router、top-1 或 top-2 dispatch。
观察指标:expert utilization、router entropy、load balance loss、训练 loss。
破坏实验:router collapse 到单个 expert;不加负载均衡;expert 容量太小。
产物:MoE toy model、路由直方图、collapse 案例。
18. 复现 sparse model trade-offs
目标:理解 dense 与 sparse 的容量、吞吐、通信和训练稳定性取舍。
动手任务:比较同等 activated params 下 dense MLP 与 MoE block。
观察指标:参数量、激活参数、tokens/sec、loss、expert imbalance。
破坏实验:expert 太多但数据太少;batch 太小导致路由不稳定。
产物:dense vs MoE 对比报告。
19. 实现 toy state-space 或 linear-attention model
目标:理解 Transformer 之外的序列建模路径。
动手任务:实现一个极小的 linear attention 或 state-space 风格模块。
观察指标:序列长度增加时的时间复杂度、短任务准确率、长依赖能力。
破坏实验:用需要精确复制远距离 token 的任务测试。
产物:toy 实现、复杂度对比、适用边界说明。
20. 实现 diffusion-style language model toy
目标:理解非自回归文本生成和 denoising 思路。
动手任务:构造 mask-noise 数据,让模型逐步恢复文本。
观察指标:不同 denoise step 的恢复质量、并行生成速度、错误类型。
破坏实验:mask 比例过高;步数过少;训练目标和采样过程不一致。
产物:denoising demo、恢复过程可视化。
21. 构建预训练数据管线
目标:理解数据质量是预训练的底座。
动手任务:实现采集、清洗、去重、语言检测、长度过滤、切分、数据卡片。
观察指标:重复率、长度分布、语言分布、过滤前后样例。
破坏实验:不去重;把验证集泄漏进训练集;混入模板化低质文本。
产物:数据处理脚本、数据卡片、过滤报告。
22. 合成数据:生成、过滤、证明有效
目标:避免把合成数据当成免费质量。
动手任务:生成一个任务数据集,做质量过滤、去重,再训练 mixed 数据版本。
观察指标:真实 eval 上的提升、样式重复率、错误传播样例。
破坏实验:不做过滤直接混入;用同一个模型生成和评测。
产物:real-only / synthetic-only / mixed 对比报告。
23. 训练不同规模模型并拟合 scaling curves
目标:建立参数、数据、计算之间的直觉。
动手任务:训练 tiny/small/medium 三个模型,尽量控制数据和训练设置。
观察指标:loss vs params、loss vs tokens、训练时间、过拟合点。
破坏实验:模型变大但数据不变;数据变大但训练步数不足。
产物:scaling curve、compute 预算笔记。
24. SFT、instruction tuning 与 preference tuning
目标:理解 base model 如何变成 assistant。
动手任务:准备 instruction 数据,做 SFT;准备偏好对,做 DPO 最小实验。
观察指标:指令跟随率、格式稳定性、拒答/幻觉样例、偏好胜率。
破坏实验:数据格式混乱;答案风格不一致;偏好数据存在明显偏置。
产物:SFT 数据样例、adapter、before/after 对比。
25. Toy RLHF、PPO、GRPO、RLVR lab
目标:理解强化学习在 reasoning 和偏好优化中的位置。
动手任务:构造一个小任务,定义 reward,跑 toy PPO 或 GRPO-style 相对奖励。
观察指标:reward 曲线、KL、输出长度、是否 reward hacking。
破坏实验:reward 写得过窄;不加 KL 约束;只奖励格式不奖励正确性。
产物:toy RL notebook、reward hacking 案例。
26. 量化模型并测损伤
目标:理解量化改变的是数值行为,不只是文件大小。
动手任务:比较 FP16、INT8、INT4、GGUF/GPTQ/AWQ 中至少两种。
观察指标:模型大小、显存、tokens/sec、perplexity、小任务准确率。
破坏实验:过低 bit;不校准;只看速度不看质量。
产物:量化损伤表、推荐配置。
27. 多 serving stack 对比
目标:理解推理框架解决的是调度、缓存、batching 和硬件利用。
动手任务:同一模型分别用 llama.cpp、vLLM 或其他栈部署。
观察指标:首 token 延迟、吞吐、并发、显存、失败日志。
破坏实验:长上下文并发;小 batch 与大 batch;流式输出压力。
产物:serving benchmark、部署笔记。
28. 构建 evaluation harness
目标:让模型和系统修改可以被回放、比较、追踪。
动手任务:写一套本地 eval runner,支持测试集、评分器、结果存档。
观察指标:准确率、通过率、faithfulness、latency、成本、失败分类。
破坏实验:评测集泄漏;只用主观肉眼检查;评分器不稳定。
产物:eval harness、版本化评测集、结果报告。
29. 从零构建 RAG
目标:理解检索增强生成的每个环节。
动手任务:实现 chunking、embedding、index、retrieval、rerank、prompt assembly、citation。
观察指标:recall@k、MRR、answer faithfulness、引用准确率。
破坏实验:chunk 太大/太小;不做 rerank;把无关文档塞进上下文。
产物:RAG demo、检索评测、失败样例库。
30. 在理解栈之后构建 tool use 与 Agent loop
目标:避免把 Agent 当成不可解释的黑盒循环。
动手任务:实现 ReAct 或 plan-execute 最小 loop,接入 2-3 个安全工具。
观察指标:任务成功率、工具调用次数、错误恢复率、越权拦截。
破坏实验:工具 schema 模糊;工具无权限边界;上下文无限增长。
产物:Agent loop、工具审计日志、失败分类。
31. 构建 tiny vision-language adapter
目标:理解多模态通常是把视觉特征接到语言模型可消费的空间。
动手任务:用现成 vision encoder 提取图像特征,训练一个小 projection adapter。
观察指标:图文匹配样例、caption 质量、错误类型。
破坏实验:冻结/不冻结 encoder;adapter 维度过小;训练数据太单一。
产物:VLM toy demo、图文失败样例。
32. 研究 circuits、probes 与 sparse autoencoders
目标:建立“模型内部发生了什么”的最小观察手段。
动手任务:保存中间激活,训练 probe,或做一个小 sparse autoencoder 实验。
观察指标:probe accuracy、激活稀疏度、特征触发样例。
破坏实验:probe 太强导致读出假信号;数据泄漏;把相关性当因果。
产物:激活分析 notebook、可解释性注意事项。
33. 构建 red-team 与 safety evaluation suite
目标:把安全从口号变成可回放测试。
动手任务:整理 prompt injection、越权工具调用、敏感信息、RAG 污染、代码执行风险样例。
观察指标:攻击成功率、拒绝准确率、误拒率、工具权限违规次数。
破坏实验:把恶意指令藏在检索文档中;让工具返回伪造系统消息。
产物:安全评测集、红队报告、防护清单。
34. 完成一个小型 LLM 系统 capstone
目标:把数据、模型、推理、RAG/工具、评测、安全、文档接成闭环。
动手任务:选一个小场景,比如“个人博客问答助手”或“代码解释助手”。完成数据处理、模型或 adapter、部署、RAG/工具、评测、红队和报告。
观察指标:任务成功率、引用准确率、latency、成本、失败类型、安全测试结果。
破坏实验:检索错文档、长上下文塞满、工具超时、prompt injection、量化后回答退化。
产物:repo、notebook、图表、failure gallery、技术报告、本地启动说明。
最低完成标准
如果时间有限,每个项目至少做到这五件事:
- 有一段能运行的最小代码。
- 有一个图或表。
- 有一个故意破坏实验。
- 有一个失败样例。
- 有一段 200-500 字复盘。
如果连这五件事都没有完成,就先不要急着进入下一个概念。LLM 工程的核心能力不是记住更多名词,而是能定位系统为什么失败。
最终归档结构
建议每个项目都按同一结构存:
project-name/
README.md
src/
notebooks/
data-samples/
plots/
failures.md
notes.md
README.md 写目标、运行方式和结论。failures.md 专门收集失败样例。plots/ 留图。notes.md 写过程笔记。这样一年后回头看,仍然能知道当时到底做了什么。
本篇要点
- 34 个项目覆盖 LLM 从文本进入模型,到推理、数据、后训练、应用、评测和安全的完整路径。
- 每个项目都必须有可运行代码、可观察指标、破坏实验和复盘。
- 学习路线不是收藏链接,而是持续积累可复现证据。
- 最终目标是能构建、测量、破坏、解释并交付一个小型 LLM 系统。
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:34 个 LLM 工程项目验收清单
本文链接:https://www.sshipanoo.com/blog/ai/llm-roadmap/07-34个项目验收清单/
本文最后一次更新为 天前,文章中的某些内容可能已过时!
目录
- 怎么使用这张清单
- 1. 从零实现 tokenizer
- 2. One-hot、embedding 与语义几何
- 3. 实现四种位置方法
- 4. 手写 scaled dot-product attention
- 5. 扩展到 multi-head attention
- 6. 构建单个 Transformer decoder block
- 7. 堆叠成 mini-former
- 8. 对比训练目标
- 9. 构建 sampling dashboard
- 10. 实现 speculative decoding
- 11. 实现 KV cache
- 12. 实现 MQA、GQA,理解 MLA
- 13. 滑动窗口 attention 与 attention sink
- 14. RoPE scaling 与上下文扩展
- 15. 比较 naive attention、SDPA、FlashAttention
- 16. 建立硬件预算
- 17. 实现 two-expert MoE router
- 18. 复现 sparse model trade-offs
- 19. 实现 toy state-space 或 linear-attention model
- 20. 实现 diffusion-style language model toy
- 21. 构建预训练数据管线
- 22. 合成数据:生成、过滤、证明有效
- 23. 训练不同规模模型并拟合 scaling curves
- 24. SFT、instruction tuning 与 preference tuning
- 25. Toy RLHF、PPO、GRPO、RLVR lab
- 26. 量化模型并测损伤
- 27. 多 serving stack 对比
- 28. 构建 evaluation harness
- 29. 从零构建 RAG
- 30. 在理解栈之后构建 tool use 与 Agent loop
- 31. 构建 tiny vision-language adapter
- 32. 研究 circuits、probes 与 sparse autoencoders
- 33. 构建 red-team 与 safety evaluation suite
- 34. 完成一个小型 LLM 系统 capstone
- 最低完成标准
- 最终归档结构
- 本篇要点