跳转至

总体架构设计

画出标准 Transformer 的 Encoder 和 Decoder 结构图,标注所有子层

Encoder(编码器):

输入嵌入 + 位置编码
   ┌─────────────────────────────┐
   │         Encoder Layer       │
   │                             │
   │  ┌──────────────────────┐   │
   │  │ 多头自注意力 (Multi-Head   │   │
   │  │ Self-Attention)        │   │
   │  └──────────────────────┘   │
   │           │                  │
   │    残差连接 + LayerNorm       │
   │           │                  │
   │  ┌──────────────────────┐   │
   │  │  前馈网络 (FFN)        │   │
   │  └──────────────────────┘   │
   │           │                  │
   │    残差连接 + LayerNorm       │
   │                             │
   └─────────────────────────────┘
   (× N,通常 6、12、24 层叠加)
  Encoder 输出(送给 Decoder 的交叉注意力)

Decoder(解码器):

目标序列嵌入 + 位置编码
   ┌─────────────────────────────┐
   │         Decoder Layer       │
   │                             │
   │  ┌──────────────────────┐   │
   │  │ 掩码多头自注意力       │   │
   │  │ (Masked Multi-Head    │   │
   │  │  Self-Attention)      │   │
   │  └──────────────────────┘   │
   │           │                  │
   │    残差连接 + LayerNorm       │
   │           │                  │
   │  ┌──────────────────────┐   │
   │  │ 交叉注意力            │   │
   │  │ (Cross-Attention)     │   │
   │  │ Q: Decoder输出         │   │
   │  │ K,V: Encoder输出      │   │
   │  └──────────────────────┘   │
   │           │                  │
   │    残差连接 + LayerNorm       │
   │           │                  │
   │  ┌──────────────────────┐   │
   │  │  前馈网络 (FFN)        │   │
   │  └──────────────────────┘   │
   │           │                  │
   │    残差连接 + LayerNorm       │
   │                             │
   └─────────────────────────────┘
   (× N,通常与 Encoder 层数相同)
   Linear + Softmax → 输出概率

Encoder 中的自注意力与 Decoder 中的自注意力有什么本质不同?掩码有何作用?

本质不同:

  • Encoder 自注意力:是双向的。每个 token 可以看到序列中的所有 token(包括前后)。这允许模型在编码时充分利用全局上下文,对一个词的理解可以依赖于它左边和右边的全部信息。这种双向性对于理解任务(如文本分类、序列标注、语义相似度)至关重要,因为理解一个词的含义往往需要同时参考它的前后文。

  • Decoder 自注意力:是单向的(通常称为因果注意力或掩码自注意力)。每个 token 只能看到它前面的 token(包括自己),不能看到未来的 token。这是自回归生成的要求:在生成第 t 个词时,模型只能基于前 t-1 个已生成的词进行预测,而不能“偷看”未来。

掩码的作用:

掩码是一个上三角矩阵(通常填充为 -∞),加到注意力分数矩阵上。在 softmax 之前,将当前 token 对未来 token 的注意力分数设为负无穷,使得 softmax 后这些位置的权重为 0。这确保了:

  1. 训练时,模型学到的预测模式符合自回归生成的因果约束,避免了信息泄露。尽管输入是完整的目标序列,掩码保证了每个位置的预测只依赖于历史上下文。

  2. 推理时,模型可以逐 token 生成,每一步只基于已生成的部分,这是文本生成的基础。

Encoder-Decoder 架构中,Decoder 是如何利用 Encoder 输出的?交叉注意力的 K、V 来自哪里?

Decoder 通过交叉注意力(Cross-Attention) 机制来利用 Encoder 的输出。

具体过程:

  • Encoder 处理完整个输入序列后,输出一个编码后的表示序列,形状为 (batch, src_len, d_model),记作 encoder_output

  • 在 Decoder 的每个层中,交叉注意力的 Q(Query)来自 Decoder 上一子层的输出(即掩码自注意力后的表示)。这个 Q 代表“我需要什么信息”,携带了目标序列当前位置的上下文特征。

  • 交叉注意力的 K(Key)和 V(Value)均来自 Encoder 的输出 encoder_output。K 代表“我能提供什么信息以供匹配”,V 代表“我实际携带的信息内容”。

  • 计算时,Decoder 的 Q 与 Encoder 的 K 做点积,得到注意力权重(shape: (tgt_len, src_len)),表示目标序列每个位置对源序列各位置的关注程度。然后用这些权重去加权 Encoder 的 V,得到聚合了源语言信息的表示。

