Elasticsearch:使用 E5 嵌入模型进行多语言向量搜索

news2024/11/26 4:40:46

作者:JOSH DEVINS

在这篇文章中,我们将介绍多语言向量搜索。 我们将使用 Microsoft E5 多语言嵌入模型,该模型在零样本和多语言设置中具有最先进的性能。 我们将介绍多语言嵌入的一般工作原理,以及如何在 Elasticsearch 中使用 E5。更多关于多语言的搜索,请阅读 “Elasticsearch:多语言语义搜索”

近年来,向量搜索席卷了搜索和信息检索领域。 它能够将查询的语义与文档相匹配,合并文本的上下文和含义,并为用户提供前所未有的自然语言查询能力。 向量搜索是促进大型语言模型 (LLM) 的重要上下文来源,并且它在生成式 AI 时代赋予越来越多的现代搜索体验。

为什么要使用多语言嵌入?

当研究人员第一次开始使用和训练向量搜索的嵌入模型时,他们使用了他们能找到的最广泛可用的数据集。 然而,这些数据集往往都是英语。 查询是英文的,维基百科索引的文章也是英文的,很快非英语世界就注意到了。 针对德语、法语、中文、日语等语言的特定语言的语言模型慢慢开始出现。 然而,这些模型只能在该语言中运行。 借助嵌入的强大功能,我们还能够使用单个模型来训练将多种语言嵌入到同一 “嵌入空间” 中的模型。 你可以将嵌入空间视为与语言无关的、句子(查询或段落)所表示的概念的数学表示(密集向量),其中嵌入空间中彼此接近的嵌入具有相似的语义含义。

既然我们可以将文本、图像和音频嵌入到一个嵌入空间中,为什么不将多种语言嵌入到同一个嵌入空间中呢? 这就是多语言嵌入模型背后的想法。 通过对齐的训练数据集(包含不同语言的相似句子的数据集),可以使模型学习的不是语言之间的单词翻译,而是每个句子背后的关系和含义,而与语言无关。 这是一个真正的跨语言模型,能够处理其所训练的任何语言的文本对。 现在让我们看看如何使用这些对齐的多语言模型。

让我们考虑几个例子

在本练习中,当英语和德语的句子具有相同的基本含义时,我们会将它们映射到嵌入空间的同一部分。 假设我有以下句子,我想对其进行索引和搜索。 对于非德语人士,我们提供了德语句子的直接英语翻译。 😉

id=doc1, language=en, passage="I sat on the bank of the river today."
id=doc2, language=de, passage="Ich bin heute zum Flussufer gegangen." (English: "I walked to the riverside today.")
id=doc3, language=en, passage="I walked to the bank today to deposit money."
id=doc4, language=de, passage="Ich saß heute bei der Bank und wartete auf mein Geld." (English: "I sat at the bank today waiting for my money.")

在下面的示例查询中,我们展示了多语言嵌入如何克服传统词汇检索在多语言搜索中面临的一些挑战。 通常我们谈论向量搜索克服了词法搜索的语义不匹配和词汇不匹配的限制。 语义不匹配是指我们在查询中使用的标记(单词)与索引文档中的形式相同,但含义不同的情况。 例如,河流里的 “bank ()” 与存放金钱的 “bank” 的含义不同。 由于词汇不匹配,我们面临着标记不同,但潜在的概念或含义与文档中表示的含义相似。 我们可能会搜索 “ATM”,它没有出现在任何文档中,但与 “bank that holds money (持有货币的银行)” 密切相关。 除了词法搜索的这两项改进之外,多语言(跨语言)嵌入还增加了语言独立性,允许查询和段落使用不同的语言。 要更深入地了解向量搜索的工作原理以及它如何与传统词汇搜索相结合,请观看此网络研讨会:向量数据库如何支持人工智能搜索。

现在让我们尝试一些搜索示例,看看它是如何工作的。

例子 1

查询:“riverside”(德语:“Flussufer”)
结果:

id=doc1, language=en, passage="I sat on the bank of the river today."
id=doc2, language=de, passage="Ich bin heute zum Flussufer gegangen." (English: "I walked to the riverside today.")

