从"你好"到回答:大模型预测下一个词的六步旅程

0 阅读9分钟

大模型预测下一个词,到底经历了什么?

我们每天跟大模型聊天,问它问题,它一个字一个字地往外蹦答案。你有没有好奇过,在你按下回车之后,模型内部到底做了什么?这篇文章就从头到尾捋一遍。

一、把你的话拆成小块

你跟大模型说"你好",它听不懂这两个汉字。模型只认数字。

所以第一步,得把文字拆开,拆成模型认识的最小单位。这个最小单位有个名字,叫 Token(词元)

Token 长什么样?举个例子:

  • 英文 "tokenization" 可能被切成 ["token", "ization"]
  • 中文 "我爱人工智能" 可能切成 ["我", "爱", "人工智能"]

你发现没有,Token 往往是词的"碎片"。拿 "playing" 来说,可能切成 ["play", "ing"] 两块。为什么不干脆把一个词当成一个整体呢?

你想,英文有几十万个单词,中文有几百万个词汇。每个词都给一个编号,那编号本就大到没法用了,查一次表都得半天。把词切成子词,常用的"积木块"就那么几万个,查找表小了,算起来也快。就像小孩玩积木,几十块基础形状就能搭出城堡、飞机、恐龙。

GPT 系列使用的分词算法叫 BPE(Byte Pair Encoding,字节对编码) ,它基于统计频次来切分,高频出现的片段会被合并为一个 token。国内像通义千问也有自己的分词方案。

把 Token 想象成大模型的"货币"就行——你每次跟它聊天,背后都是这些 Token 在流动。你发一句话过去,它先给你换成 Token,每个 Token 再对应一个整数编号,比如"你"对应的编号可能是 57668。

这个编号本身没有任何意义。57668 减 57667 等于 1,不代表语义上接近了 1 个单位。它就是个门牌号。

二、让编号带上"意思"

门牌号有了,下一步是让模型理解每个词的意思。靠什么?靠一个叫 Embedding(嵌入)  的操作。

模型内部有一张巨大的表,叫 Embedding Matrix(嵌入矩阵) 。你可以把它想成一排柜子,每个 Token ID 对应一个柜门。模型拿到 57668 这个编号,直接走到第 57668 号柜子跟前,拉开,从里面掏出一个长长的向量——比如一个 1024 维的数组。

这个向量,就是"你"这个字的语义表示。它把这个字的"意思"编码在了一串数字里。

怎么理解"编码在数字里"这件事呢?想象一个多维空间。每个词都是空间里的一个点。语义近的词,点就挨得近;语义远的词,点就离得远。

比如"你"和"好"这两个点,距离挺近的——因为日常对话里"你好"总是一起出现。但"你"和"苹果",距离就很远。

更有意思的是,向量还可以做加减法。拿"国王"的向量,减去"男性"的向量,再加上"女性"的向量,结果会非常接近"王后"的向量。这意味着语义关系被编码成了空间方向。模型的训练,本质上就是在构建这样一个几何坐标系。

三、加上位置信息

光有语义向量还不够。看这两句话:

我咬了狗。

狗咬了我。

四个字完全一样,意思天差地别。一个是你欺负狗,一个是狗欺负你。区别只在于顺序。

语义向量(Embedding)不携带位置信息——"我"不管出现在句子开头还是末尾,查表查出来的向量都一样。那模型怎么区分"第 1 个位置的我"和"第 3 个位置的我"呢?

解法很直接:在向量上叠一层位置信息。给每个位置编一个独特的信号,加到语义向量上。这样一来,每个 Token 就同时携带了两样东西:它自己是什么意思,以及它在句子里的第几个位置。

具体实现有多种方式:Transformer 原始论文用的是固定正弦波编码(Sinusoidal Positional Encoding) ;GPT 系列用的是可学习的位置嵌入(Learnable Positional Embedding) ,把位置也当成可训练的参数,和语义向量一起从数据里学出来;Llama 系列则采用了旋转位置编码(RoPE) ,把位置信息以旋转的形式融入向量。无论哪种方案,核心思想都是给模型提供位置信号。

四、理解上下文的小机制

到了这一步,每个 Token 都有了语义 + 位置。但还有个关键问题没解决——上下文

读这个英文句子:

The animal didn't cross the road, because it was too tired.

"it" 指的是谁?animal 还是 road?我们人一看就知道是 animal——累了嘛,路怎么会累。但模型怎么知道?

这里就用到了 Transformer 最核心的发明:Self-Attention(自注意力)

