
为什么选择晚期交互?
晚期交互检索模型正在改变我们查找和检索信息的方式。这些模型允许进行语义丰富的交互,从而实现对不同模态的非结构化数据(包括文本和图像)进行精确的检索过程。通过将查询和文档嵌入分解为较低级别的表示,晚期交互模型使用多向量检索,并提高了与无交互和完全交互密集检索模型相比的准确性和可扩展性。
晚期交互模型可用于各种检索任务,帮助研究人员和从业者在大型文档集合中找到相关文档,例如财务文档或法律合同。这些模型在需要高效检索过程的下游任务中特别有用,例如搜索引擎或生成式 AI 应用程序,例如 检索增强生成 (RAG) 管道,其中语义精度可以改善信息提取和理解。
密集检索模型中的 3 种交互类型
密集检索模型可以根据其“交互”类型进行分类。密集检索模型是一种使用某种类型的神经网络架构来检索与搜索查询相关的文档的模型。在这种情况下,“交互”是指通过比较它们的表示来评估文档与给定搜索查询的匹配程度的过程。本节讨论密集检索模型中不同类型的交互。
无交互检索模型
传统的检索方法通常使用“无交互”检索模型。在这种情况下,搜索查询和文档是分别处理的
- 在索引阶段,为每个文档预先计算一个 密集向量嵌入。文档首先被分割成单独的标记,所有标记一起通过神经网络模型(通常是 Transformer 模型)以获得每个标记的单独密集嵌入。最后,通过池化计算标记嵌入到单个向量表示中。
- 在在线查询阶段,计算一个向量用于搜索查询,以搜索与预先计算的文档嵌入相似的文档,并使用相似度度量(例如点积、余弦相似度)。
无交互检索模型的优点主要在于它们速度快且计算效率高。文档的向量表示已经预先计算并离线索引,并且在查询时,只需要计算查询嵌入。这使得该解决方案可扩展到大规模信息检索系统和向量搜索应用程序。
无交互检索模型的缺点在于缺乏搜索查询和文档之间的交互。由于搜索查询和文档是分别处理并压缩成单个向量嵌入,因此这种方法可能会遗漏上下文细微差别。从一个标记到另一个标记共享的任何上下文细微差别必须在比较发生之前进行压缩 - 这意味着相似度是在整个文档和整个查询之间进行比较,而不是在标记级别上进行比较。
这些特性使无交互模型非常适合第一阶段检索,其中候选文档从大型文档集合中检索出来,例如向量搜索。无交互检索模型的示例是双编码器,例如 OpenAI 的 text-embedding-3-small。

完全交互检索模型
完全交互检索模型一起处理搜索查询和文档。这就是为什么它们有时也被称为早期交互或全到全交互检索模型的原因。与无交互模型相反,全到全交互模型在查询时处理所有内容。为此,查询与每个文档连接起来,然后它们一起处理进行完全交叉注意力。
完全交互检索模型的优点在于它们上下文丰富,这意味着它们有效地捕获搜索查询和文档之间的细微上下文关系。
完全交互模型的缺点在于它们计算成本极高,因为所有文档都必须在查询时进行处理。这就是为什么完全交互模型不能扩展到大量文档的原因。
这些特性使完全交互模型非常适合第二阶段检索,例如对策划的候选文档集进行重新排序。完全交互检索模型的示例是 BERT 和其他具有交叉编码器架构的模型,这些模型通常在重新排序模型中很受欢迎。

晚期交互检索模型
虽然无交互模型速度快但可能不准确,而全交互模型准确但速度慢,但晚期交互检索模型承诺两者兼备。晚期交互模型受到上述两种检索模型的启发。
与无交互模型类似,晚期交互模型具有双编码器架构,并在离线预先计算每个文档的嵌入(在交互阶段之前)。但是,在晚期交互中,存储的嵌入是针对每个标记的,而不是整个文档的单个嵌入。而是用晚期交互机制代替池化机制。这意味着将计算查询和文档多向量表示之间的交互,类似于全交互检索模型,但处于后期阶段。
晚期交互检索模型的优点在于它们可扩展且上下文丰富。
晚期交互的缺点与它们的存储需求有关 - 它们需要每个标记的嵌入,这需要为完整的向量集存储更多的存储空间。
但是,可以将标记嵌入存储在较低的维度和量化级别,以降低计算成本并提高存储效率 - 从而减轻这些问题。例如,在 ColBERTv2 中,执行积极的量化以将每个向量的大小从 256 字节减少到 36 字节(2 位压缩)甚至 20 字节(1 位压缩),同时保持良好的准确度(请参阅后面的 ColBERTv2 部分)。
晚期交互检索模型的示例是 ColBERT、ColPali 和 ColQwen,这些模型将在以下部分中讨论。

