Elasticsearch:如何部署文本嵌入模型并将其用于语义搜索

你可以按照这些说明在 Elasticsearch 中部署文本嵌入模型,测试模型并将其添加到推理提取管道。它使你能够生成文本的向量表示并对生成的向量执行向量相似性搜索。示例中使用的模型在 HuggingFace上公开可用。

该示例使用来自 MS MARCO Passage Ranking Task 的公共数据集。它由来自 Microsoft Bing 搜索引擎的真实问题和人工生成的答案组成。该示例使用此数据集的样本,使用模型生成文本嵌入,然后对其运行向量搜索。

你可以使用 elasticsearch-labs repo 中的 Python 客户端以 Jupyter 笔记本的形式找到此示例。

注意:针对 8.15 及以后得版本,我们可以直接使用 semantic_text 字段来代替本文中的 dense_vector 字段。我们甚至直接使用 semantic query 来进行查询。有关细节,请详细阅读文章 “Elasticsearch:使用 semantic_text 进行语义搜索”。

要求

要按照本页上的流程操作,你必须具备:

  • 已正确设置 Elasticsearch Cloud 集群以使用机器学习功能。请参阅设置和安全。你也可以参阅文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 在本地创建自己的 Elasticsearch 集群。
  • 已激活适当的订阅级别或免费试用期。如果激活免费使用,请参阅文章 “Elasticsearch:如何部署 NLP:文本嵌入和向量搜索”。
  • 已安装 Docker。

部署文本嵌入模型

你可以使用 Eland 客户端安装自然语言处理模型。使用预构建的 Docker 映像运行 Eland 安装模型命令。使用以下命令获取最新映像:

docker pull docker.elastic.co/eland/eland

拉取完成后,你的 Eland Docker 客户端即可使用。

从第三方模型参考列表中选择一个文本嵌入模型。此示例使用 msmarco-MiniLM-L-12-v3 句子转换器模型。

通过在 Docker 映像中运行 eland_import_model_hub 命令来安装模型:

docker run -it --rm docker.elastic.co/eland/eland \eland_import_hub_model \--cloud-id $CLOUD_ID \-u <username> -p <password> \--hub-model-id sentence-transformers/msmarco-MiniLM-L-12-v3 \--task-type text_embedding \--start

你需要提供管理员用户名和密码,并将 $CLOUD_ID 替换为你的云部署的 ID。此云 ID 可以从你的云网站上的部署页面复制。

由于在 Eland 导入命令末尾使用了 --start 选项,Elasticsearch 会部署随时可用的模型。如果你有多个模型并想选择要部署的模型,你可以使用 Kibana 中的 Machine Learning > Model Management 用户界面来管理模型的启动和停止。

转到 Machine Learning > Trained Models 页面并同步你的训练模型。页面顶部会显示一条警告消息,提示 “ML job and trained model synchronization required”。按照链接 “ynchronize your jobs and trained models.”。然后单击同步。你也可以等待每小时发生的自动同步,或使用 sync machine learning objects API。

注意:如果你是在本地部署自己的 Elasticsearch,你可以参考文章 “Elasticsearch:如何部署 NLP:文本嵌入和向量搜索” 来上传模型。

测试文本嵌入模型

可以在 Kibana 中的 “Machine Learning > Trained Models” 下选择相应模型的 “Test model ” 操作来评估已部署的模型。

使用 _infer API 测试模型

你还可以使用 _infer API 评估模型。在以下请求中,text_field 是模型期望找到输入的字段名称,如模型配置中定义的那样。默认情况下,如果模型是通过 Eland 上传的,则输入字段为 text_field。

POST /_ml/trained_models/sentence-transformers__msmarco-minilm-l-12-v3/_infer
{"docs": {"text_field": "How is the weather in Jamaica?"}
}

API 返回类似以下内容的响应:

{"inference_results": [{"predicted_value": [0.39521875977516174,-0.3263707458972931,0.26809820532798767,0.30127981305122375,0.502890408039093,...]}]
}

结果是从示例文本转换而来的预测密集向量。

加载数据

在此步骤中,你将加载稍后在提取管道中用于获取嵌入的数据。