这种设计的意义:Decoder 的每一个位置都可以动态地关注 Encoder 输出中的所有位置,将源语言的信息有选择地融入到目标语言的生成中,解决了序列到序列的对齐问题。这就是 Transformer 在机器翻译等任务中表现优秀的核心原因。

为什么 Encoder-only 模型适合理解任务,而 Decoder-only 适合生成任务?

Encoder-only 模型(如 BERT)适合理解任务:

  • 双向上下文:Encoder 的自注意力可以看到整个序列的所有位置,能同时捕捉一个词的左右上下文,这对于理解句子语义、词义消歧、关系分类等任务至关重要。

  • 掩码语言模型预训练:Encoder-only 模型通常在 MLM 任务上预训练,学习的是“完形填空”式的理解能力,对文本的深层语义把握更强。微调时通常在 Encoder 输出之上加分类头,直接基于全局上下文做判断。

  • 无自回归生成:Encoder 本身不是为逐个生成 token 设计的,它一次性输出整个序列的表示,不能直接用于生成任务。

Decoder-only 模型(如 GPT)适合生成任务:

  • 单向因果注意力:Decoder 的注意力只关注前文,天然符合自回归生成模式——从左到右逐 token 预测下一个词。

  • 语言模型预训练:Decoder-only 模型在下一个 token 预测任务上预训练,学会的是根据前文续写文本,这正是生成任务所需的核心能力。

  • 灵活的条件注入:通过将条件信息(如翻译的源语言、问答的上下文)与待生成内容拼接为统一序列,Decoder-only 可以灵活处理各种条件生成任务,无需额外的交叉注意力结构。

  • 训练和推理的一致性:训练时使用教师强制(Teacher Forcing),推理时自回归生成,两者在序列生成模式上一致(尽管有曝光偏差),更容易优化生成质量。

Decoder-only 模型没有显式的交叉注意力,那它怎么处理条件信息?如在 GPT 中如何进行翻译?

Decoder-only 模型将条件信息(源语言文本)和待生成的目标语言文本拼接成一个统一的序列,通过自注意力完成条件到生成的映射。

以 GPT 翻译为例:

  • 输入序列构造:[源语言句子] [分隔符] [目标语言句子前缀(如开始符)]

  • 训练时,源语言部分不计算损失(或掩码掉),只计算目标语言部分的语言模型损失(预测下一个 token)。Decoder 的自注意力在源语言部分可以看到完整源语言(双向),因为源语言是已知给定的;在目标语言部分则是因果掩码,只能看到前文。

  • 生成时,给定 [源语言句子] [分隔符] [目标语言开始符],模型自回归地逐词生成目标语言翻译,每生成一个词就拼接到序列末尾,直到输出结束符。

这种做法的优势:

  • 架构统一:无需额外设计 Encoder 和交叉注意力,一个 Decoder 处理所有信息。

  • 灵活扩展:可以轻松添加更多条件信息,如翻译指令、示例(few-shot),全部通过拼接实现。

  • 自注意力全程参与:源语言和目标语言在同一个自注意力计算中交互,模型的每一层都能直接访问源语言信息,信息流动更自由。

现代大语言模型(如 GPT-4、LLaMA)在多种条件生成任务中都采用了这种统一序列的方式,体现了 Decoder-only 架构的灵活性和强大扩展能力。

一个 12 层的 Transformer Encoder,它的每一层都包含哪些可训练参数?参数分布是怎样的?

image.png

  1. 两个 LayerNorm 层:

  2. 每个 LayerNorm 包含缩放参数 γγ 和偏移参数 ββ,各 768 维

  3. 两个 LayerNorm 总参数量:4×768=3,0724×768=3,072

每层总参数量:约 2.36M + 4.72M + 约 0.003M ≈ 7.08M

参数分布规律:

  • FFN 占主导:每层约 67% 的参数集中在 FFN 部分(4.72M / 7.08M)。

  • 注意力次之:注意力部分约占 33%。

  • 归一化层极轻量:LayerNorm 参数几乎可以忽略不计。

12 层的 Encoder 总参数量(不计嵌入层)约为 12×7.08M≈85M12×7.08M≈85M。加上嵌入层(30k 词汇表 × 768 = 23M)、位置编码等,BERT-base 总参数量约为 110M。

为什么现在主流的 LLM 大多采用 Decoder-only 架构?Encoder-Decoder 架构有哪些劣势?

