SOTA Sync
全部文章
记忆与上下文2026-08-31

一个文档不该只有一个向量:多向量检索的训练与微调

多向量模型保留逐 Token 表征并以 MaxSim 做晚期交互,在领域微调后显著提高长文档检索质量,而索引成本可以通过量化与 Token 池化控制。

主流稠密检索会把一整段文档压缩成一个向量,再用一次点积衡量查询与文档的相似度。方法简单、索引紧凑,却要求一个固定长度向量同时记住主题、实体、细节和局部关系。文档越长、问题越具体,压缩损失越明显。

多向量模型采用另一条路线:为每个 Token 保留一个较小向量,查询与文档在检索阶段才进行“晚期交互”。Hugging Face 的教程不仅解释了怎样用 Sentence Transformers 训练这类模型,还给出了一次完整的医疗领域实验:单张 RTX 3090、14.5 小时、100 万组问答—段落数据,最终超过作者测试的 50 多个通用检索配置。

#MaxSim:让每个查询词找到自己的证据

ColBERT 风格模型先分别编码查询和文档。计算相关性时,每个查询 Token 都在文档 Token 中寻找相似度最高的一项,再把这些最大值相加,这就是 MaxSim。

它保留了“哪个查询词对应文档里的哪个局部证据”。若用户问某种药物在特定剂量下的副作用,模型不必把药名、剂量和症状先平均到同一个文档向量中。代价也很直接:一个文档需要存储多组向量,索引更大,打分也比单点积复杂。

模型结构通常由四部分组成:Transformer 产生上下文化 Token 表征;线性层将维度投影到较小空间;掩码模块决定哪些 Token 参与打分;最后逐 Token 归一化。可以从现有多向量检查点微调,也可以在强大的稠密嵌入 Backbone 上增加随机初始化投影层重新训练。

#领域数据比更大的通用模型更有效

作者使用 MIRIAD 医疗数据集,每个问题与包含答案的来源段落成对,段落平均 941 Tokens。起点比较只用 2.5 万组训练对:一个从强稠密 Backbone 增加新投影层的模型,已经逼近已有多向量检查点,说明领域监督能迅速重塑表示空间。

完整实验使用 100 万组训练对、Batch 内负样本和完整文档长度。单张 RTX 3090 峰值显存 17.5GB,训练 14.5 小时。预算有限时,10 万组数据约 75 分钟,距离完整训练结果仅差 0.012 NDCG@10;大部分收益在第一小时出现。

这给实践一个重要排序:先验证少量领域样本是否改变检索质量,再决定是否扩大数据与训练。直接换更大的通用嵌入模型,未必比一轮针对性微调有效。

#长度截断可能比模型架构更致命

很多公开模型沿用 MS MARCO 风格短段落设置,只读取 180、300、256 或 512 Tokens。面对平均 941 Tokens 的医疗段落,它们会静默丢弃后半部分。作者测得,截断造成的损失最高达到 0.24 NDCG@10,远大于多种模型架构之间的差距。

训练时把长度限制在 512 Tokens 可以获得约两倍速度,但会损失约 0.015 NDCG@10,而且增加训练数据也无法补回,因为模型从未看到被裁掉的内容。领域检索上线前,文档长度分布、训练截断与服务截断必须一起检查。

#评估集不能简单到所有模型都满分

若只让 1000 个问题在对应的 1 万个来源段落中检索,几乎所有模型都能超过 0.97 NDCG@10,指标已经饱和,无法区分方案。作者从训练集加入去重干扰段落,把最终语料库扩大到 20 万段,才拉开真实差距。

微调模型在这组评估中超过最强零样本方案 0.062 NDCG@10,首位命中率从 75.8% 提高到 84.9%,首位错误减少超过三分之一。BM25 也表现强劲,提醒我们始终应该保留廉价词法基线;不过该数据的问题由原段落生成,词汇重叠偏高,不能把优势直接外推到其他领域。

#大索引不是无法解决的宿命

多向量最常见的反对意见是索引体积。原文测试了两种互补方法:Token 池化减少每个文档保留的向量数量,量化则减少每个向量的字节数。

将向量数减半只损失 0.0033 NDCG@10,首位准确率不变;只保留四分之一向量时,索引约 11.2GB,得分仍为 0.8991。更有效的是先量化:一个配置把原始嵌入缩小 13 倍,只损失 0.0155 NDCG@10。量化与池化叠加后,索引可降到 1.45GB,甚至小于某些大型稠密模型的 fp16 索引,同时保持更高质量。

因此,正确的比较不是“多向量索引天然巨大”,而是给定质量目标后,稠密、多向量、量化和池化分别需要多少存储与延迟。

#对 RAG 的直接启示

多向量检索不是所有系统的默认答案。短文本、粗粒度主题匹配和极低延迟场景,单向量仍然更合适。但当知识库包含长文档、专业术语和细粒度问答时,应优先检查三件事:文档是否被压缩得过度、是否在未知位置被截断、评估语料是否足够困难。

生成模型看到什么,取决于检索层先保留了什么。若重要证据在嵌入阶段已经消失,再强的 Agent 也只能在错误上下文里推理。