第一次准备下载大模型时,模型页面上的7B、32B、128K和INT4很容易让人困惑:7B表示模型有多大,128K是不是可以直接放入一本书,INT4为什么能让模型占用更少显存?
真正开始使用以后,还会遇到会议记录放不下、长对话忘记前文、模型回答没有依据、同一个模型换种量化方式效果发生变化等问题。
要判断一个模型适不适合当前任务,需要先了解文字怎样进入模型、模型的能力怎样训练出来,以及模型运行时为什么会占用内存和显存。
这些知识可以分成三条主线,第一条从Transformer总体结构出发,再看Token、Embedding和Attention,说明一段文字怎样进入模型并被处理;第二条是预训练、指令微调和后训练,说明模型的能力怎样形成;第三条是上下文长度、KV Cache、量化和硬件,决定模型能不能在目标设备上稳定运行。
本章内容是对前面相关章节内容的基础知识提炼,例如本次所提及的模型推理相关例如可以参考第六章和第七章的内容;针对模型SFT可以参考第九章所介绍的魔搭自带的ms-swift 微调框架;针对后训练相关内容,也可以参考第十章中介绍的关于偏好对齐与强化学习的内容。针对领域模型的应用和幻觉问题等,也可以参考第十三章介绍的RAG方法,利用外部知识即提升大模型在领域类的问答下效果也能进一步降低模型的幻觉。
Transformer是目前大多数大型语言模型采用的基础架构。与早期循环神经网络按顺序处理文本不同,Transformer在训练和输入处理阶段可以并行计算多个位置,并通过Attention建立不同位置之间的联系。经典Transformer由编码器和解码器组成。每个Transformer层通常包含Attention和前馈网络。前馈网络也叫FFN或MLP,它会对每个位置的向量进行非线性变换。层中还会使用残差连接和层归一化,帮助信息稳定地通过深层网络。大量相似层堆叠起来后,模型才能逐步形成复杂的文本表示和生成能力。Transformer的整体架构如下图所示,图中左侧是编码器(Encoder),右侧是解码器(Decoder)。图中的N×表示同类模块会重复堆叠多层,实际层数会根据模型架构和参数规模变化。
在模型进行推理时,当用户输入一段文字后,模型内部会经过下面的处理过程:大模型在处理文本时,首先会通过 Tokenizer 将原始文字切分成一个个 Token,并转换成对应的 Token ID;随后,Embedding 层会把这些离散的 Token ID 映射成连续的向量表示,同时加入位置信息,让模型知道各个 Token 在句子中的先后顺序。接下来,这些向量会经过多层 Transformer 反复处理,其中 Attention 机制负责让不同 Token 之间相互关注、交换上下文信息,前馈网络则进一步加工每个位置上的特征。经过多层计算后,模型会得到对当前上下文的综合表示,并据此计算下一个 Token 的概率分布,选择或采样出下一个 Token,再将其加入上下文继续重复这一过程,直到完成整段内容的生成。
原始Transformer中的三个部分各有不同作用:
- 编码器(Encoder-only)结构:主要负责理解输入,可以同时参考输入序列中的不同位置,适合分类、抽取和语义表示等任务;
- 解码器(Decoder-only)结构:主要负责生成输出,生成当前位置时只能查看已经出现的内容;
- 编码器—解码器(Encoder-Decoder)结构:先理解输入,再逐步生成输出,常见于翻译和摘要等序列转换任务。
现代大模型不一定同时使用完整的编码器和解码器。在此基础之上,衍生了基于Transformer多种架构,比如,GPT类生成模型通常采用Decoder-only结构,BERT类模型主要使用Encoder-only,T5类模型则保留Encoder-Decoder结构。
词元(Token)是模型读取和生成文本时使用的基本单位。它可能是一个汉字、一个词、词的一部分、标点符号,也可能是空格或特殊控制标记。例如,同一句话在不同Tokenizer中可能得到不同结果:
原文:大型语言模型正在改变办公方式。
分词器A:大型 / 语言 / 模型 / 正在 / 改变 / 办公 / 方式 / 。
分词器B:大 / 型 / 语言 / 模型 / 正 / 在 / 改变 / 办公 / 方式 / 。
两个结果表达的是同一句话,但Token数量并不相同。模型实际接收的是每个Token对应的数字编号,也就是Token ID。以整理会议纪要为例,模型看到的不是一篇完整的会议记录,而是一串Token ID。会议名称、发言内容、时间、标点和输出要求都会占用Token;模型生成的摘要、结论和行动项同样会继续占用Token。因此,同一份材料要求输出得越详细,留给原始记录的空间就可能越少。
如果完全按字符切分,词表可以比较小,但序列会变长;如果完全按完整单词切分,词表会非常庞大,还会不断遇到新词、缩写和拼写变化。大模型通常采用子词分词,在字符和完整单词之间寻找平衡。BPE、WordPiece、Unigram和SentencePiece都是常见方法。
通常,模型不能直接对文字或图片进行矩阵运算,需要先把内容转换为数字向量。这个过程称为叫嵌入或向量表示(Embedding)。对于文本,分词器(Tokenizer)先把文字转换为Token ID,Embedding层再根据ID找到对应向量。向量中的单个数通常没有直观含义,但整个向量可以表示该Token在模型内部的特征。以Token为“会议”为例,对应的Token ID可以是某个整数编号,例如“15872”,而该Token对应的表征即Embedding,可以是:[0.12, -0.37, 0.08, ……],这样一组向量。Embedding会在训练过程中不断调整,出现在相似上下文中的Token,其向量往往会形成某些相近特征。由于模型结构和训练的过程不同,同一个词经过多层Transformer处理后,还会根据上下文形成不同表示。
登录 参与讨论
在模型获取输入文本的语义信息时,不仅要知道Token是什么,还要知道它位于什么位置。仅有Token Embedding时,例如“会议延期”和“延期会议”包含相似Token,但由于语序差异,却表达不同结含义。因此,模型还需要加入位置编码或位置表示。下图以BERT的输入层为例。

