Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR

警告:此功能处于技术预览阶段,可能会在未来的版本中更改或删除。 Elastic 将尽最大努力修复任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。

Elastic Learned Sparse EncodeR - 或 ELSER - 是由 Elastic 训练的检索模型,使你能够执行语义搜索以检索更相关的搜索结果。 此搜索类型为您提供基于上下文含义和用户意图的搜索结果,而不是精确的关键字匹配。

ELSER 是一种域外(out-of-domain)模型,这意味着它不需要对你自己的数据进行微调,因此可以开箱即用地适应各种用例。

ELSER 将索引和搜索的段落扩展为术语集合,这些术语被学习为在不同的训练数据集中经常共同出现。 模型将文本扩展成的术语不是搜索术语的同义词; 他们是博学的协会。 这些扩展的术语被加权,因为其中一些比其他的更重要。 然后 Elasticsearch rank-feature 字段类型用于在索引时存储术语和权重,并在以后进行搜索。

以下安装是在 Elastic Stack 8.8 下完成的。

要求

要使用 ELSER,你必须具有相应的语义搜索(semantic search)订阅级别或激活试用期。

安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参阅如下的链接来进行安装:

在安装的时候,请注意选择 Elastic Stack 8.x 的指南来进行安装。我们需要安装 Elastic Stack 8.8 及以上版本。

启动白金试用

由于语义搜索是一个机器学习的范畴,是一个收费的功能。如果我们不启动试用版本,那么在下载的时候,会出现如下的错误信息:

我们按照如下的方式来启动白金试用:

 

 

 

 

这样,我们试用授权已经启动了。

下载并部署 ELSER 

我们有如下的三种方法来下载并部署 ELSER:

  • Machine Learning => Trained Models
  • Enterprise Search => Indices
  • 通过 Dev Console

下面,我们来详细介绍它的步骤。

通过机器学的 Trained Model 页面

 

 

 

上面显示:

 

我们可以看到它正在下载当中。我们需要等待一点时间。

 

 

我们点击 Play 按钮来进行部署。

 

至此,我们已经成功地部署了 ELSER。

通过 Enterprise Search 中的 Indices 页面

针对 Enterprise search 的安装,请参考文章 “Enterprise:使用 Elastic Stack 8.2 中的 Elasticsearch API 来定位 App Search 中的文档”。

你还可以直接从 Enterprise Search 应用下载 ELSER 并将其部署到推理管道。如果你的 Elasticsearch 还没有任何的索引的话,你可以使用类似如下的命令来创建一个索引:

PUT twitter/_doc/1
{
  "name": "Xiaoguo Liu from Elastic"
}

上述命令将生成一个叫做 twitter 的索引。

 

 

 

 

 

 

 

 

 

 

从上面我们可以看出来模型已经被成功地部署。我们可以在这个页面进行配置它的部署。

使用 Dev Console 来进行部署

我们在 Dev Tools 中,通过运行以下 API 调用创建 ELSER 模型配置:

PUT _ml/trained_models/.elser_model_1
{
  "input": {
	"field_names": ["text_field"]
  }
}

如果尚未下载模型,API 调用会自动启动模型下载。

等过一会儿,我们可以看到如下的页面:

 

我们可以在机器学习的 Trained Models 里进行查看。 

我们可以使用带有 delpoyment ID 的开始训练模型部署 API 来部署模型:

POST _ml/trained_models/.elser_model_1/deployment/_start?deployment_id=for_search

 

我们可以在机器学习的页面查看它的状态。上面显示已经是 started 状态。你可以使用不同的部署 ID 多次部署模型。 

以下示例为 ID 为 my_model_for_ingest 的 .elser_model_1 训练模型启动新部署。 部署 ID 可用于推理 API 调用或推理处理器。

POST _ml/trained_models/.elser_model_1/deployment/_start?deployment_id=my_model_for_ingest

可以使用不同的 ID 再次部署经过 my_model 训练的模型:

POST _ml/trained_models/.elser_model_1/deployment/_start?deployment_id=my_model_for_search

部署完成后,ELSER 就可以在摄取管道或 text_expansion 查询中使用以执行语义搜索。

如何使用 ELSER 模型

我们可以使用如下的命令来进行测试:

POST /_ml/trained_models/.elser_model_1/_infer
{
  "docs": {
    "text_field": "how is the weather in jamaica"
  }
}

从上面我们可以看出来它是一个 text_expansion 类型的模型:

在气隙环境中部署 ELSER

如果你想在受限或封闭的网络中部署 ELSER,你有两种选择:

  • 创建你自己的带有模型工件的 HTTP/HTTPS 端点,
  • 将模型工件放入所有符合主节点条件的配置目录内的目录中。

你的系统中需要以下文件:

https://ml-models.elastic.co/elser_model_1.metadata.json
https://ml-models.elastic.co/elser_model_1.pt
https://ml-models.elastic.co/elser_model_1.vocab.json

使用 HTTP 服务器

提示:如果你使用现有的 HTTP 服务器,请注意模型下载器仅支持无密码 HTTP 服务器。

你可以使用任何 HTTP 服务来部署 ELSER。 此示例使用官方 Nginx Docker 映像来设置新的 HTTP 下载服务。

1)从 https://ml-models.elastic.co/ 下载模型工件文件。

2)将文件放入你选择的子目录中。

3)运行以下命令:

export ELASTIC_ML_MODELS="/path/to/models"
docker run --rm -d -p 8080:80 --name ml-models -v ${ELASTIC_ML_MODELS}:/usr/share/nginx/html nginx

不要忘记将 /path/to/models 更改为模型工件文件所在的子目录的路径。

这些命令使用 Nginx 服务器启动本地 Docker 映像,其子目录包含模型文件。 由于需要下载和构建Docker镜像,第一次启动可能需要较长的时间。 随后的运行开始得更快。

4)通过在浏览器中访问以下 URL 来验证 Nginx 是否正常运行:

http://{IP_ADDRESS_OR_HOSTNAME}:8080/elser_model_1.metadata.json

如果 Nginx 正常运行,你会看到模型的元数据文件的内容。

5)通过将以下行添加到 config/elasticsearch.yml 文件,将你的 Elasticsearch 部署指向 HTTP 服务器上的模型工件:

xpack.ml.model_repository: http://{IP_ADDRESS_OR_HOSTNAME}:8080

如果你使用自己的 HTTP 或 HTTPS 服务器,请相应地更改地址。 指定协议很重要(“http://”或“https://”)。 确保所有符合主节点条件的节点都可以访问你指定的服务器。

6)在所有符合主节点资格的节点上重复步骤 5。

7)一个接一个地重启 master-eligible节点。

仅下载模型需要 HTTP 服务器。 下载完成后,你可以停止并删除该服务。 你可以通过运行以下命令停止此示例中使用的 Docker 镜像:

docker stop ml-models

使用基于文件的访问

对于基于文件的访问,请执行以下步骤:

1)从 https://ml-models.elastic.co/ 下载模型工件文件。
2)将文件放入 Elasticsearch 部署的配置目录内的模型子目录中。
3)通过将以下行添加到 config/elasticsearch.yml 文件,将你的 Elasticsearch 部署指向模型目录:

xpack.ml.model_repository: file://${path.home}/config/models/`

4)在所有符合主节点资格的节点上重复步骤 2 和步骤 3。
5)一个接一个地重启 master-eligible 节点。

猜你喜欢

转载自blog.csdn.net/UbuntuTouch/article/details/131180664