Elasticsearch:使用 ELSER v2 文本扩展进行语义搜索

news2024/12/23 4:14:33

Elastic 提供了一个强大的 ELSER 供我们进行语义搜索。ELSER 是一种稀疏向量的搜索方法。我们无需对它做任何的微调及训练。它是一种 out-of-domain 的模型。目前它仅对英文进行支持。希望将来它能对其它的语言支持的更好。更多关于 ELSER 的知识,请参阅文章 “Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR”。在本文中,我们将使用第二版的  ELSER 来进行语义搜索。我将使用 Jupyter notebook 演示如何使用 ELSER 模型 .elser_model_2 模型,该模型提供了更高的检索精度。

如果你已使用 ELSER 模型 .elser_model_1 设置索引,并且想要升级到 ELSER v2 模型 - .elser_model_2,请按照文章升级索引以使用 elser 模型的说明进行操作 来进行升级。

 安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考文章:

安装 Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考一下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,请选择 Elastic Stack 8.x 进行安装。在安装的时候,我们可以看到如下的安装信息:

​​

为了能够上传向量模型,我们必须订阅白金版或试用。

​​

​​

Python

我们需要安装相应的 Elasticsearch 包:

$ pwd
/Users/liuxg/python/elser
$ pip3 install elasticsearch -qU
$ pip3 list | grep elasticseach
elasticsearch             8.11.1
rag-elasticsearch         0.0.1        /Users/liuxg/python/rag-elasticsearch/my-app/packages/rag-elasticsearch

环境变量

在启动 Jupyter 之前,我们设置如下的环境变量:

export ES_USER="elastic"
export ES_PASSWORD="yarOjyX5CLqTsKVE3v*d"
export ES_ENDPOINT="localhost"

拷贝 Elasticsearch 证书

我们把 Elasticsearch 的证书拷贝到当前的目录下:

$ pwd
/Users/liuxg/python/elser
$ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .
$ ls
 find_books_about_christmas_without_searching_for_christmas.ipynb
Chatbot with LangChain conversational chain and OpenAI.ipynb
ElasticKnnSearch.ipynb
ElasticVectorSearch.ipynb
ElasticsearchStore.ipynb
Mental Health FAQ.ipynb
Multilingual semantic search.ipynb
NLP text search using hugging face transformer model.ipynb
Question Answering with Langchain and OpenAI.ipynb
RAG-langchain-elasticsearch.ipynb
Semantic search - ELSER.ipynb
Semantic search quick start.ipynb
book_summaries_1000_chunked.json
books.json
data.json
http_ca.crt
lib
sample_data.json
upgrading-index-to-use-elser.ipynb
vector_search_implementation_guide_api.ipynb
workplace-docs.json

在上面,我们把  Elasticsearch 的证书 http_ca.crt 拷贝到当前的目录下。

运行应用

连接到 Elasticsearch

from elasticsearch import Elasticsearch
import os
 
elastic_user=os.getenv('ES_USER')
elastic_password=os.getenv('ES_PASSWORD')
elastic_endpoint=os.getenv("ES_ENDPOINT")
 
url = f"https://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
es = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)
 
print(es.info())

从上面的输出中,我们可以看到,连接到 Elasticsearch 是成功的。

如果你对如何连接到 Elasticsearch 还不是很熟悉的话,那么请阅读文章 “Elasticsearch:关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x”。

下载及部署 ELSER 模型

下面,我们来尝试通过软件的方式来针对 ELSER 进行手动部署。在此示例中,我们将下载 ELSER 模型并将其部署到 ML 节点中。 确保你有一个 ML 节点才能运行 ELSER 模型。如果你之前已经下载过,我们通过软件的方式来进行删除,并安装最新的模型:

# delete model if already downloaded and deployed
try:
  es.ml.delete_trained_model(model_id=".elser_model_2",force=True)
  print("Model deleted successfully, We will proceed with creating one")
except exceptions.NotFoundError:
  print("Model doesn't exist, but We will proceed with creating one")