如上图BERT中所采用的表征方式所示,展示了Token Embedding、句段Embedding和位置Embedding的组合方式。当然,不同模型结构和设计方式,采用的具体方案并不完全相同。以多模态大模型为例,图片、音频等内容也要先转换为向量。图片通常先被切成图像块,由视觉编码器提取特征;音频会先转换为声学特征,再由音频编码器处理。不同模态的特征经过投影或连接模块(Projection)后,才能进入大模型能够处理的向量空间。如下图所示,通过连接模块讲图像信息与语义信息进行融合。

Attention负责判断当前位置应该重点参考输入中的哪些内容。它会在模型已经形成的向量表示上计算关联程度,而不只是查找相同词语。例如,在“项目延期了,报告解释了它为什么没有按期完成”这句话中,模型处理代词“它”时,需要结合上下文判断它更可能指向“项目”,还是“报告”。在会议记录中提取负责人时,模型也需要把任务描述、人员姓名和表示分工的句子联系起来。
每个输入向量会经过不同变换,形成Query、Key和Value,通常简写为Q、K和V。Attention的计算公式可以简化写成:
$\mathrm{Attention}(Q, K, V)=\mathrm{softmax}\left(\frac{QK^{\mathrm{T}}}{\sqrt{d_k}}\right)V$
其中,Q表示当前位置正在寻找什么信息,K表示每个位置可以用什么特征被匹配,V表示匹配后需要取回的内容。模型先比较Q和K,得到当前位置与其他位置之间的相关分数;再通过softmax把分数转换为权重,按照权重对V进行加权汇总。公式中的$d_k$是Key向量的维度,除以$\sqrt{d_k}$用于调整分数尺度,使计算更加稳定。
如果Q、K、V来自同一段序列,就称为自注意力(Self-Attention),用于建立序列内部的联系;如果Q来自一段序列,而K、V来自另一段序列,就称为交叉注意力(Cross-Attention)。例如,编码器—解码器翻译模型可以让解码器通过交叉注意力读取编码器提供的原文信息。
对于生成式大模型,当前位置只能参考已经出现的内容,因此Attention中还需要加入因果掩码,屏蔽后续位置。即使屏蔽了未来Token,完整因果注意力处理的关联数量仍会随序列长度近似按平方增长。同时,生成阶段还要保存历史Token的K和V,形成后文介绍的KV Cache。随着上下文变长,Attention的计算和缓存开销会越来越突出,下面介绍的不同结构正是围绕这些问题逐步发展起来的。
多头注意力(Multi-Head Attention,MHA)由2017年的Transformer论文《Attention Is All You Need》提出,后来应用于BERT以及Llama 2 7B、13B等模型。它在单组注意力计算的基础上增加多个并行的注意力头,使模型能够从不同的表示空间提取上下文关系。
在MHA中,每个头都有各自生成Q、K、V的投影参数,分别计算注意力,再把各头的结果连接起来,通过线性层形成输出。如下图所示,左侧展示一组缩放点积注意力的计算过程,右侧把这一过程并行执行多次,再进行结果融合。不同头的关注模式由训练形成,可以共同支持指代判断、语义关联和远距离依赖等任务。

