生成式大语言模型和向量模型都要执行前向计算、反向传播和参数更新,差别主要在训练样本与损失函数。前者根据连续文本预测下一个 token;后者根据查询、正例和负例学习相关性排序。
下文的生成式大语言模型指采用因果语言模型目标的 decoder-only 模型;向量模型指输出单个稠密向量、主要使用对比或排序目标训练的文本 Embedding 模型。BERT 类掩码语言模型、多向量检索和稀疏向量模型不在本次比较范围内。隐藏状态的计算见 Transformer。
预训练的一步究竟发生了什么
模型从随机参数或已有底座开始,一次参数更新按以下链路进行:
- 从数据集中取出一个批次;
- 模型执行前向计算,产生词表分布或文本向量;
- 损失函数比较预测与训练目标;
- 反向传播计算每个可训练参数对误差的影响;
- 优化器沿着降低误差的方向更新参数。
设模型参数为 ,一个批次的损失为 ,最简单的梯度下降可以写成:
是学习率。实际训练通常使用 AdamW,并配合学习率调度、梯度裁剪和混合精度,但更新链路不变。单个批次的梯度几乎没有可解释性;参数经过大量训练 token 和批次的累积更新,才会保留那些能稳定降低损失的模式。
大语言模型把原始文本改造成逐位置预测题
网页文本经过清洗、去重和 Tokenizer 处理后,会被截断、拼接或填充成训练序列。假设其中一段是:
北京 是 中国 的 首都训练时,同一序列错开一位形成输入与标签:
输入:北京 是 中国 的
标签:是 中国 的 首都因果掩码禁止位置 读取右侧内容,模型不能提前看到答案。如果批次大小是 、序列长度是 、隐藏维度是 、词表大小是 ,input_ids 和标签的形状为 [B,T],隐藏状态为 [B,T,H],词表映射层输出的 logits 为 [B,T,V]。
每个有效位置都在回答“下一个 token 是什么”。交叉熵损失可以写成:
是参与训练的位置集合, 是其中的 token 数;填充位置和不应跨越的文档边界不计入损失。预测“首都”时概率太低,梯度会穿过词表映射层、每一层 Transformer 和嵌入表,使类似上下文中的正确续写获得更高概率。
文本右移即可产生监督信号,因此训练数据可以扩展到网页、书籍和代码。损失只约束下一个 token 的概率,不直接校验事实、因果或意图;语言规律、知识和部分推理模式进入参数,是因为它们有助于减少预测错误。模型也因此可能流畅地写错事实。指令与偏好训练是在已有表示和生成能力上继续调整。
向量模型把文本关系改造成排序题
编码器先生成各位置的隐藏状态,再经池化、可选的投影和归一化得到定长向量。对一个批次,input_ids 的形状为 [B,T],隐藏状态为 [B,T,H],池化后为 [B,H],投影后的文本向量为 [B,E]。 由架构配置决定,例如 1024。
训练目标不是某组固定浮点数,而是文本之间的关系:
Query:保险买错了怎样退保?
Positive:犹豫期内退保的办理方法
Hard Negative:退保后还能重新投保吗?查询和候选文档分别编码,得到 、 和 。两侧可以共享同一套参数,也可以使用不共享参数的双塔;有些模型共享底座,只用不同的任务指令或前缀区分两侧。训练程序计算余弦相似度或点积,并要求:
一个批次若包含 组查询和正例,查询矩阵 与文档矩阵 计算 ,会得到 [B,B] 的相似度矩阵。对角线是配对正例,其余文档可以充当批内负例。常见的单向 InfoNCE 损失为:
向量经过 L2 归一化时,点积等价于余弦相似度;没有归一化时,向量范数也会影响点积分数。正例得分偏低,或者某个负例排在正例前面,损失都会增大。梯度穿过池化和归一化运算,更新投影层及未冻结的编码器参数;只有参数化池化本身也有权重时,它才会被更新。模型不必复原某个“正确向量”,只需形成有利于相关性排序的空间。
批内负样本减少了额外编码成本,也可能制造假负例:两个样本在数据表中属于不同记录,语义上却都是正确答案。多正例和重复文档需要在损失中屏蔽,或改用支持多正例的目标。困难负样本提供更细的边界,例如“缓存击穿”和“缓存穿透”词面接近,解决的问题却不同。负样本太简单,模型只学会区分无关主题;负样本标错,训练会把本该靠近的内容推开。
问答检索、商品召回、代码搜索和同义句匹配定义的“相关”并不相同。正例怎样标注,向量空间就会优先保存怎样的关系。
相同的更新机制,不同的误差来源
两类模型都通过 Transformer 计算隐藏状态,经自动微分得到梯度,再由 AdamW 等优化器更新参数。两者都没有人工编写某个向量维度的含义。能力方向主要由样本构造、进入损失的输出,以及哪些错误会受到惩罚决定。
| 比较项 | 生成式 LLM | 向量模型 |
|---|---|---|
| 训练样本 | 连续文本产生的前缀—后继关系 | 查询—正例—负例,或其他相关文本对 |
| 进入损失的输出 | 每个有效位置的词表分布 | 池化后向量之间的相似度 |
| 主要数据风险 | 重复、污染、低质量文本、领域比例失衡 | 假负例、负例过于简单、相关性定义漂移 |
| 直接产物 | 可以继续生成的词表概率 | 可以比较距离的定长向量 |
生成损失要求模型保留足够的信息来预测后文,却没有约束两句同义话的最终表示在几何空间中接近。对比损失直接检查向量之间的距离,却不要求模型根据这个向量逐词生成答案。直接拿生成式 LLM 的任意隐藏状态做检索,通常不如经过相关性训练的向量模型稳定。
为什么向量模型通常不从随机参数开始
向量模型通常继承语言模型底座。语言模型可以从每个有效 token 获得监督,检索数据的监督则集中在查询与候选之间的关系上;从随机参数训练,对数据规模和负样本质量的要求更高。
常见配方先继承语言模型底座,再使用大规模对比数据训练,最后用高质量领域数据微调。通用对比训练建立可迁移的相似度,领域数据再收紧业务中的“相关”边界。这是一种常见路线,不是所有模型都必须经历的固定三阶段。
这里的“向量模型预训练”通常指业务微调前的通用对比训练,并不表示参数从随机值开始。底座可以来自 BERT 类掩码语言模型,也可以来自生成式语言模型;池化方式、注意力可见范围、训练指令和对比数据仍会改变最终的向量空间。
具体到保险推品,通用向量模型已经知道大量语言关系,领域训练才继续告诉它:疾病名称的展开可以保持接近,险种改变却可能影响召回结果。训练样本与 InfoNCE 的工程细节见 保险推品中的语义匹配:从产品池复用到领域微调。
训练损失下降,不等于模型可用
验收语言模型时,要看留出集损失、困惑度、下游任务和生成行为;困惑度受 Tokenizer 与词表影响,不适合跨不同分词方案直接比较。检索模型中,Recall@K 检查相关文档是否进入候选集,MRR 关注首个相关结果的位置,nDCG 适合多级相关性。聚类和语义相似度任务还需要各自的任务指标。
训练集与评测集最好按用户、时间、文档来源或近重复簇隔离。只做随机切分,可能让同源文本同时进入两边,把记忆包装成泛化。
向量落库以后,向量数据库 还会用近似最近邻索引、距离度量、量化和过滤影响召回结果,但它无法修正训练时定义错的相关性。