把大模型拆开给你看:5 幕戏讲清它怎么「猜」下一个字
一句话总览
大模型无论看起来多聪明,内部只会干一件事:给你一句话,它猜下一个词最可能是什么。猜出一个,接上去,再猜下一个,如此循环,直到它「猜」出的是【结束】。
所以「中国的首都是哪里?」不是被「理解并回答」的,而是被这样续写出来的:
中国的首都是哪里? → 模型猜:北
中国的首都是哪里?北 → 模型猜:京
中国的首都是哪里?北京 → 模型猜:是
……直到猜出【结束】
下面看它每次「猜」的时候,内部发生了什么。
第一幕:把文字切成块,变成数字(分词 + 嵌入)
模型不认识汉字,只认识数字。所以第一步是分词:把句子切成一个个 token(词元),每个 token 对应一个编号:
"中国的首都是哪里?" → ["中国", "的", "首都", "是", "哪里", "?"]
→ [1024, 57, 8391, 322, 6077, 30] (假设的编号)
然后每个编号查一张巨大的「坐标表」(嵌入矩阵),变成一个几百上千维的向量,你可以理解成给每个词发了一个 GPS 坐标。关键设计是:意思相近的词,坐标也相近。「首都」和「京城」的坐标离得很近,和「香蕉」离得很远。
到这里,你的问题就变成了一串坐标点。接下来是重头戏。
第二幕:注意力机制,词语之间开大会
单个词是看不清整句话的。「首都」这个词单独看,不知道是中国的首都还是美国的首都。所以模型要做一件事:让每个词和其他所有词交换一次信息,搞清楚自己在上下文里到底是什么意思。
这就是注意力机制。打个比方:每个词都去开一场会。
开会时,每个词带三样东西(都是模型从它的坐标算出来的三个向量):
-
Query(问题):「为了搞清楚我自己,我需要什么信息?」 -
Key(标签):挂在胸前的名牌,写着「我有什么信息」 -
Value(内容):我真正携带的信息本身
流程就像查图书馆:Query 是你的研究课题,Key 是每本书的书脊标签,Value 是书的正文。拿课题去匹配书脊,匹配度越高的书,你就越多地吸收它的内容。
具体到我们的例子,「首都」开会时:
-
它的 Query 大概是:「哪国的我?」 -
它扫过所有词的名牌,发现「中国」的 Key 高度匹配 -
于是它大量吸收「中国」的 Value
一圈下来,「首都」的新坐标就从「泛指的首都」漂移到了「中国的首都」这个位置。而「的」这种词,跟谁都匹配不上,几乎不吸收什么,基本原地不动。
这样的会有几十上百层(Transformer 的层数),每层开完,每个词对整句话的理解就深一层。浅层搞清楚语法,中层搞清楚指代关系,深层搞明白「哦,这是在问一个地理常识」。
注意一个代价:每个词都要跟所有词两两交互。10 个词是 100 次交互,100 个词就是 1 万次;长度翻倍,计算量翻四倍。记住这个痛点,后面两个缓存都是为了缓解它。
第三幕:吐出第一个字,然后一个一个往外蹦
会开完了,模型拿到最后一个词(「?」)的最终坐标,去跟词表里所有词(通常十几万个)的坐标比一遍相似度,算出一个概率分布:
北:31% 中:12% 首:9% …… 香蕉:0.0001%
按概率挑一个(不一定总挑最高的,加一点随机性,这就是「温度」参数的作用),输出「北」。
然后关键动作:把「北」接在输入后面,重新走一遍流程,猜出「京」,再接回去……直到输出【结束】标记。这种「接龙」式的生成方式叫自回归。
问题来了:每生成一个字都要把整句话重算一遍吗?生成第 100 个字时,前面 99 个字已经「开过会」了,结果会一模一样;重算纯属浪费。于是有了第一个缓存。
第四幕:KV 缓存,开过的会纪要留下来
回看第二幕:每个词开会时算出了 Query、Key、Value 三个向量。这里有个重要事实:
已经生成的词,它们的 Key 和 Value 就永远固定了;因为这些词本身没变,算出来的东西就不会变。
所以模型的做法是:把每个词算出来的 K 和 V 存进一块内存,这就是 KV 缓存(KV Cache)。
生成「京」的时候,只需要:
-
给新来的「北」算一次 Q、K、V -
把「北」的 K、V 追加进缓存 -
拿「北」的 Q 去跟缓存里所有历史 K 匹配(相当于「北」只需要看会议纪要,不用叫所有人重新开会)
这样每生成一个新词,计算量从「整句话重算」变成「只算一个新词 + 查一次缓存」。没有 KV 缓存,生成速度会慢几十上百倍,今天的聊天式 AI 根本不可能存在。
代价:缓存占显存,对话越长、模型越大,占得越多。这也是长上下文贵的原因之一,你每多说一句,所有后续生成都要多看一份更长的纪要。
第五幕:提示词缓存,固定开场白直接放录音
再看一个更高层的浪费。假设你给一个公众号客服机器人写了 3000 字的系统提示(角色设定、产品资料、回答规则),每个用户来提问,请求都长这样:
[同一份3000字系统提示] + 用户的问题
那 3000 字是一字不差的前缀。既然一字不差,它开完会算出的 K、V 每次也都一模一样。于是厂商提供了提示词缓存(Prompt Cache):把这段前缀的 KV 结果存下来,之后所有请求直接复用,只算后缀的新内容。
类比:老师每节课上课前都要花 30 分钟念同一份课堂规则。与其每节课重念,不如把第一次念规则时的状态录下来,之后每节课直接放录音,跳过这 30 分钟。
效果:响应更快,而且 API 厂商(Anthropic、DeepSeek、OpenAI 等)对命中缓存的部分收费低很多,通常打一到九折,看各家策略。
两个关键使用要点:
-
只认前缀。缓存从第一个字开始严格匹配,改一个字,后面全部失效。所以正确姿势是:不变的内容(系统提示、知识库文档)放最前面,会变的内容(用户信息、对话历史、当前问题)放最后面。 -
有时效(通常几分钟到一小时),过期作废重算。
把整条链路串起来
现在回头看你的问题「中国的首都是哪里?」,完整旅程是:
-
分词:切成 token,查坐标表变成向量 -
注意力:几十层「开会」,「首都」吸饱了「中国」的信息,整句话的意思被算透 -
采样输出:算出概率分布,吐出「北」 -
自回归:「北」接回输入,重复,吐出「京」……直到结束 -
KV 缓存:贯穿第 3、4 步;已生成内容的会议纪要不重算,保证速度 -
提示词缓存:贯穿整个会话;如果之前带着一份长系统提示,它的纪要直接复用,省钱省时
三者的关系一句话:注意力机制是核心计算,它天然重复;KV 缓存消除「同一轮对话内」的重复;提示词缓存消除「不同请求之间」的重复。
一个在 AI 时代坚持手把手带你上车的普通人。