# Creates the ELSER model configuration. Automatically downloads the model if it doesn't exist. 
es.ml.put_trained_model(
    model_id=".elser_model_2",
    input={
      "field_names": ["text_field"]
    }
  )

我们回到 Kibana 的界面中进行查看:

上面显示, .elser_model_2 正在被下载。我们需要等一段时间才能下载完毕。这个依赖于你自己的网路速度。使用以下命令检查模型下载的状态。

while True:
    status = es.ml.get_trained_models(
        model_id=".elser_model_2",
        include="definition_status"
    )
    
    if (status["trained_model_configs"][0]["fully_defined"]):
        print("ELSER Model is downloaded and ready to be deployed.")
        break
    else:
        print("ELSER Model is downloaded but not ready to be deployed.")
    time.sleep(5)

在 Kibana 中显示的状态为:

下载完模型后,我们可以将模型部署到 ML 节点中。 使用以下命令部署模型。

import time

# Start trained model deployment if not already deployed
es.ml.start_trained_model_deployment(
  model_id=".elser_model_2",
  number_of_allocations=1,
  wait_for="starting"
)

如上所示,在 Kibana 的界面中,我们可以看到 .elser_model_2 已经被成功地部署了。我们可以使用如下的代码来查看状态:

while True:
  status = es.ml.get_trained_models_stats(
    model_id=".elser_model_2",
  )
  if (status["trained_model_stats"][0]["deployment_stats"]["state"] == "started"):
    print("ELSER Model has been successfully deployed.")
    break
  else:
    print("ELSER Model is currently being deployed.")
  time.sleep(5)

摄入一些文档到 Elasticsearch

为了在我们的 Elasticsearch 中使用 ELSER,我们需要创建一个包含运行 ELSER 模型的推理处理器的摄取管道。 让我们使用 put_pipeline 方法添加该管道。

es.ingest.put_pipeline(
    id="elser-ingest-pipeline", 
    description="Ingest pipeline for ELSER",
    processors=[
    {
      "inference": {
        "model_id": ".elser_model_2",
        "input_output": [
            {
              "input_field": "plot",
              "output_field": "plot_embedding"
            }
          ]
      }
    }
  ]
)

让我们记下该 API 调用中的一些重要参数:

  • inference:使用机器学习模型执行推理的处理器。
  • model_id:指定要使用的机器学习模型的 ID。 在此示例中,模型 ID 设置为 .elser_model_2。
  • input_output:指定输入和输出字段
  • input_field:创建稀疏向量表示的字段名称。
  • output_field:包含推理结果的字段名称。

创建索引

要在索引时使用 ELSER 模型,我们需要创建支持 text_expansion 查询的索引映射。 该映射包括一个 sparse_vector 类型的字段,用于处理我们感兴趣的特征向量。 该字段包含 ELSER 模型根据输入文本创建的 token-weight 对。

让我们使用我们需要的映射创建一个名为 elser-example-movies 的索引。

es.indices.delete(index="elser-example-movies", ignore_unavailable=True)
es.indices.create(
  index="elser-example-movies",
  settings={
      "index": {
          "default_pipeline": "elser-ingest-pipeline"
      }
  },
  mappings={
    "properties": {
      "plot": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "plot_embedding": { 
        "type": "sparse_vector" 
      }
    }
  }
)

摄入文档

让我们插入 12 部电影的示例数据集。

如果出现错误,请检查模型是否已部署并且在 ML 节点中可用。 在较新版本的 Elastic Cloud 中,ML 节点是自动缩放的,并且 ML 节点可能尚未准备好。 等待几分钟,然后重试。在进行下面的运行之前,我们先在项目的根目录下创建如下的一个 movies.json 文档:

movies.json

