ai-engineering-from-scratch:拆掉生成式 AI 的黑盒
这是一个用 Python 从零手写生成式 AI 核心组件的学习项目,帮开发者摆脱只会调 SDK 的困境。本文拆解它的学习路径设计、从零实现的取舍,以及它与 MCP 协议主题之间的张力。
生成式 AI 的入门资料很多,但大多数在教你怎么调用别人封装好的接口。改几行 prompt,接一个 SDK,跑通一个 demo,就以为自己会了。等真正遇到 token 数量异常、attention 输出不对劲、训练 loss 不下降,才发现底层一片模糊。
rohitg00/ai-engineering-from-scratch 想解决的就是这个断层。它不提供开箱即用的模型,不承诺更快的推理速度,也不做任何生产级优化。它只做一件事:让你跟着代码,把 tokenizer、attention、训练循环这些核心组件亲手写一遍。
仓库自述只有一句:Learn AI Engineering! Learn it. Build it. Ship it for others. 前两个词是重点,Ship it for others 更像是学成之后的自然结果,而不是这个仓库本身的功能承诺。
从 tokenizer 写起,逼你面对真实的复杂度
调 SDK 的时候,tokenizer 只是一个看不见的前置步骤。你输入一句话,API 返回结果,中间怎么切分、怎么映射到词表编号、怎么处理未知字符,全被藏起来了。
这个项目把 tokenizer 作为第一个要手写的组件,路径是对的。因为 tokenizer 是生成式 AI 里最容易被低估、又最容易出问题的环节。一个设计糟糕的分词规则,会导致词表爆炸、OOV 泛滥,或者训练数据里全是低频噪声。
手写一遍,你才会理解为什么 BPE 要合并高频字符对、为什么词表大小是一个需要反复权衡的超参数。这些认知,看十篇博客也换不来。
代价也很直接:tokenizer 的实现往往又长又繁琐,大量代码在处理 Unicode 边界、特殊 token 和序列化格式。对于只想快速理解模型架构的人来说,这部分可能显得枯燥。但跳过它,后面 attention 的输入维度都对不上。
attention 的实现,区分“看懂”和“会写”
Attention 是 Transformer 的心脏,几乎所有技术文章都会讲 Q、K、V,讲 softmax 缩放,讲多头拆分。看懂公式的人很多,能独立写出正确实现的人少得多。
这个项目的价值在于强迫你处理那些公式里不写的细节。比如 mask 到底加在 softmax 之前还是之后,负数无穷大怎么表示,多头合并时的维度顺序是什么。这些细节在 PyTorch 的 nn.MultiheadAttention 里都被封装好了,你不写一遍永远不会意识到它们的存在。
手写 attention 还有一个隐藏收益:你会真正理解显存开销从哪来。QK^T 的结果是一个 [batch, heads, seq_len, seq_len] 的张量,序列长度翻倍,这个张量的显存占用翻四倍。这个认知,对之后做长上下文优化、理解 FlashAttention 的动机,都是必要铺垫。
代价是初学者很容易在这一步卡住。矩阵维度对不上、梯度传播异常、数值不稳定,都是常见问题。文档没有说明是否提供中间检查点或调试提示,学习曲线可能偏陡。
训练循环:把“模型能跑”变成“模型能学”
很多从零实现的项目停留在前向传播,能输出一个形状正确的张量就宣布完成。这个仓库把训练循环也纳入核心路径,这是一个重要信号。
因为前向传播只证明计算图是通的,训练循环才证明模型真的在学习。学习率调度、梯度裁剪、loss 曲线的解读、checkpoint 保存,这些环节决定了模型能不能收敛。
手写训练循环,你会被迫面对一个残酷事实:模型不收敛的原因有一百种,而报错信息通常不会告诉你答案。可能是数据没 shuffle,可能是学习率太大导致梯度爆炸,可能是 loss 函数用错了 reduction 方式。
这个过程没有捷径。文档没有说明是否附带可复现的实验配置或参考 loss 曲线,所以你可能需要自己摸索调参。但正是这种摸索,把“会调 SDK”和“懂训练”区分开来。
与 MCP 协议主题的错位
这个仓库在站内被归类到 MCP 协议主题下,但这个归类本身值得商榷。MCP 是 Model Context Protocol 的缩写,关注的是模型与外部工具、数据源之间的标准化交互。
而从这个仓库的简介和核心内容看,它的关注点完全在模型内部:tokenizer、attention、训练循环。两者不在同一个抽象层级上。
一种可能的解释是,学习 AI 工程的人最终会接触到 MCP,而亲手写过底层组件的人,在理解 MCP 的上下文管理、工具调用协议时会有更扎实的基础。但这是间接关联,不是直接关联。
如果你是因为 MCP 协议而点进这个仓库,可能会感到困惑。这里没有 MCP server 的实现,没有 tool calling 的示例,也没有任何与协议相关的代码。
边界与判断
这个仓库不适合所有人。如果你需要的是一个能直接部署的服务、一个更快的推理引擎,或者一个 MCP 协议的参考实现,它帮不了你。
它的目标用户很窄:那些已经用过 SDK、但对自己说“我其实不懂底层”的开发者。对这部分人来说,跟着写一遍的价值远超读十篇技术博客。
但要注意,从零实现和学习生产级工程是两回事。手写的 attention 不会比 PyTorch 的快,手写的 tokenizer 也不会比 HuggingFace 的稳。这个仓库教的是原理和直觉,不是性能优化。
值得用,如果你愿意接受它枯燥的部分,并且清楚自己要的是底层认知而不是可用工具。建议先快速浏览 tokenizer 部分的代码结构,判断自己的耐心和基础是否匹配,再决定是否完整跟练。