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

news2024/11/22 5:27:40

你可以按照这些说明在 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.coloradmin.cn/o/2245111.html

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

相关文章

uniapp 购物弹窗组件 (微信小程序)

效果图&#xff0c;暂时只适应单规格&#xff0c;居中弹出和下方弹出&#xff0c;如需求不满足&#xff0c;请自行修改代码 &#xff08;更新于24/11/15) 居中显示效果 下方弹出效果 html <template><view class"" v-if"show":class"mod…

(Linux)搭建静态网站——基于http/https协议的静态网站

简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1&#xff1a;搭建一个web服务器&#xff0c;访问该服务器时显示“hello w…

爬取网易云音乐热歌榜:从入门到实战

爬取网易云音乐热歌榜&#xff1a;从入门到实战 前提声明 爬虫应遵守目标网站的robots.txt协议&#xff0c;尊重版权和用户隐私。本代码仅供学习和研究使用&#xff0c;不得用于商业用途。请确保在合法合规的前提下使用本代码。本代码所爬音乐为公开可选择的音乐 目录 引言…

Quality minus junk论文阅读

Quality minus junk论文阅读 文章目录 Quality minus junk论文阅读 AbstractTheoretical FrameworkEmpirical AnalysisDataQuality scorePortfoliosEx ante quality forecasts fundamentals Results and DiscussionThe price of qualityUnderstanding the price of quality: th…

利用RAGflow和LM Studio建立食品法规问答系统

前言 食品企业在管理标准、法规&#xff0c;特别是食品原料、特殊食品法规时&#xff0c;难以通过速查法规得到准确的结果。随着AI技术的发展&#xff0c;互联网上出现很多AI知识库的解决方案。 经过一轮测试&#xff0c;找到问题抓手、打通业务底层逻辑、对齐行业颗粒度、沉…

类和对象——拷贝构造函数,赋值运算符重载(C++)

1.拷⻉构造函数 如果⼀个构造函数的第⼀个参数是自身类类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此构造函数也叫做拷贝构造函数&#xff0c;也就是说拷贝构造是⼀个特殊的构造函数。 // 拷贝构造函数//d2(d1) Date(const Date& d) {_year d._yea…

浅谈软件开发中的yield关键字:从餐厅服务理解异步编程之美

在现代软件开发中&#xff0c;处理大量数据流时经常会遇到性能和内存消耗的问题。传统的编程方式往往是一次性获取所有数据&#xff0c;这就像餐厅厨师要把所有菜品做完才上菜一样&#xff0c;既不高效也不够灵活。而yield关键字的出现&#xff0c;为我们提供了一种优雅的解决方…

散户持股增厚工具:智能T0算法交易

最近市场很多都说牛市&#xff0c;但是大多数朋友怎么来的又怎么吐出去了。这会儿我们用T0的智能算法交易又可以增厚我们的持仓收益。简单来说&#xff0c;就是基于用户原有的股票持仓&#xff0c;针对同一标的&#xff0c;配合智能T0算法&#xff0c;每天全自动操作&#xff0…

[ 网络安全介绍 1 ] 什么是网络安全?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

R语言4.3.0安装教程【附安装包】

R for Windows是一个免费的用于统计计算和统计制图的优秀工具&#xff0c;是R语言开发工具。它拥有数据存储和处理系统、数组运算工具&#xff08;其向量、矩阵运算方面功能尤其强大&#xff09;、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面&#xff0c;可…

【网络】Socket编程TCP/UDP序列化和反序列化理解应用层(C++实现)Json::Value

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.基于Socket的UDP和TCP编程介绍 1.1 基本TCP客户—服务器程序设计基本框架 ​编辑1.2 基本UDP客户—服务器程序设计基本框…

小熊派Nano接入华为云

一、华为云IoTDA创建产品 创建如下服务&#xff0c;并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码&#xff1a;小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…

如何在 Ubuntu 上安装 Jellyfin 媒体服务器

Jellyfin 是一个开源的媒体服务器软件&#xff0c;让你可以整理、管理和流式传输你的个人媒体收藏&#xff0c;比如电影、音乐、电视节目和照片&#xff0c;而且完全免费&#xff0c;没有订阅费用或数据收集的担忧。 简介 媒体管理&#xff1a;Jellyfin 整理媒体库&#xff0…

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面&#xff0c;创建自己的项目 2、点击自己创建好的项目&#xff0c;在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…

实时直播平台如何实现美颜功能?第三方美颜API与美颜SDK的技术

通过实时美颜技术&#xff0c;主播可以轻松实现肤色优化、五官调整以及滤镜效果&#xff0c;极大提升观众的观看体验。本篇文章&#xff0c;小编将深入讲解实时直播平台如何通过第三方美颜API与美颜SDK实现美颜功能&#xff0c;以及其中的技术实现与关键要点。 一、实时美颜的…

使用GDB或Delve对已经运行起来的Go程序进行远程调试

同步发布在我的博客&#xff0c;欢迎来点赞。 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 背景 Java 程序可以很方便地通过 jdwp 参数指定一个对外端口进行远程调试&#xff0c;如 java \ -agentlib…

Ubuntu问题 -- 设置ubuntu的IP为静态IP (图形化界面设置) 小白友好

目的 为了将ubuntu服务器IP固定, 方便ssh连接人在服务器前使用图形化界面设置 设置 找到自己的网卡名称, 我的是 eno1, 并进入设置界面 查看当前的IP, 网关, 掩码和DNS (注意对应eno1) nmcli dev show掩码可以通过以下命令查看完整的 (注意对应eno1) , 我这里是255.255.255.…

实现一个string的indexof方法,给出时空复杂度估计

文心快码(BaiduComate)是基于百度文心大模型&#xff0c;在研发全流程全场景下为开发者提供辅助建议的智能代码助手。结合百度积累多年的编程现场大数据、外部优秀开源数据&#xff0c;可为开发者生成更符合实际研发场景的优秀代码&#xff0c;提升编码效率&#xff0c;释放“十…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

【lamafactory BLEU ROUGLE L评测】

1、BLEU/ROUGLE评测界面 2、这个是用BLEU 和ROUGL来评测 目录&#xff1a;saves/Qwen2-7B-Chat/lora/eval_2024-11-14-16-28-19/ 在saves文件夹 生成的文件如下 all_results.json文件 说明模型在这个测试集上是不好的 3、可以查看预测结果的文件 predict_result.json