晚期交互机制如何工作?
晚期交互机制计算查询标记和文档标记之间的最大相似度得分。它需要输入文档或图像的较低级别表示,例如它们的标记(单词部分)或图像补丁(小的图像/文档部分),并使用这些进行比较,而不是全局文档表示。晚期交互最初是在 ColBERT 论文中介绍的。

假设我们有文本查询和文本文档,为了便于解释,我们保持简单。与其将向量嵌入池化到查询和文档的单个向量表示中,不如保留标记级别的嵌入并应用 MaxSim 运算符来计算相关性得分
- 对于每个查询标记,我们计算其相似度得分(例如点积或余弦相似度)与每个文档标记。
- 然后,对于每个查询标记,我们仅保留最大的相似度得分(例如最大的点积或最大的余弦相似度)。
- 最后,我们将所有这些标记级别的最大相似度得分相加,得到最终的相关性得分。
什么是 ColBERT?
ColBERT 论文于 2020 年发布,介绍了原始的 ColBERT 模型和晚期交互机制。ColBERT 代表“基于 BERT 的上下文晚期交互”。它是一个在 BERT 语言模型上进行微调的模型,BERT 是 NLP 中第一个大型 Transformer 模型之一。但是,ColBERT 使用晚期交互机制而不是 BERT 通常使用的全到全交互,并且专门用于生成查询和文档的上下文嵌入。由于 BERT 是一个仅文本模型(不是多模态),因此 ColBERT 也是一个仅文本模型。
有趣的事实:它的发音为 /koʊlˈbɛər,以史蒂芬·科尔伯特命名,以纪念他的深夜节目。
ColBERT 模型架构
由于 ColBERT 是 BERT 的微调,因此其架构几乎与 BERT 相同。BERT-base 经过 1.1 亿参数的训练(BERT-large 为 3.4 亿),ColBERT 的不同变体是在不同的训练数据集上从 BERT-base 和 BERT-large 进行训练的。您在 Hugging Face 上找到的 ColBERT 版本经过 BERT-base 的微调,并且具有大约 1.1 亿个参数。
但是,ColBERT 和 BERT 之间存在一些差异。首先,BERT-base 使用固定的嵌入维度 768(BERT-large 为 1024),而 ColBERT 使用较小的表示维度 128 来表示每个向量,以努力减少每个向量的存储需求。这通过 ColBERT 中的特殊投影层来实现,以使最终输出成为 128 维向量。
ColBERT 中使用的相同的微调 BERT 模型作为查询编码器和文档编码器分别使用,但另外两个特殊标记,[Q]和[D]分别附加到查询和文档,以“标记”它们。此标记包含在模型训练中,以便模型学习通过这些特殊标记来区分查询和文档。
ColBERT 的完整前向传递按顺序给出
- 标记查询/文档(并包含特殊标记[Q]或[D])
- 通过 1.1 亿微调 BERT-base Transformer 模型
- 使用特殊投影层将最终 BERT 表示投影到 128 而不是 768 以减少嵌入维度
- 使用延迟交互和 MaxSim 对查询和文档中的所有 token 进行比较。

