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"
        }
      },
      (...)
]

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC图形函数学习10——画颜色填充矩形函数

一、介绍绘制颜色填充矩形函数 前面介绍的几个绘图函数填充颜色都需要专门定义画刷&#xff0c;今天介绍的这个函数可以直接绘制出带有填充色的矩形。 原型1&#xff1a;void FillSolidRect(int x,int y,int cx,int cy,COLORREF color); 参数&#xff1a;&a…

【网络协议栈】网络层(中)IP地址的网段划分、CIDR划分以及网络层概念(内附手画分析图 简单易懂)

绪论​ “坚持的意义是&#xff0c;以后回想起来的时候&#xff0c;你会庆幸“真好&#xff0c;我撑过来了”&#xff0c;而不是后悔“要是当初再……就好了”。本章主要写道网络层中非常重要的概念&#xff0c;了解了网络中ip地址的由来&#xff0c;以及ip地址不够的如何的处理…

Ultiverse 和web3新玩法?AI和GameFi的结合是怎样

Gamef 和 AI 是我们这个周期十分看好两大赛道之一&#xff0c;(Gamef 拥有极强的破圈效应&#xff0c;引领 Web2 用户进军 Web3 最佳利器。AI是这个周期最热门赛道&#xff0c;无论 Web2的 OpenAl&#xff0c;还是 Web3&#xff0c;都成为话题热议焦点。那么结合 GamefiA1双叙事…

小米顾此失彼:汽车毛利大增,手机却跌至低谷

科技新知 原创作者丨依蔓 编辑丨蕨影 三年磨一剑的小米汽车毛利率大增&#xff0c;手机业务毛利率却出现下滑景象。 11月18日&#xff0c;小米集团发布 2024年第三季度财报&#xff0c;公司实现营收925.1亿元&#xff0c;同比增长30.5%&#xff0c;预估902.8亿元&#xff1b;…

Linux系列-僵尸状态

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 进程退出 进程退出之后&#xff0c;代码就不会执行了&#xff0c;而是由PCB维护起来&#xff0c;我们可以通过PCB来查看退出信息。 进程退出时首先可以立即释放的就是进程对应…

NLP论文速读(EMNLP 2023)|工具增强的思维链推理

论文速读|ChatCoT: Tool-Augmented Chain-of-Thought Reasoning on Chat-based Large Language Models 论文信息&#xff1a; 简介&#xff1a; 本文背景是关于大型语言模型&#xff08;LLMs&#xff09;在复杂推理任务中的表现。尽管LLMs在多种评估基准测试中取得了优异的成绩…

实现两个表格的数据传递(类似于穿梭框)

类似于element的 第一个表格信息以及按钮&#xff1a; <div style"height: 80%"><el-table :data"tableData1" border :cell-style"{text-align:center}" style"width: 100%;"ref"multipleTable1"selection-chang…

【学术论文投稿】JavaScript 前端开发:从入门到精通的奇幻之旅

【中文核刊&普刊投稿通道】2024年体育科技与运动表现分析国际学术会议(ICSTPA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 一、引言 二、JavaScript 基础 &#xff08;一&#xff09;变量与数据类型 &am…

【Golang】——Gin 框架与数据库集成详解

文章目录 1. 引言2. 初始化项目2.1 创建 Gin 项目2.2 安装依赖 3. 数据库驱动安装与配置3.1 配置数据库3.2 连接数据库3.3 在主函数中初始化数据库 4. 定义数据模型4.1 创建用户模型4.2 自动迁移 5. 使用 GORM 进行 CRUD 操作5.1 创建用户5.2 获取用户列表5.3 更新用户信息5.4 …

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…

用 Python 与 Turtle 创作属于你的“冰墩墩”!

用 Python 与 Turtle 创作属于你的“冰墩墩”&#xff01; &#x1f980; 前言 &#x1f980;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f980; 前言 &#x1f980; 冰墩墩是2022年北京冬季奥林匹克运动会的官方吉祥物。以熊猫为原型&#x…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…

力扣hot100-->二分查找

目录 二分查找 1. 33. 搜索旋转排序数组 2. 34. 在排序数组中查找元素的第一个和最后一个位置 3. 240. 搜索二维矩阵 II 3. 287. 寻找重复数 二分查找 1. 33. 搜索旋转排序数组 中等 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&am…

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…

蓝队技能-应急响应篇日志自动采集日志自动查看日志自动化分析Web安全内网攻防工具项目

知识点&#xff1a; 1、应急响应-系统日志收集-项目工具 2、应急响应-系统日志查看-项目工具 3、应急响应-日志自动分析-项目工具 演示案例-蓝队技能-工具项目-自动日志采集&自动日志查看&自动日志分析 系统日志自动采集-观星应急工具(Windows系统日志) SglabIr_Co…

Jenkins修改LOGO

重启看的LOGO和登录页面左上角的LOGO 进入LOGO存在的目录 [roottest-server01 svgs]# pwd /opt/jenkins_data/war/images/svgs [roottest-server01 svgs]# ll logo.svg -rw-r--r-- 1 jenkins jenkins 29819 Oct 21 10:58 logo.svg #jenkins_data目录是我挂载到了/opt目录&…

k8s-NetworkPolicy

NetworkPolicy 是k8s中的网络策略可以限制pod以及namespace之间的访问流量 演示一下名称空间之间基于端口的访问限制 官方对networkpolicy的介绍 官方网址&#xff1a; 网络策略 |Kubernetes &#xff08;简体中文&#xff09; 一&#xff1a;创建NetworkPolicy vim…

【算法一周目】滑动窗口(1)

目录 长度最小的子数组 解题思路 代码实现 无重复字符的最大字串 解题思路 代码实现 最大连续1的个数l l l 解题思路 代码实现 将x减到0的最小操作数 解题思路 代码实现 长度最小的子数组 题目链接&#xff1a;209. 长度最小的子数组题目描述&#xff1a; 给定一个…

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司&#xff0c;专注于设计和制造用于多个行业的电子和电气组件&#xff0c;产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域&#xff0c;提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…

【K8S系列】Kubernetes集群资源管理与调度 深度分析

在现代微服务架构中&#xff0c;Kubernetes&#xff08;K8s&#xff09;作为容器编排平台&#xff0c;提供了强大的资源管理和调度能力。然而&#xff0c;随着应用规模的扩大和复杂性增加&#xff0c;如何高效地管理和调度集群资源成为一个关键挑战。本文将深入探讨 Kubernetes…