MHA提升了模型聚合不同类型信息的能力,也便于在训练中并行计算。不过,在逐Token生成时,各个头都要读取自己的历史K、V。模型层数、头数和上下文长度增加后,这部分缓存和数据读取会占用大量资源。因此,后续改进首先考虑能否保留多个Query头,同时减少需要保存的Key头和Value头。
多查询注意力(Multi-Query Attention,MQA)由Noam Shazeer在2019年的论文《Fast Transformer Decoding: One Write-Head is All You Need》中提出,后来应用于Falcon-7B等大模型。它主要针对解码阶段的内存带宽问题:模型生成每一个新Token时,都需要读取已有的KV Cache,读取量过大时,即使计算单元仍有余量,生成速度也会受到限制。
MQA保留多个Query头,但让它们共享一组Key和Value。这样,不同头仍然可以生成不同的查询,历史位置却只需要保存一份供各头共用的K、V。下图展示了将已有MHA模型转换为MQA时的一种初始化方法:把多个Key投影矩阵做平均,得到一个共享投影,Value投影也可以采用同样处理;转换后还要继续训练,使模型适应新的共享结构。

采用这一结构后,MQA可以明显减少KV Cache以及每步解码的数据读取量,为较长输入或较多并发请求腾出空间。例如,Falcon-7B配置了71个Query头,但只有1个KV头。相对于相同头维度、相同精度的71组KV结构,其理论KV缓存只需约七十一分之一。共享也会约束K、V的表示容量,因此需要通过训练和评测确认这种效率收益对任务质量的影响。
分组查询注意力(Grouped-Query Attention,GQA)由Google Research团队在2023年的GQA论文中系统提出,并应用于Llama 2 70B、Mistral 7B等大模型。它希望在MHA的多组表示能力和MQA的低缓存开销之间取得平衡,避免所有Query头都只能使用同一组K、V。
GQA把Query头划分为若干组,每组共享一组Key和Value,不同组保留不同的K、V表示。如下图所示,MHA为每个Query头配置对应的K、V,MQA让所有Query头共享一组K、V,GQA则在组内共享。当组数等于Query头数时,GQA等价于MHA;当只有一组时,就等价于MQA。

以Mistral 7B v0.1为例,它有32个Query头和8个KV头,每4个Query头共享一组K、V。在头维度和精度相同的情况下,这部分缓存约为MHA的四分之一。对实际部署而言,减少缓存和读取量通常有利于提高并发能力与解码效率;由于不同组仍保留各自的K、V,GQA也比完全共享的MQA保留了更多表示空间。这里减少的是KV头数,模型仍然可以对允许访问的全部历史位置计算注意力。
滑动窗口注意力(Sliding Window Attention,SWA)来自长序列建模中的局部注意力思路,Mistral 7B v0.1将它与GQA结合使用。GQA减少了每个位置需要保存的KV头数,SWA则进一步限制每个位置直接关注的历史范围,以降低长文本的计算和缓存压力。
SWA为每个Token设置固定大小的窗口,只对窗口内的近期位置计算注意力。下图左侧是完整因果注意力,中间是滑动窗口注意力,右侧说明信息如何通过多层网络向后传递。虽然单层只读取局部范围,但上一层的Token表示已经包含更早的上下文信息,因此模型经过多层处理后,可以间接利用窗口以外的内容。

Mistral 7B v0.1采用4096个Token的窗口,并使用滚动缓存覆盖已经移出窗口的旧K、V,使各层缓存可以维持在固定范围。论文在16K序列、4096窗口的测试中报告,经过相应内核优化后,速度约为完整注意力基线的2倍。这种结构能够控制长文本的资源增长,但远处的原始细节需要经过中间表示传递,因此局部窗口大小并不能直接等同于模型能够准确检索的上下文长度。
多头潜在注意力(Multi-head Latent Attention,MLA)由DeepSeek团队在DeepSeek-V2中提出,随后继续用于DeepSeek-V3。它同样针对KV Cache过大的问题,但进一步改变了缓存的保存形式:通过学习一个紧凑的联合表示,减少每个Token需要保存的数据,同时支持多个注意力头使用这些信息。
具体来说,MLA先用低秩投影把K和V联合表示为较低维度的潜在向量,推理时主要缓存这一向量,以及单独承载旋转位置信息的Key分量。多个Query头可以利用这个共享表示完成匹配和信息聚合,部分投影矩阵还可以在推理时合并,减少显式展开完整K、V的操作。下图中的斜线区域表示需要缓存的内容,可以看到MLA将多头K、V的缓存转移到了右侧较小的潜在表示中。

