第九章 · 大模型

9.1 模型如何理解代码

本节最后更新:2026-05-12
验证环境:无(纯理论章节)

Transformer 的通俗解释

这一节我们来说一个无法完全绕开的技术话题——大语言模型是怎么工作的。我承诺:不会出现任何数学公式,只会用类比来解释。

目前所有主流的大语言模型(Claude、GPT、Gemini、LLaMA 等)都基于同一个架构:Transformer。这个架构在 2017 年由 Google 团队提出,论文标题叫《Attention Is All You Need》——"注意力就是你所需要的一切"。

论文标题本身已经透露了核心思想:当一个模型具备了"注意"不同信息之间关系的能力,它就可以理解语言、生成代码、甚至推理复杂问题。不需要其他复杂的机制,注意力就够了。

注意力机制:模型在"看"什么

想象你在读一句话:

"那只猫追着老鼠跑进了它的窝,它看起来很生气。"

你怎么知道"它"指的是什么?"它"是猫还是老鼠?作为人类,你自然会把"它"和前面出现过的"猫"关联起来——你注意到了"猫"和"它"在句子中的关系。你的大脑在处理"它"的时候,同时在"看"这个词本身、"猫"这个词、以及整句话的语境。这个"同时看所有相关词"的能力,就是注意力。

Transformer 的注意力机制做的是完全一样的事情:模型在处理一个词时,会同时"注意"到句子中所有其他词,计算它们之间的关联程度。 它不会孤立地理解一个词,而是把词放在上下文中理解。

一个更直观的类比:超级派对

想象你在一个超级大的派对上,你站在人群中。你需要同时听周围所有人的对话——不是听内容,而是听"谁和谁在说话"、"谁的声音更响亮"、"哪个方向的对话和你有关"。

你的耳朵同时在接收所有人的声音,但你的注意力会自然地偏向那些和你更相关的"对话"——离你最近的、你认识的人的、谈到你感兴趣话题的。

Transformer 的注意力机制就像这个"派对上的人"。当它处理一个词时,它会"听"所有其他词的声音,计算出每个词和当前词的"相关度",然后根据相关度决定"应该重点关注谁"。

全局注意力 vs 局部注意力

这种"全局注意力"的能力,是 Transformer 相比之前的技术(RNN、LSTM)的最大优势。

你想象一下:在 Transformer 出现之前,RNN(循环神经网络)处理文字的方式是——从第一个词开始,一个词一个词地往后读。每读一个词,它会把前一个词的"记忆"带过来。就像一个人用手指着字,一个字一个字地指着读。读到句尾时,第一个词的信息已经被稀释了很多。

这就有问题了:如果句子很长——比如"在一个阳光明媚的下午,小明带着他的狗——一只叫旺财的金毛寻回犬——去公园散步,然后旺财看到了……",读到后半部分,模型可能已经忘了"旺财"是谁。

Transformer 的注意力机制没有这个问题。不管句子多长,模型在处理"旺财"时都能同时"看到"句子前面的"金毛寻回犬"——甚至能"看到"更前面的"他的狗"和"小明"。它不会遗忘,因为它在每个位置都能看到全局。

这就是为什么 Transformer 能处理远比 RNN 更长的上下文——也是为什么它成为了所有现代大语言模型的基石。

Token 切分:模型怎么"读"你的话

我们在第 6 章讲过 Token。AI 模型在"读"你的文字时,第一步就是把文字切成若干 Token。

比如你写了一句 "帮我做一个登录页面"——切分器可能会把它切成 ["帮我", "做", "一个", "登录", "页面"] 几个 Token。也有可能会切成 ["帮", "我做", "一个", "登录页面"]——取决于切分器的"词库"中有哪些预设的 Token 组合。

切分方式的影响:

切分方式虽然看起来是技术细节,但它对实际使用有非常具体的影响。以代码为例:

// 一个简单的函数
function validateEmail(email) {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(email);
}

这意味着:变量的命名方式会影响 Token 的切分效率。 短变量名(如 abfn)切分出的 Token 更少,但可读性差;描述性变量名(如 validateEmailInput)可读性好,但切分出的 Token 更多。

这个权衡在实际编码中并不需要刻意关注——AI 不按 Token 数量计费(对普通用户来说)。但它有助于你理解:AI "理解"你的代码的第一步,是把代码翻译成它内部的数字表示。

切分完成后,每个 Token 被转换成一个向量(可以理解为"一串数字",几百到几千个数字组成的一个"坐标")。这个向量编码了 Token 的语义信息——"猫"和"狗"的向量在"语义空间"中距离很近(都是动物),"猫"和"冰箱"的距离就很远。然后所有这些向量进入 Transformer 模型进行处理。

