LLM 究竟是如何工作的?
本机暂存
<p><strong>发布时间</strong>:2026 年 6 月 1 日,星期一 · 26 分钟阅读</p><p><a href="https://0xkato.xyz/tags/#machine-learning">Machine Learning</a> <a href="https://0xkato.xyz/tags/#transformers">Transformers</a> <a href="https://0xkato.xyz/tags/#llm">LLM</a> <a href="https://0xkato.xyz/tags/#neural-networks">Neural Networks</a> <a href="https://0xkato.xyz/tags/#ai">AI</a></p><p>本文带你走一遍 LLM 的工作原理。现代 LLM 大多是由 transformer 块反复堆叠而成的,因此理解了 transformer 机制,你就掌握了大部分。</p><p>我将覆盖现代基于 transformer 的 LLM 内部的核心机制,避开那些复杂的数学。别误会,你应该学数学,但本文可以作为一个入门。</p><p>大多数现代 LLM 共享同一套 transformer 家族的骨架。差异来自于各自的训练数据、规模和配置选择,以及在此之上的后训练。读完本文后,你应该能够阅读许多现代 LLM 论文或模型卡,并知道每个部分在讲架构中的哪个组件。</p><p>路线如下:</p><ol><li>Token——一串文本如何变成一组整数序列</li><li>Embedding——这些整数如何获得含义</li><li>位置编码——模型如何知道 token 的顺序</li><li>Attention——token 之间如何交换信息</li></ol><span id="more"></span><ol start="5"><li>多头注意力——模型如何同时追踪多种关系</li><li>前馈网络——模型存储结构的主要所在</li><li>残差流与层归一化——是什么让深层堆叠可训练</li><li>预测下一个 token——模型实际输出什么,以及生成循环如何运作</li><li>架构 vs 训练权重——现代 LLM 之间广泛共享什么,以及什么不同</li></ol><p><img src="https://www.0xkato.xyz/assets/transformer-pipeline.png" alt="Transformer pipeline from tokenization to next-token prediction"></p><p>文中穿插了一些简短解释(tiny explainer),无论你的背景如何都能跟上。</p><hr><h2 id="Tokenization(分词)"><a href="#Tokenization(分词)" class="headerlink" title="Tokenization(分词)"></a>Tokenization(分词)</h2><p>模型不直接阅读文本。它们读取整数 ID。这一步将你的提示转换为一组整数序列。</p><p>这个转换步骤叫做 tokenization(分词)。一个 tokenizer(分词器)接收一个字符串并产生一组整数序列,其中每个整数指向固定词汇表中的一个条目。现代 LLM 的词汇表通常包含数万到数十万个条目。</p><blockquote><p><strong>简短解释:token ID</strong><br>token ID 是模型用于某个词汇表条目的整数。模型处理的是数字,而不是书写的单词本身。</p></blockquote><p>Token 通常不是完整的单词。它们通常是子词片段。单词 "tokenization" 可能被拆分为 ["token", "ization"]。"running" 可能被拆分为 ["run", "ning"]。原因在于效率。全词词汇表太大,且无法泛化到新词。字符级词汇表又太小,迫使模型从零开始学习最简单的模式。子词分词则处于中间地带。最常见的片段成为单独的 token,罕见或新颖的词则由更小的片段组合而成。</p><blockquote><p><strong>简短解释:词汇表(vocabulary)</strong><br>词汇表是分词器的固定片段列表。每个片段有一个 ID,模型只能直接接收来自该列表的 ID。</p></blockquote><p>这种权衡在意想不到的地方表现出来。经典例子:问 LLM "strawberry" 中有几个 R。LLM 过去常常回答错误。这不是模型不会计数。而是模型不直接操作字母,它只操作那些恰好拼写出一个单词的 token ID——而这个单词人类会逐字母拆分。</p><p><img src="https://www.0xkato.xyz/assets/transformer-tokenization.png" alt="Tokenization turns text into token IDs"></p><p>不同的模型家族使用不同的分词器。GPT 模型使用 BPE(Byte Pair Encoding)变体。SentencePiece 在 LLaMA 风格的模型中很常见。选择影响计算量(更少的 token 意味着更少的工作)和多语言覆盖等,但基本形式相同:文本进,整数出。</p><p>现在提示已经是一组整数序列,下一步是赋予这些整数含义。</p><hr><h2 id="Embedding(嵌入)"><a href="#Embedding(嵌入)" class="headerlink" title="Embedding(嵌入)"></a>Embedding(嵌入)</h2><p>一个像 <code>1024</code> 这样的 token ID 只是一个行索引。它本身没有任何意义。赋予它意义的是一个巨大的表,叫做嵌入矩阵(embedding matrix)。</p><p>每个模型都有一个。它对词汇表中的每个条目都有一行,每行是一个长长的数字向量。每行的长度就是模型的隐藏维度大小(hidden size)。在许多 7B 级别的模型中,这意味着每个 token 对应 4,096 个数字。更大的模型通常使用更宽的向量。</p><blockquote><p><strong>简短解释:向量(vector)</strong><br>向量就是一个数字列表。在 transformer 中,每个 token 变成一个向量,这样模型就可以用它做数学运算。</p></blockquote><p>当分词器把整数交给模型时,模型查找那一行并用向量替换它。那个向量就是 token 的嵌入(embedding)。它是模型对该 token "含义" 的表示,是在训练过程中学到的。</p><blockquote><p><strong>简短解释:嵌入矩阵(embedding matrix)</strong><br>嵌入矩阵是一个查找表。token ID 进,学到的向量出。</p></blockquote><p>这些嵌入的一个有趣特性是,语义上相似的 token 最终会得到相似的向量。"king" 的向量在空间中接近 "queen" 的向量,"Paris" 的向量接近 "France" 的向量。这一切都不是硬编码的。它是在足够多的文本上训练后涌现出来的,模型学会这些位置是因为它们能让模型更好地预测文本。</p><p>你可以对嵌入做算术运算,有时候确实有效。著名的例子是 <code>king − man + woman ≈ queen</code>。嵌入空间的几何结构携带着真实的语义结构,尽管没有人告诉模型要以这种方式构建它。</p><p><img src="https://www.0xkato.xyz/assets/transformer-embedding-analogy.png" alt="Embedding space analogy with semantic relationships"></p><p>有一点需要明确:在这个阶段,每个 token 都被它的嵌入替换了,但嵌入本身不包含 token 在序列中的位置信息。"dog" 的向量无论在提示的第一个还是第五个位置,都是同一个向量。这是个问题。</p><p>这就是位置编码要填补的空白。</p><hr><h2 id="Positional-Encoding(位置编码)"><a href="#Positional-Encoding(位置编码)" class="headerlink" title="Positional Encoding(位置编码)"></a>Positional Encoding(位置编码)</h2><p>纯粹的 self-attention 没有内置的词序表示。没有某种位置信号,它无法直接知道 "dog" 在 "bites" 之前而不是之后。</p><p>词序会改变含义。所以模型需要另一个组件。它需要一种方式将每个 token 的位置注入到数学运算中。</p><blockquote><p><strong>简短解释:位置编码(positional encoding)</strong><br>位置编码是模型获取顺序信息的方式。它告诉模型每个 token 在序列中的位置。</p></blockquote><p>最初的 transformer 论文(Vaswani et al. 2017)的解决方案是给每个位置赋予自己的数字模式,并在任何其他处理之前直接加到每个 token 的嵌入上。位置 1 有一种模式,位置 5 有不同的模式,位置 100 有另一种模式。这些模式来自不同频率的正弦和余弦波。这样一来,位置 1 的 "dog" 的嵌入就不同于位置 5 的 "dog" 的嵌入,仅仅因为加在它上面的位置模式不同。</p><p>这能够工作,而且选择正弦编码的部分原因是它们可以外推到超出训练时见过的序列长度。但加法式的位置方案仍然有两个随着模型规模扩大而变得重要的问题。</p><p>首先,嵌入必须在同一组数字中同时承载含义和位置。能塞进去的东西是有限的。</p><p>其次,尤其是学到的绝对位置嵌入(learned absolute position embeddings)不能干净地泛化。如果你训练的提示最长 2,048 个 token,模型在训练时从未见过位置 5,000,那个位置的嵌入就不是以同样的方式学到的。</p><p>现代模型大多使用一种不同的方案,叫做 Rotary Position Embeddings(RoPE),由 Su et al. 于 2021 年提出,现在被 LLaMA、Mistral、Gemma、Qwen 和大多数其他开源权重家族所使用。直觉是:RoPE 不是将位置信息加到每个 token 的向量上,而是将 Query 和 Key 向量旋转一个取决于 token 位置的角度。位置 1 的 token 转一个小的角度,位置 100 的 token 转一个更大的角度。当两个 token 在后面的 attention 中被比较时,重要的是它们 Query 和 Key 旋转的差值,这编码了它们相距多远。</p><blockquote><p><strong>简短解释:RoPE</strong><br>RoPE 代表 Rotary Position Embeddings。它不是加一个位置向量,而是旋转 Query 和 Key 向量,使相对距离在 attention 中显现出来。</p></blockquote><p><img src="https://www.0xkato.xyz/assets/transformer-rope.png" alt="Rotary position embeddings rotate vectors by position"></p><p>实际的优点是真实的。RoPE 自然地编码相对位置(这更接近 attention 实际需要的东西)。它能更好地泛化到更长的上下文。而且它不给模型增加新的参数。</p><p>即使有了好的位置编码,现代 LLM 仍然有一个已记录在案的"迷失在中间(lost in the middle)"问题(Liu et al. 2023)。它们使用长提示开头和结尾的信息比使用中间的信息更可靠。这就是为什么像"把重要上下文放在前面"或"在末尾重复关键信息"这样的提示工程技巧确实有用。模型并不是同等地使用你提示的每个部分。</p><p>有了 token 含义和位置都编码完成,下一个问题是:token 实际上如何交换信息?</p><hr><h2 id="Attention"><a href="#Attention" class="headerlink" title="Attention"></a>Attention</h2><p>这就是赋予这个架构名字的机制。Attention。</p><p>在每个 transformer 层内部,attention 做一件事。它让每个 token 查看它被允许看到的其他 token,并决定哪些对接下来发生的事重要。</p><p>它通过同时给每个 token 赋予三个角色来实现。每个 token 被转换成三个新的向量,称为 Query、Key 和 Value(Q、K、V)。</p><blockquote><p><strong>简短解释:Q、K、V</strong><br>Query 表示"我在找什么",Key 表示"我匹配什么",Value 是匹配成功时被传递的信息。</p></blockquote><ul><li>Query 问:"我从其他 token 那里在寻找什么?"</li><li>Key 说:"这就是我提供给正在看我的 token 的东西。"</li><li>Value 携带:"这就是匹配发生时被传递的东西。"</li></ul><p>同一个 token 同时扮演全部三个角色。Q、K、V 的变换是学到的矩阵,所以模型在训练过程中会弄清楚每个 token 应该寻找什么以及它应该提供什么。</p><p>匹配通过相似度分数来发生。每个 token 的 Query 与它被允许看到的每个 token 的 Key 进行比较,使用缩放点积(scaled dot product)。直观地说,这衡量了两个向量的对齐程度。缩放使得数字在 softmax 之前保持稳定。</p><blockquote><p><strong>简短解释:点积(dot product)</strong><br>点积是一种简单的方法,用于给两个向量的对齐程度打分。对齐程度越高意味着匹配越强。</p></blockquote><p>然后,匹配分数通过 softmax 转换为权重。Softmax 接收任意一组数字,将它们转化为总和为 1 的类概率分布。匹配分数更高的 token 获得更高的权重,然后用这些权重取 value 向量的加权平均。</p><blockquote><p><strong>简短解释:softmax</strong><br>Softmax 将原始分数转化为加起来等于 1 的权重。大分数得大权重,小分数得小权重。</p></blockquote><p>举个例子。考虑句子 "The cat that I saw yesterday was sleeping." 当模型处理 "was" 时,它需要弄清什么在睡觉。"was" 的 Query 向量与它被允许看到的 token 的 Key 向量进行比较。与 "cat" 的点积很高,因为模型已经学会像 "was" 这样的动词需要一个主语,而像 "cat" 这样的主语会产生与之对齐良好的 Key 向量。与 "yesterday" 的点积很低。Softmax 将这些分数转化为权重,"cat" 得到高权重,"yesterday" 得到低权重。然后模型对相应的 value 向量取加权和,所以 "cat" 的 value 主导了结果。"was" 的新表示现在主要由 "cat" 的 value 塑造。这就是几个位置之前的 token 如何成为被指代对象。</p><p>有一个 GPT 风格语言模型特有的约束,即它们从左到右生成文本。位置 5 的 token 只能关注位置 1 到 5。它不能关注位置 6、7、8 的 token,因为它们还没被生成。这叫做因果掩码(causal masking)。实现很简单:未来 token 的匹配分数低到经过 softmax 后权重几乎为零。</p><blockquote><p><strong>简短解释:因果掩码(causal masking)</strong><br>因果掩码隐藏未来的 token。它阻止 decoder-only 语言模型在预测下一个 token 时向前偷看。</p></blockquote><p><img src="https://www.0xkato.xyz/assets/transformer-attention-heatmap.png" alt="Attention heatmap showing causal masking and high attention to cat"></p><p>可解释性研究中最有趣的发现之一是关于一种专门的注意力头,叫做 induction head(归纳头),由 Anthropic 在 2022 年发现。这些头学会了在提示中发现 "A B … A" 这种模式,并预测接下来的会是 B。当模型第二次看到 "A" 时,归纳头回溯到上一次 "A" 出现的地方,看到它后面是什么,然后复制那个。它们是已知的最清晰的上下文学习(in-context learning)机制之一——LLM 从你的提示中捕捉到一个模式并继续它的能力。</p><blockquote><p><strong>简短解释:归纳头(induction head)</strong><br>归纳头是一种注意力头,它注意到提示中重复的模式并帮助延续它们。</p></blockquote><p>Attention 有一个巨大的成本。在全注意力(full attention)中,每个 token 与它被允许看到的所有 token 比较,所以提示长度加倍,工作量大约翻四倍。这就是为什么长提示运行成本高,以及为什么最近很多研究都在关注让 attention 更高效(FlashAttention、稀疏注意力、线性注意力)。</p><p>但一个注意力头只给模型提供一种关于关系的学到的视角。</p><hr><h2 id="Multi-Head-Attention(多头注意力)"><a href="#Multi-Head-Attention(多头注意力)" class="headerlink" title="Multi-Head Attention(多头注意力)"></a>Multi-Head Attention(多头注意力)</h2><p>一次 attention 传递给模型提供了一种决定哪些 token 对其他 token 重要的方式。这还不够。语言中有许多同时发生的关系。主谓一致。代词及其指代的名词。句子之间的长距离引用。词序和局部短语。</p><p>多头注意力通过并行地运行多次 attention 来解决这个问题,每个并行的传递在它自己较小的空间中操作。每个并行传递被称为一个头(head)。</p><blockquote><p><strong>简短解释:注意力头(attention head)</strong><br>一个注意力头是一次独立的 attention 传递,拥有自己学到的投影。</p></blockquote><p>这部分经常被描述错误——包括在大量教程中。每个头并不是获取原始 token 向量的字面切片。每个头有自己学到的投影矩阵,将完整的 token 向量映射到它自己较小的 Q、K、V 向量。所以如果一个模型每个 token 有 4,096 个数字和 32 个头,每个头通常在 128 维空间中工作,但那 128 个数字是完整 4,096 的学到的投影,而不是固定的切片。是同一 token 的不同"视角",而不是它的不同分块。</p><p>每个头独立运行它的 attention 传递。然后所有头的输出被拼接(concatenate)起来,经过一个最终的线性层,将它们混合回一个完整大小的向量。模型也学习那个最终的混合。</p><p><img src="https://www.0xkato.xyz/assets/transformer-multi-head-attention.png" alt="Multi-head attention combines specialized attention heads"></p><p>有意思的是,不同的头往往最终部分地专门化。模型从未被告知每个头应该做什么。专门化是在训练中自然涌现的。研究人员发现了追踪语法的头(将动词连接到宾语、冠词连接到名词)、弄清代词指代哪个名词的头、追踪位置模式的头、归纳头,以及更多。一个 transformer 层可能有 32 个头。一个现代前沿模型有几十层。所以一个典型的 LLM 总共有数千个注意力头,每个都贡献自己学到的视角。</p><p>有一个实际的成本问题驱动了近期的架构变化。每个头需要将所有已生成 token 的 Key 和 Value 向量保存在内存中,这样当生成新 token 时模型不必从头重新计算所有内容。这叫做 KV 缓存(KV cache),它是在长上下文长度下运行 LLM 的主要内存成本。</p><blockquote><p><strong>简短解释:KV 缓存(KV cache)</strong><br>KV 缓存在生成过程中存储旧的 Key 和 Value 向量。它省去了模型每增加一个 token 就重新计算整个提示的工作。</p></blockquote><p>现代 decoder-only LLM 大多使用一种变体,叫做 Grouped-Query Attention(GQA)。不是每个头都有自己的 key 和 value,而是头分组共享相同的 key 和 value 头。LLaMA-2 70B 有 64 个 query 头但只有 8 个 key/value 头。Mistral 7B 有 32 个 query 头和 8 个 key/value 头。结果几乎是全多头注意力相同的精度,但内存压力和推理成本大大降低。</p><blockquote><p><strong>简短解释:GQA</strong><br>Grouped-Query Attention 允许多个 query 头共享更少的 key/value 头。这在保持多个 query 视角的同时削减了 KV 缓存内存。</p></blockquote><hr><h2 id="Feed-Forward-Network(前馈网络)"><a href="#Feed-Forward-Network(前馈网络)" class="headerlink" title="Feed-Forward Network(前馈网络)"></a>Feed-Forward Network(前馈网络)</h2><p>在 attention 完成 token 之间的信息混合之后,每一层还有第二步,但谈论它的人少得多。前馈网络。</p><p>如果说 attention 是 token 之间互相交谈,那么前馈网络是每个 token 独立地做更多处理。它对每个 token 的向量独立运行,没有跨 token 的混合。</p><p>前馈网络按顺序做三件事:</p><ol><li>将 token 的向量扩展到更大的尺寸(原始 transformer 使用 4x,而现代 SwiGLU 模型通常使用不同的扩展尺寸)。</li><li>应用一个非线性函数。</li><li>将向量压缩回原始尺寸。</li></ol><p><img src="https://www.0xkato.xyz/assets/transformer-ffn.png" alt="Feed-forward network expands, transforms, and compresses each token vector"></p><p>中间那个非线性步骤做了某件值得理解的具体事情。非线性是一个弯曲其输入的函数。最简单的,ReLU,对任何负数输出零,对正数原样传递。</p><blockquote><p><strong>简短解释:非线性(non-linearity)</strong><br>非线性是一个函数,它阻止网络坍塌成一个大的线性变换。</p></blockquote><p>没有它,FFN 只是两个线性层叠在一起,而堆叠纯线性数学会坍塌。两个线性层连续排列在数学上等价于一个线性层,一百层线性层连续排列仍然等价于一层。非线性阻止了这种坍塌,它是 FFN 能够做到比单次矩阵乘法更丰富的事情的原因。</p><p>原始 transformer 使用 ReLU。GPT 和 BERT 转向 GELU。现代模型如 LLaMA、Mistral 和 PaLM 使用 SwiGLU。扩展-然后-压缩的结构保持不变。被迭代改进的是非线性本身。</p><p>密集 transformer 模型的大部分参数都在 FFN 中,而不是 attention 中。大部分权重位于前馈层中。</p><p>而这些参数不是泛化的。它们承载了模型存储的大部分事实和语义结构。研究人员发现 FFN 内部的某些神经元与特定的概念或事实强烈关联。一个神经元可能在埃菲尔铁塔相关的文本上强烈激活。另一个在编程语言上。另一个在过去式动词上。当模型"知道"巴黎是法国的首都时,这个事实由特定层中的 FFN 权重和激活来表示。</p><p>这种存储记忆的特性有一个有趣的推论。研究人员已经弄清楚了如何在训练好的模型中直接编辑某些事实而无需重新训练。像 ROME(Rank-One Model Editing)这样的方法可以通过对特定 FFN 权重矩阵进行目标低秩编辑,将"埃菲尔铁塔在巴黎"改为"埃菲尔铁塔在罗马"。然后模型会倾向于生成与编辑后的关联一致的文本。</p><p>一些现代前沿模型已经开始用称为 Mixture of Experts(MoE)的东西替换密集 FFN。不是每层有一个前馈网络,模型有许多并行的 FFN(称为 experts),以及一个微小的路由网络来选择哪些 expert 处理每个 token。Mixtral 8x7B 每层有 8 个 expert;对于任何给定的 token 只有 2 个被激活。总参数量大幅增加,但每个 token 的计算量增长慢得多,因为只有少数几个 expert 在运行。这就是如何在不成比例地扩展推理成本的情况下扩展参数规模。</p><blockquote><p><strong>简短解释:MoE</strong><br>Mixture of Experts 意味着模型有几个前馈网络,并将每个 token 只路由通过其中少数几个。</p></blockquote><p>Mixtral 8x7B 总共有 467 亿参数,但每个 token 只用大约 129 亿。对于非常大型的模型,这已经成为一个常见选项,因为它让你在不断增加参数规模的同时不让推理成本成比例增长。</p><hr><h2 id="Residual-Stream-and-Layer-Normalization(残差流与层归一化)"><a href="#Residual-Stream-and-Layer-Normalization(残差流与层归一化)" class="headerlink" title="Residual Stream and Layer Normalization(残差流与层归一化)"></a>Residual Stream and Layer Normalization(残差流与层归一化)</h2><p>残差流使得模型是"加法式"的而不是"替换式"的。在 attention 运行之后,或前馈网络运行之后,结果通常不替换 token 的向量。它被加到上面。逐个位置地加。新向量等于旧向量加上子块的输出。</p><blockquote><p><strong>简短解释:残差连接(residual connection)</strong><br>残差连接将块的输出加回它起始时的向量。它为信息和梯度提供了通过网络的捷径。</p></blockquote><p>跨越三十、五十或一百层,每层的贡献累积起来,而不是简单地覆写前一个向量。这个运行中的和被称为残差流(residual stream),它有一个奇特的性质。原始输入嵌入仍然有一条到达后面层的直接加法路径,与沿途每个子块的贡献混合在一起。</p><p><img src="https://www.0xkato.xyz/assets/transformer-residual-stream.png" alt="Residual stream accumulates attention and feed-forward outputs"></p><p>残差连接不是为 transformer 发明的。它们来自 ResNet(He et al. 2015),最初用于图像识别。动机是深层网络无法训练。训练信号在穿越许多层回来时变得太弱(或有时太强)。模型实际上无法从自己的错误中学习。添加一条捷径路径让信号直接从输出流回输入。突然间你可以训练有数百层的网络了。Transformer 继承了同样的技巧。</p><p>在现代可解释性研究中,残差流已经成为核心对象。每个组件——每个注意力头、每个前馈网络、甚至最后的反嵌入步骤——都从残差流读取并写回其中。</p><p>第二部分,层归一化(layer normalization),存在的原因要实际得多。没有它,残差流将无法保持稳定。流经数十次加法的数字倾向于要么爆炸式增长,要么坍缩到零。无论哪种情况,训练都会失败。层归一化在每个子块之间将每个 token 的向量重新缩放到一个受控的范围。</p><blockquote><p><strong>简短解释:层归一化(layer normalization)</strong><br>层归一化重新缩放 token 向量,使其数字在模型训练期间保持在一个稳定的范围内。</p></blockquote><p>原始 2017 年的 transformer 在每个子块之后应用归一化(post-norm)。这对于浅层模型有效,但随着深度增加变得更难可靠训练。现代 transformer(GPT-2 以后,LLaMA、Mistral)通常在每个子块之前应用归一化(pre-norm)。这是使得非常深的 transformer 更容易训练的变更之一。</p><p>归一化函数本身也变了。许多现代开源模型(LLaMA、Mistral、Gemma、Phi)使用一种更简单的变体,叫做 RMSNorm。原始层归一化同时做两件事:将每个向量向零平移,然后重新缩放数字的大小。RMSNorm 去掉了平移步骤,只保留缩放。经验上,缩放承载了大部分好处,同时计算成本更低。</p><blockquote><p><strong>简短解释:RMSNorm</strong><br>RMSNorm 是一种更便宜的归一化方法,在不先减去均值的情况下重新缩放向量大小。</p></blockquote><p>这就是那些不光彩的基础设施。没有残差连接,非常深的模型会变得极难训练。没有层归一化,运行中的和可能爆炸或坍缩。有了两者,你就能得到数百层深的模型。</p><hr><h2 id="Next-Token-Prediction(下一个-token-预测)"><a href="#Next-Token-Prediction(下一个-token-预测)" class="headerlink" title="Next-Token Prediction(下一个 token 预测)"></a>Next-Token Prediction(下一个 token 预测)</h2><p>在所有 attention 和前馈处理层完成之后,模型对序列中的每个 token 都有一个向量。在生成过程中,要预测下一个词,它只取最后一个 token 的最终向量。</p><p>那个最后的向量被转换为每个可能的下一个 token 对应一个数字。如果词汇表有 100,000 个 token,那就是 100,000 个数字。这些数字叫做 logits。它们还不是概率。它们可以是任何大小,正数或负数。</p><blockquote><p><strong>简短解释:logits</strong><br>Logits 是每个可能的下一个 token 的原始分数。只有在 softmax 之后它们才变成概率。</p></blockquote><p>Softmax 将这些 logits 转化为模型在可能的下一个 token 上的概率分布。和之前一样的操作,在模型中的不同位置。</p><p>模型通常不每次只选最高概率的 token。解码设置控制输出的确定性或多样性程度。Temperature 改变分布的尖锐程度。Top-k 和 top-p 将选择限制在最合理的一组下一个 token。这就是为什么同一个模型在一种设置下可以感觉精确,在另一种设置下可以更有创意。</p><blockquote><p><strong>简短解释:temperature</strong><br>Temperature 控制采样期间的随机性。低 temperature 使模型更保守;高 temperature 使输出更多样化。</p></blockquote><p>一旦选出一个 token,它就被添加到输入中。模型在更长的序列上运行下一步,通常重用 KV 缓存,这样就不必从头重新计算整个前缀。新 token 的新 attention。新前馈。新最终向量。新预测。循环继续,直到模型输出一个序列结束 token 或达到长度限制。一整段话就是这个循环,一次一个 token。</p><p>这个单一目标——预测下一个 token——是基础 LLM 的核心训练信号。基础模型不是被训练来做事实准确性、对话能力、推理或编程的。它被训练来预测海量文本中的下一个 token。之后的后训练才能将模型调整为指令遵循、偏好、安全性和对话行为。</p><p>有一个值得了解的重大效率创新。它叫做投机解码(speculative decoding)。一个小型快速模型提前提出几个 token。大模型并行地验证它们。如果提出的 token 在大模型的概率下被接受,就接受它们。如果没有,就回退到大模型。做得正确的话,输出分布与单独运行大模型一致,但循环可以快得多。</p><blockquote><p><strong>简短解释:投机解码(speculative decoding)</strong><br>投机解码使用一个小型草稿模型向前猜测,然后让较大的模型一次验证几个猜测的 token。</p></blockquote><p>下一个 token 预测循环是架构中最简单的部分,但它是让整个系统运作起来的东西。</p><hr><h2 id="Architecture-vs-Trained-Weights(架构-vs-训练权重)"><a href="#Architecture-vs-Trained-Weights(架构-vs-训练权重)" class="headerlink" title="Architecture vs Trained Weights(架构 vs 训练权重)"></a>Architecture vs Trained Weights(架构 vs 训练权重)</h2><p>我们已经走过了核心机制:token、嵌入、位置编码、attention、多头注意力、前馈网络、残差流与归一化,以及输出侧的下一个 token 循环。这就是基本架构的一遍遍历。</p><p>那么 GPT、Claude、Gemini 和 LLaMA 之间实际有什么区别?公开细节各不相同,而闭源模型不会公布所有的架构选择。但在本文所覆盖的层面,它们大致处于同一 transformer 家族的设计空间之中。</p><p>大多数现代基于 transformer 的 LLM 使用相同的大致结构:分词、嵌入、位置编码、堆叠的 transformer 层(每层有多头注意力和前馈网络)、残差流、层归一化,以及下一个 token 预测。</p><p>模型之间的不同在于:</p><ol><li>训练权重本身——从不同的训练数据、在不同的规模上学习而来。</li><li>配置:层数、词汇表大小、头数、参数量、MoE 还是密集。</li><li>后训练:指令微调、基于人类反馈的学习、在基础模型之上应用的安全控制。</li></ol><blockquote><p><strong>简短解释:权重(weights)</strong><br>权重是模型内部学到的数字。训练会改变这些数字,直到模型能很好地预测文本。</p></blockquote><p>2023-2025 年的"现代 transformer"技术栈在许多严肃的前沿和开源权重模型上收敛到了一组共同的选择,尽管不同的团队是独立达到这些选择的。Pre-norm 布局。RMSNorm。RoPE。SwiGLU。Grouped-Query Attention。在一些最大型的模型中使用 Mixture of Experts。这些都不是一次性发明的。它们是在原始 2017 年设计之上大约五年的精炼中累积起来的。</p><hr><h2 id="未来走向"><a href="#未来走向" class="headerlink" title="未来走向"></a>未来走向</h2><p>Transformer 家族架构的收敛在机器学习历史上是不寻常的。在这个领域的大部分历史中,每个问题都有自己的专门网络。图像识别用一种。语言用另一种。音频用第三种。视觉和语言团队几乎不共享方法。</p><p>现在 transformer 风格的模型出现在语言、视觉、音频和多模态系统中。Transformer 吸收了该领域的很大一部分。</p><p>这可能会改变。Mamba 和其他状态空间模型是可信的替代方案,特别是对于非常长的序列。混合架构正在被探索。Mixture-of-Experts 已经以五年前会被认为是异域的方式改变了前沿上"架构"的含义。</p><p>但本文中的核心机制——token、嵌入、位置编码、attention、前馈网络、残差流与归一化,以及下一个 token 预测——是持久的部分。即使架构发生变化,这些也是任何序列模型必须以某种形式解决的问题。</p><p>如果你读到了这里,你现在可以阅读许多现代 transformer 论文或模型卡,并知道每个部分在讲哪个组件。这就是目标。</p><hr><p><strong>原文来源</strong>:0xkato, "How LLMs Actually Work", June 1, 2026, <a href="https://www.0xkato.xyz/how-llms-actually-work/">https://www.0xkato.xyz/how-llms-actually-work/</a></p>
同分类推荐文章
- 00 卷首语:当 Karpathy 说他半年没写一行代码 (2026-06-21 21:20:27)
- Loop Engineering 实践:一次批量实现 8 个 issue,完成夔牛工具的开发 (2026-06-17 04:00:24)
- 从月球漫步到赛博都市,WBench 测出了世界模型的边界 (2026-06-15 09:05:33)
建议继续学习
- 微博 × MCP:社交媒体新玩法解锁 (累计阅读 56)
- 从「能用」到「好用」:LLM 流式响应实现方式的探索之路 (累计阅读 52)
- Agent Loop 简介 (累计阅读 44)
- ACL 2026美团论文精选:从能力评测到推理优化,构建生成新范式 (累计阅读 51)
- 00 卷首语:当 Karpathy 说他半年没写一行代码 (累计阅读 11)