Decoder-only 架构的优势(为何成为主流):

  1. 架构统一简单:只有一种 Transformer 块,所有信息(条件、上下文、生成内容)都通过统一的自注意力处理。无需分别设计 Encoder 和 Decoder,代码实现、优化和扩展都更简单。

  2. 预训练目标与生成一致:下一个 token 预测的预训练任务与自回归生成天然一致,训练和推理的模式差异小(仅有曝光偏差)。Encoder-Decoder 需要在预训练时设计类似 Seq2Seq 的任务,训练效率和数据利用率相对较低。

  3. 灵活的零样本/少样本能力:通过文本拼接可将任何任务转化为语言模型格式。例如翻译、问答、摘要只需在输入中提供指令和上下文,无需改变模型结构。这种“一切皆生成”的范式使得同一个模型可以处理极多样化的任务。

  4. 易于扩展到极大规模:Decoder-only 的因果注意力在训练时可以利用 FlashAttention 等优化,且序列级别的自回归训练适合用教师强制做高效批量训练。Encoder-Decoder 的双向/交叉注意力增加了额外的计算复杂度和内存开销。

  5. 更长的有效上下文:Decoder-only 的 KV 缓存机制在推理时较为直接,且容易结合 PagedAttention 等优化。Encoder-Decoder 还需要缓存 Encoder 的表示,且交叉注意力的 KV 缓存管理更复杂。

Encoder-Decoder 的劣势:

  • 结构复杂:需要两组不同的 Transformer 块,参数量和训练开销更大。

  • 任务适配不灵活:新增任务通常需要设计特定的输入格式或微调策略,不像 Decoder-only 可通过 Prompt 统一处理。

  • 推理效率较低:生成时 Encoder 需要先处理整个输入,Decoder 再逐步生成,无法像 Decoder-only 那样可以在生成的同时对输入做增量处理。

  • 扩展性受限:在超大模型和超长文本场景下,Encoder 的双向注意力复杂度为 O(n2),且与 Decoder 的交叉注意力也是 O(n2),相比 Decoder-only 的因果注意力更难以用稀疏或线性注意力优化。

Encoder-Decoder 的优势场景是什么?请至少举三个典型任务。

尽管 Decoder-only 大行其道,Encoder-Decoder 在以下场景仍有独特优势:

  1. 机器翻译(特别是低资源语言对):

  2. Encoder 可以充分双向编码源语言,捕获完整的上下文信息。Decoder 通过交叉注意力显式地从源语言表示中提取信息,这种结构化的对齐机制在翻译时需要精确的源-目标映射,比 Decoder-only 的拼接方式更直接。在训练数据有限的情况下,Encoder-Decoder 往往能更高效地学习到翻译模式。

  3. 长文本摘要:

  4. 输入是一篇长文档,输出是简短摘要。Encoder 可以双向处理整个长文档,提取关键信息并压缩为密集表示。Decoder 通过交叉注意力有选择地关注文档的不同部分来生成摘要。双向编码能更好地理解文档的全局结构和要点,避免因果解码器可能发生的“长文档前部信息在生成时被淡忘”的问题。

  5. 语音识别(ASR)或多模态理解:

  6. 语音信号或图像特征经过编码器提取为高级表示,解码器(可能是自回归的)基于这些特征生成文本。Encoder 负责从连续信号中抽象出离散的语义信息,Decoder 负责将这些语义转化为流畅文本。这种感知-生成分离的结构天然适合这类任务。

其他场景:代码生成(源语言为自然语言描述)、图像描述(图到文)、知识图谱到文本等,这些任务都具有“从结构化或非文本表示到文本”的转换特征,Encoder-Decoder 的分离设计更贴合。

如果要用一个预训练的 Encoder-only 模型做文本摘要,你会怎么做?会遇到什么限制?

怎么做:

由于 Encoder-only 模型无法直接生成文本,需要将其改造为生成式架构。一种常见做法是在 Encoder 上添加一个随机初始化的 Decoder,形成一个 Encoder-Decoder 框架。预训练的 BERT 作为 Encoder,提供强大的文本理解能力;Decoder 使用标准 Transformer 解码器,通过交叉注意力利用 Encoder 的表示进行自回归生成。训练时,可以冻结 BERT 部分(或使用小学习率微调),重点训练 Decoder 和交叉注意力层。这实际上就是 BERT2BERT 或 BERT-gen 的做法。

