《大模型是怎样跑起来的(轻科技)》软件篇 阅读笔记

《大模型是怎样跑起来的(轻科技)》软件篇 阅读笔记

想理解大模型是如何跑起来的,可以抓住两个问题。

第一个问题是软件层面的。我们输入的是自然语言,它怎样一步步变成模型能处理的数字,又怎样从数字变回文字?

第二个问题是硬件层面的。这些计算为什么这么庞大,又为什么能在几秒钟内完成?

软件篇

假设你在对话框里输入 "中国首都是"​,屏幕停顿一下,模型输出 "北京"​。

这几乎不需要思考。可是对机器来说,它不是在脑海里打开地图,也不是在数据库里查 "中国首都" 这一条记录。它真正做的事,是根据前面这几个字,判断后面最可能接什么。

在这个例子里,​"中国首都是" 后面很可能接 "北京"​。于是模型先输出 "北"​。接着,新的上下文变成 "中国首都是北"​,它再继续判断后面最可能是什么。此时,​"京" 就成了最合适的下一个片段。

于是,我们看到了 "北京"​。

这里有一个细节需要先说明。模型并不一定按我们理解的 "一个汉字" 来工作。它处理的基本单位叫 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 ✅ 正确
自回归 把已生成的内容接回去,继续预测下一个 ✅ 正确

有几个地方可以再补细一点:

  1. 模型不是只跑一层,而是跑很多层。

    向量进入模型后,会经过很多层 Transformer 层。每一层都会做注意力计算和前馈网络变换,逐步把"上下文含义"提炼出来。

  2. "打分"最后会变成概率。

    模型最后一层会输出一个和词表一样长的向量,叫 logits;再经过 Softmax,就变成每个 Token 的概率。

  3. 注意力里通常有 Q、K、V。

    你把它理解成"回头看上下文"很准确。更细一点说,当前词会用 Query 去匹配前面词的 Key,再根据权重聚合它们的 Value。

  4. 生成时不会每次都从头算全部前文。

    实际推理会用到 KV Cache,把前面已经算过的中间结果缓存起来,这样生成下一个 Token 时不用重复计算整个输入。

  5. "北京"不一定分两步生成。

    你举的"北"→"京"只是便于理解的例子。如果模型的词表里有完整 Token "北京",它可能一步就输出"北京";如果词表里没有,也可能拆成"北""京"两个 Token。

所以,你的思路没有方向性问题。唯一需要微调的是:模型并不是"知道中国首都是北京",而是它在训练数据里反复见过类似表达,于是当上下文出现"中国首都是"时,会把"北京"这个 Token 的概率推得很高。


相关推荐
hss123456781 小时前
天津整装公司横向测评:红杉树大宅整装与业某峰、东某日盛在工期、ENF板材、防水厚度和监理模式上的数据差异
笔记
京存高性能存储1 小时前
POC 实测笔记:全闪存储大带宽压测,顺序读 19.2GiB/s、顺序写 10.8GiB/s,聊聊长尾延迟与持续吞吐问题
人工智能·笔记
runningshark1 小时前
雅思-speak-lesson5上课笔记
笔记
海鸥-w1 小时前
区域名称同步存储实现笔记
java·笔记
東隅已逝,桑榆非晚2 小时前
map和set的使用
数据结构·c++·笔记·学习
深圳海导科技2 小时前
深圳海导科技navynav|收发一体数传电台:工业级的无线数据传输
科技
一切皆是因缘际会2 小时前
信息 几何
科技
Z21-X2 小时前
云原生运维笔记:硬核拆解OpenStack计算与存储——从主机聚合到Cinder挂载全流程
运维·笔记·学习·云原生·openstack
坤坤子吖2 小时前
Linux网络编程基础:从 MAC 到 IP,理解网络数据是怎么传输的
linux·网络·笔记·学习