从零开始的 LLM 底层知识学习之旅。
本文最后更新于 2026年7月21日 凌晨
参考书目:《图解大模型: 生成式 AI 原理与实战》Jay Alammar Maarten Grootendorst 著;李博杰译
此为读书笔记,准确来说是原书省流版摘抄与批注。
背景来自 XHS woomo
1.1 何为人工智能
AI 学科创始人之一 John McCarthy 给出的正式定义(“What is Artificial Intelligence?”,2007)
(人工智能)是制造智能机器,特别是智能计算机程序的科学和工程。它与使用计算机理解人类智能的任务相似,但人工智能不必局限于生物学上可观察到的那些方法。
语言人工智能是人工智能的一个子领域,专注于开发能够理解、处理和生成人类语言的技术。随着机器学习方法在解决语言处理问题方面取得持续成功,语言人工智能这个术语与自然语言处理(natural language processing,NLP)经常可以互换使用。
1.2 GPT及其之前的语言人工智能发展史
GPT及其之前的语言人工智能发展史
- 统计表示时代:聚焦于"如何表示语言"
- 2000:词袋模型(Bag of Words)
- NLP 领域的基本方法
- 原理:将文本视为词的无序集合,仅统计词频而完全忽略语法结构和词序,用高维稀疏向量表示文本。优点是简单高效,缺点是丢失了语义和上下文信息。
- 2013:Word2Vec
- 作者/团队:Tomas Mikolov 等,Google,
- 论文链接:https://arxiv.org/abs/1301.3781
- 原理:提出两种神经网络架构——CBOW(用上下文预测中心词)和Skip-gram(用中心词预测上下文)。通过大规模语料训练,将高维稀疏的one-hot词向量映射到低维密集的连续向量空间,使得语义相近的词在向量空间中距离相近。
- 2000:词袋模型(Bag of Words)
- 深度学习架构时代:聚焦于"如何理解上下文"
- 2017:注意力机制(Attention / Transformer)
- 作者/团队:Ashish Vaswani 等,Google Brain
- 论文链接:https://arxiv.org/abs/1301.3781
- 原理:在论文《Attention Is All You Need》中提出 自注意力机制(Self-Attention)。通过计算 Query、Key、Value 三个矩阵的相似度,为序列中每个位置分配不同的注意力权重,从而捕捉长距离依赖。彻底摒弃了 RNN/CNN,完全基于注意力构建 Transformer 架构,奠定了后续几乎所有大模型的基础。
- 2018:BERT
- 作者/团队:Jacob Devlin 等,Google
- 论文链接:https://arxiv.org/abs/1301.3781
- 原理:基于 Transformer编码器(Encoder)。采用 双向预训练:通过掩码语言模型(MLM,随机遮挡词语让模型预测)和下一句预测(NSP)进行训练。能够同时利用词语的左右上下文信息,在理解类任务上表现卓越。
- 2018:GPT(Generative Pre-trained Transformer)
- 作者/团队:Alec Radford 等,OpenAI
- 论文链接:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
- 原理:基于Transformer解码器(Decoder)。采用 自回归语言建模——给定前文预测下一个词,通过大规模无监督预训练+下游任务微调(Fine-tuning)的模式,开创了生成式预训练的新范式。
- 2019:GPT-2
- 作者/团队:Alec Radford 等,OpenAI
- 论文链接:https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
- 原理:GPT的规模化延续(15亿参数)。验证了 “大力出奇迹”——通过在海量多样化数据上训练,模型无需微调即可展现出零样本 (Zero-shot)能力,能完成摘要、翻译、问答等任务。
- 2019:DistilBERT
- 作者/团队:Victor Sanh 等,Hugging Face
- 论文链接:https://arxiv.org/abs/1910.01108
- 原理:对 BERT 进行 知识蒸馏(Knowledge Distillation)。让小模型(DistilBERT)学习大模型(BERT)的输出分布,在保留约 97% 性能的同时,减少 40% 参数量、提升 60% 推理速度,开创了模型压缩与高效部署的先河。
- 2019:RoBERTa
- 作者/团队:Yinhan Liu 等,Facebook AI
- 论文链接:https://arxiv.org/abs/1907.11692
- 原理:对BERT训练策略的 鲁棒优化(Robustly optimized)。移除了效果不佳的 NSP 任务,采用更大批次、更多数据、更长的训练时间,并动态调整掩码模式。证明BERT的潜力尚未被完全挖掘,通过更优的训练方案即可显著提升性能。
- 2020:T5(Text-to-Text Transfer Transformer)
- 作者/团队:Colin Raffel 等,Google
- 论文链接:https://arxiv.org/abs/1910.10683
- 原理:提出 "文本到文本"统一框架——将所有 NLP 任务(分类、翻译、摘要、问答等)都转换为输入文本-输出文本的格式。采用完整的 编码器-解码器 (Encoder-Decoder)架构,用同样的目标函数训练所有任务,实现了任务范式的统一。
- 2017:注意力机制(Attention / Transformer)
- 大模型与对齐时代:聚焦于"如何规模化"以及"如何对齐人类意图"
- 2020:GPT-3
- 作者/团队:Tom B. Brown 等,OpenAI
- 论文链接:https://arxiv.org/abs/2005.14165
- 原理:将规模推向极致(1750亿参数)。核心突破是 上下文学习(In-context Learning):无需更新模型参数,仅通过在输入提示(Prompt)中放置少量示例,模型就能理解任务模式并生成相应输出,展现出强大的少样本(Few-shot)和零样本能力。
- 2021:Switch Transformer
- 作者/团队:William Fedus 等,Google
- 论文链接:https://arxiv.org/abs/2101.03961
- 原理:引入 稀疏专家混合(Mixture of Experts, MoE)架构。将模型划分为多个"专家"子网络,通过门控机制为每个输入 token 只激活部分专家(如1.6万亿参数中仅使用约5%)。在保持计算成本可控的前提下,将模型规模推向万亿级别,验证了稀疏激活路线的可行性。
- 2022:FLAN-T5
- 作者/团队:Hyung Won Chung 等,Google
- 论文链接:https://arxiv.org/abs/2210.11416
- 原理:在 T5 基础上进行 指令微调(Instruction Tuning)。将大量 NLP 数据集改写为指令格式进行训练,使模型学会"如何遵循人类指令"而非仅学习特定任务。显著提升了模型的泛化能力和对用户意图的理解,是后续 ChatGPT 指令对齐技术的重要前身。
- 2023:ChatGPT
- 作者/团队:OpenAI
- 论文链接:https://arxiv.org/abs/2203.02155
- 原理:基于GPT-3.5/GPT-4架构,核心创新在于 RLHF(人类反馈强化学习)对齐技术。先通过有监督微调(SFT)学习对话模式,再通过奖励模型(Reward Model)评估人类偏好,最后用PPO等强化学习算法优化策略。使模型不仅能生成流畅文本,更能遵循人类价值观、理解复杂指令并进行多轮连贯对话。
- 2020:GPT-3
语言人工智能的作用
语言文本的本质是非结构化的(有内在含义),如果单纯用 0-1 此类结构化文本进行表示,则难以建模全部语义信息。在语言模型的统计表示时代(词袋模型、Word2Vec等),人们主要聚焦于如何将语言文本表示为结构化数据。
1.2.1 词袋模型
词袋模型的工作原理如下。
假设我们有两个句子需要创建数值表示。词袋模型的第一步是分词(tokenization),即将句子拆分成单个词或子词(词元,token)。最常见的分词方法是通过空格分割来把句子分割成词。然而,这种方法也有其缺点,因为某些语言(如汉语)的词之间没有空格。
分词之后,我们将每个句子中所有不同的词组合起来,创建一个可用于表示句子的词表(vocabulary)。
词袋模型
使用词表,我们只需计算每个句子中词出现的次数,就创建了一个词袋。因此,词袋模型旨在以数字形式创建文本的表示(representation),也称为向量或向量表示。
词袋模型虽然简洁,但其仅把语言视为一个几乎字面意义上的“词袋”,而忽略了文本的语义特性和含义。
1.2.2 Word2Vec
word2vec(词向量)于 2013 年发布,是首批成功利用 嵌入(embedding)这个概念来捕捉文本含义的技术之一。
词嵌入
嵌入是数据的向量表示,试图捕捉数据的含义。为此,word2vec 通过在大量文本数据(如整个维基百科)上训练来学习词的语义表示。
为了生成这些语义表示,word2vec 利用了神经网络(neural network)技术,观察在给定句子中哪些词倾向于出现在其他词旁边,进而据此生成词嵌入。
词嵌入的基本原理
我们首先为词表中的每个词分配一个向量嵌入,比如说每个词有 50 个随机初始化的值。然后在每个训练步骤中,我们从训练数据中取出词对(pairs of words),用模型尝试预测它们是否可能在句子中相邻。
在训练过程中,word2vec 会学习词与词之间的关系,并将这些信息提炼到词嵌入中。如果两个词各自的 相邻词集合 有更大的交集,它们的 词嵌入向量 就会更接近,反之亦然。
词嵌入可以用多种属性来表示一个词的含义。由于 嵌入向量的大小是固定的,这些属性需要 经过精心选择,以构建用来代表词的抽象表示。
在 Lec02 中,我们将深入探讨 word2vec 的训练过程。
词嵌入的表征能力
如何体现上述过程训练出的词嵌入能够捕捉词的含义?这主要通过 表示词的属性 来实现。
- baby 在 newborn、human 上的得分可能很高
- apple newborn、human 上的得分可能很低,而在 fruit 上得分较高
在实践中,这些分类属性通常相当抽象,很少与单一属性或人类可识别的概念相关。然而,这些属性组合在一起对计算机来说是有意义的。
词嵌入非常有用,因为它使我们能够衡量两个词的语义相似度。使用各种距离度量方法,我们可以判断一个词与另一个词的接近程度。
在 Lec05 中,我们将探讨如何将这些词嵌入压缩到 n 维空间。
嵌入的类型
按嵌入类型,语言模型中的嵌入方法主要分为:
- 文档嵌入 = 把整篇文档当作一个整体来理解
- 句子嵌入 = 把一句话当作一个整体来理解
- 词嵌入 = 把每个词当作基本单位
- 词元嵌入 = 把文本拆成更小的 token,逐个理解后再组合
嵌入的类型
-
文档嵌入(Document Embedding)
- 含义:将整个文档(可能包含多个段落、多句话)压缩成一个固定维度的向量。这个向量代表了整篇文档的主题、语义和核心内容。
- 使用场景:文档分类、文档聚类、文档检索/推荐、重复检测
- 典型方法:词袋模型(Bag-of-Words)、TF-IDF、Doc2Vec
-
句子嵌入(Sentence Embedding)
- 含义:将单个句子压缩成一个固定维度的向量。它捕捉了整句话的语义,而不是单个词的含义。
- 使用场景:语义相似度、语义搜索(用句子查询找意思相近的句子或文档)、文本摘要、句子分类(情感分析、意图识别)、机器翻译评估(判断译文和原文语义是否一致)
- 典型方法:Sentence-BERT(SBERT)、SimCSE、E5
-
词嵌入(Word Embedding)
- 含义:将单个词(如"cat"、“cute”)映射为一个向量。语义相近的词在向量空间中距离也相近。
- 使用场景:
- 词类比:king - man + woman ≈ queen
- 词相似度:计算"happy"和"joyful"的相似程度
- 作为上层模型的输入:将词向量输入到 RNN/LSTM/Transformer 中
- 传统NLP任务:命名实体识别、词性标注
- 典型方法:Word2Vec、GloVe、FastText
-
词元嵌入(Token Embedding)
- 含义:将 词元(token)映射为向量。Token 是比"词"更细粒度的单位——它可能是一个完整的词,也可能是一个词的片段(子词),甚至是标点符号。
图中的 “#ization” 是 “vocalization” 被拆分后的子词片段,带#号表示它是词的前缀/后缀部分。
- 使用场景:
- 现代大模型的输入层:GPT、BERT、T5等模型接收的都是 token 序列,每个 token 先转为 embedding 再进入模型
- 处理未登录词(OOV):对于罕见词或新词,可以拆成子词来表示(如"unhappiness" -> “un” + “happiness”)
- 多语言模型:统一处理不同语言的文本
- 典型方法:WordPiece(BERT)、BPE(GPT)、SentencePiece
利用注意力机制解码编码上下文
word2vec 的训练过程会创建 静态的、可下载的 词嵌入。但静态带来的问题就是,有些词是多义词,需要根据上下文来确定其具体含义。
例如,bank 无论在什么上下文中使用,都会有相同的词嵌入。然而,bank 既可以指银行,也可以指河岸。它的含义应该根据上下文而变化,因此它的嵌入也应该根据上下文而变化。
使用 RNN(recurrent neural network,循环神经网络)可以将序列作为补充输入进行建模。为此,这些 RNN 被用于两个任务:
- 编码,也就是表示输入句子;
- 解码,也就是生成输出句子。
下图展示了如何将“I love llamas”(我喜欢美洲驼)翻译成荷兰语“Ik hou van lama’s”。
RNN 用于机器翻译的整体框架与生成过程
该架构中的每个步骤都是自回归(auto-regressive)的:在生成下一个词时,该架构需要使用所有先前生成的词作为输入。
上述编码步骤旨在尽可能准确地表示输入,以嵌入的形式生成上下文,作为解码器的输入。为了生成这种表示,它将嵌入作为词的输入,这意味着我们可以使用 word2vec 作为初始表示。在图 1-13 中,我们可以观察到这个过程。请注意输入是如何按顺序一次处理一个词的,输出也是如此。
加入嵌入的 RNN 机器翻译模型
RNN 的标准记法是
- 将 I、love、llamas 使用 word2vec 分别生成词嵌入
- 将词嵌入 按顺序输入编码器 RNN 中:
- 读取 ,初始化隐藏状态 (此处的 是编码器的初始隐藏状态)
- 读取 ,更新隐藏状态
- 读取 ,更新隐藏状态
- 将 作为上下文嵌入(context embedding)输入到解码器 RNN 中,
- 按照顺序生成输出:
- 计算隐藏状态 ,生成 (其中, 是开始序列标记 Start-of-Sequence 的 word embedding)
- 更新隐藏状态 ,生成
- 更新隐藏状态 ,生成
然而,这种上下文嵌入方式存在局限性,因为它仅用一个嵌入向量来表示整个输入,使得处理较长的句子变得困难。2014 年,Dzmitry Bahdanau 等人提出了 注意力机制(attention),大大改进了原始架构。注意力机制允许模型 关注输入序列中彼此相关(相互“注意”)的部分,并 放大它们的信号,如图 1-14 所示。注意力机制通过选择性地聚焦于句子中最关键的词,来突出其重要性。
Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio. “Neural Machine Translation by Jointly Learning to Align and Translate”(ICLR 2015 Oral)arXiv:https://arxiv.org/abs/1409.0473
我之前一直以为注意力机制要到 Transformer 问世才发明 🤯
注意力机制
- 将 I、love、llamas 使用 word2vec 分别生成词嵌入
- 将词嵌入 按顺序输入编码器 RNN,计算所有隐藏状态:
- 将 作为解码器 RNN 的初始隐藏状态 ,按顺序生成输出。解码器每一步都先对 所有编码器隐藏状态 计算注意力,得到 动态上下文向量 :
- 生成 :
- 计算注意力分数:,其中
- 注意力权重:(Softmax 函数的性质:较大的分数信号会放大)
- 上下文向量:
- 更新隐藏状态:,其中 表示向量拼接
- 生成输出:
- 生成 :
- 计算注意力分数:
- 注意力权重:
- 上下文向量:
- 更新隐藏状态:
- 生成输出:
- 生成 (仿上)
- 生成 (仿上)
- 生成 :
例如,输出词 lama’s 是荷兰语中 llamas(美洲驼)的意思,因此两者之间的 attention 权重很高。反之,lama’s 和 I 这两个词之间的 attention 权重较低,因为它们的相关性不大。
在 Lec03 中,我们将深入讨论注意力机制。
通过在解码步骤中添加这些注意力机制,RNN 可以为输入序列中的每个词生成与潜在输出相关的信号。这并不仅仅是将上下文嵌入传递给解码器,而是传递所有输入词的隐藏状态。因此,在生成 “Ik hou van lama’s” 的过程中,RNN 会追踪它在进行翻译时主要关注的词。
相比 word2vec,基于注意力的 RNN 架构可以通过 “关注” 整个句子,更好地表征文本的序列特性及其上下文。但是,这种序列特性 不利于 模型训练过程中的 并行化。
1.2.3 Attention Is All You Need
Ashish Vaswani et al. “Attention is All You Need.”NeurIPS 2017.
Attention is All You Need 首次探讨了注意力机制的真正威力,以及驱动 LLM 展现出惊人能力的核心所在。作者提出了一种被称为 Transformer 的网络架构,它完全基于注意力机制,摒弃了此前提到的 RNN。与 RNN 相比,Transformer 支持并行训练,这大大加快了训练速度。
Transformer 整体架构简介
在 Transformer 中,编码和解码组件相互堆叠,如图 1-16 所示。这种架构仍然是自回归的,每个新生成的词都被模型用于生成下一个词。
Transformer 编码块示意图
Transformer 中的编码器块由两部分组成:自注意力(self-attention)和前馈神经网络(feed-forward neural network)。与之前的注意力方法相比,自注意力可以关注单个序列内部的不同位置,从而更高效且准确地表示输入序列。
自注意力机制可以一次性查看整个序列,而不是一次处理一个 token。
与编码器相比,解码器多了一个注意力层,用于关注编码器的输出(以便找到输入中相关的部分)。如图 1-19 所示,这个过程类似于我们之前讨论过的 RNN 注意力解码器。
Transformer 解码块示意图
如图 1-20 所示,解码器中的自注意力层会掩码未来的位置,这样在生成输出时就只会关注之前的位置,从而避免信息泄露。
解码器会遮盖上三角的位置
编码器、解码器这些模块共同构成了 Transformer 架构,它是语言人工智能中许多影响深远的模型(如 BERT 和 GPT-1)的基础。在第 2 章和第 3 章中,本书将深入探讨 Transformer 模型如此成功的诸多原因,包括 多头注意力(multi-head attention)、位置嵌入(positional embeddings)和 层归一化(layer normalization)。
1.2.4 Encoder-Only
原始的 Transformer 模型是一个 Encoder-Decoder 架构,虽然非常适合翻译任务,但难以用于其他任务,比如文本分类。
Jacob Devlin et al. “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”
2018 年,研究人员提出了一种名为 BERT(bidirectional encoder representations from Transformers,基于 Transformer 的双向编码器表示)的新架构,它可以应用于各种任务,并在未来几年成为语言人工智能的基石。如图 1-21 所示,BERT 是一个 Encoder-Only 架构,专注于语言表示。
BERT 基座模型架构:它只使用编码器,完全移除了解码器。
这些编码器模块与我们之前看到的相同:在自注意力层之后,接上前馈神经网络。输入中包含一个附加词元 [CLS](Classification Token,分类词元)用于表示整个输入。通常,我们使用 [CLS] 词元作为 输入嵌入(input embedding),用于在特定任务(如分类)上进行模型微调。
这些堆叠起来的编码器很难训练,因此 BERT 采用了一种被称为 掩码语言建模(masked language modeling)的技术来解决这个问题(见第 2 章和第 11 章)。如图 1-22 所示,该方法会掩码部分输入,让模型预测被掩码的部分。这样的预测任务虽然困难,但能让 BERT 为输入序列创建更准确的(中间)表示。
使用掩码语言建模方法的 BERT 模型
这种架构和训练过程使 BERT 及相关架构在表示依赖上下文的文本方面表现十分出色。
BERT 类模型通常用于 迁移学习(transfer learning):首先针对语言建模进行 预训练(pretraining),然后针对特定任务进行 微调(fine-tuning)。例如,通过在整个维基百科的文本数据上训练 BERT,它学会了理解文本的语义和上下文性质。然后,如图 1-23 所示,我们可以使用该预训练模型,针对特定任务(如文本分类)进行微调。
预训练与微调
特征提取(Frozen) 把 BERT 当作固定编码器,只取它的输出向量,然后接自己的简单分类器 用 [CLS] 的嵌入向量直接训练一个 SVM 做情感分
预训练模型的一个 巨大优势 是大部分训练工作已经完成。针对特定任务的微调通常计算量较小,且需要的数据更少。此外,BERT 类模型架构在处理过程中的几乎每一步都会生成嵌入,这使得 BERT 模型成为通用特征提取器,无须针对特定任务进行微调。
上面说无需微调的原因是:BERT 中每一层的 Transformer 都会输出一个向量序列,不同深度层的输出向量序列会有不同作用。
- 低层(1-4 层):侧重句法、语法、局部表层特征
- 词性、依存关系、短语边界、标点、局部搭配,适合句法分析、分词、词性标注。
- 中层(5-8 层):兼顾句法 + 浅层语义
- 实体边界、指代初步信息,适合命名实体识别(Named Entity Recognition, NER)、关系抽取任务。
- 高层(9-12 层):高度抽象全局语义、句子整体含义
- 上下文推理、句间逻辑、完整语义,适合文本分类、情感分析、语义匹配。
- 最后一层(第 12 层):适配预训练目标
- 最贴合掩码语言建模(Masked Language Modeling,MLM)、下一句预测任务(Next Sentence Prediction,NSP),但会丢失部分细粒度句法信息
像 BERT 这样的 Encoder-Only 模型将在本书的多个章节中使用。多年以来,它们一直被用于常见任务,包括分类任务(见第 4 章)、聚类任务(见第 5 章)和语义搜索(见第 8 章)。
在本书中,我们将 Encoder-Only 模型称为 表示模型(representation model),将 Decoder-Only 模型称为 生成模型(generative model)。需要注意的是,表示模型和生成模型的主要区别并不在于底层架构和工作方式。表示模型主要关注语言的表示,例如创建嵌入,而通常不生成文本;相比之下,生成模型主要关注生成文本,通常不会被训练用于生成嵌入。
1.2.5 Decoder-Only
Alec Radford et al. “Improving Language Understanding by Generative Pre-Training”.
论文链接:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
与 BERT 的 Encoder-Only 架构类似,2018 年出现了一种用于处理生成任务的 Decoder-Only 架构——生成式预训练 Transformer(Generative Pre-trained Transformer,GPT)。如图 1-24 所示,GPT-1 与 BERT 编码器堆叠架构类似,堆叠了多个解码器块。
GPT-1 架构
GPT-1 在 7000 本图书和 Common Crawl(一个大型网页数据集)上进行训练。最终模型包含 117M 个参数。每个参数都是一个数值,代表着模型对语言的理解。
Alec Radford et al. “Language Models are Unsupervised Multitask Learners.”
假设其他条件相同,我们预计更多的参数能显著提升语言模型的能力和性能。考虑到这一
点,我们已经看到新发布的模型越来越大,模型规模稳步提升。如图 1-25 所示,GPT-2 有 1.5B 个参数,GPT-3 则有 175B 参数。
Tom Brown et al. “Language Models are Few-Shot Learners.” NeurIPS 2020.
GPT-3 论文链接:https://arxiv.org/abs/2005.14165
GPT 的规模:0.1B -> 1.5B -> 175B
这些生成式 Decoder-Only 模型,特别是“更大”的模型,通常被称为大语言模型(LLM)。正如我们将在本章后面讨论的,LLM 这个术语不仅仅指代生成模型,也包括表示模型。生成式 LLM 作为一种 序列到序列(sequence-to-sequence,Seq2Seq)的文本生成系统,其核心机制是接收文本输入并尝试自动补全。尽管自动补全功能很实用,但这类模型真正的强大之处在于经过训练成为聊天机器人。与其只是补全文本,不如将它们训练得能够回答问题。通过微调这些模型,我们可以创建能够遵循人类指示的 指令模型(instruct model)或 对话模型(chat model)。
LLM 的问答机制
如图 1-26 所示,由此创建的模型接收用户查询(提示词,prompt),输出最可能符合该提示词的响应。
上下文
这些补全模型的一个要素是所谓的 上下文长度(context length),也称为 上下文窗口(context window)。如图 1-27 所示,上下文长度代表模型可以处理的最大 token 数量。如果我们有较大的上下文长度,就可以将整个文档传递给 LLM。需要注意的是,由于这些模型的 自回归特性,当生成新的 token 时,当前的上下文长度会增加。
1.2.6 生成式 AI 元年
LLM 对 AI 领域产生了巨大影响,随着 ChatGPT(GPT-3.5)的发布、普及和媒体关注,一些人将 2023 年称为“生成式 AI 元年”。当我们提到 ChatGPT 时,我们实际上指的是这款产品而非其底层模型。它最初由 GPT-3.5 LLM 驱动,此后又发展出了几个性能更强的版本,如 GPT-4。
OpenAI “GPT-4 Technical Report.” 2023
在生成式 AI 元年,产生影响力的模型不只是 GPT-3.5。如图 1-28 所示,开源和专有的 LLM 都以惊人的速度走入大众视野。这些开源基座模型通常被称为 基础模型(foundation model),可以针对特定任务,比如遵循指令进行微调。
生成式 AI 的发展
1.3 LLM 的训练范式与应用
在我们回顾语言人工智能的近期历史时,我们观察到主要是生成式 Decoder-Only 模型被称为 LLM。很多人认为 LLM 的关键特点就是“大”,但在实践中,这样的描述显然有局限性。
如果我们创建一个与 GPT-3 能力相当但参数量减少到原来的 1/10 的模型,这样的模型是否就不属于“LLM”的范畴了?同样,如果我们发布一个与 GPT-4 同等规模的模型,它能够进行准确的文本分类,但没有生成能力,那么它还能被称为“LLM”吗?即使它的主要功能不是语言生成,但它仍然可以表示文本。
这类定义的问题在于我们排除了一些能力很强的模型。无论我们给某个模型起什么名字,
都不会改变它的行为方式。由于“LLM”这个术语的定义随着新模型的发布而不断演变,我们需要明确说明它在本书中的含义。“大”的定义是相对的,今天被认为“大”的模型,明天可能就显得很小了。目前同一事物有很多不同的称呼,对我们来说,“LLM”也包括那些不生成文本且可以在消费级硬件上运行的模型。
因此,除了涵盖生成模型,本书还将介绍参数少于 1B 且不生成文本的模型。我们将探索如何使用其他模型,如嵌入模型、表示模型,甚至词袋模型,来增强 LLM 的能力。
1.3.1 LLM 的训练范式
传统机器学习通常是为特定任务(如分类)训练模型。如图 1-29 所示,我们认为这是一个单步过程。
传统模型的训练范式
相比之下,创建 LLM 通常包含至少两个步骤。
- 语言建模
- 第一步称为 预训练,占用了创建 LLM 过程中的大部分算力和训练时间。LLM 在海量互联网文本语料库上进行训练,使模型能够学习语法、上下文和语言模式。这个宽泛的训练阶段并不是针对特定任务或应用的,而仅仅用于预测下一个词。由此产生的模型通常被称为基础模型或基座模型。这些模型通常不会遵循指令。
- 微调
- 第二步是 微调,有时也称为 后训练(post-training),包括使用先前训练好的模型,并在更具体的任务上进行进一步训练。这使得 LLM 能够适应特定任务或展现符合人们期望的行为。例如,我们可以微调一个基座模型,使其在分类任务上表现良好或遵循指令。这可以节省大量资源,因为预训练阶段成本相当高,通常需要大多数人和组织难以企及的数据和计算资源。
LLM 的训练范式
对于任何经过第一步(预训练)的模型,我们都称之为预训练模型。对于基座模型,我们可以添加微调步骤来进一步使模型与用户偏好对齐。
1.3.2 LLM 的应用
借助文本生成能力和提示词,LLM 适用于广泛的任务,似乎限制它应用范围的只有人的想象力。让我们探索一些常见任务和技术来说明这一点。
- 检测客户评论是正面的还是负面的
- 这是(有监督的)分类任务,可以使用 Encoder-Only 和 Decoder-Only 模型来处理,既可以使用预训练模型(参见第 4 章),也可以使用微调模型(参见第 11 章)来完成。
- 开发一个系统,找出主题相同的工单问题
- 这是(无监督的)分类任务,没有预定义的标签。我们可以利用 Encoder-Only 模型来执行分类本身,并使用 Decoder-Only 模型来标记主题(参见第 5 章)。
- 构建一个用于检索和查看相关文档的系统
- 语言模型系统的一大重要特性是能够整合外部信息资源。使用语义搜索,我们可以构建系统,让 LLM 轻松访问和查找信息(参见第 8 章)。还可以通过创建或微调自定义嵌入模型来改进系统(参见第 12 章)。
- 构建一个能利用外部资源(如工具和文档)的 LLM 聊天机器人
- 这一应用是多种技术的组合,展示了如何通过外部组件来发挥 LLM 的真正潜力。提示工程(参见第 6 章)、RAG(参见第 8 章)和微调 LLM(参见第 12 章)等方法都是LLM 拼图的一部分。
- 构建一个能够根据冰箱中的食材图片生成食谱的 LLM
- 这是一个多模态任务,LLM 需要输入图像并对所看到的图像进行推理(参见第 9 章)。LLM 正在被扩展到视觉等其他模态,这带来了各种有趣的用例。
创建 LLM 应用是极具吸引力的,因为在一定程度上,这些应用的能力仅仅受限于你的想
象力。
1.3.3 LLM 伦理
LLM 的广泛应用已经带来深远的影响,且这种影响很可能越来越显著。在我们探索 LLM 令人难以置信的能力时,我们应该牢记它们的社会和伦理影响。以下是几个需要考虑的关键点。
- 偏见和公平性
- LLM 在训练时使用了大量可能包含偏见的数据。模型可能会从这些偏见中学习,再现乃至放大这些偏见。由于训练 LLM 的数据集很少公开,除非亲自尝试,否则很难明确它们可能包含哪些偏见。
- 透明度和问责制
- 由于 LLM 具有令人难以置信的能力,在与之交互时,我们并不总是能清楚分辨是在与人类还是模型对话。因此,当没有人类参与时,在人机交互中使用 LLM 可能会产生意想不到的后果。例如,在医疗领域使用的基于 LLM 的应用可能会被归类为医疗设备,因为它们可能会影响患者的健康。
- 有害内容
- LLM 生成的内容不一定是真实的,且它们可能“自信地”输出错误的文本。此外,它们还可能被用于生成假新闻、文章和其他具有误导性的信源。
- 知识产权
- LLM 输出内容的知识产权应该归属于你,还是模型创造者?当输出与训练数据中的某个短语相似时,知识产权是否属于该短语的作者?由于大多数情况下我们无法访问训练数据,我们很难确定模型何时使用了受版权保护的材料。
- 监管
- 由于 LLM 的巨大影响力,各国政府开始对商业应用进行监管。例如欧盟《人工智能法案》,该法案对包括 LLM 在内的基础模型的开发和部署进行监管。
我们要强调在开发和使用 LLM 时道德规范的重要性,敦促你多了解如何安全、负责任地使用 LLM 和人工智能系统。
1.3.4 LLM 分类
专有模型是闭源模型的一种。闭源 LLM 是指不向公众公开其权重和架构的模型。专有模
型由特定组织开发,其底层代码保密。此类模型的例子包括 OpenAI 的 GPT-4 和 Anthropic 的 Claude。
专有模型通常有强大的商业支持,并已在其服务中进行了开发和集成。你可以通过一个与 LLM 通信的 应用程序接口(application program interface,API)来访问这些模型,如图 1-31 所示。例如,要在 Python 中使用 ChatGPT,你可以使用 OpenAI 的软件包来与服务交互,而无须直接访问它。
优点:
- 用户无须拥有强大的 GPU 就能使用 LLM。服务提供商负责托管和运行模型,而且通常拥有更多的计算资源。
- 用户也无须具备托管和使用模型的专业知识,这显著降低了使用门槛。
- 由于相关组织的大量投资,专有模型往往比开源模型性能更强。
缺点:
- LLM API 服务可能成本较高。
- 由于无法直接访问模型的权重,用户也无法自行微调模型。
- 用户的数据会与提供商共享,在许多常见的应用场景中,这可能是用户不希望发生的,比如共享患者数据。
闭源模型和开源模型
开源 LLM 是指向公众共享其权重和架构的模型。它们仍然由特定组织开发,但通常会共
享用于创建或本地运行模型的代码。开源 LLM 具有不同级别的许可方式,有的允许模型
的商业使用,有的不允许。Cohere 的 Command R、Mistral 系列模型、微软的 Phi 和 Meta 的 Llama 系列模型都是开源模型。
优点:
- 用户可以完全控制模型。
- 你可以在不依赖 API 连接的情况下使用模型
- 可以对其进行微调,并通过它处理敏感数据。
- 你不依赖于任何服务,并且可以完全透明地了解模型产生输出的过程。
大型社区的支持进一步突出了这一优势,比如 Hugging Face,展示了基于开源模型开展社区合作的可能性。
缺点:
- 需要强大的硬件来运行,在训练或微调时甚至需要更强大的硬件。
- 配置和使用这些模型需要特定的知识。
我们通常倾向于尽可能使用开源 LLM。这种方式带来了更高的自由度,可以尝试各种选
项、探索模型的内部工作原理以及本地使用模型,可以说,比使用闭源 LLM 好处更多。
本书以直观理解为先的理念是这一过程的重要一环。如果你不仅对 LLM 有直观的理解,还熟悉常见框架的使用,那么转向其他框架应该是比较简单的。具体来说,我们专注于后端软件包。这些是没有 GUI(graphical user interface,图形用户界面)的软件包,专门用于在你的设备上高效加载和运行 LLM,比如 llama.cpp、LangChain,以及许多框架的核心 Hugging Face Transformers。
1.3.5 牛刀小试
当我们在使用 LLM 时,需要在本地加载两个模型:
- 生成模型本身
- 其底层的分词器(tokenizer)
分词器负责在将输入文本送入生成模型之前,将其分割成 token。你可以在 Hugging Face 网站上找到分词器和模型,只需传入相应的 ID 即可。在本例中,我们使用 microsoft/Phi-3-mini-4k-instruct 作为模型的主路径。我们可以使用 transformers 来加载分词器和模型。
1 | |
然后使用 transformers 的 pipeline 方法创建一个 LLM 对象。
1 | |
说明:
"text-generation"是流水线的名称,表示生成文本。model是加载的模型。tokenizer是加载的分词器。return_full_text表示是否返回完整的文本。如果为 False,则只返回生成的文本,不包含提示词。max_new_tokens表示生成文本的最大 token 数。do_sample表示是否使用采样生成文本。如果为 False,则使用贪心搜索(始终选择概率最高的)生成文本。
1 | |
运行上述代码,将生成一个笑话,并打印出来。
1 | |
笑点解析:egg-sistence 通 existence,crack the existence of sth 表示看透、接受某事。
所以上面意为,
- 鸡为啥不爱去健身房?
- 因为它们根本没法接受这件事的 “蛋实”(现实)!