这种设计让DeepSeek-V2、V3能够在保留多头表达能力的同时,降低长上下文生成中的缓存压力。DeepSeek-V2报告中,MLA每Token的KV缓存规模相当于只有2.25组KV头的GQA。它压缩的是每个位置的表示维度,历史位置本身仍然保留,因此在完整注意力模式下,模型依然需要读取并匹配全部历史条目。进一步减少每次实际参与计算的条目,就需要引入稀疏注意力。
DeepSeek稀疏注意力(DeepSeek Sparse Attention,DSA)由DeepSeek团队提出,应用于DeepSeek-V3.2-Exp和DeepSeek-V3.2。它在MLA基础上增加动态选择机制,解决长上下文中即使单个KV条目已经较小,读取和计算全部历史条目仍然昂贵的问题。
DSA先通过轻量索引器Lightning Indexer计算当前Query与历史Token的相关分数,再取分数最高的Top-k个位置,交给主Attention进行计算。下图中的绿色部分是新增的索引过程,Top-k Selector负责选择位置,上方的核心Attention则读取所选位置对应的MLA缓存。索引器使用较小的表示和较少的头完成筛选,其计算成本低于直接执行完整的主Attention。

DeepSeek-V3.2报告中的配置是每个Query最多选择2048个KV条目。随着上下文增长,核心Attention仍可以集中处理这一有限范围,因而明显降低长输入处理和后续生成的成本。未被本次选中的历史条目仍可供后续Query检索,所以稀疏选择主要减少的是本次读取和计算量,而不是按相同比例删除全部缓存。索引器本身仍需处理历史候选,实际开销也会受到上下文长度影响。
MiniMax稀疏注意力(MiniMax Sparse Attention,MSA)由MiniMax团队提出,应用于MiniMax-M3。它面向百万Token上下文中的效率问题,特别考虑了如何让稀疏注意力适合GPU批量计算,而不仅是在理论上减少参与计算的Token。
MSA建立在GQA基础上,包含索引分支和主分支。索引分支先计算Token级相关分数,再取每个块内的最高分数作为块分数,为不同GQA组分别选择Top-k个历史块。主分支随后读取选中块中满足因果条件的Token级K、V,同时保留当前所在的局部块。如下图所示,右侧两个Query组可以形成不同的选择范围,同组内的Query头则共享选择结果。

按块组织访问可以提高GPU处理数据的规则性,而分组选择使不同组能够保留不同的检索模式。在109B参数实验模型的1M上下文测试中,论文报告MSA的每Token注意力计算量约为GQA的1/28.4;配合专用内核,在H800上处理输入的Prefill阶段和逐Token生成的Decode阶段分别获得约14.2倍和7.6倍的速度提升。这说明稀疏算法与计算内核需要共同设计,减少计算量才能更充分地转化为实际速度收益。
Qwen稀疏注意力(Qwen Sparse Attention,QSA)由Qwen团队提出,并应用于Qwen3.8-Flash-Next。该模型采用三层Gated DeltaNet搭配一层QSA的混合结构:前者通过状态更新高效处理序列,后者保留对历史Token的直接检索。QSA重点处理的问题是,长上下文中的索引器自身也会产生较大开销。
为此,QSA先将连续多个Token的索引Key通过平均池化压缩成微块表示,在较短的微块序列上计算相关分数并选择Top-k块。选中后,再把块展开为原始Token位置,让核心Attention读取对应的K、V;尚未组成完整块的尾部Token也会保留。下图左侧是压缩索引过程,右侧是根据选择结果进行的微块稀疏Attention,两部分之间传递的是位置索引。

这样既减少了主Attention访问的位置,也缩短了索引器需要扫描的序列。Qwen3.8-Flash-Next报告在1M上下文的内核测试中,QSA相对稠密注意力的Prefill和Decode速度分别提升约7.6倍和4.9倍。理解这一结构时,需要区分索引表示与主Attention缓存:QSA压缩前者来降低筛选成本,选中后仍读取Token级KV,因此可以保留所选区域的细粒度信息。
Kimi Delta Attention(KDA)由Moonshot AI团队在Kimi Linear中提出,实际应用于Kimi Linear的48B总参数、3B激活参数模型。它采用线性注意力思路,把历史信息持续写入固定大小的状态,减少每一步生成时反复读取长历史序列的开销。
KDA在Gated DeltaNet的基础上引入更细粒度的门控。新Token到来时,模型先控制旧状态中不同通道的信息保留程度,再通过Delta规则修正已有的键值关联。这种更新可以理解为利用新输入与当前状态所预测内容之间的差异,调整状态中保存的信息。由于衰减门按通道变化,不同部分可以采用不同的保留速率。计算时还可以按块并行处理一段Token,以提高GPU效率。

