LLM 课程文档

深入了解大语言模型的文本生成推理

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

深入了解大语言模型的文本生成推理

Ask a Question

到目前为止,我们已经探讨了 Transformer 架构在文本分类或摘要等一系列离散任务中的应用。然而,大语言模型最常用于文本生成,这正是本章将要探讨的内容。

在本页中,我们将探讨大语言模型推理背后的核心概念,全面了解这些模型如何生成文本以及推理过程中涉及的关键组件。

理解基础知识

让我们从基础开始。推理是指使用经过训练的大语言模型,根据给定的输入提示生成类似人类的文本。语言模型利用其从训练中获得的知识,一次生成一个词。模型利用从数十亿参数中学到的概率来预测和生成序列中的下一个词元(token)。这种顺序生成的方式使得大语言模型能够产出连贯且与上下文相关的文本。

注意力的作用

注意力机制赋予了大语言模型理解上下文和生成连贯回答的能力。在预测下一个词时,句子中的每个词并非都具有同等的重要性——例如,在句子“法国的首都是……”中,“法国”和“首都”这两个词对于确定下一个词应该是“巴黎”至关重要。这种专注于相关信息的能力就是我们所说的注意力。

Visual Gif of Attention

这种识别最相关词语以预测下一个词元的过程已被证明非常有效。尽管训练大语言模型的基本原则——预测下一个词元——自 BERT 和 GPT-2 以来基本保持一致,但在扩展神经网络和使注意力机制能够处理越来越长的序列、同时降低成本方面,已经取得了显著的进步。

简而言之,注意力机制是大语言模型能够生成既连贯又具有上下文感知能力的文本的关键。它将现代大语言模型与前几代语言模型区分开来。

上下文长度和注意力广度

既然我们理解了注意力,让我们来探讨一个大语言模型实际上能处理多少上下文。这就引出了上下文长度,或者说模型的“注意力广度”。

上下文长度指的是大语言模型一次可以处理的最大词元(单词或单词的一部分)数量。你可以把它想象成模型的工作记忆大小。

这些能力受到几个实际因素的限制:

  • 模型的架构和规模
  • 可用的计算资源
  • 输入和期望输出的复杂性

在理想情况下,我们可以向模型提供无限的上下文,但硬件限制和计算成本使得这不切实际。这就是为什么不同的模型被设计成具有不同的上下文长度,以在能力和效率之间取得平衡。

上下文长度是模型在生成响应时一次可以考虑的最大词元数量。

提示词的艺术

当我们向大语言模型传递信息时,我们构建输入的方式旨在引导大语言模型的生成朝着期望的输出方向发展。这被称为提示词工程 (prompting)

理解大语言模型如何处理信息有助于我们撰写更好的提示词。由于模型的主要任务是通过分析每个输入词元的重要性来预测下一个词元,因此你输入序列的措辞就变得至关重要。

精心设计的提示词可以更容易地引导大语言模型的生成朝着期望的输出方向发展

两阶段推理过程

现在我们理解了基本组件,让我们深入了解大语言模型实际上是如何生成文本的。这个过程可以分为两个主要阶段:预填充(prefill)和解码(decode)。这两个阶段像流水线一样协同工作,每个阶段都在生成连贯文本中扮演着至关重要的角色。

预填充阶段

预填充阶段就像烹饪中的备菜阶段——所有初始食材都在这里处理并准备好。这个阶段包括三个关键步骤:

  1. 分词 (Tokenization):将输入文本转换为词元(可以将其视为模型理解的基本构建块)
  2. 嵌入转换 (Embedding Conversion):将这些词元转换为能够捕捉其含义的数值表示
  3. 初始处理 (Initial Processing):将这些嵌入输入模型的神经网络,以建立对上下文的丰富理解

这个阶段计算量很大,因为它需要一次性处理所有输入词元。可以把它想象成在开始写回应之前,先阅读并理解整个段落。

你可以在下面的交互式演示中体验不同的分词器:

解码阶段

预填充阶段处理完输入后,我们就进入解码阶段——这是实际文本生成发生的地方。模型一次生成一个词元,这个过程我们称之为自回归过程(其中每个新词元都依赖于之前的所有词元)。

解码阶段涉及几个关键步骤,这些步骤对每个新词元都会发生:

  1. 注意力计算 (Attention Computation):回顾之前的所有词元以理解上下文
  2. 概率计算 (Probability Calculation):确定每个可能的下一个词元的可能性
  3. 词元选择 (Token Selection):根据这些概率选择下一个词元
  4. 继续检查 (Continuation Check):决定是继续生成还是停止

这个阶段对内存要求很高,因为模型需要跟踪所有先前生成的词元及其关系。

采样策略

现在我们了解了模型如何生成文本,接下来让我们探讨控制这个生成过程的各种方法。就像作家可能会选择更具创造性或更精确的表达方式一样,我们可以调整模型如何选择词元。

