尽管针对整个文档的单一密集向量嵌入是现代检索的根本,但它们捕捉长文档或多方面文档完整语义信息的能力可能有限。单个向量可能平均化重要细节,或未能表示某些查询所需的特定方面。为此,为提高大规模检索的精度,我们转向多向量表示和ColBERT式架构。这些方法能够实现查询与文档之间更细致的匹配。在大型分布式系统中,精准度可显著提升生成回应的质量,因此这些方法特别有益。多向量表示提高粒度其基本设想是使用多个嵌入来描述单个文档,而非仅一个。这使得表示更详细,可适应文档的各个方面或部分。生成多向量的策略:细粒度分块: 这可能是最直接的方法。与为长文档生成单个嵌入不同,您为更小、连贯的块(例如,段落或固定大小的片段)创建嵌入。每个块都成为一个可检索单元,拥有自己的向量。这是标准分块的延伸,但侧重于将每个块的向量视为父文档的独立表示层面。父文档与子块: 一种常见策略涉及为父文档(或摘要)创建一个嵌入,并为其组成子块创建单独的嵌入。检索时,查询可能首先匹配父文档,然后考虑与有希望的父级关联的子块嵌入。或者,查询匹配子块,父文档上下文用于重新排序或合成。基于方面的嵌入: 对于涵盖多个不同主题或方面的文档,可以为每个主题或方面生成专用嵌入。例如,产品评论可能具有分别表示其价格、功能和可用性讨论的向量。这通常需要更精细的预处理或能够识别和隔离这些方面的模型。文档嵌入(HyDE)变体: 尽管HyDE通常为查询生成文档,但多向量变体可能涉及生成与文档相关的多个答案片段或问题,并将这些嵌入作为辅助表示。检索和扩展考量:使用多向量表示时,检索过程通常涉及两阶段方法:初始检索: 检索单个向量嵌入(例如,块嵌入)。聚合/重新排序: 结果随后根据其父文档或上下文进行聚合或重新排序。例如,如果来自同一文档的多个块排名靠前,则该文档的整体相关性得分可能得到提升。在分布式环境中扩展多向量方法带来一些挑战:向量数量增加: 需要管理、索引和搜索的向量数量可以显著增加(例如,如果文档被分成许多块,则增加一个数量级或更多)。这直接影响存储需求和向量索引的大小。索引策略: 分片策略必须考虑相关向量(例如,来自一个文档的所有块)如何分布。将它们共置或拥有从不同分片收集它们的有效机制对聚合步骤很重要。按父文档ID分片可能是有益的。查询复杂性: 查询可能需要被制定以有效定位这些子文档表示,或者系统可能需要将查询扇出以匹配多种表示类型。结果多样性: 在提供粒度的同时,如果多个靠前的块来自相同的少数文档,确保呈现给LLM的最终结果足够多样很重要。尽管存在这些挑战,多向量方法在捕捉大型文档中的特定细节方面提供显著改进,使其成为满足大规模复杂信息需求的一种有价值的工具。ColBERT式架构:细粒度后期交互ColBERT(基于BERT的上下文后期交互)及类似架构与标准密集检索不同,后者通常计算查询嵌入和文档嵌入之间的单个相似度得分(“早期交互”模型)。ColBERT采用“后期交互”机制,其中细粒度相似度计算发生在查询和文档的令牌级嵌入之间。ColBERT的核心原则:令牌级嵌入: 查询和文档都使用基于BERT的模型编码,为每个生成一系列令牌嵌入。对于包含$L$个令牌的查询$Q$,我们得到嵌入${q_1, q_2, \ldots, q_L}$。对于包含$N$个令牌的文档$D$,我们得到${d_1, d_2, \ldots, d_N}$。这些文档令牌嵌入是预先计算并存储的。后期交互(MaxSim): 查询$Q$与文档$D$之间的相关性得分是通过对每个查询令牌嵌入在所有文档令牌嵌入中找到的最大相似度得分求和计算得出的。公式如下: $$ \text{得分}(Q, D) = \sum_{i=1}^{L} \max_{j=1}^{N} (q_i \cdot d_j^T) $$ 这种MaxSim操作使ColBERT能够识别精确的上下文匹配,即使文档的整体内容宽泛。digraph ColBERT_LateInteraction { rankdir=LR; node [shape=record, style="rounded,filled", fontname="Arial"]; edge [fontname="Arial"]; subgraph cluster_query_processing { label="查询处理"; bgcolor="#e9ecef"; query [label="查询文本", fillcolor="#d0bfff"]; query_encoder [label="查询编码器", fillcolor="#bac8ff"]; query_token_embeds [label="{<t1>Q_嵌入_1 | <t2>Q_嵌入_2 | ... | <tL>Q_嵌入_L}", shape=record, fillcolor="#91a7ff"]; query -> query_encoder -> query_token_embeds; } subgraph cluster_doc_processing { label="文档处理(预计算与索引)"; bgcolor="#e9ecef"; doc_text [label="文档文本", fillcolor="#fcc2d7"]; doc_encoder [label="文档编码器", fillcolor="#faa2c1"]; doc_token_embeds [label="{<d1>D_嵌入_1 | <d2>D_嵌入_2 | ... | <dN>D_嵌入_N}", shape=record, fillcolor="#f783ac"]; doc_text -> doc_encoder -> doc_token_embeds; } maxsim_op [label="后期交互\n(MaxSim操作)\nΣ max(Q_emb_i ⋅ D_emb_j)", shape=hexagon, style=filled, fillcolor="#ffe066", width=3.5, height=1.5]; query_token_embeds:t1 -> maxsim_op [label=" 查询令牌嵌入", dir=none, color="#495057"]; query_token_embeds:tL -> maxsim_op [dir=none, color="#495057"]; doc_token_embeds:d1 -> maxsim_op [label=" 文档令牌嵌入", dir=none, color="#495057"]; doc_token_embeds:dN -> maxsim_op [dir=none, color="#495057"]; score [label="相关性得分", shape=ellipse, style=filled, fillcolor="#b2f2bb"]; maxsim_op -> score; }图表说明了ColBERT后期交互机制。查询和文档令牌嵌入独立生成,然后通过MaxSim操作进行交互以生成相关性得分。ColBERT的优势:高精度: 擅长查找包含与查询完全相同或高度相似措辞的文档。上下文敏感性: 基于BERT的编码器捕捉每个令牌的丰富上下文信息。减少词汇不匹配: 通过在令牌嵌入级别匹配,与稀疏方法相比,它能更好地处理同义词或相关术语,并提供比单向量密集方法更高的精度。在分布式系统中扩展ColBERT:大规模部署ColBERT需要细致的架构设计:文档嵌入的巨大存储需求: 在大型语料库中存储每个文档的令牌级嵌入,导致数据占用空间比单向量嵌入显著增大。例如,一个包含200个令牌的文档,每个令牌由128维嵌入表示(降维后,ColBERT中常见做法),将需要$200 \times 128 \times \text{sizeof(浮点型)}$字节,而典型的单个BERT嵌入需要$768 \times \text{sizeof(浮点型)}$字节。这需要高效的存储解决方案,并且通常涉及嵌入的量化。令牌嵌入的高效索引: 为了使MaxSim操作在查询时可行,文档令牌嵌入必须为快速近似最近邻(ANN)搜索建立索引。使用PLAID(ColBERT的剪枝格状索引)或专门的FAISS索引等技术。这些索引本身需要分片和分布式。分布式MaxSim计算: 查询令牌嵌入被广播到所有持有文档令牌嵌入索引部分的分片。每个分片对其本地文档令牌子集执行MaxSim计算。然后聚合部分得分(或来自每个分片的前k个文档候选项)。查询时的计算成本: 即使有ANN索引,MaxSim操作也涉及多次查找(每个查询令牌一次)和聚合,使其比单向量相似度搜索计算更密集。通常采用提前退出或剪枝等优化措施。重新排序阶段: ColBERT常被用作强大的第一阶段检索器或重排器。如果用作第一阶段,随后的、可能更简单的重排模型可能优化其输出。ColBERT式架构虽然复杂且资源密集,但通过实现查询和文档表示之间更丰富的交互,为许多任务提供了先进的检索质量。“ColBERT式”方面也适用于采用类似后期交互或令牌级匹配原则的新兴模型,这表明一种趋向更细粒度检索机制的趋势。多向量与ColBERT式架构的选择多向量方法与ColBERT式系统之间的选择取决于具体需求和限制:实现复杂性: 多向量方法,特别是基于简单分块的方法,在现有单向量RAG管道之上相对更容易实现。ColBERT需要更专业的设置,包括用于令牌嵌入的专用编码器和索引。计算资源: ColBERT通常在索引(预计算所有文档令牌嵌入)和查询(MaxSim操作)方面都需要更多计算资源。多向量方法增加了向量存储,但如果聚合简单,查询时计算可能更简单。检索粒度: ColBERT由于其令牌级交互提供了极细粒度的匹配能力。多向量方法在所选子文档单元(例如,块、方面)级别提供粒度。数据集特点: 对于精确短语匹配或高度特定细节非常重要的数据集,ColBERT通常表现出色。对于更广泛的主题段落足以满足需求的数据集,精心设计的多向量策略可能非常有效。分布式实现总结对于多向量和ColBERT式架构,有效的分布式部署必不可少,以便处理大型数据集和查询量:数据分片:多向量: 文档块或每个文档的多个向量可以分片。一种常见策略是按父文档ID分片,以方便从相关向量聚合得分或上下文。ColBERT: 文档令牌嵌入的数量分片到多个节点上。每个分片通常持有全局令牌嵌入索引的一部分。分布式查询处理:多向量: 查询被发送到分片。如果单个文档的向量位于不同分片上,则需要聚合服务。ColBERT: 查询令牌嵌入通常广播到所有分片。每个分片对其本地文档令牌嵌入计算MaxSim得分。中央聚合器从所有分片收集靠前的候选项或得分。负载均衡与复制: 负载均衡请求跨分片以及复制分片以实现容错和读取可扩展性等标准分布式系统实践是必要的。总之,多向量和ColBERT式架构通过摆脱单向量文档表示,提供了提升检索性能的强大机制。它们实现了更细致和精准的匹配,这对大规模运行的RAG系统而言非常重要。然而,这种增强的能力伴随着数据管理、索引和计算成本方面的复杂性增加,需要在分布式环境中进行细致的工程设计和资源分配。这些先进技术通常保留给检索质量要求最高且工程投入可被合理化的情况。它们通常构成更大检索管道的一部分,可能包括多个检索和重新排序阶段。