另一种方案是将摘要任务转化为抽取式摘要:在 Encoder 的输出上训练一个分类头,为每个句子预测是否应该被选入摘要。这不需要生成,完全在 Encoder-only 框架内完成,但只能做抽取式,不能做生成式摘要。

限制:

  • 缺乏生成能力:Encoder-only 模型预训练时没有学过文本生成,添加的 Decoder 需要从头训练,需要大量摘要标注数据,且训练成本高。

  • Encoder 与 Decoder 不匹配:BERT 的表示是针对 MLM 和 NSP 优化的,与生成任务所需的表示可能不完全适配。直接使用可能需要较多的微调。

  • 序列长度受限:BERT 通常使用绝对位置编码,最大长度为 512。对于长文档摘要,无法直接输入完整文档,需要截断或分段处理,可能丢失关键信息。

  • 不是主流方案:相比直接用预训练的 Seq2Seq 模型(如 BART、T5)或 Decoder-only 大模型,使用 Encoder-only 做摘要的性价比和效果上限都较低。

Transformer 结构的“深度”和“宽度”分别指什么?哪个对模型能力影响更大?

深度:指 Transformer 的层数(即 Encoder 或 Decoder 的堆叠数量)。深度决定了模型能够进行多少次非线性变换和注意力聚合。更深的网络可以建模更复杂的层次化特征:浅层关注局部模式,中层组合为短语级表示,深层捕捉全局语义和复杂推理。

宽度:指每层内部的维度大小,主要是 d_model(模型隐藏维度)和 d_ff(FFN 中间层维度)。宽度决定了每层能表示多少信息容量。更宽的网络每个位置可以存储更丰富的特征。

哪个影响更大:

  • 在模型总参数量固定的情况下,深度往往比宽度更重要。研究表明,增加层数通常比增加宽度带来更显著的性能提升。深层网络可以逐步抽象化表示,每一层的增量可以叠加为强大的推理能力。而宽度增加仅提升了单层的容量,边际收益递减更快。

  • 然而,过深的网络训练困难(即使有残差连接和 Pre-Norm),会遭遇梯度消失、表示崩溃等问题。因此大模型通常会同时增加深度和宽度,但深度优先。例如 GPT-3 的 175B 模型有 96 层,而不是减少层数但把宽度做得很极端。

  • 近年也有研究关注深度与宽度的最优配比。对 Transformer 而言,在一定范围内,加深比加宽收益更大,但需要配合更优的归一化和初始化策略。

Encoder 的双向自注意力和 Decoder 的单向自注意力各自适合什么任务?为什么不能互换?

双向自注意力(Encoder)适合的任务:

  • 文本理解:文本分类、情感分析、自然语言推理、命名实体识别、关系抽取等。这些任务需要综合整个句子的上下文来做出判断。

  • 序列标注:每个位置的标签可能依赖于前后文,双向信息至关重要。

  • 句子/文档编码:用于检索、语义相似度计算、句子嵌入等。

单向自注意力(Decoder)适合的任务:

  • 文本生成:语言建模、对话生成、故事创作、代码生成等。生成过程必须遵守时间顺序,只能基于已生成内容预测下一个词。

  • 自回归生成:翻译、摘要等条件生成任务中,目标端需要按顺序逐个生成。

为什么不能互换?

  • 如果用双向注意力去做生成,模型在预测第 t 个词时能看到未来的正确答案(信息泄露),训练出的模型无法用于实际生成——因为它依赖的未来信息在推理时根本不存在。

  • 如果用单向注意力去做理解任务,每个 token 的表示只包含左侧上下文,对于需要右向信息的任务(如理解一个代词指向前文还是后文),模型会丢失重要信号,性能显著下降。

例外:有些理解任务(如文本分类)对方向性不敏感,单向模型也能取得不错效果,因为最终分类只需全局聚合信息,从左到右逐步聚合也能近似全局语义。但序列标注等细粒度任务对双向信息的需求更为刚性。

为什么 Encoder-Decoder 架构在神经机器翻译中逐渐被 Decoder-only 取代?除了统一性还有哪些原因?

