ColBERT (基于 BERT 的上下文后期交互) 是一种检索模型,旨在提高文档检索或问答等任务的准确性和效率之间的平衡。与将查询和文档编码为固定维度向量并计算单个相似度分数的标准双编码器方法不同,ColBERT 引入了一种“后期交互”机制。这允许模型比较查询和文档中的单个令牌级别嵌入,从而捕获更细粒度的语义关系。关键区别在于查询和文档之间的交互处理方式:双编码器在编码后计算一次相似度,而 ColBERT 将交互延迟到编码之后,从而实现更细致的比较,而不会产生过多的计算成本。
标准的双编码器(例如使用 BERT 的双编码器)独立处理查询和文档。例如,像“如何烤蛋糕”这样的查询和标题为“简单的甜点食谱”的文档都将被转换为单个向量。这些向量之间的相似度(例如,通过点积)决定了相关性。虽然效率很高(因为可以预先计算文档嵌入),但这种方法有丢失上下文的风险。如果文档侧重于“烤箱温度”或“糖霜技术”,但使用不同的措辞,则“烤”或“蛋糕”等特定术语可能无法很好地对齐。双编码器依赖于编码器将所有语义信息压缩到一个向量中,这可能会过度简化复杂的关系。ColBERT 通过为每个令牌生成多个嵌入来解决此问题。查询中的每个令牌(例如,“烤”、“蛋糕”)都与文档中的每个令牌进行比较,并且模型会聚合这些令牌对中的最大相似度。这使得 ColBERT 能够识别“烤”与“烤箱”对齐,“蛋糕”与“食谱”对齐,即使文档没有使用完全相同的查询术语。
ColBERT 通过利用预先计算的文档令牌嵌入来保持效率,这与双编码器类似,但会动态处理查询。例如,在检索期间,文档的令牌嵌入会提前存储,而查询的嵌入则会动态生成。与双编码器相比,后期交互步骤(计算每个令牌的相似度)增加了计算开销,但仍然比交叉编码器(联合处理查询-文档对)便宜得多。这使得 ColBERT 适合大规模应用程序,在这些应用程序中,双编码器可能会错过细微的匹配。例如,搜索“汽车维护”可以通过在令牌级别将“汽车”与“汽车”匹配,将“维护”与“保养”匹配来检索讨论“汽车保养”的文档,即使整体文档向量在双编码器设置中与查询向量不接近。通过平衡粒度和可扩展性,ColBERT 为需要更高准确性但又不牺牲预计算优势的开发人员提供了一个折衷方案。