数据集 msmarco-passagetest2019-top1000 是 MS MARCO Passage Ranking 数据集的子集,该数据集用于 2019 TREC 深度学习轨道的测试阶段。它包含 200 个查询,每个查询都有一个由简单信息检索 (IR) 系统提取的相关文本段落列表。从该数据集中,提取了所有具有其 ID 的唯一段落并将其放入 tsv 文件中,共计 182469 个段落。在下文中,此文件用作示例数据集。

使用数据可视化工具上传文件。将第一列命名为 id,将第二列命名为 text。索引名称为 collection。上传完成后,你可以看到一个名为 collection 的索引,其中包含 182469 个文档。

提示:如果你想要了解详细的步骤来装载数据,请详细阅读文章 “Elasticsearch:使用 ELSER 进行语义搜索 - sparse_vector” 中的相关章节。

将文本嵌入模型添加到推理摄取管道

使用 inference processor 处理初始数据。它为每个段落添加一个嵌入。为此,创建一个文本嵌入摄取管道,然后使用此管道重新索引初始数据。

现在在 Stack Management UI 中或使用 API 创建摄取管道:

PUT _ingest/pipeline/text-embeddings
{"description": "Text embedding pipeline","processors": [{"inference": {"model_id": "sentence-transformers__msmarco-minilm-l-12-v3","target_field": "text_embedding","field_map": {"text": "text_field"}}}],"on_failure": [{"set": {"description": "Index document to 'failed-<index>'","field": "_index","value": "failed-{{{_index}}}"}},{"set": {"description": "Set error message","field": "ingest.failure","value": "{{_ingest.on_failure_message}}"}}]
}

段落位于名为 text 的字段中。field_map 将 text 映射到模型所需的字段 text_field。on_failure 处理程序设置为将失败索引到不同的索引中。

在通过管道提取数据之前,请创建目标索引的映射,特别是针对提取处理器存储嵌入的字段 text_embedding.predicted_value。dense_vector 字段必须配置为与模型生成的文本嵌入相同的维度 (dims)。该值可以在模型配置中的 embedding_size 选项中找到,位于 Kibana 中的 “ Trained Models” 页面下或 “Get trained models API” API 调用的响应主体中。msmarco-MiniLM-L-12-v3 模型的 embedding_size 为 384,因此 dims 设置为 384。

PUT collection-with-embeddings
{"mappings": {"properties": {"text_embedding.predicted_value": {"type": "dense_vector","dims": 384},"text": {"type": "text"}}}
}

通过推理管道将数据重新索引到带嵌入的集合索引中,从而创建文本嵌入。推理摄取处理器将嵌入向量插入到每个文档中。

POST _reindex?wait_for_completion=false
{"source": {"index": "collection","size": 50  /* 1 */},"dest": {"index": "collection-with-embeddings","pipeline": "text-embeddings"}
}
  1. 重新索引的默认批次大小为 1000。将大小减小到较小的数字可以加快重新索引过程的更新速度,从而使你能够密切跟踪进度并尽早发现错误。

API 调用返回一个任务 ID,可用于监控进度:

GET _tasks/<task_id>

你还可以打开模型统计 UI 来跟踪进度。

重新索引完成后,新索引中的文档包含推理结果 - 向量嵌入。

语义搜索 - semantic search

使用向量嵌入丰富数据集后,你可以使用语义搜索查询数据。将 query_vector_builder 传递给 k-最近邻 (kNN) 向量搜索 API,并提供查询文本和你用于创建向量嵌入的模型。此示例搜索 “How is the weather in Jamaica?”:

GET collection-with-embeddings/_search
{"knn": {"field": "text_embedding.predicted_value","query_vector_builder": {"text_embedding": {"model_id": "sentence-transformers__msmarco-minilm-l-12-v3","model_text": "How is the weather in Jamaica?"}},"k": 10,"num_candidates": 100},"_source": ["id","text"]
}

结果,你将从 collection-with-embedings 索引中收到与查询含义最接近的前 10 个文档,这些文档按与查询的接近程度排序:

