news 2026/8/12 18:31:23

从Token到生成:深入解析LLM预测下一个词的核心原理与工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从Token到生成:深入解析LLM预测下一个词的核心原理与工程实践

1. 从“猜词游戏”到万亿参数:LLM预测下一个词的直观理解

我们每天都在玩一个“猜词游戏”。当你在手机输入法里敲出“今天天气真”这几个字时,输入法大概率会给你推荐“好”、“不错”、“热”这些候选词。这其实就是一种最简单的“下一个词预测”。大型语言模型(LLM)所做的,本质上就是这个游戏的超级进化版,只不过它的“词汇量”和“上下文理解能力”达到了人类难以想象的高度。

想象一下,你面前坐着一位博览群书、记忆力超群的朋友。你刚说出“床前明月光,疑是”,他几乎不假思索就能接上“地上霜”。他并不是在背诵,而是基于对无数文本的“阅读经验”,瞬间计算出在“疑是”这个语境之后,“地上霜”出现的概率远高于“红烧肉”或“计算机”。LLM就是这位朋友的数字化化身,它的核心任务就是:给定一串已经出现的词(或更准确地说,Token),计算出下一个最可能出现的词是什么,并以此为基础,一个词一个词地“生成”出连贯的文本。这个过程在技术上被称为“自回归生成”。

这个看似简单的任务,背后却是一个极其复杂的系统工程。它不像查字典,而更像是一个基于海量数据训练出的、拥有千亿甚至万亿参数的“概率宇宙”。模型每预测一个词,都需要对这个宇宙进行一次快速扫描和计算。从我们输入一句话开始,到模型输出第一个词,中间经历了文本的数字化(Token化)、上下文的理解与表征(Transformer编码)、可能性的评估与选择(解码)等多个精密环节。理解这个过程,不仅是理解当今AI如何“思考”的关键,也能帮助我们在使用、调优甚至开发相关应用时,避免很多想当然的错误。接下来,我们就拆开这个黑盒,看看从你按下回车键到模型给出回答,究竟发生了什么。

2. 基石:从文本到Token——模型世界的“第一语言”

在人类世界,我们使用文字交流;在LLM的世界里,它只认识数字。因此,任何文本在进入模型之前,都必须被转换成模型能理解的格式——Token序列。这是整个预测流程的第一步,也是最基础、却最容易引发问题的一步。

2.1 Token化的本质:一种高效的压缩与编码方案

Token化不是简单地把每个汉字或英文单词映射成一个数字。它的核心目标是在“词汇粒度”和“序列长度”之间取得最佳平衡。如果以单个字符为Token(如:‘今’, ‘天’, ‘,’, ‘天’, ‘气’, ‘真’),序列会很长,模型难以学习有意义的组合模式;如果以整个句子为Token,词汇表将变得无比庞大且无法处理新句子。

因此,主流的子词(Subword)分词法(如BPE、WordPiece、Unigram)应运而生。它们通过统计学习,将频繁出现的字符组合(如“ing”、“ation”、“我们”、“模型”)作为一个独立的Token。例如,“Transformer”这个单词可能会被拆分成“Trans”, “form”, “er”三个Token。这样做的好处显而易见:

  1. 解决未登录词问题:即使模型从未见过“ChatGPTing”这个词,它也可以根据学到的“ChatGPT”“ing”两个Token来理解和生成它。
  2. 平衡效率与效果:用一个中等大小的词汇表(通常3万到10多万),可以高效地表示绝大多数文本。

在实际操作中,比如使用OpenAI的tiktoken库或Hugging Face的tokenizers库,你会发现同一个句子,用不同的分词器(如cl100k_base对应GPT-4,o200k_base对应o1)得到的结果可能不同。一个关键的注意事项是:Token的长度直接影响模型的计算成本和上下文窗口的“有效容量”。对于中文,由于汉字本身信息密集,一个汉字通常就是一个Token,这使得在相同Token数限制下,中文能承载的语义信息可能少于英文。这也是为什么在处理长中文文档时,需要特别关注上下文是否被截断。

2.2 Token ID与嵌入向量:从离散符号到连续空间

