AI by Hand 不是又一个大模型仓库也不是一键部署工具。它是一套把 GPT、BERT、Transformer 这类模型的前向传播过程拆成“可以用铅笔在纸上一步一步写完”的 AI 练习手册。作者之一就是做《The Illustrated Transformer》图解 AI 内容的那位。所以它的风格非常直接不给你一行 Python也不要求你装显卡驱动而是把注意力公式、矩阵乘法、Softmax 这些概念铺在一张纸上让你真算一遍。这次我们来看 AI by Hand 能解决什么问题。很多同学学 Transformer 时都有一种困惑代码能跑通面试却说不清 Q、K、V 分别是什么看了一堆架构图自己推导时又总在“除以根号 d”这个位置卡住。AI by Hand 想解决的问题就是这个不用 GPU、不用 CUDA、不用下载模型用一支笔把计算过程走完。核心方法是一边画矩阵一边通过手算完成一次完整的小规模前向传播。如果你关心的是“如何跳过黑盒理解大模型”“如何用最小成本验证自己真的懂了”这篇文章可以直接收藏。下面我会梳理 AI by Hand 的玩法、手算流程、环境要求并给出一套“先手算、再用 Python 数值核对”的可执行验证方式。本文不会教你跑 70B 模型而是帮你在一个 2×2 的小例子上亲手推出注意力矩阵。1. AI by Hand 核心能力速览在开始之前先把关键信息列出来方便快速判断这个项目适不适合你。能力项说明项目类型AI 教育练习手册不是推理引擎或模型仓库主要学习内容Transformer、GPT、BERT、注意力机制、词嵌入、Softmax、KV Cache 等概念的前向手算练习方式在教材或练习页上手工填写矩阵、画出每一步计算结果硬件要求纸 笔即可推荐显示器或平板看教程GPU / 显存不需要 GPU核心练习不占用显存CPU / 内存零基础练习不需要电脑若用 Python 数值验证任意现代 CPU 足够代码语言教材主体不是代码需要验证时可配合 NumPy是否支持 API项目本体不提供 API可自行接大模型接口辅助批改下面会讲是否支持批量任务支持“批量练习”可用脚本批量出题、批量核对适合场景从底层理解大模型、算法面试复习、课程教学、内部技术分享不适合场景不想动手算、只想快速调库、需要实际推理生成内容从资源门槛来看AI by Hand 的下限比大多数 AI 工具都要低不需要下载权重不需要安装依赖不需要联网跑推理。真正的门槛只有一个你是否愿意坐下来把矩阵乘法算一遍。2. 适用场景与使用边界AI by Hand 最适合三类人。第一类是刚入门的大模型应用开发者。你已经在用 OpenAI API也在跑 ComfyUI但对注意力机制的理解还停留在“里面有个 QKV”。手推一次注意力比你读十篇图解博客更有用。第二类是准备面试的算法工程师。Transformer 相关的面试题非常容易问到底层推导为什么除以根号 d为什么 Softmax 前要对齐维度手算过一次之后这些问题基本不会丢分。第三类是高校讲师、培训讲师。AI by Hand 里的手算练习很适合放进课件作为课堂的动手环节。我实际带团队学习时发现手算题比 PPT 讲解更能暴露“以为自己懂了其实没懂”的误区。需要特别说明使用边界。第一AI by Hand 不是软件不能“安装后调用”。如果你把它当成本地模型来用会非常失望。第二它是教学材料版权归作者所有。个人学习、手抄练习通常没问题但如果要复刻、分发、做成商业课件需要先确认对应的授权许可。网上能找到的电子版本来源复杂请优先使用正版渠道不要传播扫描版或盗版资源。第三学习过程中你会手写大量结构示意。如果你要把推导过程发到公开博客、GitHub 或课程平台最好重新绘制并标注知识来源。这不只是礼貌问题也是版权合规要求。3. 原理拆解AI by Hand 到底手算什么AI by Hand 的练习内容可以理解为把一个完整的 Transformer 前向传播“拆成几十个手写小步骤”。我们不需要从 GPT 的千亿参数开始推而是从最小组件开始。3.1 词嵌入与矩阵乘法的直觉Transformer 的输入是一段文本。文本不能直接做乘法所以要先映射成向量。这部分非常适合作手写练习给定一个小词表查表拿到每个 token 的向量再乘一个权重矩阵得到新的表示向量。假设输入一句话只有两个单词每个单词用一个 2 维向量表示那么输入就是一个 2×2 矩阵。手算时要明确这件事矩阵乘法中行是 token列是特征权重矩阵的行列变化决定了输出的维度。绝大多数手算错误都发生在“维度对不上”这一步。3.2 注意力机制中的 QKVSelf-Attention 是 AI by Hand 的核心练习对象也是整个项目最有价值的章节。它想让你亲手验证一件事Q、K、V 并不是凭空出现的三个向量而是由同一个输入矩阵分别乘上三个权重矩阵得到的。Q我要查什么K我有哪些内容可以被查V我实际想取出的信息从一个非常小的例子出发假设输入矩阵 X 是两个 token 的向量分别记为 x1 和 x2。先把 X 和 Wq 相乘得到 q1、q2和 Wk 相乘得到 k1、k2和 Wv 相乘得到 v1、v2。接下来用 q1 分别和 k1、k2 做点积就得到“第一个 token 对第一个 token 的注意力分数”和“第一个 token 对第二个 token 的注意力分数”。手算时通常会写成四步计算 q1 与 k1 的点积记作 score11计算 q1 与 k2 的点积记作 score12对 score11、score12 除以根号 d做一次 Softmax得到权重最后把 v1、v2 按权重相加得到第一个 token 对应的注意力输出。如果你手动走完这两行的计算就会发现 QKV 的直觉并不复杂它做的是“加权求和”权重来自 token 之间的相关性。手算的过程虽然慢但能让你真正看到矩阵的形状变化和数值流动。3.3 从单头注意力到完整 Block单头注意力算完AI by Hand 通常会引导你继续补全 Transformer Block 的剩余部分残差连接、LayerNorm、前馈网络 FFN以及 GPT 这种自回归模型在生成下一个 token 时如何利用 KV Cache。这部分的练习价值在于代码层面的model.forward()可能只有一行但手算会把这一行展开成十几个公式。当你把这一整套流程在纸上走过一遍再回去看开源代码里的 tensor shape就会顺畅很多。4. 手算练习环境准备AI by Hand 是少有的“几乎不需要环境准备”的 AI 学习项目。核心准备物如下物品数量和用途A4 纸或练习册建议不少于 20 页用于推导和重复训练铅笔或中性笔记录矩阵数值橡皮算错时方便修改计算器可选项用于验证小数计算Python 环境可选项用于生成题目和核对答案如果要配合 Python 验证环境准备也很轻量# 可选创建独立虚拟环境 python -m venv ai-by-hand-venv # 激活环境Windows 和 Linux/macOS 命令不同 # Windows: ai-by-hand-venv\Scripts\activate # Linux/macOS: source ai-by-hand-venv/bin/activate # 安装 numpy 即可不需要 torch不需要 CUDA pip install numpy jupyter版本方面NumPy 1.24 以上都可以。如果你已有 Python 3.9 以上环境直接安装 NumPy 即可。这个项目本身不依赖深度学习框架甚至不装 Python 也能学习。如果你的练习册是电子版或需要跟着屏幕画网格可以准备一块平板和一个支持手写的笔记 App。不过传统纸笔反而更容易专注。5. AI by Hand 手写练习流程下面给出一套可执行的“纸笔练习 代码验证”流程。你不需要一次做完小步走会更稳。5.1 建议按章节顺序推进AI by Hand 的练习设计是由浅入深。建议不要跳着读按下面顺序推进词嵌入与 Token 向量化矩阵乘法与为什么形状匹配很重要单头注意力的手算前向缩放点积与 Softmax 计算多头注意力的合并逻辑残差连接与 LayerNormFFN 和完整 Transformer BlockGPT 自回归生成过程中的 KV Cache每节花 30 分钟到 1 小时比一次性刷完整本效果好得多。5.2 手算输出格式建议在 A4 纸上画一个统一的推导模板输入矩阵写在左上角中间步骤写权重矩阵的 shape 变化所有中间矩阵都标注行名和列名最后留一块区域写结论和代码输出对比这个习惯能避免一个常见问题只算对数值不知道位置对应哪个 token。5.3 判断一次手算是否成功的标准我认为有两个验收标准。第一个是数值自洽把每一步除法后的结果保留两位小数下一轮继续用这个结果计算答案不应出现明显跑偏。第二个是形状自洽从输入 X 的 shape能够口头说清每一步变换后的 shape。如果每次都要回头看公式说明还没形成直觉。建议先选一个两行两列的小例子把注意力输出算出来再和 6.1 节的 Python 结果比较。误差控制在 1e-2 以内基本可以认为手算过程没有问题。5.4 手算中经常被忽略的“除以根号 d”和 Softmax 稳定性很多初学者在练习时会忽略两个细节。第一注意力分数要除以根号 d其中 d 是单个头的维度。如果 d2那么除数就是根号 2。如果不除数值会偏大Softmax 之后概率分布会更尖锐这会影响梯度的稳定性。第二手算 Softmax 时要留意 exp 增长速度。比如输入分数是 [0.7, 0.0]需要先计算出 exp(0.7)≈2.0138 和 exp(0.0)1总和约 3.0138因此两个概率分别约为 0.668 和 0.332。如果输入分数很大比如 [5.0, 4.0]手算会比较吃力。这时可以把每个分数先减去当前行的最大值再做 exp数值不变但计算量更小。写完这几个步骤你已经完成了手算前向传播的主要流程。接下来用代码进行一次数值核对。6. Python 数值验证不装 GPU 也能核对结果AI by Hand 本身不需要代码但我强烈建议用一段非常小的 NumPy 代码做“自动判分”。先手算再把结果和 Python 输出对比这是最快暴露理解漏洞的方式。6.1 最小 Self-Attention 验证脚本下面代码直接用单位权重矩阵做简化方便你在纸上复现每一步。为了让计算最简单输入两个独立的 one-hot 向量。import numpy as np def softmax(z): # 按行做减最大值操作数值更稳定 e np.exp(z - z.max(axis-1, keepdimsTrue)) return e / e.sum(axis-1, keepdimsTrue) # 两个 token每个 token 用 2 维向量表示 X np.array([ [1.0, 0.0], # token1 [0.0, 1.0] # token2 ]) # 为了便于手算这里把三个权重矩阵都设为单位阵 Wq np.eye(2) Wk np.eye(2) Wv np.eye(2) q X Wq k X Wk v X Wv d_k q.shape[-1] # 这里等于 2 scale np.sqrt(d_k) # 根号 2 ≈ 1.4142 scores q k.T / scale attention softmax(scores) output attention v print(scores:) print(scores) print(attention weights:) print(attention) print(final output:) print(output)按这个脚本运行你会得到 attention weights 大约为[[0.6697, 0.3303], [0.3303, 0.6697]]因为这里 v 是单位矩阵所以 final output 和 attention weights 相同。手算时可以用这个结果作为参考答案。这个例子看起来非常小但它完整覆盖了注意力机制中的所有关键步骤。手算一遍后再看代码你会发现代码里的每个矩阵运算都能在草稿纸上找到对应位置。6.2 手算结果和代码对不上的排查技巧如果你手算的结果和 Python 输出不一致优先排查四点检查项说明是否少乘了权重矩阵有些入门推导会直接让 qkv但那只是特例点积方向是否正确q k.T和k q.T会导致结果行方向不同是否漏掉除以根号 d漏掉后概率分布会偏尖锐Softmax 是按行还是整列注意力分数矩阵中同一行对应同一个 query必须按行做 Softmax如果代码里数字对不上不要急着怀疑算力先回到公式重新推导。多数情况下是维度或行方向搞错了。6.3 批量练习题生成器AI by Hand 这类项目很适合“反复练习”。与其在书上只算一个例子不如用脚本批量生成带答案的练习。下面是一个练习集生成器它会生成若干个随机权重矩阵并把参考答案写入 JSON 文件方便之后核对。import json import numpy as np def softmax(z): e np.exp(z - z.max(axis-1, keepdimsTrue)) return e / e.sum(axis-1, keepdimsTrue) def make_case(seed, seq_len2, dim2): rng np.random.default_rng(seed) X rng.normal(size(seq_len, dim)) Wq rng.normal(size(dim, dim)) Wk rng.normal(size(dim, dim)) Wv rng.normal(size(dim, dim)) q X Wq k X Wk v X Wv scores q k.T / np.sqrt(dim) attention softmax(scores) output attention v return { seed: int(seed), X: X.tolist(), Wq: Wq.tolist(), Wk: Wk.tolist(), Wv: Wv.tolist(), attention: attention.tolist(), output: output.tolist() } if __name__ __main__: exercises [] for i in range(5): exercises.append(make_case(seed100 i)) with open(ai_by_hand_exercises.json, w, encodingutf-8) as f: json.dump(exercises, f, ensure_asciiFalse, indent2) print(生成 5 道练习题答案已保存到 ai_by_hand_exercises.json)使用这套脚本你可以把“手算练习”做成可批量执行的任务每拿到一道题先只看X、Wq、Wk、Wv手算再打开 JSON 文件的第九个字段核对attention或output。整个过程和传统“试卷 答案”很像但答案完全可复现不会因为教材印刷错误产生纠纷。7. 为什么这个项目不依赖 API但可以用 AI 做配套批改AI by Hand 项目本身不提供接口 API也没有服务端可以调用。它的价值在于“离线手算”和“在线 API 调用”是两条路线。但这不意味着你不能用 AI 工具帮助学习。我提供一个通用思路把手写推导的中间步骤拍照或转录成文本然后请大模型接口做逻辑检查。常见的做法是写一个本地校验脚本把结构化结果发送给大模型。下面是一个极简请求模板实际使用时需根据你当前使用的服务商 API 调整地址、鉴权方式和参数import requests import json prompt 请检查下面这组手算 Self-Attention 步骤是否正确 1. q1[1.0, 0.0] 2. k1[1.0, 0.0], k2[0.0, 1.0] 3. score11 1.0, score12 0.0 4. 除以根号2后score11≈0.7071, score12≈0.0 5. softmax后权重约为[0.6697, 0.3303] 请指出步骤中可能存在的问题。 # 这里只是模板接口地址和参数请按实际使用的服务文档修改 url https://your-llm-api.example.com/chat/completions headers { Authorization: Bearer YOUR_API_KEY, Content-Type: application/json } payload { model: your-model-name, messages: [ {role: user, content: prompt} ] } response requests.post(url, headersheaders, jsonpayload, timeout60) print(response.json())需要注意三点不要把未授权私密内容或整本版权教材上传到第三方服务。大模型回答只能作为“提示”不能代替你从公式层面验证数字。如果服务返回超时请先降低请求频率再检查网络和接口鉴权配置不要直接提高并发测试。8. 资源占用与性能观察这一节对 AI by Hand 来说比较特殊因为它不是一个推理程序。纸笔练习的资源占用是零不需要显存不需要 CPU。如果配合 Python 练习也基本属于“瞬间执行”的范畴因为示例矩阵都非常小。我用了一个比较小的示例来演示代码在普通笔记本上运行的时间基本可以忽略。如果你打开任务管理器会看到 Python 进程短暂出现然后很快结束。这不是项目性能差而是矩阵规模太小不足以产生可观测压力。如果你把矩阵规模扩大比如让seq_len512、dim64NumPy 仍可以处理但你会看到 CPU 占用上升。想要降低压力可以按批处理每次只算一个 mini-batch中间结果及时写入磁盘。这种观察方式比盯着模型大小更符合学习项目的特点。显卡方面nvidia-smi 基本用不上。你不需要检查显存占用也不需要验证 CUDA 是否可用。正因为 AI by Hand 不接触 GPU它才可以成为你“降噪”学习的最佳工具。9. 常见问题与排查方法问题现象可能原因排查方式解决方案手算数字和答案差很多矩阵乘法顺序或转置搞错检查q k.T是否写成k q.T统一先用小例子逐个核对 shapeSoftmax 结果不合理没有按行做 Softmax或数值溢出打印中间scores矩阵并人工判断使用减最大值的稳定 Softmax注意力分数偏大漏掉“除以根号 d”对比公式中的缩放系数检查 d 是单头维度还是总维度Python 报维度不匹配矩阵 shape 设计错误打印所有中间矩阵的.shape在纸上先标注每个步骤的 shape计算占用感觉高矩阵规模设置过大打开系统任务管理器观察缩小 seq_len 和 dim想用 API 批改但没有密钥当前没有可用的模型服务先不接 API直接用 NumPy 核对离线脚本已经足够做基本判定练习题生成后无法复现随机种子不一致检查所有seed参数使用固定seed或直接保存矩阵数据手抄练习册内容并公开忽略版权许可查阅授权说明改为个人整理 自制图示经常看到有人问是否需要一张好显卡才能理解 Transformer 底层原理。答案是不需要。AI by Hand 最推荐的环境恰恰是“远离显卡”的环境。10. 最佳实践与使用建议如果你准备用 AI by Hand 做系统学习我有几条比较务实的建议。第一第一次练习务必使用 2 维或 3 维向量。不要一上来就复现 512 维的注意力。向量维度过大时手算会陷入大量无意义的算术偏离学习主线。先在 2 维上把流程走通再扩大到 4 维观察模式性价比最高。第二把“手算答案”和“代码答案”放进同一个表格。每步留一列写中间结果例如 scores、除以根号 d 后的结果、Softmax 输出。这样一旦出错你能定位到具体是哪一步而不是笼统地知道结果不对。第三不要忽略计算过程只看结论。手算的意义在于体验数值流动。尤其在 Softmax 和矩阵乘法这里看 100 遍公式不如自己写 10 个数字。第四批量练习时加日志。如果你按 6.3 节生成几十道题不要把答案直接写在题纸上。可以使用logs目录保存每道题的 seed 和手算结果遇到失败题目再回头排查。第五手算要控制时间。理想的半成品状态是单个 2×2 注意力例子的完整手算能在 15 到 20 分钟内完成。如果超过 1 小时说明你对矩阵乘法或概念还不够熟停下来重新看公式比较好不建议硬刷题。第六尊重版权和隐私。使用 AI 辅助批改时不要把没有授权的内部文档、私人笔记或完整教材内容发给第三方服务。个人推导过程通常没有问题但公开展示时要重新组织内容并注明来源。第七把这个练习纳入团队分享。让团队里每个人手推一个不同的小例子再互相检查效果往往比一个人闷头苦学好很多。11. 总结与下一步AI by Hand 最值得尝试的地方是它用极低的硬件门槛补足了大多数开发者在大模型学习中的短板不是不知道注意力公式长什么样而是没有亲手走过一次完整的数值计算。建议你拿到项目后的第一件事不是翻完整本教材而是先找一个两行两列的小例子手推一次 Self-Attention写清 X、Wq、Wk、Wv再算 q 与 k 的点积、除以根号 d、Softmax、最后乘 v。这个完整流程大概需要 15 到 20 分钟。完成之后用文章里的 Python 脚本核对一次。如果结果停留在 0.001 级别说明你已经建立起了最基本的数值直觉。最容易踩的坑有两个一个是矩阵转置方向搞错导致注意力行顺序颠倒另一个是忘记除以根号 d导致 Softmax 后的分布太尖锐。这两个坑适合写进自己的错题本。后续要继续扩展的方向可以考虑把同样的“手算 代码验证”思路迁移到多头注意力、KV Cache以及一个小型 GPT 的完整前向过程。等你能够不看公式只凭代码 tensor shape 说出每步的矩阵形状再回头阅读大模型源码时障碍会小很多。建议收藏备用。学完 AI by Hand 之后再去看其他本地部署、模型微调或者 API 开发内容你会更清楚底层究竟在发生什么。