[
    {
    "title": "Pulp Fiction",
    "runtime": "154",
    "plot": "The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
    "keyScene": "John Travolta is forced to inject adrenaline directly into Uma Thurman's heart after she overdoses on heroin.",
    "genre": "Crime, Drama",
    "released": "1994"
    },
    {
    "title": "The Dark Knight",
    "runtime": "152",
    "plot": "When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, Batman must accept one of the greatest psychological and physical tests of his ability to fight injustice.",
    "keyScene": "Batman angrily responds 'I’m Batman' when asked who he is by Falcone.",
    "genre": "Action, Crime, Drama, Thriller",
    "released": "2008"
    },
    {
    "title": "Fight Club",
    "runtime": "139",
    "plot": "An insomniac office worker and a devil-may-care soapmaker form an underground fight club that evolves into something much, much more.",
    "keyScene": "Brad Pitt explains the rules of Fight Club to Edward Norton. The first rule of Fight Club is: You do not talk about Fight Club. The second rule of Fight Club is: You do not talk about Fight Club.",
    "genre": "Drama",
    "released": "1999"
    },
    {
    "title": "Inception",
    "runtime": "148",
    "plot": "A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into thed of a C.E.O.",
    "keyScene": "Leonardo DiCaprio explains the concept of inception to Ellen Page by using a child's spinning top.",
    "genre": "Action, Adventure, Sci-Fi, Thriller",
    "released": "2010"
    },
    {
    "title": "The Matrix",
    "runtime": "136",
    "plot": "A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers.",
    "keyScene": "Red pill or blue pill? Morpheus offers Neo a choice between the red pill, which will allow him to learn the truth about the Matrix, or the blue pill, which will return him to his former life.",
    "genre": "Action, Sci-Fi",
    "released": "1999"
    },
    {
    "title": "The Shawshank Redemption",
    "runtime": "142",
    "plot": "Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.",
    "keyScene": "Andy Dufresne escapes from Shawshank prison by crawling through a sewer pipe.",
    "genre": "Drama",
    "released": "1994"
    },
    {
    "title": "Goodfellas",
    "runtime": "146",
    "plot": "The story of Henry Hill and his life in the mob, covering his relationship with his wife Karen Hill and his mob partners Jimmy Conway and Tommy DeVito in the Italian-American crime syndicate.",
    "keyScene": "Joe Pesci's character Tommy DeVito shoots young Spider in the foot for not getting him a drink.",
    "genre": "Biography, Crime, Drama",
    "released": "1990"
    },
    {
    "title": "Se7en",
    "runtime": "127",
    "plot": "Two detectives, a rookie and a veteran, hunt a serial killer who uses the seven deadly sins as his motives.",
    "keyScene": "Brad Pitt's character David Mills shoots John Doe after he reveals that he murdered Mills' wife.",
    "genre": "Crime, Drama, Mystery, Thriller",
    "released": "1995"
    },
    {
    "title": "The Silence of the Lambs",
    "runtime": "118",
    "plot": "A young F.B.I. cadet must receive the help of an incarcerated and manipulative cannibal killer to help catch another serial killer, a madman who skins his victims.",
    "keyScene": "Hannibal Lecter explains to Clarice Starling that he ate a census taker's liver with some fava beans and a nice Chianti.",
    "genre": "Crime, Drama, Thriller",
    "released": "1991"
    },
    {
    "title": "The Godfather",
    "runtime": "175",
    "plot": "An organized crime dynasty's aging patriarch transfers control of his clandestine empire to his reluctant son.",
    "keyScene": "James Caan's character Sonny Corleone is shot to death at a toll booth by a number of machine gun toting enemies.",
    "genre": "Crime, Drama",
    "released": "1972"
    },
    {
    "title": "The Departed",
    "runtime": "151",
    "plot": "An undercover cop and a mole in the police attempt to identify each other while infiltrating an Irish gang in South Boston.",
    "keyScene": "Leonardo DiCaprio's character Billy Costigan is shot to death by Matt Damon's character Colin Sullivan.",
    "genre": "Crime, Drama, Thriller",
    "released": "2006"
    },
    {
    "title": "The Usual Suspects",
    "runtime": "106",
    "plot": "A sole survivor tells of the twisty events leading up to a horrific gun battle on a boat, which began when five criminals met at a seemingly random police lineup.",
    "keyScene": "Kevin Spacey's character Verbal Kint is revealed to be the mastermind behind the crime, when his limp disappears as he walks away from the police station.",
    "genre": "Crime, Mystery, Thriller",
    "released": "1995"
    }
]
$ pwd
/Users/liuxg/python/elser
$ ls Install\ ELSER.ipynb 
Install ELSER.ipynb
$ ls movies.json 
movies.json
import json
from elasticsearch import helpers
 