Token化后,我们得到一串数字ID,比如[2301, 792, 11, 1246, 345]。但模型无法直接处理这些离散的ID。下一步,模型会通过一个叫做“嵌入层”的查找表,将每个Token ID转换成一个高维的连续向量(例如,维度为4096或8192)。这个过程,可以理解为为每个“词”赋予了一个在模型语义空间中的“坐标”。

这个嵌入向量至关重要,它包含了模型从海量数据中学到的关于该Token的语义信息。在训练之初,这些向量的值是随机初始化的。随着训练的进行,模型通过调整这些向量,使得语义相近的词(如“猫”和“狗”)在向量空间中的位置也接近,而语义无关的词(如“猫”和“哲学”)则相距甚远。这里有一个实操心得:预训练模型的嵌入层是高度特化的。如果你在一个新的领域(如医疗、法律)进行微调,冻结嵌入层通常不是好主意,因为新领域的术语(如“血小板减少症”)其向量表示可能需要调整以适应新的上下文。

3. 核心引擎:Transformer架构如何理解上下文

得到了Token的嵌入向量序列后,就进入了模型的核心——Transformer架构。它的任务是理解整个输入序列的上下文,并为每个位置生成一个包含了上下文信息的“增强版”向量表示。Transformer摒弃了RNN/LSTM的顺序计算,采用“自注意力”机制,实现了高效的并行化上下文建模。

3.1 自注意力机制:全局关联的“信息聚会”

自注意力机制是Transformer的灵魂。它的工作方式可以类比于一场讨论会。序列中的每个Token(与会者)都会做三件事:

  1. 生成问题:基于自己的嵌入向量,提出一个“查询”。
  2. 准备答案:同样基于自己的嵌入向量,准备一个“键值对”(“键”用于匹配查询,“值”是实际要贡献的信息)。
  3. 交流互动:每个Token用自己的“查询”去与会场里所有Token(包括自己)的“键”进行匹配计算,得到一个“注意力分数”。这个分数决定了在思考当前Token时,应该从其他每个Token那里汲取多少信息。最后,用这些分数作为权重,对所有Token的“值”进行加权求和,得到当前Token新的表示。

公式上,对于输入序列矩阵X,经过线性变换得到查询矩阵Q、键矩阵K、值矩阵V。注意力输出为:Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V其中,sqrt(d_k)是一个缩放因子,防止点积结果过大导致softmax梯度消失。

为什么需要多头注意力?单一组的注意力可能只聚焦于一种关系(例如语法结构)。多头注意力(例如32头或64头)允许模型在不同的“表示子空间”中同时关注不同的信息。比如,一个头可能关注句法依赖(主谓宾),另一个头可能关注指代关系(“它”指代什么),再一个头可能关注情感一致性。最后,所有头的输出被拼接起来,再经过一个线性层融合,从而获得更丰富的上下文表征。

3.2 编码器与解码器:在预测任务中的分工

原始的Transformer论文提出了编码器-解码器架构,但在像GPT这样的纯自回归LLM中,通常只使用解码器结构。这里需要仔细区分:

  • 编码器(如BERT所用):在训练时,可以看到完整的输入序列,并通过自注意力学习每个Token的上下文表示,常用于理解类任务(如文本分类、情感分析)。它的注意力是“双向的”,每个Token都能看到序列中的所有其他Token。
  • 解码器(如GPT所用):在训练和生成时,都只能看到当前时刻及之前的Token,未来的Token是被“掩码”掉的。这是为了严格模拟自回归生成过程:预测下一个词时,你只知道已经说出来的话,不知道后面要说什么。这种注意力被称为“因果注意力”或“掩码自注意力”。

在GPT等模型的解码器块中,其核心是一个掩码多头自注意力层,后面跟着一个前馈神经网络。每个子层周围还有残差连接和层归一化,以确保训练的稳定性。一个至关重要的细节是:在生成阶段,模型会缓存之前所有时间步的键值对。这样,在预测第t个词时,无需为前t-1个Token重新计算注意力,只需计算最新Token的Q与缓存的所有K的注意力,大大提升了生成效率。这也是为什么在API调用中,你可以传递past_key_values参数来加速长文本生成。