具体做法是这样的。每个 Token 的向量通过三个不同的线性变换(权重矩阵),分别生成三个新向量,各司其职:

  • Q(Query,查询向量) :代表"我在找什么"。比如"it"的 Q 向量,在问:"前面有没有跟我相关的词?"
  • K(Key,键向量) :代表"我能提供什么"。每个词都有一张"名片",上面写着自己的关键特征。
  • V(Value,值向量) :代表"我可以贡献什么具体内容"。当某个词被选中后,就把它丰富的语义信息传过去。

接下来,"it" 用自己的 Q 向量,去跟句子里其他每个词的 K 向量做点积(一种衡量相似度的运算)。算出来一个分数:

  • Q_it · K_animal → 分数很高,说明 animal 跟 it 相关性很强
  • Q_it · K_road → 相关性较弱,说明 road 跟 it 不太相关
  • Q_it · K_cross → 相关性也较弱

分数越高,两个词的关系越紧密。模型根据这些分数,把各个词的 V 向量按比例融合起来,得到"it"在当前语境下的最终含义。于是"it"就"知道"自己指的是 animal。

这整个流程在模型内部对句子里的每个词同时做一遍,所有词互相"照看"——你看我、我看你,彼此的影响力分数同时算出来,一层一层更新每个词的含义。这也是 Transformer 比之前 RNN、LSTM 等串行方案高效的地方:整句话可以并行计算(这主要体现在训练阶段;推理时仍然是逐词生成的自回归过程)。

做完 Self-Attention 之后,每个位置的向量还会经过一个前馈神经网络(FFN) ,对信息做进一步的变换和提炼。你可以把 FFN 理解为"让每个词独立地思考一下刚才从别人那里收集到的信息"——Attention 负责词与词之间的交流,FFN 负责每个位置的独立处理。

以上只是单层 Transformer 的处理。实际的大模型由几十甚至上百层这样的结构(Self-Attention + FFN)堆叠而成,每一层都在对语义进行更深度的抽象。信息从底层流到顶层,经过层层提炼,最终才形成对下一个词的预测。

同一个词在不同句子里,算出来的最终含义也不一样:

  • "苹果手机"里的"苹果",经过多层处理后,会带上手机、科技、品牌这些语义
  • "我吃了苹果"里的"苹果",则会带上水果、食物、味道这些语义

同一个"苹果",不同的上下文,最后表达的意思完全不同。这就是 Self-Attention + 多层堆叠共同作用的结果。

五、猜下一个词

经过上面一串操作(多层 Self-Attention 和 FFN 的交替处理),输入进来的每个 Token 都变成了一个富含上下文信息的向量。接下来,模型要做它唯一会做的事——预测下一个词

具体来说,模型最后一层输出一组 logits(未归一化的分数) ,每个候选 Token 都有一个对应的分数。这些 logits 经过 softmax 函数后,被转换为概率分布。比如你输入"中国的首都是":

text

北京    92%
上海     4%
南京     3%
...     ...

模型说:有 92% 的把握下一个词是"北京"。为什么不是 100%?因为语言天然有不确定性。也许在某段文本里,后面接的是"上海"也说不定。

模型选出概率最高的那个词(或者按一定策略从高概率词里随机选),输出。然后把这个词拼到原来的输入后面,形成新的输入,再走一遍整个流程,预测下下个词。就这样一个接一个,直到全部回答生成完毕。这个过程叫自回归生成(Autoregressive Generation)。

六、串起来看

用最简单的话把整个过程说一遍:

  1. 你输入的文字被切成 Token,每个 Token 给一个整数编号。
  2. 模型拿编号去查嵌入矩阵,取出这个 Token 的语义向量——在巨大的向量空间里找到它的位置。
  3. 给语义向量叠上位置信息,标明这个 Token 在句子里的第几位。
  4. 经过多层 Transformer 处理(每层包括 Self-Attention 让词之间交换信息,以及 FFN 对每个位置独立做变换),每个 Token 的向量被更新为融合了上下文含义的版本。
  5. 模型最后一层输出 logits,经过 softmax 变成概率分布,预测下一个 Token。
  6. 选出下一个 Token,拼回去,再重复第 2 步到第 5 步,一个字一个字地把回复生成出来。

大模型不神秘。它做的,就是把文字变成数字,在高维空间里做一堆矩阵运算,算出一个最可能跟在后面的词。拆开看,每一步的道理都不难懂。

📅 写作日期:2026-07-06