在此示例中,“riverside” 在德语中的翻译为 “Flussufer”。 然而,语义含义与英语短语 “bank of the River” 以及德语关键字 “Flussufer” 匹配,因此我们对两个文档进行匹配。

例子2

查询:“Geldautomat”(英语:“ATM”)
结果:

id=doc4, language=de, passage="Ich saß heute bei der Bank und wartete auf mein Geld." (English: "I sat at the bank today waiting for my money.")
id=doc3, language=en, passage="I walked to the bank today to deposit money."

在此示例中,“Geldautomat” 的英文翻译为 “ATM”。 “Geldautomat” 和 “ATM” 都没有作为关键字出现在任何文档中,但语义含义接近英语短语 “bank … Money” 和德语短语 “Bank … Geld”。 在这种情况下,上下文很重要,查询指的是持有货币的银行,而不是河岸,因此我们仅匹配引用此类 “bank” 的文档,但我们这样做跨语言基于语义而不是关键字。

例子 3a

查询:“movement”
结果:

id=doc3, language=en, passage="I walked to the bank today to deposit money."
id=doc2, language=de, passage="Ich bin heute zum Flussufer gegangen." (English: "I walked to the riverside today.")

在此示例中,我们正在搜索文本中表示的运动类型。 我们对运动或行走感兴趣,而不是坐在一处或一动不动。 因此,最接近的文档由德语单词 “gegangen”(英语:“have gone to”)和英语单词 “walked” 表示。

例子 3b

查询:“stillness”
结果:

id=doc4, language=de, passage="Ich saß heute bei der Bank und wartete auf mein Geld." (English: "I sat at the bank today waiting for my money.")
id=doc1, language=en, passage="I sat on the bank of the river today."

如果我们反转示例 3a 中的查询并查找 “stillness” 或缺乏运动,我们会得到“相反”的结果。

多语言E5嵌入模型

2022 年 12 月,微软发布了一种新的通用嵌入模型,称为 E5,或来自 bidirEctional Encoder rEpresentations 的 EmbEddings。 (我知道,命名事物很困难。)该模型是在一个名为 CCPairs 的特殊的纯英文数据集上进行训练的,并在训练过程中引入了一些新方法。 该模型很快就在众多基准测试中名列前茅,在该模型成功后,他们将目光投向了非英语领域。 除了嵌入英语模型之外,微软后来还使用各种多语言数据集在多语言文本上训练了 E5 模型的变体,但总体过程与英语模型相同。 这表明他们的训练过程在很大程度上帮助产生了如此好的英语嵌入,并且这种成功也转移到了多语言嵌入。 在一些纯英语基准测试中,多语言嵌入甚至比仅在英语数据集上训练的其他嵌入更好! 对于那些感兴趣的人,请查看 MTEB 检索基准以了解更多详细信息。

正如嵌入模型的常见做法,E5 系列提供三种尺寸,允许用户针对其特定用例和预算在有效性和效率之间做出权衡决策。

  • 嵌入的有效性是指它们在某项任务上的表现如何,根据特定数据集进行衡量。 对于语义搜索,这是一项检索任务,并使用 nDCG@10 或 MRR@10 等搜索相关性指标来衡量。
  • 嵌入和嵌入模型的效率受以下因素影响:
    1. 模型生成的向量有多少维,这会影响存储需求(磁盘上和内存中)以及它们的搜索速度。
    2. 嵌入模型有多大(参数数量),这会影响推理延迟或在摄取和搜索时创建嵌入所需的时间。

下面我们可以看到三个多语言 E5 模型及其特征,以及在 Mr. TyDi(看,命名很难)的多语言基准测试上测量的有效性。 作为基线和比较,我们纳入了 Mr. TyDi的 BM25(词汇搜索)有效性分数,如 E5 作者报告的那样。

Effectiveness: Avg. MRR@10Efficiency: dimensionsEfficiency: parameters
BM2533.3n/an/a
multilingual-e5-small64.4384118M
multilingual-e5-base65.9768278M
multilingual-e5-large70.51024560M

Elasticsearch 使用 E5 进行多语言向量搜索