4. 从理解到生成:解码策略与下一个词的诞生

经过多层Transformer解码器的处理,序列中最后一个Token(即我们期望预测的下一个词的位置)的输出向量,包含了之前所有上下文的精华信息。这个向量将被送入模型的“语言模型头”。

4.1 语言模型头:从向量到概率分布

“语言模型头”通常就是一个线性层(全连接层),它将高维的上下文向量(例如4096维)映射到整个词汇表大小的维度(例如10万维)。这个10万维的向量,经过一个Softmax函数,就被转换成了一个概率分布。

假设词汇表是[“好”, “不错”, “热”, “冷”, …,“人工智能”],那么对于上下文“今天天气真”,模型输出的可能是一个类似这样的概率分布:

  • P(“好”) = 0.55
  • P(“不错”) = 0.25
  • P(“热”) = 0.15
  • P(“冷”) = 0.04
  • P(…) = 很小
  • P(“人工智能”) = 近乎0

至此,模型已经完成了它的核心计算工作:给出了在所有可能的下一个词上的一个概率分布。接下来的问题就是:我们如何从这个分布中选出一个词?

4.2 解码策略:贪婪、采样与束搜索

选择哪一个词作为输出,这就是解码策略。不同的策略会导致生成文本的风格和质量产生巨大差异。

  1. 贪婪解码:每次都选择概率最高的那个词。如上例中,永远选择“好”。这种方法简单高效,但容易导致生成重复、枯燥的文本(比如“好好好好……”),因为一旦进入某个高概率循环,就难以跳出。

  2. 随机采样:完全根据概率分布随机选取。概率为0.55的“好”被选中的机会最大,但也有可能选中“不错”甚至“冷”。这种方法生成的内容多样性高,但可能不稳定,有时会产生不合逻辑或偏离主题的词。

  3. 核采样:这是目前最常用的策略之一,在多样性和可控性之间取得了很好的平衡。它首先将概率分布按值从大到小排序,然后只保留累积概率达到某个阈值(如top_p=0.9)的最高概率词项,重新归一化这些词的概率,然后从中采样。这样,既避免了选择那些概率极低的奇怪选项,又保留了一定的随机性。例如,如果“好”、“不错”、“热”三者的累积概率已超过0.9,那么“冷”及之后的词就会被过滤掉,模型只从这三个词中随机选一个。

  4. 束搜索:这是一种考虑多个候选序列的全局优化方法。它维护一个大小为k(束宽)的候选序列列表。在每一步,对每个候选序列,都考虑词汇表中概率最高的k个扩展,然后从所有k*k个可能的新序列中,选择总体概率(或对数概率之和)最高的k个作为新的候选。束搜索能生成更连贯、更准确的序列,特别适合事实性、确定性强的任务(如机器翻译)。但其计算成本高,且对于开放生成长文本,有时会导致过于保守和重复。

在实际应用中,我们通常结合使用温度参数和Top-p采样。温度参数T在Softmax之前调整概率分布的平滑程度:T=1使用原始分布;T>1使分布更平滑(多样性增加);0<T<1使分布更尖锐(确定性增加,倾向于高概率词)。一个常见的配置是temperature=0.8, top_p=0.95,这能在保持创造力的同时,维持一定的可控性。

5. 循环与迭代:自回归生成的完整链条

选中了一个词(假设是“好”)之后,这个新生成的Token并不会直接输出给你就结束。相反,它会被追加到原有的输入序列末尾,形成新的输入序列:“今天天气真好”。然后,这个新的序列再次经过整个流程:Token化(虽然“好”已经是Token ID了)、经过所有Transformer层、计算新的最后一个位置的概率分布、选择下一个词(比如“,”或“啊”)。

这个过程循环往复,直到:

  1. 生成了一个特殊的结束符(如<|endoftext|>)。
  2. 达到了预设的最大生成长度
  3. 在某些交互式场景中,用户主动中断。