你可以在这个 Space 中与 SmolLM2 互动,亲自体验基本的解码过程(请记住,它会一直解码直到遇到 EOS 词元,对于这个模型来说是 <|im_end|>

理解词元选择:从概率到词元选择

当模型需要选择下一个词元时,它会从词汇表中每个单词的原始概率(称为 logits)开始。但我们如何将这些概率转化为实际的选择呢?让我们分解一下这个过程:

image

  1. 原始 Logits:可以将其视为模型对每个可能的下一个单词的初始直觉
  2. 温度控制 (Temperature Control):就像一个创造力调节旋钮——较高的设置 (>1.0) 使选择更随机、更具创造性,较低的设置 (<1.0) 使选择更集中、更具确定性
  3. Top-p (核) 采样 (Top-p (Nucleus) Sampling):我们不考虑所有可能的单词,只关注那些加起来达到我们选择的概率阈值(例如,前 90%)的最可能的单词
  4. Top-k 过滤 (Top-k Filtering):另一种方法,我们只考虑 k 个最可能的下一个单词

管理重复:保持输出新鲜

大语言模型的一个常见挑战是它们倾向于重复自己——就像一个演讲者不断回到相同的话题。为了解决这个问题,我们使用两种惩罚:

  1. 存在惩罚 (Presence Penalty):对任何出现过的词元施加固定的惩罚,无论其出现频率如何。这有助于防止模型重复使用相同的词语。
  2. 频率惩罚 (Frequency Penalty):一种可伸缩的惩罚,根据词元的使用频率增加。一个词出现的次数越多,它再次被选择的可能性就越小。

image

这些惩罚在词元选择过程的早期应用,在应用其他采样策略之前调整原始概率。可以把它们看作是鼓励模型探索新词汇的温和推动。

控制生成长度:设定边界

就像一个好故事需要适当的节奏和长度一样,我们需要方法来控制我们的大语言模型生成多少文本。这对于实际应用至关重要——无论是生成一条推文长度的回复还是一篇完整的博客文章。

我们可以通过几种方式控制生成长度:

  1. 词元限制 (Token Limits):设置最小和最大词元数量
  2. 停止序列 (Stop Sequences):定义标志着生成结束的特定模式
  3. 序列结束检测 (End-of-Sequence Detection):让模型自然地结束其响应

例如,如果我们想生成一个段落,我们可能会设置最大 100 个词元,并使用“\n\n”作为停止序列。这确保我们的输出保持专注且大小适合其目的。

image

集束搜索:向前看以获得更好的连贯性

虽然我们迄今讨论的策略是逐个词元做决策,但集束搜索 (beam search) 采用了一种更全面的方法。它不是在每一步都确定一个选择,而是同时探索多个可能的路径——就像一个棋手提前思考几步棋。

image

其工作原理如下:

  1. 在每一步,维护多个候选序列(通常为 5-10 个)
  2. 为每个候选序列计算下一个词元的概率
  3. 只保留最有希望的序列和下一个词元的组合
  4. 继续这个过程,直到达到期望的长度或停止条件
  5. 选择总体概率最高的序列

你可以在这里直观地探索集束搜索

这种方法通常能生成更连贯、语法更正确的文本,尽管它比简单的方法需要更多的计算资源。

实际挑战与优化

在结束对大语言模型推理的探索时,让我们看看在部署这些模型时会面临的实际挑战,以及如何衡量和优化它们的性能。

关键性能指标

在与大语言模型合作时,四个关键指标将影响你的实施决策:

  1. 首个词元时间 (TTFT):多久能得到第一个响应?这对用户体验至关重要,主要受预填充阶段影响。
  2. 每个输出词元时间 (TPOT):生成后续词元的速度有多快?这决定了整体生成速度。
  3. 吞吐量 (Throughput):能同时处理多少个请求?这影响了扩展性和成本效益。
  4. 显存使用量 (VRAM Usage):需要多少 GPU 显存?这通常成为实际应用中的主要限制因素。

上下文长度的挑战

大语言模型推理中最重大的挑战之一是有效地管理上下文长度。更长的上下文提供了更多信息,但也带来了巨大的成本:

  • 内存使用量:随上下文长度呈二次方增长
  • 处理速度:随上下文长度线性下降
  • 资源分配:需要仔细平衡显存使用

Qwen2.5-1M 这样的最新模型提供了令人印象深刻的 100 万词元上下文窗口,但这以显著减慢推理时间为代价。关键是为你的具体用例找到合适的平衡点。

输入文本(原始)
分词后的输入
上下文窗口
(例如,4K 词元)
内存使用
∝ 长度²
处理时间
∝ 长度

KV 缓存优化

为了应对这些挑战,最强大的优化之一是 KV(键值)缓存。这项技术通过存储和重用中间计算结果,显著提高了推理速度。这种优化:

  • 减少重复计算
  • 提高生成速度
  • 使长上下文生成变得可行

代价是额外的内存使用,但性能优势通常远大于此成本。

结论

理解大语言模型推理对于有效部署和优化这些强大的模型至关重要。我们已经涵盖了关键组成部分:

  • 注意力和上下文的基础作用
  • 两阶段推理过程
  • 控制生成的各种采样策略
  • 实际挑战与优化

通过掌握这些概念,你将能更好地构建有效且高效地利用大语言模型的应用程序。

请记住,大语言模型推理领域正在迅速发展,新的技术和优化方法层出不穷。保持好奇心,不断尝试不同的方法,以找到最适合你特定用例的方案。

< > 在 GitHub 上更新