来源:Karpathy Blog | 整理:小新博士
这是关于我的新艺术项目 microgpt 的简要指南——一个仅 200 行纯 Python 代码、无任何依赖项的文件,同时完成 GPT 的训练和推理。该文件包含了所需的全部算法内容:文档数据集、分词器、自动微分引擎、类 GPT-2 神经网络架构、Adam 优化器、训练循环和推理循环。其他一切不过是效率优化。我已经无法再简化了。
这个脚本是多个项目(micrograd、makemore、nanogpt 等)十年痴迷的结晶,我认为它很美。它甚至完美地分成三栏排列:

microgpt 三栏代码布局示意
资源链接
- GitHub Gist 源码:microgpt.py
- 官方页面:https://karpathy.ai/microgpt.html
- Google Colab notebook:在线运行
数据集(Dataset)
大语言模型的燃料是文本数据流。在生产级应用中,每个文档是一个互联网网页,但对于 microgpt,我们使用一个更简单的例子:32,000 个名字,每行一个。
emma
olivia
ava
isabella
sophia
charlotte
mia
amelia
harper
... (~32,000 names) |
模型的目标是学习数据中的模式,然后生成具有相似统计规律的新文档。训练完成后,模型会生成这样的"幻觉"名字:
sample 1: kamon
sample 2: ann
sample 3: karai
sample 4: jaire
sample 5: vialan
sample 6: karia
sample 7: yeran
sample 8: anna
sample 9: areli
sample 10: kaina
... |
看起来不太起眼,但从 ChatGPT 这类模型的角度看,你和它的对话不过是一个看起来有点奇怪的"文档"。当你用提示初始化文档时,模型的回应在它看来只是统计性的文档补全。
分词器(Tokenizer)
神经网络底层处理的是数字而非字符,所以我们需要将文本转换为整数 token id 序列。生产级 tokenizer 如 tiktoken(GPT-4 使用的)按字符块高效运作,但最简单的 tokenizer 只需为数据集中的每个唯一字符分配一个整数:
uchars = sorted(set(''.join(docs))) # unique characters
BOS = len(uchars) # Beginning of Sequence token
vocab_size = len(uchars) + 1 # 27 total tokens |
自动微分(Autograd)
训练神经网络需要梯度:对于模型中的每个参数,我们需要知道"如果我把该数值略微增加,损失是上升还是下降,幅度如何?"
micrograd 是 Andrej 的早期项目,实现了纯 Python 的自动微分引擎——只需约 100 行代码。它构建了一个计算图,其中节点是数组操作,存储了每个节点所需的梯度。
GPT 模型架构
GPT(Generative Pre-trained Transformer)的核心是 Transformer 架构。microgpt 中的 Transformer 包括:
- 嵌入层:将 token id 映射到向量空间
- 位置编码:注入 token 位置信息
- 因果注意力(Causal Attention):每个 token 只关注前面的 token
- 前馈网络(FFN):两层全连接网络
训练与推理
训练循环使用 Adam 优化器最小化交叉熵损失。由于 microgpt 是从头开始训练,且数据集较小(32k 名字),在 CPU 上几分钟内即可完成。
推理循环是自回归的:模型一次预测一个 token,然后将输出作为下一步的输入,直到生成完整的 EOS(文档结束)token。
为何重要?
microgpt 展示了 LLM 的核心原理可以多么精简。通过 200 行代码,你就能理解从文本到 token、从 token 到向量、从向量到注意力、从注意力到生成的完整流程。
所有现代 LLM(ChatGPT、Claude、Llama 等)本质上都是 microgpt 的"更大版本"——更多的参数、更多的数据、更复杂的优化,但数学原理完全相同。
一句话总结:microgpt 是用最少的代码展示 LLM 本质的教学项目。它不是为了生产使用,而是为了让更多人理解 AI 背后的基本原理。 |
▌ 本文由小新博士整理编译
原文链接:https://karpathy.github.io/2026/02/12/microgpt/