这就是“自回归”的含义:每一次预测的输出,都作为下一次预测的输入,模型像是在跟自己对话,逐步编织出完整的文本。这里有一个非常重要的性能优化点:KV缓存。在生成过程中,对于已经处理过的Token序列,其对应的键和值向量可以被缓存起来。当新Token加入时,只需要为新Token计算其Q、K、V,并与缓存的K、V进行注意力计算,无需为整个历史序列重新计算,这极大地提升了长文本生成的效率。这也是为什么LLM的生成速度通常远低于其处理等长输入的速度。

6. 实战中的常见问题与调优技巧

理解了原理,我们来看看在实际使用和开发中会遇到哪些典型问题,以及如何应对。

6.1 重复与退化:为什么模型会车轱辘话来回说?

这是自回归生成最常见的问题之一。模型陷入循环,不断重复相同的短语或句子。

  • 根本原因:概率分布陷入了局部最优。当某个n-gram(如“这是一个非常好的非常好的”)出现后,模型历史上下文形成了一个强模式,导致其后续预测该模式重复的概率极高。
  • 排查与解决
    1. 调整解码参数:这是首选方法。适当提高temperature(如从0.7调到0.9)或降低top_p(如从0.95调到0.85),可以打破概率分布的僵局,引入更多变化。使用“重复惩罚”参数(如repetition_penaltyfrequency_penalty),主动降低已出现Token的生成概率。
    2. 检查提示工程:你的输入提示本身是否包含了重复模式或诱导了重复?尝试改写提示,增加引导性指令,如“请用多样化的语言描述”。
    3. 模型能力问题:如果在小模型上频繁出现,可能是模型容量不足,无法建模长距离依赖和复杂变化,考虑换用更大或更先进的模型。

6.2 生成无关或有害内容:如何让模型“守规矩”?

模型有时会生成偏离主题、包含虚假信息或不符合伦理的内容。

  • 根本原因:预训练数据包罗万象,模型学到了所有模式,包括不好的那些。在生成时,如果没有约束,它可能按照概率采样到不期望的内容。
  • 排查与解决
    1. 后处理与过滤:对生成结果进行关键词、敏感词过滤,或使用另一个分类器进行内容安全审核。
    2. 引导生成:在提示中明确要求,例如“请生成一段关于XX的、积极健康的文字”。使用系统提示词来设定角色和边界。
    3. 使用安全层:许多生产级API和开源框架(如Transformers库的GenerationConfig)集成了内容安全模块,可以在生成过程中实时抑制有害Token的生成概率。
    4. 微调与对齐:通过指令微调、RLHF等技术,从根本上调整模型的生成偏好,使其与人类价值观对齐。这是ChatGPT等模型表现“听话”的核心技术。

6.3 长文本生成中的“失忆”与逻辑矛盾

生成长文档时,模型可能会忘记前文设定,或在后面出现与前文矛盾的情节。

  • 根本原因:Transformer的注意力机制虽然是全局的,但在固定上下文长度内。当生成文本超过缓存的历史长度(如32K),最早的信息会被丢弃。此外,即使在同一上下文窗口内,注意力权重也可能更聚焦于邻近Token,远距离依赖可能被稀释。
  • 排查与解决
    1. 利用长上下文模型:选择支持更长上下文窗口的模型(如128K、1M Token)。
    2. 结构化提示与摘要:在生成长文本时,主动在提示中插入关键信息摘要,或要求模型分阶段生成,并在每个阶段前复述核心设定。
    3. 外部记忆体:对于超长文本生成,可以引入向量数据库等外部记忆系统,将前文的关键信息存储和检索出来,在生成时作为补充上下文输入给模型。

6.4 生成速度慢:如何优化推理性能?

对于实时应用,生成速度至关重要。

  • 根本原因:自回归生成本质上是串行的,无法并行化。每个新Token的生成都依赖于前序所有Token,且需要经过整个大模型的前向传播。
  • 排查与解决
    1. 确保KV缓存开启:这是最重要的优化。检查你的推理框架是否默认启用了KV缓存。
    2. 量化与模型压缩:使用INT8、INT4甚至更低精度的量化技术,可以大幅减少模型内存占用和计算量,提升推理速度,通常对质量影响很小。
    3. 使用更快的推理引擎:如vLLM、TensorRT-LLM、DeepSpeed等,它们通过优化的内核、连续批处理、PagedAttention等技术极大提升吞吐量。
    4. 调整生成长度与束宽:明确设置max_new_tokens,避免无意义的过长生成。在非必需场景下,使用贪婪解码或束宽为1的束搜索。
    5. 硬件选择:使用性能更强的GPU(如H100)或AI加速卡,并利用多卡并行推理。