Elasticsearch 使你能够生成、存储和搜索向量嵌入。 我们已经大致了解了多语言嵌入的介绍,并且对 E5 有了一些了解。 让我们看一下如何将所有这些实际连接到 Elasticsearch 的搜索体验中。 该博客有一个随附的 notebook,其中详细显示了上面示例中使用 Elasticsearch 端到端的所有代码。

以下是所需内容的快速概述:

  1. 使用一个大小为 8GB 或更大的 ML 节点创建 Elastic Cloud 部署(或使用任何具有 ML 节点的 Elasticsearch 集群)
  2. 在 Elasticsearch 中设置 multilingual-e5-base 的嵌入模型,以通过推理处理器在摄取时嵌入文本
  3. 创建索引并将文档提取到 ANN 索引中以进行近似 kNN 搜索
  4. 使用 query_vector_builder查询 ANN 索引

现在让我们看一下 notebook 中每个步骤的一些代码片段。

设置

创建 Elastic Cloud 集群或准备另一个 Elasticsearch 集群后,我们可以使用 eland 库上传嵌入模型。

MODEL_ID = "multilingual-e5-base"

!eland_import_hub_model \
    --cloud-id $CLOUD_ID \
    --es-username elastic \
    --es-password $ELASTIC_PASSWORD \
    --hub-model-id intfloat/$MODEL_ID \
    --es-model-id $MODEL_ID \
    --task-type text_embedding \
    --start

现在模型已上传到集群并准备好进行推理,我们可以创建包含 inference pipeline 的 ingest pipeline 来执行我们选择的文本字段的嵌入。 使用网络爬虫等企业搜索功能时,你还可以通过 Kibana UI 管理摄取管道。

client.ingest.put_pipeline(id="pipeline", processors=[{
    "inference": {
        "model_id": MODEL_ID,
        "field_map": {
            "passage": "text_field" # field to embed: passage
        },
        "target_field": "passage_embedding" # embedded field: passage_embedding
    }
}])

索引数据

对于上面的简单示例,我们仅使用一个非常简单的索引映射,但希望它也能让你了解你的映射可能是什么样子。

mapping = {
    "properties": {
        "id": { "type": "keyword" },
        "language": { "type": "keyword" },
        "passage": { "type": "text" },
        "passage_embedding.predicted_value": {
            "type": "dense_vector",
            "dims": 768,
            "index": "true",
            "similarity": "cosine"
        }
    },
    "_source": {
        "excludes": [
            "passage_embedding.predicted_value"
        ]
    }
}

使用根据上述映射创建的索引,我们就可以提取文档了。 你可以使用任何你想要的摄取方法,只要引用我们在开始时创建的摄取管道(或设置为索引的默认值)即可。 请注意,与其他嵌入模型一样,E5 确实有 token 限制(512 个令牌或约 400 个单词),因此较长的文本需要在被摄取之前分块为单独的段落(例如使用 LangChain 或其他工具)。 这是我们的示例文档的样子。

passages = [
   {
        "id": "doc1",
        "language": "en",
        "passage": """I sat on the bank of the river today."""
    },
    {
        "id": "doc2",
        "language": "de",
        "passage": """Ich bin heute zum Flussufer gegangen."""
    },
    {
        "id": "doc3",
        "language": "en",
        "passage": """I walked to the bank today to deposit money."""
    },
    {
        "id": "doc4",
        "language": "de",
        "passage": """Ich saß heute bei der Bank und wartete auf mein Geld."""
    }
]

搜索

文档已被索引并创建了嵌入,因此我们准备好搜索!

client.search(index="passages", knn={
    "field": "passage_embedding.predicted_value",
    "query_vector_builder": {
        "text_embedding": {
            "model_id": MODEL_ID,
            "model_text": f"query: {q}",
        }
    },
    "k": 2, # for the demo, we're always just searching for pairs of passages
    "num_candidates": 5
})

就是这样! 通过上述步骤以及 notebook 中的完整代码,你可以完全在 Elasticsearch 中构建自己的多语言语义搜索体验。

注意:E5 模型在嵌入之前使用文本前缀的指令进行训练。 这意味着当你想要嵌入文本进行语义搜索时,必须在查询前加上 “query:” 前缀,并在索引段落前加上 “passage:”。 有关更多详细信息和需要不同前缀的其他用例,请参阅 multilingual-e5-base 模型卡中的常见问题解答。

