llm-from-scratch-lab
Ahmadhaiwala/llm-from-scratch-lab加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你对着 ChatGPT 输入一句话,几秒钟后它就能写诗、编程、回答问题——这背后到底发生了什么?大多数人把 LLM 当成黑盒子使用,但有一群人选择亲手拆开它,从最底层的数学运算开始,一行行代码重建整个系统。LLM-From-Scratch-Lab 正是这样一份"手术刀级"的学习项目,它不带任何框架依赖,从零实现分词(Tokenizer)、词嵌入(Embeddings)、神经网络、注意力机制,一路向上攀升至 RAG 检索增强和 Agent 智能体,最终抵达生产级 LLM 工程。
这个项目的作者 Ahmadhaiwala 在 README 中写道:"别担心现在的代码,它还很简陋——但这只是学习用途。后续我会用 Rust 重写,打磨成生产级水准。"坦率的态度反而让人感受到一份难得的专注:先学会走,再学会跑。
一切语言的起点都是"词"——但计算机并不懂什么是词。Tokenizer(分词器)的工作,就是把人类书写的文字,转换成模型能处理的数字序列。这个项目从最基础的 BPE(Byte Pair Encoding,字节对编码)算法切入。BPE 的核心思路简单而优雅:首先把文本拆成最小的字符单元,然后反复统计相邻字符对的出现频率,将最频繁的字符对合并成新符号。BPE 被 GPT-2、BART 等主流模型广泛采用,因为它能够在"单词粒度"和"字符粒度"之间找到最佳平衡点——既能压缩序列长度,又能优雅地处理生僻词和新词。
项目中的 tokenizer.py 实现了完整的 BPE 训练和编码流程。虽然作者自评"naive but working",但对于教学目的而言,清晰的逻辑比极致的性能更重要。理解 BPE 的工作原理,是后续理解 GPT 架构的第一步——你必须知道模型"看到了什么",才能理解它"学到了什么"。
分词之后,第二步是把每个 token 转换为向量表示(Embedding)。词嵌入的本质,是将离散的语言符号映射到连续的实数向量空间——语义相近的词,其向量在空间中距离更近。这就是为什么"国王"减去"男人"加上"女人"会接近"女王":向量运算对应了语义关系。
项目 02-embeddings 模块覆盖了词嵌入的经典方法(Word2Vec、CBOW、Skip-gram 思路),03-neuralnetworks 模块则从感知机出发,逐步构建多层神经网络、激活函数、反向传播等基础知识。这两个模块为后续理解 Transformer 的内部运算奠定了数学基础——注意力机制本质上就是一系列矩阵乘法,而矩阵乘法的梯度计算是神经网络的命脉。
如果说 Embeddings 是语言模型的血肉,那注意力机制(Attention Mechanism)就是它的灵魂。2017 年 Google 在论文《Attention Is All You Need》中提出了 Transformer 架构,彻底颠覆了 NLP 领域。传统 RNN 需要逐token顺序处理,而 Attention 允许模型同时关注输入序列中的任意位置,实现真正的并行计算。
项目 04-attention 模块从数学公式出发,手工实现 Self-Attention(自注意力)。其核心公式是:
Attention(Q, K, V) = softmax(QK^T / √d) × V
其中 Q(Query,查询)、K(Key,键)、V(Value,值)三个矩阵来自同一个输入的线性变换。QK^T 衡量每个位置对其他位置的"关注程度",除以 √d 是为了防止点积过大导致 softmax 梯度消失,最后乘以 V 得到加权和输出。
为了防止模型"看到未来",项目还实现了 Causal Attention(因果注意力)——通过一个下三角 mask,确保生成第 N 个 token 时,只能参考前 N-1 个 token。这正是 GPT 系列模型"自回归"生成方式的核心实现。
05-transfomer 模块将前面积累的知识组装成完整的 Transformer 编码器-解码器架构。这个架构的核心组件包括:多头注意力(Multi-Head Attention,将 Q/K/V 分成多个头并行处理,捕获不同子空间的语义关系)、前馈神经网络(FFN,两个线性层之间夹 ReLU 激活)、残差连接(Residual Connection,缓解深层网络的梯度消失问题)和层归一化(Layer Normalization,稳定训练过程)。
06-minigpt(tiny gpt) 模块则聚焦于 GPT 风格的**仅解码器(Decoder-only)**架构——这是当前最主流的 LLM 架构路线,GPT-4、Llama、ChatGLM 等均属于此类。项目通过一个极简的 TinyGPT 实现,帮助学习者理解 GPT 的核心工作方式:给定前文,预测下一个最可能的 token,不断循环生成。
训练出模型只是第一步,如何让它真正发挥作用?07-inference 和 10-llmserving 模块覆盖了推理优化和服务化部署的知识:KV Cache(缓存已计算的 Key-Value 矩阵,避免重复计算)、批量推理(Batching,多个请求合并处理提高吞吐)、量化(Quantization,将 FP32 权重压缩为 INT8 甚至更低,减少显存占用)。这些是 LLM 工程落地的核心技术。
大模型本身是"知识封印者"——训练完成后,知识就固定在权重里了。RAG(Retrieval-Augmented Generation,检索增强生成) 通过外挂知识库,在推理时动态检索相关信息注入 Prompt,有效解决大模型幻觉和知识过时问题。08-rag 模块从向量检索(Embedding 相似度匹配)出发,手工实现了完整的 RAG 流程。
Agent(智能体) 则是 LLM 的进阶用法:让模型自主调用工具(搜索、计算、代码执行),与环境交互完成复杂任务。09-agents 模块探索了 ReAct(Reasoning + Acting)、Toolformer 等 Agent 范式,让模型不仅能思考,还能动手执行。
11-production 模块是整个学习路径的终点:日志记录、监控告警、A/B 测试、灰度发布、Prompt 版本管理等生产级工程实践。真实的 LLM 产品不仅需要模型准确,还需要系统稳定、可观测、可迭代。这一模块填补了大多数教程的空白——教会学习者把"能跑的 Demo"变成"能上线的产品"。
这个项目最大的特点是教学导向:代码不追求性能优化,不依赖 PyTorch 的高层 API,纯粹用 Python 底层实现核心逻辑。对于想真正理解 LLM 内部原理的学习者,这是极好的实践材料;但对于需要快速复现生产级模型的研究者,应该直接参考 Sebastian Raschka 的《Build a Large Language Model (From Scratch)》书籍配套代码(rasbt/LLMs-from-scratch),后者更完整、更工程化。
由于项目仍处于早期开发阶段(作者明确表示后续会用 Rust 重写核心代码),各模块的完成度参差不齐——部分模块如 06-minigpt(tiny gpt) 目录为空,代码质量也有较大提升空间。适合作为学习路径的参考框架,而非最终的代码来源。