统一性确实是重要原因——用一个模型处理所有任务,减少架构复杂性。但还有更深层的原因:

  1. 数据和规模优势:Decoder-only 的预训练目标(下一个 token 预测)天然适合从海量无标注文本中学习。互联网上几乎有无穷无尽的自然文本可用于训练语言模型。而 Encoder-Decoder 需要成对的平行语料(如翻译对)进行监督训练,这种数据昂贵且稀缺。Decoder-only 可以先在海量单语数据上预训练强大的语言能力,再用少量平行数据微调,大幅降低了对标注数据的依赖。

  2. 零样本/少样本的涌现能力:当 Decoder-only 模型足够大时,即使只在单语数据上训练,也能通过提示(prompt)展现出一定的翻译能力——这源于多语言文本在训练数据中的共现。Enc-Dec 没有这种涌现特性,必须显式在平行数据上训练。

  3. 长序列的注意力效率:Decoder-only 的自回归生成时,源语言和目标语言在同一个自注意力中。源语言部分不需要生成,可以直接用双向注意力(通过掩码控制),目标语言部分用因果掩码。这种灵活掩码机制比 Enc-Dec 的 Encoder 双向 + 交叉注意力更高效,因为交叉注意力需要额外的 KV 缓存和计算。

  4. 更适合多任务统一:在同一个序列中,Decoder-only 可以自然混合指令、示例、输入和输出。这催生了 In-Context Learning 和 Chain-of-Thought 等能力。Enc-Dec 很难自然融入这些范式。

  5. 社区和生态的收敛:GPT 系列的成功证明了 Decoder-only 的大规模可扩展性,大量资源和优化工具(如 FlashAttention、vLLM)围绕这一架构展开,形成了强大的生态飞轮。

Decoder-only 模型进行条件生成时,如何将条件信息(如源语言)注入?常用的做法有哪些?

核心做法:条件信息与目标序列拼接成统一序列。

具体方法如下:

  1. 前缀拼接法: 将条件文本直接拼接在待生成序列之前,用特殊分隔符隔开。格式为 [条件文本] [分隔符] [目标前缀]。训练时只对目标部分计算语言模型损失。这是最基础也最常用的做法,GPT 系列处理翻译、摘要等任务均采用此法。

  2. 指令+上下文拼接: 在条件信息前再拼接任务指令(如“将以下文本翻译成英文:”),形成 [指令] [条件] [分隔符] [目标] 的结构。这让模型能够区分不同类型的条件生成任务,实现多任务统一。

  3. 部分双向掩码(PrefixLM):

允许条件部分使用双向注意力(token 之间可以互相看到),而目标生成部分使用因果掩码。这通过自定义的注意力掩码矩阵实现:条件部分的 mask 是全零(可见),目标部分的 mask 是上三角因果掩码,且条件到目标方向是可见的。这样既保留了条件部分的双向理解能力,又不破坏生成的因果性。GLM、PaLM 等模型采用了这种策略,可以在条件理解上获得接近 Encoder 的双向能力。

  1. 交叉注意力替代方案(Decoder with Encoder):

有些模型保留一个单独的轻量 Encoder 来编码条件,但主网络仍是 Decoder。Encoder 输出的表示通过额外的交叉注意力注入 Decoder。这介于纯 Decoder 和 Enc-Dec 之间,用于需要强条件控制的场景。

  1. 提示嵌入法(Prompt Tuning):

在输入层插入可学习的软提示(soft prompt)向量,这些向量作为条件的压缩表示,与输入 token 嵌入拼接。只需少量条件文本示例即可,适用于高效微调。

在实际工程中,前缀拼接 + 因果掩码是绝大多数生成式 LLM 的首选,因其最简单、最统一、且能充分利用 Decoder-only 的架构优势。

如果让你设计一个同时具备理解和生成能力的混合架构,你会怎么安排层的类型和比例?

设计目标:结合双向理解的深度和单向生成的自然性。一种成熟的思路是非对称的 Encoder-Decoder 或 PrefixLM 变体。

方案一:深层双向编码器 + 浅层自回归解码器

  • 前端:约 60%-70% 的层采用双向自注意力,负责对输入进行深度的全局理解,提取丰富的上下文表示。这部分类似 BERT 的 Encoder,可处理输入文本、图像特征等多模态信息。

  • 后端:约 30%-40% 的层采用因果掩码自注意力,负责基于前面的双向表示进行自回归生成。生成部分不设交叉注意力,而是直接从双向编码器的最后一层输出作为初始隐藏状态,或以残差方式注入生成层。

  • 理由:理解需要深度双向建模,生成则需要因果约束。将更多层分配给理解,可以建立强大的语义基础,生成部分在高质量表示之上仅需少量层即可完成流畅输出。