with open('movies.json') as f:
   data_json = json.load(f)
 
# Prepare the documents to be indexed
documents = []
for doc in data_json:
    documents.append({
        "_index": "elser-example-movies",
        "_source": doc,
    })
 
# Use helpers.bulk to index
helpers.bulk(es, documents)
 
print("Done indexing documents into `elser-example-movies` index!")
time.sleep(3)

检查新文档以确认它现在有一个 plot_embedding 字段,其中包含新的附加术语列表。 这些术语是创建管道时在 input_field 中用于 ELSER 推理的目标字段的文本扩展。 ELSER 实质上创建了一个扩展术语树,以提高文档的语义可搜索性。 我们将能够使用 text_expansion 查询来搜索这些文档。我们可以在 Kibana 中查看:

但首先让我们从简单的关键字搜索开始,看看 ELSER 如何提供开箱即用的语义相关结果。

搜索文档

response = es.search(
    index='elser-example-movies', 
    size=3,
    query={
        "text_expansion": {
            "plot_embedding": {
                "model_id":".elser_model_2",
                "model_text":"fighting movie"
            }
        }
    }
)

for hit in response['hits']['hits']:
    doc_id = hit['_id']
    score = hit['_score']
    title = hit['_source']['title']
    plot = hit['_source']['plot']
    print(f"Score: {score}\nTitle: {title}\nPlot: {plot}\n")

上面的所有源码可以在地址 https://github.com/liu-xiao-guo/semantic_search_es/blob/main/Install%20ELSER.ipynb 进行下载。

下一步

现在我们有了使用 ELSER 进行语义搜索的工作示例,你可以在自己的数据上尝试一下。 

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

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

相关文章

关键字:new关键字

在 Java 中,new关键字用于创建对象实例。它是对象创建的语法糖,用于分配内存空间并调用构造函数来初始化对象。 以下是new关键字的基本语法: 在上述语法中,ObjectType是要创建对象的类名,objectName是对象的引用变量…

Android textview展示富文本内容

今天实现的内容,就是上图的效果,通过Span方式展示图片,需要支持文字颜色改变、加粗。支持style\"color:green; font-weight:bold;\"展示。尤其style标签中的font-size、font-weight是在原生中不被支持的。 所以我们今天需要使用自…

听GPT 讲Rust源代码--compiler(2)

File: rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs 在Rust源代码中,rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs文件的作用是为Cranelift代码生成器构建系统准备依赖项。 具体来说,该文件的主要目标是处理Crane…

HarmonyOS自学-Day3(做个登录功能小案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!登录功能小案例 文章声明⭐⭐⭐ 该文章为我(有编程语言基础,非编程小白)的 HarmonyOS自学笔记,此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

信息管理就业方向之产品经理

学长分享自己确定互联网产品经理的工作方向以及产品经理的相关工作情况。 互联网领域产品经理是对一个软件或者平台产品的运维和设计。比如网上订机票业务,需要根据筛选用户的需求,确定要实现的某个需求,然后画出原型图,流程图等…

blender mix节点和它的混合模式

Mix 节点是一种用于混合两个颜色或者两个图像的节点,它有以下几个输入和输出: Color1:用于接收第一个颜色或者图像,也就是基色。Color2:用于接收第二个颜色或者图像,也就是混合色。Fac:用于控制…

一个计算机视觉从业者2023回顾

作为一个计算机视觉从业者,我非常认同上面所列的技术发展规划。在计算机视觉领域,我认为要实现这些规划,需要注重以下几个方面的发展和预测: 深入学习新技术:计算机视觉领域的技术发展非常迅速,不断涌现出新…

原生与封装Ajax

Ajax 一.Ajax概述 1.应用场景 在线视频、直播平台等…评论实时更新、点赞、小礼物、…会员注册时的信息验证,手机号、账号唯一百度关键搜索补全功能 2.简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML)&#x…

