《大模型是怎样跑起来的(轻科技)》软件篇 阅读笔记
想理解大模型是如何跑起来的,可以抓住两个问题。
第一个问题是软件层面的。我们输入的是自然语言,它怎样一步步变成模型能处理的数字,又怎样从数字变回文字?
第二个问题是硬件层面的。这些计算为什么这么庞大,又为什么能在几秒钟内完成?
软件篇
假设你在对话框里输入 "中国首都是",屏幕停顿一下,模型输出 "北京"。
这几乎不需要思考。可是对机器来说,它不是在脑海里打开地图,也不是在数据库里查 "中国首都" 这一条记录。它真正做的事,是根据前面这几个字,判断后面最可能接什么。
在这个例子里,"中国首都是" 后面很可能接 "北京"。于是模型先输出 "北"。接着,新的上下文变成 "中国首都是北",它再继续判断后面最可能是什么。此时,"京" 就成了最合适的下一个片段。
于是,我们看到了 "北京"。
这里有一个细节需要先说明。模型并不一定按我们理解的 "一个汉字" 来工作。它处理的基本单位叫 Token。
Token 可以是一个字,也可以是一个词,还可以是一个词的一部分 。
为了方便理解,下面很多地方会用 "字" 来讲,但你只需要知道,模型实际处理的是 Token。
基于上面的理解,大模型在生成回答时的动作,就是根据前面的内容,预测下一个 Token。
下一个字为什么是 "北"
我们可以把模型想象成一个非常大的打分器。
当它看到 "中国首都是" 时,会给所有可能出现的下一个 Token 打分。
"北" 的分数很高,"上" "南" "东" 之类的分数可能也有,但低很多。还有很多完全不合适的词,分数会更低。
然后,模型会根据这些分数选择一个 Token 输出。
真实模型内部不会生成一张给人看的表格,上面写着 "北 99.2%" "上 0.7%"。
但为了便于理解,你可以把它想象成一张概率计分板。计分板上,"北" 明显领先,所以它被选了出来。
如果每次都选分数最高的那个,模型会非常稳定,但也会比较死板。你问同一个问题,它几乎总是用同一种方式回答。
为了让回答有一定变化,系统会使用一些采样策略,其中一个常见说法叫 "温度"。
温度低,模型更保守,更倾向于选择最高分的 Token。回答事实题、定义题时,这样通常更稳。
温度高,模型会给一些分数没那么高但仍然合理的候选项更多机会。写故事、取标题、做创意表达时,这样更容易产生变化。
所以,我们平时看到的大模型每次的回答可能并不完全一样。它不是突然有了灵感,而是在选择下一个 Token 时,允许了一定程度的不确定性。