方案二:混合层(PrefixLM 的层内切换)

  • 所有层共享,不区分编码器/解码器。在每一层内,根据 token 位置动态切换注意力掩码:前缀(条件/输入)部分使用双向注意力,后缀(待生成)部分使用因果注意力。

  • 比例控制:输入和输出的序列长度自然形成分工,无需固定层的比例。模型可以灵活处理任意长度的条件。

  • 理由:这种设计在 PaLM、GLM 中已被验证,兼顾理解和生成,且架构统一,训练高效。

方案三:MoE 混合

  • 在每层引入两组专家 FFN:一组是“理解专家”,在双向特征上表现更好;另一组是“生成专家”,在因果特征上优化。路由机制根据 token 是前缀还是后缀来激活不同的专家。

  • 这可以增加模型容量而不显著增加计算量。

权衡:混合架构的复杂度高于纯 Decoder-only,但如果应用场景明显区分理解与生成(如文档理解+问答生成),且对理解深度有刚性需求,那么非对称方案更具优势。纯 Decoder-only 因其极致的统一性和扩展性仍是当前主流。

Transformer 的深度对“局部模式”和“全局模式”的捕捉有什么不同影响?

局部模式通常指邻近 token 之间的依赖关系,如短语结构、语法搭配、相邻词性约束等。全局模式指跨越长距离的依赖,如指代消解、段落主题一致性、全文逻辑结构等。

深度的影响:

  • 浅层更擅长捕捉局部模式。注意力权重通常在浅层集中于对角线附近(每个 token 关注自己和左右几个 token),这是类似于卷积的局部特征提取。浅层的表示也更多保留词级和短语级的特征。

  • 随着层数加深,注意力范围逐渐扩大,全局模式开始涌现。深层通过多层自注意力的组合,每个 token 的感受野指数级扩大,能够关注到距离很远的语义相关 token。同时,深层 FFN 存储的“记忆”模式更多涉及高层语义和抽象概念。

  • 极深网络能捕捉极其复杂的全局依赖,但也可能出现“过度全局化”:所有 token 的表示趋于相似(表示坍缩),失去局部细节的辨别力。这解释了为什么很深的 Transformer 有时需要引入局部注意力窗口或额外的局部增强机制。

实证:BERT 的可视化研究表明,浅层注意力有明确的局部模式(邻近关注),中间层开始出现句法结构(如关注同一短语的其他词),深层则关注语义相关但距离较远的词。因此,足够的深度是实现从局部到全局逐层抽象的关键。

现代大模型很少单独使用 Segment Embedding,取而代之的是什么机制?

Segment Embedding 最初在 BERT 中引入,用于区分输入中的不同句子(如句子 A 和句子 B),便于 NSP 任务。现代大模型普遍不再单独使用 Segment Embedding,原因和替代方案如下:

为什么不再使用:

  • NSP 被抛弃:RoBERTa 等研究发现 NSP 任务效果有限甚至有害,因此区分句子的 Segment Embedding 失去了主要作用对象。

  • 统一序列建模:Decoder-only 模型将一切输入视为连续序列,通过特殊分隔 token(如 <sep><eos><|user|><|assistant|>)和注意力掩码来区分不同部分(指令、上下文、生成内容)。模型从分隔符的位置和掩码模式中隐式学会部分之间的边界和关系。

  • 灵活性受限:Segment Embedding 需要预先设定句子段落数量,难以适应复杂多变的对话、多文档输入等场景。

取而代之的机制:

  • 特殊 Token 标记:使用特殊的控制 token 来标明不同段落的起止,这些 token 的嵌入和位置编码包含了段落边界信息。现代对话模型(如 LLaMA-2-Chat、ChatGPT)使用 <|system|><|user|><|assistant|> 等标记清晰划分角色和内容。

  • 注意力掩码控制:通过构造不同形状的注意力掩码,精确控制哪些 token 可以互相看到。例如,对话历史可以互相看到,但当前回复只能看到历史(不能看到未来的回复)。这种掩码机制比 Segment Embedding 更灵活、更细粒度。

  • 位置编码:现代模型使用旋转位置编码(RoPE)或 ALiBi 等,使模型能更好地区分不同位置的 token,隐式包含了段落的顺序信息,无需额外嵌入。

  • 无显式分隔:在某些架构中,输入和输出只是自然拼接,模型从语义和上下文中自己学习边界,不依赖任何显式的段落标记。

总结来说,Segment Embedding 被更灵活、更通用的特殊 token + 注意力掩码 + 位置编码组合取代,使得模型可以处理任意形式的文本拼接和复杂的对话结构。