结论

在本博客和随附的 notebook 中,我们展示了多语言向量搜索的工作原理,以及如何将 Elasticsearch 与 E5 嵌入模型结合使用。 我们通过展示跨语言的多语言搜索示例来推动这一点,但实际上相同的 E5 嵌入模型也可以在单一语言中使用。 例如,如果你只有一个德语文本语料库,你可以自由地使用相同的模型和相同的方法来仅使用德语查询来搜索该语料库。 它们都是相同的模型,并且最终的嵌入空间相同!

试用 notebook,并确保启动你自己的云集群,以尝试使用 E5 对你选择的语言和数据集进行多语言语义搜索。 如果你有任何疑问或想要讨论多语言语义搜索,请加入我们和整个 Elastic 社区的讨论论坛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯每日一题2023.10.29

螺旋折线 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 在图中我们可以观察到四个对角线的值均为特殊点&#xff0c;其他的点可以根据这几个 进行偏移量的计算从而进行表示&#xff0c;此题主要是找到规律即可 #include<bits/stdc.h> using namespace std; typedef long…

ENSP L2TP 配置

拓扑 真机模拟出差员工使用l2tp客户端接入公司内网。 客户端下载&#xff1a;URL 说明&#xff1a; 确保真机与AR1设备之间网络可达&#xff0c;且真机上可以访问到LNS的 10.100.1.254 真机网卡配置 真机上添加去往LNS的路由 测试 LNS配置 #l2tp enable #ip pool shass…

聊聊装饰模式

缘起 某日&#xff0c;阳光明媚&#xff0c;绿草花香。Leader突然找到了小明&#xff1a;“小明&#xff0c;如果让你将一个人的穿着使用代码来实现&#xff0c;你该怎么完成呢&#xff1f;” 小明一听&#xff0c;回答道:“Leader&#xff0c;这个不难&#xff0c;马上就完事…

【PyQt学习篇 · ④】:QWidget - 尺寸操作

文章目录 QWidget简介QWidget大小位置操作案例一案例二 QWidget尺寸限定操作案例 内容边距案例 QWidget简介 在PyQt中&#xff0c;QWidget是一个基本的用户界面类&#xff0c;用于创建可见的窗口组件。QWidget可以包含多种类型的子组件&#xff0c;如QPushButton、QLabel、QLi…

matlab 中的基本绘图指令与字符串操作指令

字符串指令 创建字符串 使用单引号将字符序列括起来创建字符串使用单引号创建的字符串是一个字符数组&#xff0c;每个字符都被视为一个独立的元素 可以通过索引访问每个字符使用双引号创建的字符串是一个字符串数组&#xff0c;整个字符串被视为一个元素 无法通过索引访问单个…

Linux shell编程学习笔记17:for循环语句

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算&#xff0c;同样也需要进行根据条件进行流程控制&#xff0c;提供了if、for、while、until等语句。 之前我们探讨了if语句&#xff0c;现在我们来探讨for循环语句。 Li…

海外问卷调查是怎么做的?全方位介绍!

橙河这样说&#xff0c;相信大家应该不难理解。 国外问卷调查目前主要有三种形式&#xff1a;口子查、站点查和渠道查。橙河自己做的是渠道查。 站点查是最早的问卷形式&#xff0c;意思是我们需要登录到问卷网站上&#xff0c;就可以做问卷了。但想要在网站上做问卷&#xf…

YOLO轻量化改进 , 边缘GPU友好的YOLO改进算法!

在本文中&#xff0c;作者根据现有先进方法中各种特征尺度之间缺少的组合连接的问题&#xff0c;提出了一种新的边缘GPU友好模块&#xff0c;用于多尺度特征交互。此外&#xff0c;作者提出了一种新的迁移学习backbone采用的灵感是来自不同任务的转换信息流的变化&#xff0c;旨…

《Attention Is All You Need》阅读笔记

论文标题 《Attention Is All You Need》 XXX Is All You Need 已经成一个梗了&#xff0c;现在出现了很多叫 XXX Is All You Need 的文章&#xff0c;简直标题党啊&#xff0c;也不写方法&#xff0c;也不写结果&#xff0c;有点理解老师扣论文题目了。 作者 这个作者栏太…