ColBERT v2 及其改进
虽然 ColBERT 引入了延迟交互的概念,但 ColBERTv2 对其进行了完善。ColBERT 的主要缺点是存储需求——需要为每个文档中的每个 token 存储一个完整的向量。ColBERTv2 改进了原始 ColBERT 巨大的内存存储需求弱点,同时也提高了检索质量。
ColBERTv2 质量的提高来自于一个名为去噪监督的过程,它涉及从更大的教师模型进行知识提炼(传递知识)和硬负样本挖掘(向给定查询展示相似但错误的检索结果)。
提炼来自教师模型,MiniLM。这个跨编码器模型使用全到全的交互,就像 BERT 一样,这意味着它具有很高的准确性,但在实践中效率较低。提炼意味着可以使用这个模型来教导 ColBERTv2,同时 ColBERTv2 仍然保留了其由于延迟交互而提高的计算效率。
硬负样本挖掘涉及使用与查询相似但不相关的文档来构建检索框架,从而模型能够区分正确的文档和与该正确文档相似的文档。这减少了 ColBERTv2 将检索到的假阴性数量。
ColBERTv2 改进的存储效率来自于残差压缩。残差压缩是一种存储技术,它以高精度(更准确的向量,存储成本高)存储“质心”,以低精度(不太准确的向量,存储成本低)存储“残差”向量。每个 token embedding 是一个质心及其自身唯一残差向量的组合。这些向量质心占用更多的空间,但数量较少;根据 ColBERTv2 论文,他们建议使用
许多向量,这是一个与数据集中总 embedding 数量成比例的值。
使用这种残差压缩技术大大减少了空间占用——MS MARCO 训练数据集在 ColBERTv1 上有一个 154GB 的索引,而在 COLBERTv2 上,该技术使其能够存储为低至 1 位压缩的 16GB,或 2 位压缩的 25GB。与 ColBERTv1 相比,ColBERTv2 的空间占用减少了 6-10 倍,并将该值降低到典型单向量模型将需要的水平。
ColBERT 的优点和局限性
ColBERT 的一个优点是它对检索性能的影响。由于其可扩展性和上下文丰富性,与典型的密集向量 embedding 模型相比,它可以提高检索准确性,从而提高 RAG 应用程序和排序管道的整体性能。
ColBERT 在相似度评分中保留 token-level embedding 的另一个积极副作用是增加了可解释性的特性。类似于关键字匹配,你可以获得更易于解释的向量搜索结果,因为你可以看到哪些 token 在搜索查询和相关文档之间具有高相似度分数。

然而,原始 ColBERT 模型的多向量方法有一个主要的缺点是空间占用增加。因为使用 ColBERT,你现在为文档中的每个 token 都有一个向量 embedding,而不是为单个文档的一个向量 embedding,存储需求和内存使用量会激增,但可以通过 ColBERTv2 引入的量化方法在一定程度上缓解。
让我们比较一下密集向量 embedding 和多向量 embedding 的存储需求。假设每个文档由 100 个 token 组成,并且我们正在存储一个可变数量的文档。下表给出了存储所有文档作为各自 embedding 的存储成本,以兆字节为单位。
| 单向量 Embedding | 多向量 Embedding (ColBERTv2 量化) | ||||||
|---|---|---|---|---|---|---|---|
| d=768 | d=1024 | d=1536 | d=64 | d=96 | d=128 | ||
| 文档数量 (n) (每个文档 100 个 token) | n=100 | 0.15 MB | 0.20 MB | 0.31 MB | 0.36 MB | 0.55 MB | 0.73 MB |
| n=500 | 0.77 MB | 1.02 MB | 1.54 MB | 1.26 MB | 1.89 MB | 2.52 MB | |
| n=1000 | 1.54 MB | 2.05 MB | 3.07 MB | 2.25 MB | 3.37 MB | 4.50 MB | |
| n=2000 | 3.07 MB | 4.10 MB | 6.14 MB | 4.12 MB | 6.17 MB | 8.23 MB | |
| n=10000 | 15.36 MB | 20.48 MB | 30.72 MB | 18.05 MB | 27.07 MB | 36.10 MB | |
即使进行大量量化,使用 ColBERTv2 存储 128 维向量的成本也明显高于存储整个文档/块的高维单向量。随着文档大小和 token 数量的增加,存储成本也会激增,这对于某些场景来说可能是不可持续的。但是,增加的上下文丰富性和检索性能可能值得额外的存储空间。