预测下一个词:涌现出智能

Transformer 模型要做的事情,本质上非常简单:根据输入 Token 的序列,预测下一个最可能出现的 Token。

比如你输入"帮我写一个"——模型预测下一个词可能是"程序",也可能是"函数",还可能是"网站"。它根据训练数据中的统计模式,给每个可能的词分配一个概率,选择概率最高的那个。

模型一次预测一个 Token,然后把这个 Token 加入输入序列,再预测下一个。如此循环,直到生成完整的回答。

这个过程在数学上很简单——就是"猜下一个词"。但关键点在下面:

当模型在数万亿 Token 的互联网数据上训练过之后,"预测下一个词"这个简单的任务,在超大规模的层面发生了质变。模型"被迫"学到了远超"预测下一个词"的能力:

在数万亿 Token 的规模上,"预测下一个词"这个简单的训练目标,催生了语法、逻辑、知识、推理等高级能力。 这不是有人在代码中写了"教会模型推理"的规则——它是模型在巨大的数据规模上自然"涌现"出来的能力。

这个"涌现"现象,是过去几年 AI 领域最重要的发现之一。

上下文窗口的意义

模型在处理你的输入时,一次能"看到"的 Token 数量是有限制的。这个限制就是上下文窗口。

上下文窗口越大,模型一次能接收的信息就越多。但代价是:更大的窗口需要更多的计算资源,处理速度也更慢。而且对于 Transformer 架构来说,计算量随上下文长度平方级增长——窗口扩大一倍,计算量增加四倍。

平方级增长的后果:

这就是为什么"200K 上下文"是一个值得强调的规格——它不仅意味着更多的记忆空间,还意味着更大规模的计算资源投入。从 4K 到 200K,计算量增加了 2500 倍。所以长上下文模型往往更贵、更慢。

但这也解释了为什么 Google 的 Gemini 能达到 1M Token——Google 可能在 Transformer 架构上做了工程优化(比如稀疏注意力、滑动窗口注意力等),降低了计算复杂度。

模型训练的两个阶段

理解模型的训练过程有助于你理解它的行为模式——为什么它有时候很聪明,有时候又犯低级错误。

第一阶段:预训练

模型在数万亿 Token 的互联网公开数据上进行训练。这些数据包括书籍、文章、代码仓库、论坛讨论、维基百科等。

这个阶段的目标是"学习语言的模式"——语法、知识、推理方式、各种编程语言的代码风格。模型在大量文本中"找规律",逐渐建立起对语言的"理解"。

预训练结束时,模型已经"知道"了很多东西。它知道 JavaScript 的函数怎么定义,知道 Python 怎么处理 Exception,知道 React 的 useEffect 是做什么的。但它还没有学会遵循指令——你可以问它"什么是闭包",它可能会生成一篇关于闭包的文章,而不是一个简洁的回答。因为它没有被训练成"回答问题"——它只是被训练成"生成看起来像人类写的文字"。

第二阶段:指令微调和对齐

模型在高质量的人类标注数据上进行微调。这些数据通常是"问题-答案"对——人类标注员写了很多问题和理想回答,让模型学习怎么响应人类的请求。

这个阶段的目标是教模型"怎么正确回答用户的问题"——理解指令、遵循规则、拒绝有害请求、解释自己的推理。

对齐阶段还做了另一件重要的事:让模型学会说"我不知道"。

预训练阶段的模型不会说"我不知道"——它只会生成"最可能的"回答。但在对齐阶段,标注员教了模型:当你不知道答案时,承认不知道比编造一个答案更好。这是为什么现代 AI 模型会主动说"我不知道"或"我不确定"——这不是它们天生的能力,是人工标注的结果。

这个两阶段过程解释了 AI 的一些常见行为:

但对齐训练也不是万能的。如果预训练数据中某个领域的覆盖不充分(比如一个偏门框架的旧版本),模型在这个领域的表现就会很差——对齐阶段无法补充预训练缺失的知识。

本节要点
Vibe 练习

问 AI:

"用'你在一场超级大的派对上,每时每刻都在听周围所有人说话'这个类比,来解释一下 Transformer 的注意力机制。重点解释'自注意力'是什么意思,以及为什么这对理解和编程很重要。"

然后做一个"预训练 vs 对齐"的体验实验:

问 AI 一个"知识型"问题("JavaScript 的闭包是什么?")和一个"对齐型"问题("如果你不知道答案,你应该怎么做?")。比较 AI 在两个问题上的回答风格差异——知识型回答流畅准确,对齐型回答可能更注意态度和安全性。这个对比会让你对两阶段训练有更直观的感受。