7. 超越下一个词:思维链与规划式生成

标准的自回归预测下一个词,有时会限制模型在复杂推理任务上的表现。近年来,两种重要的技术扩展了这一范式:

  1. 思维链:通过提示(如“让我们一步步思考”),引导模型不是直接输出最终答案,而是先生成一系列中间推理步骤。这相当于让模型把“内心的思考过程”也Token化并生成出来。研究发现,这能显著提升模型在数学、逻辑推理上的能力。实操技巧:在构建复杂任务提示时,明确要求模型“分步解答”或“展示你的推理过程”,往往能得到更准确的结果。

  2. 规划式生成:对于写文章、编代码等需要长期规划的任务,让模型先输出一个高层大纲或计划,然后再根据计划分部分生成内容。这打破了严格的自回归顺序,引入了顶层设计。例如,模型可以先生成“第一章:引言;第二章:原理;第三章:实验…”,然后再去逐一生成每一章的内容。这能有效改善长文本的结构性和一致性。

这两种技术本质上都是在利用“下一个词预测”这个基本能力,通过巧妙的提示和设计,让模型模拟出更高级、更结构化的认知行为。它们提示我们,LLM的能力边界不仅取决于模型规模,也取决于我们如何与之交互和引导。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 18:28:30

C++类型推导机制:auto与decltype的深度解析

1. C类型推导的本质与应用场景 现代C最显著的特征之一就是类型推导机制的引入。2003年发布的C03标准中&#xff0c;每个变量都必须显式声明类型&#xff0c;这种严格性虽然保证了类型安全&#xff0c;却导致代码冗长且维护困难。2011年发布的C11标准首次引入auto和decltype关键…

作者头像 李华
网站建设 2026/8/12 18:28:15

技术人职业规划:从期权激励到核心竞争力构建

1. 从一则新闻谈起&#xff1a;技术人的财富叙事与职业迷思 最近&#xff0c;一则关于“28岁程序员期权过亿从字节退休”的新闻&#xff0c;连同“当事人称同级的张天一比我财富自由多了”的后续&#xff0c;在技术圈内外激起了不小的波澜。这则新闻像一颗投入平静湖面的石子&a…

作者头像 李华
网站建设 2026/8/12 18:28:02

STM32单片机标准库—DWT

DWT在 Cortex-M 里面有一个外设叫 DWT(Data Watchpoint and Trace)&#xff0c;是用于系统调试及跟踪&#xff0c;它有一个 32 位的寄存器叫 CYCCNT&#xff0c;它是一个向上的计数器&#xff0c;记录的是内核时钟运行的个数&#xff0c;内核时钟跳动一次&#xff0c;该计数器就…

作者头像 李华
网站建设 2026/8/12 18:25:35

Linux 下使用 Docker 部署 ComfyUI

Linux 下使用 Docker 部署 ComfyUILinux 下使用 Docker 部署 ComfyUI准备工作硬件与系统要求安装 Docker安装 NVIDIA Container Toolkit部署 ComfyUI选择镜像版本创建数据目录启动容器验证部署下载模型使用 Hugging Face 镜像站下载模型存放位置使用 ComfyUI 进行图像生成常见问…

作者头像 李华
网站建设 2026/8/12 18:22:52

【2014-05-09】某《魔鬼训练营》读书笔记:特定服务扫描

[历史归档] 本文原发布于 cstriker1407.info 个人博客&#xff0c;内容为历史存档&#xff0c;仅供参考。 发布时间&#xff1a; 2014-05-09 &#xff5c; 标题&#xff1a;某《魔鬼训练营》读书笔记&#xff1a;特定服务扫描 &#xff5c; 分类&#xff1a; 操作系统 / 安…

作者头像 李华