上图展示了Kimi Linear将三层KDA与一层MLA交错使用的方式。KDA层用固定大小的状态降低长序列成本,MLA层则补充对具体历史位置的直接检索,缓解固定状态容量有限的问题。在论文采用相同训练方案的比较中,这一混合模型相对完整MLA基线最多减少75%的KV Cache,并在1M上下文下获得最高约6倍的解码吞吐量。这些效果对应Kimi Linear的混合架构,而不是所有Kimi型号的统一配置。
压缩稀疏注意力(Compressed Sparse Attention,CSA)由DeepSeek团队在DeepSeek-V4中提出,应用于DeepSeek-V4-Pro和DeepSeek-V4-Flash。前面的MLA主要压缩每个Token的KV表示,CSA进一步沿序列方向减少条目数量,将多个Token的信息汇聚到较少的KV条目中,再进行稀疏选择。
CSA先用可学习的Token级压缩器处理连续Token,并结合相邻块的重叠信息,形成压缩KV。接着,Lightning Indexer为这些压缩条目打分,选择Top-k条目参与主Attention。下图中,压缩器位于索引和选择之前,主Attention直接读取压缩后的KV;左侧还有一条滑动窗口分支,把近期未压缩的Token一起送入计算,保留局部细节。

DeepSeek-V4报告中的CSA压缩率为4,即历史KV条目数量约降至四分之一,再从中选择部分条目进行核心Attention计算。因此,CSA既降低长期缓存量,也减少每次读取和计算的历史内容。QSA压缩索引后会回到原始Token,而CSA直接在压缩条目上完成信息聚合,因而对历史KV本身也进行了压缩。这种设计需要压缩器保留有用特征,并由局部窗口补充近期细节。
高度压缩注意力(Heavily Compressed Attention,HCA)同样由DeepSeek团队在DeepSeek-V4中提出,并与CSA在DeepSeek-V4-Pro和Flash的多层结构中交错使用。它采用更强的序列压缩,让模型以较少的缓存保留覆盖大范围历史的信息,与CSA的选择性读取形成补充。
HCA的压缩率在报告中设为128,远高于CSA的4。多个Token通过可学习的加权汇聚形成一个压缩条目后,当前Query会对全部因果可见的压缩历史执行Attention,不再进行Top-k筛选。如下图所示,HCA保留压缩分支和局部滑动窗口分支,但省去了CSA中的索引器和选择器。窗口提供近期Token的细节,压缩历史提供更大范围的上下文信息。

CSA与HCA交错配置,使DeepSeek-V4能够同时利用不同粒度的历史表示。报告中,在1M上下文下,DeepSeek-V4-Pro的单Token推理FLOPs和KV Cache分别约为DeepSeek-V3.2的27%和10%。这是混合Attention及低精度计算、存储共同作用的整体效果。对使用者而言,这类结构的意义在于使超长上下文更容易在有限硬件上运行;具体模型能否准确提取长材料中的细节,仍取决于压缩方式、训练过程和实际任务。
从这些模型的设计可以看出,Attention的改进并不只有一种方向。MHA、MQA和GQA主要改变头之间的共享关系,MLA压缩每个位置的KV表示,DSA、MSA和QSA减少核心Attention访问的位置,KDA通过状态更新处理历史,而CSA、HCA进一步压缩历史条目。模型可以将其中多种方法组合使用,因此分析资源需求时,需要结合每种结构的层数和缓存形式。无论采用哪种结构,Attention都只负责聚合上下文信息,模型的整体能力仍由它与Embedding、前馈网络及训练过程共同形成。
模型结构决定信息怎样计算,训练过程则决定模型最终学到什么。大模型的训练通常可以分为几个阶段。首先,预训练阶段,模型会在海量文本、代码等数据上学习语言规律、知识结构和基本的推理模式,获得通用能力;随后,进入指令微调(Supervised Fine-Tuning,SFT)阶段,通过大量“指令—回答”样本,让模型学会理解用户要求,并按照指定任务形式进行回答;在此基础上,还会进一步进行偏好优化或强化学习,根据人工反馈或规则对模型行为进行调整,使回答在有用性、准确性、表达风格、安全性以及行为边界等方面更加符合预期。
预训练是模型形成基础能力的阶段。模型会在大规模文本、代码或多模态数据上反复训练。对于Decoder-only语言模型(比如GPT系列),常见训练任务是根据前面的内容预测下一个Token,预测错误时再调整模型参数。海量样本不断重复后,模型逐渐学习语言结构、表达方式和不同概念之间的统计关系,并形成完成问答、摘要、翻译和代码生成等任务所需的基础表示与生成能力。
模型在预训练中学到的知识分布在大量参数中,并不是一套可以逐条查询的数据库。它可以组合已经学到的规律,生成训练数据中没有原样出现过的内容,也可能把相关但不完全匹配的信息组合在一起,形成看似合理的错误答案。当然,训练数据也不是越多越好。重复内容、低质量网页、错误知识、隐私数据和有害内容都会影响模型。预训练前通常需要进行格式解析、去重、质量筛选、安全过滤和数据配比。数据规模决定模型能够接触多少内容,数据质量则直接影响模型能够从中学到什么。
完成预训练后,模型已经能够续写文本,但不一定会稳定地按照用户要求完成任务。例如,用户要求列出三个行动项,基础模型可能继续扩写问题,也可能忽略指定格式。指令微调会使用指令和期望答案组成的示例继续训练模型,以下是一个指令微调的例子:
指令:把下面的会议记录整理成行动项。
输入:会议记录正文。
输出:包含任务、负责人和截止时间的表格。
经过问答、摘要、信息抽取、代码、工具调用和安全拒答等不同类型的示例训练,模型会逐渐学会识别用户意图并遵守输出要求。指令微调主要教模型怎样使用已有能力。它可以补充部分知识,但不适合解决所有知识更新问题。需要频繁更新或者必须提供来源的内容,更适合通过知识库、检索或外部工具在运行时提供。
后训练是模型完成预训练后进行的一系列训练和对齐工作的总称。指令微调通常属于后训练的一部分,进一步地指令微调(SFT)、偏好优化和强化学习也可能出现在这个阶段。因此,指令微调和后训练不是两个互相独立的步骤,前者是一类具体方法,后者是包含多种方法的阶段。几种训练方式可以先按下面的关系理解如下:
阶段或方法 | 主要使用的数据 | 主要解决的问题 |
预训练 | 大规模文本、代码和多模态数据 | 让模型学习语言和知识等基础规律 |
指令微调/SFT | 指令与期望回答 | 让模型学会按照任务要求输出 |
偏好优化 | 同一问题下的较好回答和较差回答 | 让模型更倾向符合偏好的回答 |
强化学习 | 提示、模型回答和奖励信号 | 根据奖励继续调整生成策略 |
参考InstructGPT中采用的基于人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)框架,目前已经行程了一条经典后训练路线。RLHF通常第一步使用人工示范数据完成SFT,第二步使用回答排序数据训练奖励模型,第三步根据奖励模型给出的分数,使用PPO优化语言模型的生成策略。具体过程如下图所示。

