Skip to content

大模型推理过程概览:以 MiniMind 为例

大模型推理过程概览:从输入问题到循环生成

上一章我们从"语言模型就是预测下一个词"出发,看到了文字怎么变成数字,为什么简单网络处理不了语言,Transformer 怎么用注意力机制解决这些问题,以及为什么模型需要足够大才能涌现出惊人能力。

现在,我们把镜头拉近,看看当一个训练好的大模型真正接到用户问题时,它内部到底发生了什么。这个过程叫推理——上一章建立了"推理"和"训练"的区别:训练是学习阶段,推理是使用阶段。这一章我们要讲的就是使用阶段。

为了讲清楚这个过程,我们会以 MiniMind 作为具体例子。MiniMind 是一个结构完整但规模很小的语言模型,它的架构和 GPT 系列一样,都是 Decoder-Only Transformer——上一章提到的注意力机制、因果 Mask、位置编码,它全都用到了。区别只是参数量小得多,所以我们可以更清晰地观察每一步在做什么。

先认识几个后面会反复出现的关键词:

text
训练:让模型通过大量文本学习规律,调整模型内部的能力。
推理:训练完成后,把新问题交给模型,让模型生成回答。
token:模型处理文本的基本单位,可以是一个字、一个词,也可以是词的一部分,你现在可以先简单理解是一个汉字或者一个单词。
prompt:真正交给模型的完整输入,不只是用户问题,也可能包含角色标记、历史对话和系统提示。
参数:模型训练后保留下来的大量数字,决定了模型如何根据输入进行计算和预测。
上下文:模型当前能看到的所有内容,包括用户问题、历史消息,以及已经生成出来的 token。

训练时,模型会反复看大量样本,学习什么样的上下文后面应该接什么内容;推理时,模型不再重新学习,而是利用已经学到的规律,根据当前输入一步步生成新的内容。

注:因为当前主流的语言模型都采用了 Decoder-Only 的 Transformer 架构,本文将不再介绍 Encoder-Decoder 的模型结构,望见谅。

MiniMind 的推理过程就是:先把用户问题整理成模型熟悉的输入格式,再把这段输入切成 token,最后不断预测和生成下一个 token。

可以先把它简化成这条主线:

text
输入问题
-> 套聊天模板
-> 切成 token
-> 模型预测下一个 token
-> 采样一个 token
-> 拼回上下文
-> 继续预测
-> 直到结束

这条主线里,每一步对应的含义如下:

  1. 输入问题

    用户先输入一句自然语言问题,例如:

    text
    为什么天空是蓝色的?

    这一步还只是普通文本,模型不能直接拿它做计算。

  2. 套聊天模板

    聊天模型通常不会直接把用户输入丢给模型,而是先把它套进一段模型熟悉的对话格式。原因很简单:模型只是在看 token 预测下一个 token,它需要知道哪段是用户说的,哪段轮到助手回答。

    比如用户输入:

    text
    为什么天空是蓝色的?

    简化后可以理解成:

    text
    用户:为什么天空是蓝色的?
    助手:

    真实模型通常会使用更明确的特殊标记:

    text
    <|im_start|>system
    你是一个有帮助的助手。
    <|im_end|>
    <|im_start|>user
    为什么天空是蓝色的?
    <|im_end|>
    <|im_start|>assistant

    模板里可以包含 system、user、assistant、tool 等角色,也可以包含 这样的思考标记。多轮对话时,历史消息也会按同样格式拼进来。

    模板里的角色标记、换行、特殊符号、用户问题和历史回答,都会一起被 tokenizer 切成 token。模型真正看到的是这整段 prompt 对应的 token id 序列,而不是单独的用户问题。

  3. 切成 token

    套好模板后,得到的是一整段 prompt。模型仍然不能直接处理这段文字,所以还要用 tokenizer 把它切成 token,再转换成 token id。

    可以粗略理解为:

    text
    用户 / : / 为什么 / 天空 / 是 / 蓝色 / 的 / ? / 助手 / :

    token 是什么、词表怎么来、BPE 如何切分文本,见:token 是怎么被切出来的

  4. 模型预测下一个 token

    MiniMind 是 Decoder-only Transformer,本质上和 GPT 类模型一样。它会读取前面的所有 token,然后预测:

    text
    下一个最可能出现的 token 是什么?

    这一步输出的不是一个最终答案,而是一组候选 token 的原始分数。比如模型可能认为“这是”“因为”“天空”等 token 都有机会成为下一个片段,只是分数不同。更具体的预测流程见:模型如何预测下一个 token

  5. 采样一个 token

    有了候选概率后,推理程序会根据 temperature、top-k、top-p 等参数,从候选 token 里选出一个作为本轮生成结果。

    如果选择最确定的 token,回答会更稳定;如果允许更多随机性,回答可能更丰富,但也更容易飘。更具体的采样过程见:采样一个 token

  6. 拼回上下文

    上下文在生成中不断增长:每生成一个 token,就进入下一轮输入

    假设模型这一步选出了:

    text
    这是

    那么新的上下文就变成:

    text
    用户:为什么天空是蓝色的?
    助手:这是

    新生成的 token 会被接回原来的输入后面,成为下一步预测的一部分。

  7. 继续预测

    模型会基于更新后的上下文继续预测下一个 token。比如接着生成:

    text
    因为

    上下文又变成:

    text
    用户:为什么天空是蓝色的?
    助手:这是因为

    所以,大模型不是一次性写完整答案,而是一步一步“接龙”出来。

  8. 直到结束

    当模型生成结束符,或者达到最大生成长度时,推理就会停止。最终,我们看到的回答就是这一连串 token 被解码回文本后的结果。

所以,MiniMind 的“推理”不是像人一样先完整想好一篇答案再说,而是每一步根据已有上下文预测下一个最合理的片段。所谓“思考过程”,本质上也是模型按训练过的格式,把中间分析内容作为文本 token 生成出来。