"hits" : [{"_index" : "collection-with-embeddings","_id" : "47TPtn8BjSkJO8zzKq_o","_score" : 0.94591534,"_source" : {"id" : 434125,"text" : "The climate in Jamaica is tropical and humid with warm to hot temperatures all year round. The average temperature in Jamaica is between 80 and 90 degrees Fahrenheit. Jamaican nights are considerably cooler than the days, and the mountain areas are cooler than the lower land throughout the year. Continue Reading."}},{"_index" : "collection-with-embeddings","_id" : "3LTPtn8BjSkJO8zzKJO1","_score" : 0.94536424,"_source" : {"id" : 4498474,"text" : "The climate in Jamaica is tropical and humid with warm to hot temperatures all year round. The average temperature in Jamaica is between 80 and 90 degrees Fahrenheit. Jamaican nights are considerably cooler than the days, and the mountain areas are cooler than the lower land throughout the year"}},{"_index" : "collection-with-embeddings","_id" : "KrXPtn8BjSkJO8zzPbDW","_score" :  0.9432083,"_source" : {"id" : 190804,"text" : "Quick Answer. The climate in Jamaica is tropical and humid with warm to hot temperatures all year round. The average temperature in Jamaica is between 80 and 90 degrees Fahrenheit. Jamaican nights are considerably cooler than the days, and the mountain areas are cooler than the lower land throughout the year. Continue Reading"}},(...)
]

如果你想快速验证结果,请按照本博文快速验证部分的步骤进行。

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

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

相关文章

使用Python生成F分布表并导出为Excel文件

使用Python生成F分布表并导出为Excel文件 一、引言二、准备工作三、代码实现四、运行结果五、总结六、参考资料 一、引言 在统计分析中&#xff0c; F F F分布是一种非常重要的连续概率分布&#xff0c;广泛应用于方差分析、回归分析的显著性检验等场景。为了方便查阅和使用F分…

RNN公式解释:实现记忆功能;RNN的状态向量

目录 RNN公式解释:实现记忆功能 一、词向量 二、RNN的状态向量 三、词向量变为状态向量的过程 四、总结 RNN公式解释:实现记忆功能 在RNN(递归神经网络)中,词向量变为状态向量的过程,实际上是RNN处理时序数据的一个核心环节。以下是对这一过程的详细解释: 一、词向…

激光雷达定位初始化的另外一个方案 通过键盘按键移动当前位姿 (附python代码)

通常使用的是通过在 rviz 中点选指定初始化位置和方向来完成点云的初始化匹配。 但是这种粗略的初始化方法有时候可能不成功,因此需要使用准确的初始化方法,以更好的初始值进行无损检测配准。 为了提供更好的匹配初始值,我使用 Python 脚本获取键盘输入,并不断调整这个匹配…

小试牛刀-Anchor安装和基础测试

目录 一、编写目的 二、安装步骤 2.1 安装Rust 设置rustup镜像 安装Rust 2.2 安装node.js 2.3 安装Solana-CLI 2.4 安装Anchor CLI 三、Program测试 四、可能出现的问题 Welcome to Code Blocks blog 本篇文章主要介绍了 [Anchor安装和基础测试] 博主广交技术好友&…

自存 sql常见语句和实际应用

关于连表 查询两个表 SELECT * FROM study_article JOIN study_article_review 查询的就是两个表相乘&#xff0c;结果为两个表的笛卡尔积 相这样 这种并不是我们想要的结果 通常会添加一些查询条件 SELECT * FROM study_articleJOIN study_article_review ON study_art…

OpenGL 进阶系列09 - 计算着色器

目录 一:概述 二: 特征与用途 三:计算着色器 API 四:GLSL 计算着色器接口 五:一个完整的例子 一:概述 计算着色器(Compute Shader) 是 OpenGL 中的一种专门用于通用计算的着色器,独立于图形渲染管线。它允许在 GPU 上进行高效的并行计算,可用于科学计算、粒子模拟…

Linux-第2集-打包压缩 zip、tar WindowsLinux互传

欢迎来到Linux第2集&#xff0c;这一集我会非常详细的说明如何在Linux上进行打包压缩操作&#xff0c;以及解压解包 还有最最重要的压缩包的网络传输 毕竟打包压缩不是目的&#xff0c;把文件最终传到指定位置才是目的 由于打包压缩分开讲没有意义&#xff0c;并且它们俩本来…

小鹏汽车嵌入式面试题及参考答案