其中,奖励模型给出的分数代表一种偏好,不等于客观真理。如果偏好数据覆盖不足,或者奖励规则设计不合理,模型可能只是学会迎合评分方式。
实际模型不一定采用完全相同的路线。有的模型使用SFT加DPO,有的使用SFT、奖励模型和PPO,还有的会加入AI反馈、安全对齐、工具使用训练和多轮对话数据。前面的预训练、指令微调和后训练解释了模型能力怎样形成。模型训练完成以后,使用者更常遇到的问题是一次能输入多少内容、运行时需要多少显存,以及有限硬件应该选择什么精度。
模型完成训练后,就进入实际推理和部署阶段。上下文长度决定一次请求能够放入多少Token;上下文越长,模型能够读取的材料越多,但Attention计算和KV Cache占用也会增加,进而影响推理速度和显存需求。这里所谓的上下文,即一次请求中的系统提示、对话历史、当前输入、文件内容、工具说明、工具返回结果和模型已经生成的内容,可以使用如下公式来表达:上下文占用= 系统指令 + 对话历史 + 当前输入+ 附件内容 + 工具信息 + 模型输出。
正如上文所提及的,大模型的上下文占用并不只是用户当前输入的内容,而是由多部分共同构成,包括系统指令、此前的对话历史、用户当前输入、附件中的相关内容、工具调用所需的信息以及模型已经生成的输出等。这些内容都会占用模型的上下文窗口,因此随着对话变长、附件增多或工具信息变复杂,可用于后续输入和生成的上下文空间也会逐渐减少。比如,模型标注支持上下文长度为:128K,通常表示一次请求能够处理的Token总量级。具体是否包含输出、单次最大输出是多少,还要看模型和服务接口的限制。通常,超出上下文后,平台可能拒绝请求、截断部分内容,或者自动压缩历史记录。
为了提升模型在长文档场景下的推理效率和回答质量,在输入材料前应尽量对内容进行整理,删除与任务无关、重复或价值较低的信息,并明确告诉模型需要重点关注的章节、字段或问题范围,避免模型在大量无关上下文中分散注意力。对于篇幅特别长、一次难以完整处理的材料,可以先按照章节、主题或固定长度进行分段,让模型分别完成信息提取、摘要或分析,再对各部分结果进行统一汇总和综合判断。对于关键结论、重要数据或需要进一步核验的内容,还应要求模型同时标明对应的原文位置、章节或页码,便于后续人工检查和结果追溯,从而提高整体处理过程的准确性、可解释性和可靠性。
基于Transformer架构的生成式模型,通常会逐个生成Token,在生成的构成中,如果每生成一个Token都重新计算此前全部Token的注意力信息,会产生大量重复工作,因此不妨引入一套缓存机制,即KV Cache。KV Cache会保存各层已经计算过的Key和Value,生成下一个Token时只需要计算新增部分,从而提高生成速度。每增加一个Token,各个Transformer层都要保存对应的K和V。因此,KV Cache会随着上下文长度、输出长度、并发数量和模型层数增加。
对于常见Decoder-only模型,可以用下面的简化公式理解单条序列的缓存占用,可以用以下公式表示:
\text{KV Cache占用}
\approx
2 \times \text{层数}
\times \text{Token数}
\times \text{KV头数}
\times \text{每个头的维度}
\times \text{每个数的字节数}
模型权重加载完成后占用相对固定,KV Cache却会随请求变化,因此,同一个量化模型在短问答中可以顺利运行,换成长文档或者多人并发后仍可能显存不足。例如,同一台服务器只处理一份短会议记录时可能运行正常,如果同时让十名用户上传长记录后,模型需要为多条序列分别保存KV Cache,显存压力会明显增加。这也解释了,即使模型文件能够放进显存,随着输入的文本长度和并发规模的增大,算力资源的消耗也在发生变化。因此,在实际部署时,可以通过缩短无关上下文、限制最大生成长度、降低并发量、使用分页缓存,或者选择采用GQA、MQA结构的模型降低KV Cache压力,提升算力服务的效率。
模型文件实际是保存当前模型结构即即相关参数,这些参数本质上是一组数值。结合计算机组成原理中的相关只是,这些参数通常在计算机中是一堆0和1的表达,而采用不同位数规模来表达同一数值,即规定的数值范围也规约了数值的精度,在模型训练时,通常用采用FP32、FP16或BF16等浮点格式进行运算,实际表示采用32位或16位0和1来表示一个数,位数越多,虽然表示的数值范围和数字精度都有所增加,但实际的资源消耗也非常大,因而,为进一步减少资源消耗,提出了量化方法,所谓量化,就是把这部分原本多位的浮点数值转换为8位的INT8、4位大的呃INT4等更低精度表示,从而减少模型文件和运行时的资源占用。下表展示了浮点数精度对应的相关特点:
精度 | 每个参数的理论字节数 | 典型特点 |
FP32 | 4 | 精度较高,资源占用较大 |
FP16/BF16 | 2 | 常见训练和高精度推理格式 |
INT8 | 1 | 权重理论占用约为16位的一半 |
INT4 | 0.5 | 权重理论占用约为16位的四分之一 |
实际量化不是把所有小数简单取整,而是把一组浮点数映射到有限范围,并保存缩放系数、零点或分组信息。常见做法包括只压缩模型权重、同时量化权重和激活,以及在模型训练完成后进行训练后量化,我们过于不用担心因为量化导致的数值变化,因为最终模型在生成时,是预测每个候选Token作为下一个词的概率,在选择时,更多地时关系排序以及经过归一化后的得分,因此量化的精度虽有损失,但是在严格的控制下,可以有效地兼顾模型本身的生成效果。
在进行模型选型时,经常需要判断显存是否够用。模型名称中的7B、14B和70B通常表示大约70亿、140亿和700亿个参数。参数是模型训练中学到的数值,分布在Attention、前馈网络和Embedding等模块中。
参数量不能直接等同于模型文件大小,还要结合每个参数采用的精度。只计算模型权重时,可以使用下面的公式:
权重占用 ≈ 参数量 × 每个参数的字节数
参数规模 | FP16/BF16 | INT8 | INT4 |
7B | 约14GB | 约7GB | 约3.5GB |
14B | 约28GB | 约14GB | 约7GB |
32B | 约64GB | 约32GB | 约16GB |
70B | 约140GB | 约70GB | 约35GB |
表中的数字只表示模型权重的理论下限。量化模型还要保存缩放系数等信息,实际推理还需要KV Cache、中间计算结果、推理框架工作区和并发请求缓存。
例如,14B模型的INT4权重理论上约7GB,但在8GB显卡上几乎没有空间留给KV Cache和运行缓冲。短上下文、单请求时可能运行,处理长文档时则容易显存不足。使用12GB或16GB显存更加宽松。70B INT4权重约35GB,一般需要48GB以上的显存,在部署时,可以选择更大现存的算力卡、多卡或者使用CPU内存进行混合推理。
通用大模型需要覆盖大量知识和任务,在医疗、金融、法律和代码等专业场景中,不一定熟悉行业术语、业务流程和风险边界。领域模型通常是在通用底座模型上,使用专业数据和任务进行继续训练或适配,使模型更加适合某个领域。它不一定从零训练,也不只是通过Prompt把模型设定成专业人士。常见训练和适配方式包括:
这里需要区分领域模型和领域应用。领域模型经过专业数据训练,专业能力已经写入模型参数;领域应用则可以直接使用通用模型,再连接专业知识库、规则和工具。实际系统也经常把两种方式组合起来。
下图中的法律问答系统先提取关键词,再从法规向量库中检索参考条文,最后由法律大模型结合依据生成回答。这说明专业能力不一定只依靠模型参数,外部资料也是领域应用的重要组成部分。

