解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在信息检索领域(即从海量数据中查找相关信息),双编码器和交叉编码器是两种至关重要的工具。它们各自拥有独特的工作机制、优势和局限性。本文将深入探讨这两种核心技术。

在信息检索领域(即从海量数据中查找相关信息),双编码器和交叉编码器是两种至关重要的工具。它们各自拥有独特的工作机制、优势和局限性。本文将深入探讨这两种核心技术。

双编码器:高效的大规模检索

双编码器分别处理文档和搜索查询。可以将其类比为两个人独立工作:一人负责概括文档,另一人则专注于搜索查询,两者之间互不交流。“双”字体现了查询和文档的独立编码过程。

用户查询和文档向量嵌入使用相同的嵌入模型计算,但两者完全隔离。

双编码器尤其适用于需要大规模实时检索的场景,例如搜索引擎或大型知识库。

双编码器的关键特性

独立处理

  • 为查询和文档分别生成向量表示
  • 允许预先计算文档嵌入
  • 可将输入查询与数百万个预编码文档快速比较

与近似最近邻 (ANN) 算法的兼容性

  • 固定维度向量表示非常适合 ANN 算法
  • 通过在向量空间中逼近最近邻,高效搜索大型数据集
  • 适用于处理海量数据的系统的快速检索

对比学习

  • 通常使用对比学习技术进行训练
  • 学习区分相似和不相似(正负样本)的查询-文档对
  • 创建一个语义相似的项彼此更接近的向量空间

优势

  • 高效搜索大型数据集
  • 适用于实时应用
  • 适用于初始的广度优先搜索

局限性

  • 可能忽略查询和文档之间细微的语义关系
  • 与交叉编码器相比,处理复杂查询的准确性较低

交叉编码器:精准的相关性评估

交叉编码器将搜索查询和每个文档一同进行比对,如同一个人仔细地逐一比较两份文本。这种方法通常能更准确地评估相关性,使交叉编码器在需要高精度语义匹配的任务中极具价值。

交叉编码器将两个文本片段(例如,用户查询和文档)同时作为输入。它不分别生成向量表示,而是输出 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,通过两个句子对进行说明。模型输出一个分数,分数越高表示句子之间的语义相似度越高。

 # 安装 sentence_transformers 库
 # pip install sentence_transformers

 fromsentence_transformersimportCrossEncoder

 # 初始化交叉编码器模型
 model=CrossEncoder('cross-encoder/ms-marco-TinyBERT-L-2-v2', max_length=512)

 # 定义要比较的句子对
 sentence_pairs= [
     ('How many people live in Berlin?', 'Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers.'),
     ('How many people live in Berlin?', 'Berlin is well known for its museums.')
 ]
 scores=model.predict(sentence_pairs)
 print(scores)

 # 输出: array([ 7.152365 , -6.2870445], dtype=float32)

 # 结果表明,第一对句子的语义相似度远高于第二对。

下面的代码片段演示了如何使用双编码器进行语义相似性搜索。模型将查询和语料库编码成嵌入向量,然后执行相似性搜索以找到最相关的段落。结果显示前 k 个匹配项(此处 k=25),每个匹配项包含语料库 ID 和相似度分数:

 fromsentence_transformersimportSentenceTransformer, util

 # 初始化双编码器模型
 # 使用 'multi-qa-MiniLM-L6-cos-v1',一个用于将问题和段落编码到共享嵌入空间的紧凑模型
 bi_encoder=SentenceTransformer('multi-qa-MiniLM-L6-cos-v1')
 bi_encoder.max_seq_length=256

 # 将所有文本块编码为嵌入
 corpus_embeddings=bi_encoder.encode(chunks, convert_to_tensor=True, show_progress_bar=True)

 # 定义查询并搜索相关段落
 query="what is rlhf?"

 # 编码查询并计算与所有段落的相似度
 query_embedding=bi_encoder.encode(query, convert_to_tensor=True).cuda()

 # 检索前 25 个最相似的段落
 top_k=25
 hits=util.semantic_search(query_embedding, corpus_embeddings, top_k=top_k)[0]

 print(hits)

 # 输出:  
 # [{'corpus_id': 14679, 'score': 0.6097552180290222},
 #  {'corpus_id': 17387, 'score': 0.5659530162811279},
 #  {'corpus_id': 39564, 'score': 0.5590510368347168},
 #  ...]

使用高召回率但低精度的双编码器获取最相似的文本块后,可以通过第二阶段使用交叉编码器模型对结果进行重排序,利用其更高的准确性来优化结果。

以下是两阶段方法的实现:

 fromsentence_transformersimportCrossEncoder

 cross_encoder=CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')

 # 通过将查询与每个检索到的块配对来准备交叉编码器的输入
 cross_inp= [[query, chunks[hit['corpus_id']]] forhitinhits]

 cross_scores=cross_encoder.predict(cross_inp)

 print(cross_scores)

 # 输出是一个包含交叉编码器分数的数组,分数越高表示查询和文本块之间语义相似度越高。
 # array([ 1.2227577 ,  5.048051  ,  1.2897239 ,  2.205767  ,  4.4136825 ,
 #        1.2272772 ,  2.5638275 ,  0.81847703,  2.35553   ,  5.590804  ,
 #        1.3877895 ,  2.9497519 ,  1.6762824 ,  0.7211323 ,  0.16303705,
 #        1.3640019 ,  2.3106787 ,  1.5849439 ,  2.9696884 , -1.1079378 ,
 #        0.7681126 ,  1.5945492 ,  2.2869687 ,  3.5448399 ,  2.056368  ],
 #      dtype=float32)

代码使用交叉编码器模型对双编码器识别的查询-文本块对重新评分。交叉编码器提供更准确的相似度分数,从而实现更精细的排序。这种两阶段方法结合了双编码器在初始检索阶段的高效性和交叉编码器在最终排序阶段的高精度,为语义搜索任务提供了一种均衡的解决方案。

总结

双编码器和交叉编码器在现代信息检索中都扮演着至关重要的角色。双编码器提供速度和效率,是进行大规模初始搜索的理想选择。交叉编码器提供精度和深度,非常适合优化结果和处理复杂查询。理解它们的优势和局限性有助于构建能够同时处理广泛和细致信息需求的高效搜索系统。

https://avoid.overfit.cn/post/d9d5114419294e2aa30f3643be4a4a2e

作者:Marc Puig

目录
相关文章
|
9天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
12天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
4天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
9天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
19天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3941 3
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
9天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
522 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
4天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
15天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
992 3
|
8天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
13天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
445 18
白话文讲解大模型| Attention is all you need