ColBERT 的用例
由于其对文本细微差别的改进相关性,ColBERT 非常适合需要更高准确性的检索任务,例如基于法律文本的 RAG 管道或金融文档验证。
你可以在我们的文档中找到 ColBERT 的 Python 代码示例。
ColPali 和 ColQwen 是什么?
ColPali 和 ColQwen 是多模态延迟交互检索模型,它们使用视觉语言模型 (VLM) 而不是仅文本模型。ColPali 代表 PaliGemma 上的上下文延迟交互,而 ColQwen 代表 Qwen2 上的上下文延迟交互(这就是它也被称为 ColQwen2 的原因)。
与传统的 PDF 检索方法不同,后者需要光学字符识别 (OCR) 和高级分块来分离不同的内容格式(例如,文本内容和视觉内容,如图形或图像)来进行复杂的文档处理,ColPali 和 ColQwen 将整个 PDF 视为图像,因此这些模型将 ColBERT 的概念扩展到视觉内容。

ColPali 和 ColQwen 通过类似的流程处理复杂文档
- 文档图像转换:整个文档被视为图像,而不是分离文本内容和视觉内容,例如文本、表格和图形
- 补丁生成:文档图像被划分为一系列具有预定义尺寸的均匀图像补丁
- 视觉编码:每个图像补丁由视觉编码器模型处理,将视觉信息转换为初始图像 embedding
- 上下文关联:补丁嵌入被传递到 VLM(对于 ColPali 来说是 PaliGemma,对于 ColQwen 来说是 Qwen2),VLM 在文档的整体结构中对其进行上下文关联。
- 向量空间投影:上下文关联的补丁嵌入被映射到文本向量空间,创建在相同搜索空间中的表示,并保持对周围补丁的感知。
- 查询处理:用户查询由语言模型组件嵌入,以在与文档补丁相同的向量空间中创建 token 级别的嵌入。
- 后期交互匹配:使用 MaxSim 算子将查询 token 与文档补丁进行匹配。
这种多模态后期交互方法保留了补丁之间的上下文关系,类似于 ColBERT 中的 token 在整个句子中具有上下文的方式。因此,在检查特定的查询词时,模型可以识别和突出显示文档中最相关的视觉组件和图像补丁。
ColPali 模型架构
ColPali 的创建方式与 ColBERT 类似。就像 BERT 对 ColBERT 一样,PaliGemma 对 ColPali 也是如此。本质上,ColPali 没有像 ColBERT 那样使用 BERT 作为查询和文档编码器,而是使用 PaliGemma 视觉 LLM,该模型分为两部分用于查询和文档。由于查询始终是纯文本,它使用 Gemma(PaliGemma 的仅语言部分)作为查询编码器,并使用 PaliGemma(完整的视觉模型)作为视觉编码器。就像 ColBERT 一样,ColPali 存储预先计算的文档向量,并在运行时使用后期交互来与在线嵌入的查询进行比较。ColPali 具有
- ~3B 参数
- 128 嵌入维度大小
- 最大 1024 补丁大小

ColQwen 模型架构
ColQwen 与 ColPali 非常相似,只是使用了不同的视觉语言模型,即 Qwen2 视觉 LLM 作为编码器。ColQwen 使用 Qwen2 LM 作为查询编码器,并使用 Qwen2-VL 作为视觉编码器。虽然架构与 ColPali 相似,但由于使用了完全不同的编码器模型,细节有所不同。
- ~2B 参数
- 128 嵌入维度
- 最大 768 补丁大小
此外,ColQwen 的视觉语言骨干模型采用宽松的 apache2.0 许可协议授权。

