嵌入与表示学习
嵌入模型是一套带版本的评分接口。它把文本、文本承担的角色,以及可选的任务指令转换成定长向量。检索系统由此可以用一个查询向量与数百万个已保存的文档向量比较,而不必让语言模型逐一读取每个文本对。这套接口的有效承诺很有限:训练过程判定为相关的文本对,得分应高于不相关的文本对。距离近本身并不意味着两段文本同义、事实正确、获得同一位用户的授权,或适合所有任务。
上一章 第 44 章 把稠密检索视为候选生成的一条通道。本章将打开这条通道,考察它的内部。工程上的核心问题,不是去发现一套通用的意义几何,而是要定义一份排序契约,用并不完美的样本对学出这份契约,在建立索引后继续维持它,并判断模型或索引的变更何时已经破坏了它。
从评分契约开始
嵌入只有与生成它的转换过程放在一起才有意义。两组各含 768 个浮点数的数组,未必可以相互比较。它们可能来自不同的分词器、池化规则、任务提示、模型检查点或归一化约定。应把这些选择记录成数据:
EmbeddingSpec {
model_id, model_revision, tokenizer_revision
query_role, document_role, instruction_version
pooling, source_layer, max_tokens, truncation_policy
dimension, normalization, similarity, dtype, quantization
}
EmbeddingRecord {
tenant, document_id, chunk_id, source_version, content_hash
embedding_spec_hash, vector, acl_version, index_generation
}
这份规格是索引模式的一部分。查询必须使用兼容的查询侧规格,所有已保存向量也必须使用与之对应的文档侧规格。对于非对称检索模型,两种角色可能使用不同的前缀,也可能采用不同的编码器权重。遗漏必需的查询指令并不是无关紧要的格式变化,而是在要求模型应用另一套评分函数。
用 表示查询编码器, 表示文档编码器。两者可以共享权重,也可以不共享。对于查询文本 和文档文本 ,定义
其中, 是 维向量, 是二者的内积, 是排序所用的分数。如果契约要求做 归一化,则
向量上方的帽号表示单位长度向量, 表示欧氏范数。对于单位向量,余弦相似度、内积和平方欧氏距离会给出相同的排序,只是距离的方向与前两者相反。没有归一化时,向量长度会影响内积。因此,归一化必须与训练和索引保持一致,不能把它当作一种通用的后处理改进。例如,稠密段落检索(Dense Passage Retrieval,DPR)在训练和搜索时使用的就是未经归一化的内积 (Karpukhin et al. 2020)。
池化决定一个向量包含什么
Transformer 会为输入中的每个词元生成一个隐藏状态,而检索通常需要为每个查询或分块生成一个向量,因此必须用池化规则压缩这些词元状态。带掩码的平均池化可以写为
这里, 包含 个词元位置, 是位置 的隐藏状态, 用于排除填充词元,或契约规定不应参与池化的其他词元。特殊词元池化只选择某个 ;最大池化对各坐标取最大值;学习得到的注意力则分配随数据变化的权重。选用哪一层、是否包含特殊词元、填充掩码如何设置,以及池化后是否归一化,都会改变结果。
Sentence-BERT 说明了为什么需要专门的训练与池化接口。它的孪生编码器会生成可以直接比较的句向量,因此语义搜索不再需要对每个文本对都运行一次 BERT。平均池化是论文的默认选择,在其消融实验中表现良好,但这项实验并不能说明平均池化适合所有模型 (Reimers and Gurevych 2019)。基于解码器的嵌入模型可能使用最后一个词元、双向注意力或学习得到的池化器。这些是不同的设计,不是一条历史演进路线上的连续阶段。
未经适配的语言模型状态并不会天然构成检索度量。预训练目标监督的是词元预测,而不是经过池化的查询与文档分数应如何排序。早期上下文模型还表现出各向异性:随机抽取的词元表示,其平均余弦相似度往往为正,并没有均匀分布在原点周围 (Ethayarajh 2019)。这项结果针对特定 BERT、ELMo 和 GPT-2 检查点中的上下文词元实例。它是几何上的警示,但不能证明各向异性会导致所有池化失败,也不能说明各向同性的空间就一定擅长检索。后续分析发现,纠正各向异性本身也未必能恢复语义上的等距关系 (Fuster Baggetto and Fresno 2022)。最终仍要以目标查询和语料分布上的排序质量为准。
对比学习塑造排序
对比训练会把评分契约明确写进目标函数。假设一个批次由 个带标签的样本对 组成,其中 与查询 相关。令 ,。查询 常用的一种批内损失为
其中, 是契约规定的相似度函数, 是带标签的正样本,其他 是查询 的候选负样本, 是温度。整个批次的损失为 。softmax 比较的是正样本与训练时实际提供的那组负样本,并不会拿它与模型上线后可能遇到的每一篇文档比较。
InfoNCE 最初用于对比预测编码 (Oord et al. 2018)。在它特定的采样构造中,一个候选来自条件分布 ,其余候选是从边缘分布 独立抽取的。在这些条件下,期望目标给出一个互信息下界,其上限随 增长。若评分器不受限制,最优 logit 与 之间只差一个仅依赖查询的常数。如果负样本来自挖掘分布,也就是提议分布 ,这个比值会变为 ;依赖查询的困难负样本挖掘,甚至可能使标准的互信息解释失效。增加候选数量会提高下界的上限,但并不能保证下界更紧或检索器更好 (Poole et al. 2019)。
实践中,几何视角通常更有用。对于归一化向量,对比训练会鼓励带标签正样本对彼此对齐,并让整体表示在球面上分布得更均匀。Wang 和 Isola 在对称采样模型下证明了一个渐近关系,并发现这两个量可以诊断其评估的视觉和语言任务 (Wang and Isola 2020)。查询与文档检索可能是非对称的,因此这里只能把它当作一种诊断类比,而不是适用于所有双编码器的定理。SimCSE 在句子相似度任务上展示了这种机制:无监督设置用 dropout 为同一句话生成两个视图;有监督设置则把蕴含关系作为正样本,把矛盾关系作为困难负样本 (Gao et al. 2021)。
温度控制梯度如何分配给不同候选项。得分高的负样本会获得更多 softmax 权重,也会受到更强的训练压力。降低 会把相对权重集中到得分最高的负样本上,但同时也会放大被误标的负样本,并可能破坏有用的局部邻域。不存在与任务无关的最佳温度。应把温度与归一化、批次组成、重复项掩码和负样本挖掘器一起调节;分数尺度发生变化后,从另一个模型照搬的数值就不再具有稳定含义。
交互发生的位置决定成本边界
查询词元与文档词元从何时开始相互作用,决定哪些工作可以预先计算。
| 架构 | 文本对得分 | 可以建立什么索引 | 主要代价 |
|---|---|---|---|
| 双编码器 | 单向量内积或余弦相似度 | 每篇文档一个向量 | 失去词元级交叉注意力 |
| 后期交互 | 词元向量聚合 | 文档词元向量 | 索引更大,线上评分更多 |
| 交叉编码器 | 用同一个 Transformer 联合处理文本对 | 没有与查询无关的文档分数 | 每个候选文本对都要运行一次模型 |
双编码器通常用作第一阶段稠密检索器,因为语料侧表示与查询无关。交叉编码器会联合读取查询与文档,因此表达能力更强,但这种表达能力并不保证它在所有工作负载上都表现最好。生产系统通常用它重排一个有界的候选集合,此时逐对运行模型的次数仍在可承受范围内。
ColBERT 位于两者之间。它分别编码查询词元和文档词元,再通过 MaxSim 做后期交互:
这里, 和 分别是查询与文档的词元数, 是归一化后的词元向量。MaxSim 为每个查询词元保留最匹配的文档词元,再把这些匹配分数相加。文档向量仍可预先计算,但索引需要为每篇文档保存多个向量。ColBERTv2 在实验中通过残差压缩和去噪监督,把未压缩的后期交互索引缩小到原来的六分之一到十分之一;这里并不是与单向量索引相比 (Santhanam et al. 2022)。
训练数据定义何为相关
损失函数无法决定“相关”究竟表示什么,正样本对策略才会作出这个决定。一次搜索点击、一个问题与包含答案的段落、两条重复记录、一组翻译文本,以及两句意思相近的话,表达的是不同的关系。如果没有任务标签就把它们混在一起,相当于要求同一个向量空间满足彼此不兼容的排序。因此,每条训练记录都要包含查询与文档角色、任务、语言、来源和许可证、来源版本、标签来源与置信度、去重组、数据集划分,以及教师模型或挖掘器的版本。
批内负样本会复用上式中其他 篇文档。DPR 在开放域问答实验中高效使用了这种方法,并加入由 BM25 挖掘的候选项 (Karpukhin et al. 2020)。这种复用并非没有语义风险:同一批次中的两条记录可能共享相关文档,彼此重复,或分别包含同一个查询的不同有效答案。在损失函数把非对角位置当作负样本之前,必须先屏蔽已知正样本和重复组。更大的批次不仅增加候选数量,也会增加计算、通信和遇到错误负样本的机会。
当随机负样本已经太容易时,可以用冻结的检查点从语料中检索得分较高但尚未标注的文档。ANCE 会异步刷新这类索引,让挖掘器在训练过程中跟随模型更新 (Xiong et al. 2021)。这些候选项只是未经过判断,并不等于已知不相关。RocketQA 报告称,稀疏标签使许多排名靠前的检索段落成为错误负样本,因此用交叉编码器过滤候选项 (Qu et al. 2021)。教师模型仍然可能出错。系统需要保留已知正样本、近重复内容、包含答案的段落和多正样本标签;对于不确定且影响较大的样本,应交给人工判断,而不是直接把教师分数当作事实。
import numpy as np
rng = np.random.default_rng(0)
def unit(vector):
norm = np.linalg.norm(vector)
return vector / norm if norm else vector
def infonce(query, positive, negatives, temperature=0.08):
candidates = [positive, *negatives]
logits = np.array([query @ item for item in candidates]) / temperature
logits -= logits.max()
probabilities = np.exp(logits) / np.exp(logits).sum()
return -np.log(probabilities[0])
query = unit(rng.normal(size=32))
positive = unit(query + 0.4 * rng.normal(size=32))
for hardness in [0.0, 0.3, 0.6]:
negatives = [
unit(hardness * query + (1 - hardness) * rng.normal(size=32))
for _ in range(16)
]
print(hardness, round(infonce(query, positive, negatives), 3))
弱监督扩大正样本覆盖范围,但会引入更多标签噪声。E5 先过滤网络中自然出现的文本对,再进行对比预训练 (Wang et al. 2022)。后续工作则让语言模型生成多样化的任务和文本对,再用这些合成数据训练嵌入模型 (Wang et al. 2024)。合成生成可以覆盖少见意图和语言,但也会复制生成器的事实错误、写作风格和任务假设。数据集应保留生成提示、生成器版本、过滤规则和来源权利。还要先按来源和时间划分数据,再开始挖掘,以免近重复内容跨越训练集与评估集。
蒸馏是另一种标签来源。交叉编码器可以为数量受限的查询与文档对评分,双编码器则学习这些文本对之间的分数间隔,而不是照搬原始分数尺度。蒸馏会继承教师模型的偏差,而且只覆盖教师模型见到的候选集合。挖掘过程从未呈现过的区别,教师模型也无法教给学生模型。
一个模型可以提供多套契约
通用嵌入模型往往支持任务指令。INSTRUCTOR 在大量混合任务上训练同一个模型,编码每条输入时都会附上对任务和领域的描述 (Su et al. 2023)。这并不意味着它会把任意自然语言理解为策略。FollowIR 发现,许多受测检索器会把详细指令大多当作额外关键词;有针对性的微调则能改善约束遵循能力 (Weller et al. 2025)。应把确切的指令模板作为规格中带版本的一部分,并测试改写、否定、排除条件和相互冲突的约束。
向量维度也可以成为经过训练的接口。Matryoshka 表示学习会把损失分别施加到选定的向量前缀上。对于检索适配,可以写为
其中, 是完整嵌入, 是它的前 个坐标, 是训练过的前缀维度集合, 是前缀 的权重, 则使用独立归一化后的 维查询与文档前缀计算对比损失。只有训练过的维度才有性能承诺。截取已经归一化的完整向量,并不会得到一个仍然归一化的前缀;任意中间维度也不保证可用。
最初的 Matryoshka 研究在视觉和语言评估中学习由粗到细的表示,并在受测数据集上报告了良好的尺寸与检索取舍 (Kusupati et al. 2022)。它在系统层面的主要收益,是一次模型前向计算可以供给多个受支持维度的索引。多个训练损失并非没有成本;较短前缀的表现未必总是严格更差,也未必总能与独立训练的模型持平。应在部署工作负载上测量每一种对外提供的维度。
索引把兼容性约束落实到运行中
若保存了 个向量,每个向量维度为 ,每个坐标占 字节,则原始向量载荷为
这里的 不包括文档元数据、图索引或倒排索引开销、副本、质心,以及迁移期间的临时副本。降低维度、减少精度、乘积量化和后期交互压缩,会以不同方式改变存储、内存带宽、延迟和近邻召回率。只有端到端检索质量仍可接受时,更小的载荷才有价值。
更改任何 EmbeddingSpec 字段都会创建新的索引代次。即使维度相同,也不要比较一个模型的查询向量与另一个模型的文档向量。应在现有索引旁边构建替代索引,重新嵌入完整且经过授权的语料,并对代表性流量进行双读。先比较精确向量排序,再比较近似索引排序,避免把表示漂移与 ANN 损失混为一谈。应明确切换流量,并保留回滚窗口。删除标记、来源更新和 ACL 变更必须传递到每个仍在服务的索引代次和所有嵌入缓存。
嵌入是派生内容,不是匿名化内容。它们继承来源的租户、授权、保留期限、数据驻留和删除策略。向量索引不能成为绕过 第 44 章 中授权不变量的路径。缓存键应包含规格哈希、输入内容哈希、角色、指令版本,以及租户或其他隔离边界。供应商日志和批处理路径也要接受与其他模型调用相同的数据处理审查。
评估必须匹配用途
汇总式嵌入排行榜只能用于初步筛选,不能直接决定部署选型。MTEB 表明,在语义文本相似度上表现出色的模型,未必也能主导聚类、分类、重排和检索任务 (Muennighoff et al. 2023)。MMTEB 扩大了语言和任务覆盖范围,进一步说明单一英文平均分为何信息不足 (Enevoldsen and others 2025)。这些基准可以高效比较多种工作负载,但不能复现私有语料、权限结构、更新方式和它对相关性的确切定义。
评估检索嵌入模型时,应固定语料版本、分块方式、查询集、相关性判断、查询与文档角色、规格哈希和索引参数。随后分别评估以下边界:
- 表示: 精确搜索的 recall@k 和 nDCG@k、困难负样本错误率、按分数区间计算的校准情况,以及相对 BM25 和现有模型的表现。
- 近似: ANN 相对精确近邻的召回率、空结果率、延迟、内存,以及每种压缩或维度设置下的索引构建时间。
- 切片: 查询意图、文档来源、长度与截断、语言、书写系统、跨语言方向、语码转换、时效和权限群体。除了平均值,还要报告表现最差且影响显著的切片。
- 运行: 查询编码延迟、文档吞吐量、加速器与 CPU 成本、原始及总索引字节数、缓存命中率、索引代次年龄、迁移持续时间和回滚成功率。
- 端到端: 在生成器和重排器保持不变时,测量组装上下文后的证据召回率、回答质量、引用支持、不作答、延迟和成本。
应采用配对的逐查询比较和自助法置信区间,并纳入有多个有效段落的查询和不可回答查询。还要扰动任务指令,缩短或延长文档,加入近重复内容,修改事实,删除来源,撤销访问权限,并改变查询语言。如果一个模型在常规测试集上的平均分更高,却在删除流程、某种语言或高价值查询群体上失败,它就不是更好的生产嵌入模型。
一个通用嵌入模型能否服务所有任务仍无定论。共享训练可以迁移有用结构,并简化运行管理。指令条件化则可能让同一个检查点提供多套面向不同任务的几何关系。但对称相似度、非对称相关性、聚类和分类所要求的邻域并不相同。MTEB 的研究中,没有任何一种方法在所有任务上占优;后续更大、更多语言的模型虽然改变了前沿,却没有消除这种任务依赖 (Muennighoff et al. 2023; Enevoldsen and others 2025)。稳定的结论不是某种架构必胜,而是模型选择取决于实际测量的任务组合、语言、语料和成本边界。
向量契约的成本最终落在存储与服务层。维度会成倍放大原始索引载荷;池化方式和模型大小决定编码吞吐量;归一化和相似度函数限制搜索原语;后期交互会增加需要保存的向量数量。这些成本会通过 Matryoshka 损失、蒸馏、量化感知评估和交互架构选择,反向影响训练;也会继续影响 第 44 章 中的检索预算和索引迁移。
由此得到的边界很明确:嵌入模型在一份任务契约下产生带版本的评分结果。检索利用该分数选择证据,但授权、时效、融合和不作答仍由检索系统负责。下一章 第 46 章 从证据已经选定的位置继续,讨论指令、历史记录、工具结果和检索材料应如何共享一份有界的工作上下文。
延伸阅读
- Reimers & Gurevych, “Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks” (使用余弦相似度比较的孪生双编码器句子嵌入), 2019. arXiv:1908.10084SBERT 通过孪生网络和三元组网络对 BERT 进行微调,生成可用余弦相似度直接比较的句子嵌入,将成对相似度搜索时间从 65 小时缩短至 5 秒。
- Karpukhin et al., “Dense Passage Retrieval for Open-Domain Question Answering” (DPR:使用批内负样本的双编码器), 2020. arXiv:2004.04906DPR 分别训练查询与段落编码器,并在多个开放域问答数据集上展示了稠密检索的效果。
- Gao et al., “SimCSE: Simple Contrastive Learning of Sentence Embeddings” (用 dropout 作最小数据增强,并用自然语言推断句对进行监督), 2021. arXiv:2104.08821SimCSE 通过对比学习提升句子嵌入质量,无监督时以 dropout 噪声作为最小数据增强,有监督时利用自然语言推断的蕴含与矛盾句对。
- Kusupati et al., “Matryoshka Representation Learning” (以多种容量训练同一表示的若干选定前缀), 2022. arXiv:2205.13147Matryoshka 表示学习(MRL)训练单个嵌入向量,使其任意前缀维度均构成有效表示,从而在保持精度的同时实现分类与检索嵌入尺寸最多缩小 14 倍。
- Muennighoff et al., “MTEB: Massive Text Embedding Benchmark” (覆盖广泛任务的嵌入基准,没有一个模型在所有任务上占优), 2023. arXiv:2210.07316MTEB 提出一个涵盖 8 项嵌入任务、58 个数据集与 112 种语言的基准,发现没有单一文本嵌入方法能在所有任务上保持领先。
- Su et al., “One Embedder, Any Task: Instruction-Finetuned Text Embeddings” (Instructor:用任务指令调节同一个模型), 2023. arXiv:2212.09741INSTRUCTOR 是一个在推理时接受任务指令的文本嵌入模型,无需进一步微调即可生成任务感知与领域感知的嵌入向量,在 70 个多样化任务上达到最优性能。
- Wang & Isola, “Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere” (把对比损失分解为球面上的对齐性与均匀性), 2020. arXiv:2005.10242本文将对比表示学习的成功归因于单位超球面上的对齐性与均匀性两个关键属性,证明对比损失渐近地优化这两者,并表明直接优化这两个可量化指标可达到与对比学习相当甚至更好的下游任务性能。
- Xiong et al., “Approximate Nearest Neighbor Negative Contrastive Learning for Dense Text Retrieval” (ANCE:从异步刷新的近似最近邻索引中挖掘困难负样本), 2021. arXiv:2007.00808ANCE 通过异步更新的 ANN 索引从整个语料库全局选取困难负样本来训练稠密检索模型,性能接近 BERT 级联流水线,效率提升 100 倍。
- Santhanam et al., “ColBERTv2: Effective and Efficient Retrieval via Lightweight Late Interaction” (残差压缩和去噪蒸馏把后期交互索引缩小 6 至 10 倍), 2022. arXiv:2112.01488ColBERTv2 将残差压缩与去噪监督相结合,使晚期交互检索的存储占用降低 6-10 倍,同时在训练域内外均达到最优检索质量。
- Enevoldsen & others, “MMTEB: Massive Multilingual Text Embedding Benchmark” (覆盖 500 多项任务和 250 多种语言;公开模型中,5.6 亿参数编码器的表现优于更大的大语言模型), 2025. arXiv:2502.13595MMTEB 是一个社区驱动的文本嵌入基准,涵盖 250 余种语言的 500 余个质量受控评测任务,并通过优化子集将计算量降低 98% 同时保持模型排名一致性。
- Weller et al., “FollowIR: Evaluating and Teaching Information Retrieval Models to Follow Instructions” (检索器会把指令当作关键词而非约束,微调可以教会这种能力), 2025. arXiv:2403.15246FOLLOWIR 基于 TREC 标注员叙述构建基准与训练集,用于评估和训练信息检索模型遵循详细自然语言指令的能力。
评论
登录后评论