全面分析解决mfc110u.dll丢失的5种方法,简单三步即可搞定

在计算机使用过程中,我们可能会遇到一些错误提示,其中“找不到mfc110u.dll”是常见的一种。mfc110u.dll是Microsoft Foundation Class(MFC)库中的一个动态链接库文件,它提供了许多用于开发Windows应用程序的函数和类。…

Win7/Win10/Win11系统优点缺点

Windows7优点: 熟悉的用户界面:Windows 7具有传统的用户界面,对于习惯了Windows XP或Windows Vista的用户来说很容易上手。 稳定性高:Windows 7在稳定性方面表现良好,大多数用户都能够获得可靠的性能和运行体验。 兼容…

分库分表之Mycat应用学习二

3 Mycat 概念与配置 官网 http://www.mycat.io/ Mycat 概要介绍 https://github.com/MyCATApache/Mycat-Server 入门指南 https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%973.1 Mycat 介绍与核心概念 3.1.1 基本介绍 历史&#x…

AI绘图之风景画

这一段时间AI画图比较火,笔者也尝试了一些工具,在使用的过程中发现midjourney比较适合小白,而且画的画比较符合要求。质量也高。当然AI时代的来临大家也不要太慌,毕竟人才是最重要的,AI还是要靠人输入内容才可以生成内…

【继承多态】

#include <iostream> #include <string>int monster 10000; // 全局变量class Hero { protected:std::string name;int hp;int attack;public:// 公有的无参构造函数Hero() : hp(100), attack(10) {}// 公有的有参构造函数Hero(const std::string& n, int h,…

【后端已完成,前端更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】

目录 &#xff08;1&#xff09;项目可行性分析 &#xff08;一&#xff09;技术可行性&#xff1a; &#xff08;二&#xff09;经济可行性&#xff1a; &#xff08;三&#xff09;社会可行性&#xff1a; &#xff08;2&#xff09;需求描述 功能模块图 用例图&#…

谷歌推出了一种名为提示扩展(Prompt Expansion)的创新框架,旨在帮助用户更轻松地创造出既高质量又多样化的图像。

谷歌推出了一种名为提示扩展&#xff08;Prompt Expansion&#xff09;的创新框架&#xff0c;旨在帮助用户更轻松地创造出既高质量又多样化的图像。 论文标题: Prompt Expansion for Adaptive Text-to-Image Generation 论文链接: https://arxiv.org/pdf/2312.16720.pdf 问…

iCloud 备份 如何删除?

文章目录 Intro操作效果 浏览器端触发手机操作 Intro 前几天重置手机系统&#xff0c;不小心向 iCloud 推送了手机备份。 可是我用的是不需要这份备份&#xff0c;想要删除&#xff0c;可是常规入口找不到删除icloud中备份的按钮。 需要如下设备&#xff1a; 一台iphone &am…

新网域名外部入库流程

注册商是新网&#xff0c;且在新网管理的&#xff0c;请使用此教程外部入库。 如您的域名注册商是新网但在聚名管理&#xff0c;请参考教程&#xff1a;https://www.west.cn/faq/list.asp?unid2539 在外部入库操作之前&#xff0c;请先登录新网获取用户ID和绑定邮箱信息。…

CodeWave智能开发平台--02--目标:文档快速阅读

CodeWave智能开发平台的02次接触-实现快速了解CodeWave平台 CodeWave参考资源 网易数帆CodeWave开发者社区课程中心 网易数帆CodeWave开发者社区文档中心 CodeWave智能开发平台-文档快速阅读指北 大家如果看了本专栏中的第一篇博客&#xff0c;应该知道我接触CodeWave不久&a…

在vscode中创建任务编译module源文件

接昨天的文章 [创建并使用自己的C模块&#xff08;Windows10MSVC&#xff09;-CSDN博客]&#xff0c;觉得每次编译转到命令行下paste命令过于麻烦&#xff0c;于是研究了一下在vscode中创建自动编译任务。 经过尝试&#xff0c;在task.json中增加如下代码&#xff1a; {"…

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …