双编码器分别处理文档和搜索查询。可以将其类比为两个人独立工作:一人负责概括文档,另一人则专注于搜索查询,两者之间互不交流。“双”字体现了查询和文档的独立编码过程。
交叉编码器将两个文本片段(例如,用户查询和文档)同时作为输入。它不分别生成向量表示,而是输出 0 到 1 之间的值,表示输入对的相似度。
交叉编码器在高精度至关重要的任务中尤其重要,例如在最终文档重排序阶段,或在语义匹配的准确性至关重要时。
查询-文档对的联合处理
- 将查询和文档作为单个输入一同处理
- 直接评估查询和文档之间的关系
- 实现更细致的语义匹配
更准确地捕捉复杂关系
- 擅长捕捉细微和复杂的语义关系
- 在法律或医学文档检索等领域具有重要价值
高效的文档重排序
- 通常用于检索的重排序阶段
- 优化双编码器检索到的初始文档集
- 确保语义最相关的文档排名最高
- 更准确地评估相关性
- 更擅长捕捉复杂关系
- 适用于需要高精度的任务
- 对于大规模搜索,计算成本较高
- 不适用于海量文档集合的初始检索
双编码器:
- 搜索海量文档集合
- 速度至关重要,例如实时网络搜索
- 执行初始的广度优先搜索
交叉编码器:
- 优化较小的搜索结果集
- 准确性比速度更重要
- 处理复杂查询或专业领域(例如,法律或医学搜索)
假设有四个句子 A、B、C 和 D,需要比较所有可能的配对:
- 双编码器需要分别编码每个句子,共需编码四次。
- 交叉编码器需要编码所有可能的配对,共需编码六次(AB、AC、AD、BC、BD、CD)。
假设有 100,000 个句子,需要比较所有可能的配对:
- 双编码器将编码 100,000 个句子。
- 交叉编码器将编码 4,999,950,000 对(根据组合公式:n! / (r!(n-r)!),其中 n=100,000 且 r=2)。因此,交叉编码器的扩展性较差,在大规模数据集上计算成本过高。
使用交叉编码器进行语义相似度检测的实际应用: 尽管双编码器也可以完成此任务,但交叉编码器在牺牲一定处理速度的情况下能提供更高的准确性。
以下演示将使用微软的预训练模型 MS MARCO,通过两个句子对进行说明。模型输出一个分数,分数越高表示句子之间的语义相似度越高。
下面的代码片段演示了如何使用双编码器进行语义相似性搜索。模型将查询和语料库编码成嵌入向量,然后执行相似性搜索以找到最相关的段落。结果显示前 k 个匹配项(此处 k=25),每个匹配项包含语料库 ID 和相似度分数:
使用高召回率但低精度的双编码器获取最相似的文本块后,可以通过第二阶段使用交叉编码器模型对结果进行重排序,利用其更高的准确性来优化结果。
以下是两阶段方法的实现:
代码使用交叉编码器模型对双编码器识别的查询-文本块对重新评分。交叉编码器提供更准确的相似度分数,从而实现更精细的排序。这种两阶段方法结合了双编码器在初始检索阶段的高效性和交叉编码器在最终排序阶段的高精度,为语义搜索任务提供了一种均衡的解决方案。