ColPali 和 ColQwen 的优势和局限性
ColPali 和 ColQwen 等多模态后期交互检索模型的优势在于,它们允许在无需复杂预处理或分块策略的情况下进行 RAG 应用,处理 PDF 文档。PDF 文档中的文本和图像都可以简单地被视为“截图”,ColPali 和 ColQwen 中的视觉模型可以查看和处理这些截图。这意味着文档中的图形可以与文档的文本一起按上下文放置,并且这些文档的处理方式与人类阅读它们的方式类似。
虽然 ColPali 和 ColQwen 简化了 PDF 文档处理通常复杂的流程,但它们也需要更多的资源来存储所有单个图像补丁嵌入,即使使用压缩机制,这与 ColBERT 类似。
ColPali 和 ColQwen 的用例
由于其多模态能力,ColPali 和 ColQwen 非常适合处理包含不同组件(如文本、图像、图表、表格和公式)的复杂文档(如 PDF)的检索管道。
您可以在 我们的 GitHub 上的 recipes 仓库 中找到使用 ColPali 的 PDF 文档多模态 RAG 代码示例。
总结
本文讨论了后期交互机制及其检索模型,例如 ColBERT、ColPali 和 ColQwen。与不交互模型和完全交互模型相比,后者要么有效要么可扩展,后期交互模型是快速有效的检索模型。这就是为什么它们非常适合需要有效高效检索过程的应用。
ColPali 和 ColQwen 添加的多模态性使我们能够通过将复杂文档(如 PDF 文件)转换为图像来构建 RAG 管道。虽然后期交互检索模型需要更多的内存来存储多向量嵌入,但它们也提供了对文本和图像文件的更丰富的上下文理解。这就是为什么多模态后期交互检索模型在处理复杂文档(如 PDF 文件)的多模态 rag 管道中特别有用。
如果您想开始使用讨论的后期交互模型,您可以在此处找到代码示例
- ColBERT 的 RAG 代码示例在 我们的文档 中。
- 使用 ColPali 的 PDF 文档多模态 RAG 代码示例在 我们的 GitHub 上的 recipes 仓库 中。
常见问题解答
ColBERT 和密集向量方法有什么区别?
ColBERT 和密集向量方法之间的区别在于,这些传统的密集方法将 token 级别的嵌入池化到一个单一的表示中,而 ColBERT 嵌入保持 token 级别的表示在多向量嵌入中。保持传统密集嵌入模型的 token 级别表示效率低下,因为它们并非为此目的而训练的,而像 ColBERT 这样的多向量嵌入模型则不然。保留 token 级别表示的好处是,它可以更详细地了解查询和搜索结果之间的语义相似性。此外,由于嵌入保持在 token 级别,因此不会丢失上下文。
BERT 和 ColBERT 有什么区别?
BERT 和 ColBERT 之间的区别在于,ColBERT 离线计算文档嵌入,使其在运行时比 BERT 更快。BERT 需要一起嵌入查询和文档才能进行比较,而 ColBERT 具有预先计算并存储的文档嵌入。
顺便说一下,ColBERT 使用 BERT 的微调版本作为查询和文档的编码器。
ColBERT 和 ColBERTv2 有什么区别?
ColBERT 和 ColBERTv2 之间的区别在于,新模型具有改进的存储效率和更高的检索效果。任何多向量模型都因需要存储每个文档的多个向量而导致存储成本高,并且随着文档中 token 数量的增加而高度缩放。ColBERTv2 通过大力量化 token 向量嵌入并存储更高精度的一组“附近”质心向量来缓解存储问题。将质心与量化的向量结合使用,可以在最大程度地降低每个向量的存储成本的同时,很好地逼近真实的 token 嵌入。
此外,ColBERTv2 通过从更大的、更不切实际的模型的知识中进行提炼(MiniLM),以及训练模型学习区分相似但错误的文档和给定查询的正确文档,从而在 ColBERT 上获得了强大的检索性能。
ColBERT 与 ColPali 和 ColQwen 有什么区别?
ColBERT 与 ColPali 和 ColQwen 之间的区别在于这些检索模型能够处理的模态。由于 ColBERT 使用 BERT,因此它只能处理文本。相反,ColPali 和 ColQwen 使用 VLM 并且因此是多模态的,可以处理文本和图像。所有模型的搜索查询都是文本输入,但模型处理的文档类型不同。ColBERT 处理文本格式的文档,而 ColPali 和 ColQwen 处理图像,包括作为图像处理的 PDF 文档。
ColPali 和 ColQwen 有什么区别?
ColPali 和 ColQwen 的主要区别在于,ColQwen 使用 Qwen 视觉 LM,而 ColPali 使用 PaliGemma VLM(以及 Gemma LM 用于嵌入)。此外,Qwen2 VLM 的参数数量比 PaliGemma VLM 少 10 亿个,这使得 ColQwen 成为一个更小的模型。ColQwen 还具有较小的图像补丁大小,这可以降低存储和计算成本。
资源
- ColBERT 论文:https://arxiv.org/abs/2004.12832
- ColBERT v2 论文:https://arxiv.org/abs/2112.01488
- ColPali 论文:https://arxiv.org/abs/2407.01449
- PaliGemma 论文:https://arxiv.org/pdf/2407.07726
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。