专业数据并不等于专业可靠。医疗模型仍要检查医学证据和安全边界,法律模型要检查法条和引用,金融模型要检查数据时效和计算结果,代码模型则要通过运行和测试验证。医疗、法律和金融等高风险任务还应保留专业人员审批。
使用模型整理会议记录时,如果原文没有指定负责人,模型却自行补出一个姓名;使用模型抽取合同时,如果原文没有金额,模型却生成了一个具体数字,这些都属于模型幻觉。模型幻觉是指大模型生成了语言流畅、结构完整,却与事实、输入材料或可验证来源不一致的内容。它还可能表现为编造不存在的政策、论文或网址,写错人物和时间,或者把没有形成的讨论写成已经确定的结论。
大模型的核心任务是根据上下文预测下一个Token,在生成的过程中,模型无法验证每句话是否真实。导致模型幻觉的原因有很多,比如,预训练数据可能存在错误或过时信息;用户问题可能缺少关键条件;长文本中的证据也可能被忽略或截断。后训练如果设计的奖励函数,更加偏向于鼓励完整、流畅的回答,也可能使模型在缺少依据时仍然继续生成。
模型产生的幻觉也多种多样,通常可以分为事实幻觉、应用幻觉、推理幻觉等,详细分类和典型表现如下表所示:
类型 | 典型表现 |
事实幻觉 | 人名、日期、数字和事件与真实情况不符 |
引用幻觉 | 编造论文、法条、链接或出处 |
输入幻觉 | 生成原始材料中没有出现的结论和字段 |
推理幻觉 | 中间推导存在错误,但回答表达得很确定 |
工具幻觉 | 声称已经读取文件或调用接口,实际上没有成功 |
除了通用模型外,训练获取的领域模型同样也会产生幻觉。通常,专业数据能够改善领域表现,但不能保证每个答案都准确。知识库检索也不能完全解决所有幻觉问题,如果检索到的材料不相关、已经过期或者本身存在错误,模型仍可能得到错误结论,进一步导致幻觉。
大模型产生幻觉是当前应用过程中比较常见的问题,仅仅在提示词中添加一句“不要编造”或者“请保证回答准确”,通常无法从根本上消除这类风险。模型本质上仍然是在根据上下文预测最可能出现的内容,当输入信息不足、材料存在冲突,或者问题本身超出模型可靠知识范围时,仍然可能生成看起来合理但实际上并不准确的答案。因此,降低幻觉风险更依赖一整套输入约束、外部验证和人工复核机制。
首先,应尽量为模型提供清楚、相关且相互一致的材料,减少无关信息和冲突信息对判断过程的干扰。对于事实、数字、政策条款、实验结果等关键内容,可以要求模型同时标明对应的来源、章节、页码或原文位置,使回答具备可追溯性,方便后续核验。对于新闻、政策、价格、法规、产品参数等更新频繁的知识,则不应只依赖模型内部记忆,而应通过搜索引擎、知识库、数据库、API 或其他外部工具获取最新信息,再让模型基于这些可靠材料进行分析。
其次,当原始材料中确实缺少某项信息时,应明确要求模型使用“待确认”、“原文未提供”、“无法根据现有材料判断”等方式进行标记,而不是根据经验自行补全。对于日期、金额、身份证号、统计数据、公式、代码执行结果等适合结构化检查的内容,还可以引入程序进行自动校验,例如检查数值范围、字段格式、计算结果以及代码是否能够实际运行,从而避免模型仅凭语言生成结果。
此外,对于重要结论,特别是会影响业务决策、项目验收或用户权益的内容,还应保留人工复核环节。语言表达流畅、逻辑看起来完整,并不代表事实一定正确,因此不能把“说得像真的”直接等同于“确实是真的”。在医疗、法律、金融、安全生产等高风险场景中,更应明确模型只是辅助工具,最终结论需要由具备相应资质和经验的专业人员审核和确认。
因此,降低幻觉的核心思路并不是要求模型“永远回答”,而是让模型学会在缺少可靠依据时合理停止。当现有信息不足以支持结论时,最合适的行为可能是明确说明“当前缺少哪些关键材料”“哪些结论暂时无法确认”,并进一步告诉用户需要补充哪些数据、文档或证据。相比继续生成一个貌似完整但缺乏依据的答案,这种做法通常更加可靠,也更适合实际业务应用。