static 变量放在哪个段中? 在 C 和 C++ 等编程语言中,static 变量根据其定义的位置不同放置的段也不同。对于全局的静态变量(在函数体外定义的静态变量),它会被放在数据段(.data 段或者.bss 段)。如果这个静态变量被初始化了非零值,那么它会被放在.data 段,这个段存储…

关于pip install 包 时出现This is an issue with the package mentioned above,not pip的问题

关于This is an issue with the package mentioned above,not pip 今天在用pip下载gensim包的时候&#xff0c;出现了上图中的问题&#xff0c;提示信息是&#xff1a;This is an issue with the package mentioned above,not pip 那说明是包的问题&#xff0c;而不是在使用 pi…

h5小游戏实现获取本机图片

h5小游戏实现获取本机图片 本文使用cocos引擎 1.1 需求 用户通过文件选择框选择图片。将图片内容转换为Cocos Creator的纹理 (cc.Texture2D),将纹理设置到 cc.SpriteFrame 并显示到节点中。 1.2 实现步骤 创建文件输入框用于获取文件 let input document.createElement(&quo…

java设计模式 - 装饰者模式

装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保持原类方法签名的同时&#xff0c;增添了…

高阶云服务-ELB+AS

ELBAS 弹性负载均衡弹性伸缩 原来1台web服务器不满足相应&#xff0c;现部署多台提供相同服务&#xff1b; 由于多个服务器多个ip该如何提供给应用呢&#xff1f; 引申出负载均衡&#xff08;HAProxy&#xff0c;LVS01四层&#xff0c;Nginx七层&#xff09; 防单点故障做主备…

【论文阅读】WaDec: Decompiling WebAssembly Using Large Language Model

论文阅读笔记:WaDec: Decompiling WebAssembly Using Large Language Model 1. 来源出处 论文标题: WaDec: Decompiling WebAssembly Using Large Language Model作者: Xinyu She, Yanjie Zhao, Haoyu Wang会议: 39th IEEE/ACM International Conference on Automated Softwar…

Nginx参数配置-笔记

文章目录 upstream实现后台应用服务负载均衡&高可用proxy_set_header参数 upstream实现后台应用服务负载均衡&高可用 角色IPnginx172.168.110.2后端应用服务1172.168.110.3后端应用服务2172.168.110.4后端应用服务3(备用)172.168.110.5 示例如下&#xff1a; upstre…

STM32学习笔记----UART、IIC、SPI的区别

在STM32微控制器中&#xff0c;UART&#xff08;通用异步收发传输器&#xff09;、I2C&#xff08;串行外设接口&#xff09;和SPI&#xff08;串行外设接口&#xff09;是三种常见的通信协议。它们各自有不同的用途、特性和工作方式。它们的基本区别在于通信协议、数据传输方式…

Go小记:使用Go实现ssh客户端

一、前言 SSH&#xff08;Secure Shell&#xff09;是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务&#xff0c;保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …

html中select标签的选项携带多个值

搜索参考资料&#xff1a;SELECT标签中的选项可以携带多个值吗&#xff1f; 【摘抄】&#xff1a; 它可能有一个select选项中的多个值&#xff0c;如下所示。 <select id"ddlEmployee" class"form-control"> <option value"">-- S…

oracle导入线上数据的全步骤

多租户架构允许oracle数据库成为一个多租户的容器数据库&#xff0c;也就是CDB&#xff0c;container database&#xff0c;与之相对应的&#xff0c;则是插入到这个容器里面的可插拔式数据库&#xff0c;pluggable database 一个CDB可以包含0&#xff0c;1或者多个用户创建的…

华为刷题笔记--题目索引

文章目录 更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记简单题目 更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记 该专栏题目包含两部分&#xff1a; 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新&#xff0c;订阅防丢失 简单题目 –题目分值试卷1华为OD机…

从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改

在 sophpi 中&#xff0c;默认网卡 eth0 的 MAC 地址未配置&#xff0c;是随机生成的。这样就会导致每次重启之后&#xff0c;MAC 地址会改变&#xff0c;从而导致通过 DHCP 获取 IP 地址每次也都在变化。 查看 MAC 地址 前文提到 eth0 自动使能并通过 DHCP 获取 IP 地址&…