Yolo-Z:改进的YOLOv5用于小目标检测

目录 一、前言 二、背景 三、新思路 四、实验分析 论文地址&#xff1a;2112.11798.pdf (arxiv.org) 一、前言 随着自动驾驶汽车和自动驾驶赛车越来越受欢迎&#xff0c;对更快、更准确的检测器的需求也在增加。 虽然我们的肉眼几乎可以立即提取上下文信息&#xff0c;即…

Arhas 常用命令

watch 函数执行数据观测: location 会有三种值 AtEnter&#xff0c;AtExit&#xff0c;AtExceptionExit。 对应函数入口&#xff0c;函数正常 return&#xff0c;函数抛出异常。 result 表示观察表达式的值&#xff1a; {params,returnObj,throwExp} eg: 查看是某个方法的参…

探索Apache HttpClient超时时间如何设定?

目录 一、Apache HttpClient模拟POST请求&#xff0c;调用第三方接口1、发起POST请求&#xff1a;2、模拟服务端3、通过postman测试一下4、Apache HttpClient 二、HTTP超时时间1、众所周知&#xff0c;HTTP使用的是TCP/IP 协议。2、TCP/IP超时时间设置3、HTTP连接超时时间如何设…

笔记Kubernetes核心技术-之Controller

2、Controller 2.1、概述 在集群上管理和运行容器的对象&#xff0c;控制器(也称为&#xff1a;工作负载)&#xff0c;Controller实际存在的&#xff0c;Pod是抽象的&#xff1b; 2.2、Pod和Controller关系 Pod是通过Controller实现应用运维&#xff0c;比如&#xff1a;弹…

前馈神经网络处理二分类任务

此文建议看完基础篇再来&#xff0c;废话不多说&#xff0c;进入正题 目录 1.神经元 1.1 活性值 1.2 激活函数 1.2.1 Sigmoid函数 1.2.2 Relu函数 2.基于前馈神经网络的二分类任务 2.1 数据集的构建 2.2 模型的构建 2.2.1 线性层算子 2.2.2 Logistic算子 2.2.3 层的串行组合…

FL Studio 21.2.0.3842中文破解版发布啦,支持 Cloud 在线采样库和 AI 音乐制作功能

好消息&#xff01;FL Studio 21.2 在 10 月 26 日正式发布啦&#xff0c;它新增了 FL Cloud 在线采样库和 AI 音乐制作功能&#xff0c;还提供音乐分发到 Spotify、Apple Music 等主要音乐平台的服务。此外&#xff0c;还有新的音频分离功能、自定义波形颜色和新的合成器 Kepl…

改进YOLOv3!IA-YOLO:恶劣天气下的目标检测

恶劣天气条件下从低质量图像中定位目标还是极具挑战性的任务。现有的方法要么难以平衡图像增强和目标检测任务&#xff0c;要么往往忽略有利于检测的潜在信息。本文提出了一种新的图像自适应YOLO (IA-YOLO)框架&#xff0c;可以对每张图像进行自适应增强&#xff0c;以提高检测…

Windows一键添加命名后缀(文件)

温馨提示&#xff1a;使用前建议先进行测试和原文件备份&#xff0c;避免引起不必要的损失。 &#xff08;一&#xff09;需求描述 之前老板让我给大量文件添加命名前缀&#xff0c;如今为了防患于未然&#xff0c;我决定把添加命名后缀的功能也实现一下&#xff0c;虽然这与添…

EASYX键盘交互

eg1:使用键盘的上下左右按钮控制小球的上下左右移动 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <conio.h> #define PI 3.14int main() {// 键盘交互initgraph(800, 600);setorigin(400, 300);set…

Linux网卡

网卡 网卡&#xff08;Network Interface Card&#xff0c;NIC&#xff09;是一种计算机硬件设备&#xff0c;也称为网络适配器或网络接口控制器。一个网卡就是一个接口 网卡组成和工作原理参考https://blog.csdn.net/tao546377318/article/details/51602298 每个网卡都拥有唯…