参数里藏着语言规律
那模型凭什么知道 "北" 的分数应该高?这就不得不提大模型的参数。
大模型在正式使用前,要经历漫长的训练。训练时,它会读大量文本,不断练习一件事:看前面的内容,猜后面的内容。
比如训练数据里可能出现过很多类似句子:
java
中国的首都是北京。
北京是中国的首都。
中华人民共和国的首都是北京。
模型一开始并不知道这些规律,它会乱猜,猜错了,内部参数就被调整;猜对了,相关参数就被强化。
这就好比一个人练习投篮,新手第一次摸球完全凭感觉扔,如果球砸到了篮板,教练就会告诉你下次力度小一点,弧度高一点,模型的参数调整也是这样。
你在球场上投了十万次之后,肌肉形成了本能,只要站在熟悉的位置,身体自然就知道该用怎样的姿势和力度把球投出去。
经过海量练习之后,模型也慢慢形成了一种能力,看到某些上下文,就知道哪些后续更可能出现。
这些被反复调整后的数字,就是模型的参数。
参数不是一张张知识卡片,也不是一本百科全书。
你不能打开模型,在里面找到一行文字写着 "中国的首都是北京"。
更准确的理解是参数塑造了模型的倾向,就像环境对人的影响深远且不可见一样。
当它看到 "中国首都是" 这样的上下文时,内部计算会把 "北京" 相关 Token 的分数推高。于是,"北" 更容易被选中,随后 "京" 也更容易被选中。
这也是大模型容易让人误会的地方。
它常常表现得像 "知道"。但从运行机制看,它不是在查阅一个永远正确的知识库,而是在根据训练中形成的语言规律做预测 。
常见事实因为在训练中反复出现,模型通常答得很稳;
冷门事实、过时信息、模糊问题,或者需要严密推理的问题,它就可能答得很流畅,但并不一定正确。
这就是为什么我们说,大模型的回答需要判断和核实。它擅长生成语言,但生成得像真的,并不等于一定是真的。
文字先要变成数字
现在还有一个更底层的问题。
我们输入的是文字,机器处理的是数字。那 "中国首都是" 这几个字,怎样进入模型计算?
第一步,是切分。系统会把连续文字切成一个个 Token。比如我们可以把 "中国首都是" 看成:
java
中/国/首/都/是
也可能被切成:
java
中国/首都/是
不同模型的切分方式不完全一样,但目标相同,把自然语言拆成模型能处理的基本片段。
第二步,是编号。模型内部有一本词表,里面记录着它认识的所有 Token。每个 Token 都对应一个编号。比如 "中" 对应某个编号,"国" 对应另一个编号,"北京" 也可能对应某个编号。
到这里,文字已经变成了一串整数。
但整数本身没有多少意义。编号 1234 和编号 5678,只能说明它们在词表里的位置不同,并不能说明它们的语义关系。
模型还需要知道,"北京" 和 "巴黎" 都可能是城市,"苹果" 和 "香蕉" 都可能是水果,"汽车" 和 "香蕉" 关系就远一些。
于是,第三步出现了:把编号变成向量 。向量可以理解成一长串数字。
每个 Token 都会被展开成一组数字,放进一个很大的语义空间里。语义相近的 Token,在这个空间里的位置往往更接近;语义差得远的 Token,位置也更远。
当然,真实的语义空间不是二维图,也不是我们能直接画出来的坐标纸,它可能有几千个维度。
这一步完成后,文字就不再只是文字,而变成了可以参与数学运算的数字。

光把词变成向量还不够。"中国首都是" 和 "首都是中国",用到的字完全一样,但意思完全不同。
模型不仅要知道每个 Token 是什么,还要知道它出现在哪里。
这就需要位置信息。系统会给每个 Token 加上位置编码,就是给每个词贴了一个位置标签:你是第一个,你是第二个,你是第三个。
这样,模型看到的不只是 "中" "国" "首" "都" "是" 这些 Token,还知道它们的顺序。
词义和位置合在一起,才构成一句话真正的结构。
到这一步,输入文字终于变成了模型能处理的数字序列。
注意力让每个词回头看上下文
但是,仅仅知道词义和位置,还不足以生成好回答。
假设你听到别人说:"我刚才打了一个......" 你会本能地等后面的词。
如果后面是 "电话",你马上知道他说的是联系别人;
如果后面是 "喷嚏",你知道这是身体反应;
如果后面是 "人",意思就完全变了。
也就是说,我们理解一个词,并不是孤立地理解它,而是会自动看它周围的词 。
周围哪些词更关键,我们就会多参考它们;哪些词关系不大,我们就会少参考它们。
这就是注意力机制要解决的问题。
注意力机制可以粗略理解成,每个 Token 在参与计算时,都会回头看前面出现过的 Token,判断谁对自己更重要。
拿 "中国首都是" 来说,模型要判断 "是" 后面应该接什么,就需要回头看 "中国" 和 "首都"。这两个信息比其他无关词更关键。
模型会让当前 Token 吸收这些重要上下文,让它不再是一个孤立的 "是",而是一个带着 "中国首都" 语境的 "是"。
这样,模型就更容易判断后面应该出现一个地名,这就像同样一句建议,不同人说出来,对你而言分量是不一样的。
注意力机制也是这样,不是所有上下文都同样重要,模型会给不同 Token 分配不同的参考权重。
有了注意力机制,模型生成每个新 Token 时,都能回看前文。它不是只盯着最后一个字,而是可以利用整段上下文。

一句话里的关系不止一种。有些词之间是语法关系,有些是语义关系,有些是指代关系。
比如 "它" "这个" "那里" 这样的词,必须结合前文才能知道指什么。一个角度往往不够。
在现在的大模型中,会同时运行多组注意力。每一组都像是从一个角度看句子。
有的更关心语法,有的更关心实体,有的更关心远距离联系。
最后,模型把这些观察结果合起来,形成更完整的上下文理解。
这就是多头注意力。这就像一千个读者就有一千个哈姆雷特,每个人关注点不同,最后大家把结果合并,模型对这句话的把握就更细,避免盲人摸象的片面性。
这也是大模型比早期语言模型强很多的重要原因,它能在很长的文本里寻找关联,而不是只看眼前几个字。
一句话是怎样被接出来的
现在,我们把软件篇串起来。
你输入 "中国首都是"。系统先把它切成 Token,再把 Token 变成编号,编号变成向量。
随后,模型给这些向量加上位置信息,让它知道每个 Token 出现在什么位置。
接下来,注意力机制开始工作。
每个 Token 都会参考上下文,更新自己的含义。"是" 不再只是一个孤立的字,而是一个带有 "中国首都" 语境的 "是"。
然后,这些带着上下文的信息进入模型内部的参数矩阵。参数经过训练,保存着大量语言规律。它们会共同决定下一个 Token 的分数。
模型发现,"北" 是一个很合适的下一个 Token,于是输出 "北"。
但回答还没结束。模型会把 "北" 接回原来的上下文,继续预测下一个 Token。新的上下文变成 "中国首都是北"。
这一次,"京" 的分数最高,于是输出 "京"。然后模型继续预测标点、下一句话,直到它判断应该停止,或者系统达到长度限制。
这个过程叫自回归,也就是说前面已经生成的内容,会成为后面继续生成的依据。
所以,我们看到的回答是一段完整文字;模型实际做的,是一次又一次地预测下一个 。

AI 测评
你的理解整体是对的,而且关键链条都抓住了:输入文字 → Token → 编号 → 向量 → 位置编码 → 注意力理解上下文 → 参数打分 → 选下一个 Token → 拼回原文 → 继续生成。
可以把它再整理成一条更完整的链路:
| 环节 | 模型实际在做什么 | 你的笔记里对应理解 |
|---|---|---|
| 分词 | 把文字切成 Token,如"中国/首都/是" | ✅ 正确 |
| 编号 | 每个 Token 查词表,变成 Token ID | ✅ 正确 |
| 向量化 | Token ID 转成高维语义向量 | ✅ 正确 |
| 位置编码 | 给每个 Token 加上位置信息 | ✅ 正确 |
| 注意力 | 每个 Token 回头看前面哪些词更重要 | ✅ 正确 |
| 参数打分 | 通过训练得到的参数计算下一个 Token 的分数 | ✅ 正确 |
| 采样 | 用温度、Top-K、Top-P 等策略选下一个 Token | ✅ 正确 |
| 自回归 | 把已生成的内容接回去,继续预测下一个 | ✅ 正确 |
有几个地方可以再补细一点:
-
模型不是只跑一层,而是跑很多层。
向量进入模型后,会经过很多层 Transformer 层。每一层都会做注意力计算和前馈网络变换,逐步把"上下文含义"提炼出来。
-
"打分"最后会变成概率。
模型最后一层会输出一个和词表一样长的向量,叫 logits;再经过 Softmax,就变成每个 Token 的概率。
-
注意力里通常有 Q、K、V。
你把它理解成"回头看上下文"很准确。更细一点说,当前词会用 Query 去匹配前面词的 Key,再根据权重聚合它们的 Value。
-
生成时不会每次都从头算全部前文。
实际推理会用到 KV Cache,把前面已经算过的中间结果缓存起来,这样生成下一个 Token 时不用重复计算整个输入。
-
"北京"不一定分两步生成。
你举的"北"→"京"只是便于理解的例子。如果模型的词表里有完整 Token "北京",它可能一步就输出"北京";如果词表里没有,也可能拆成"北""京"两个 Token。
所以,你的思路没有方向性问题。唯一需要微调的是:模型并不是"知道中国首都是北京",而是它在训练数据里反复见过类似表达,于是当上下文出现"中国首都是"时,会把"北京"这个 Token 的概率推得很高。