IBM Cloud Docs
使用 ELSER,Elastic 的自然语言处理模型

使用 ELSER,Elastic 的自然语言处理模型

弹性学习稀疏 EncodeR(ELSER) 是由 Elastic 训练的自然语言处理 (NLP) 模型,使您能够使用稀疏向量表示来执行语义搜索。 语义搜索将根据搜索查询的意向和上下文含义来检索结果,而不是对搜索项进行字面值匹配。

在本教程中,您将供应 Databases for Elasticsearch Platinum 实例,并将 ELSER 模型应用于文本主体,了解其如何提高搜索结果的质量。

这是围绕 机器学习探索 Elasticsearch 功能的三个教程中的第二个教程。 Machine Learning 是人工智能 (AI) 和计算机科学的一个分支,专注于使用数据和算法来模仿人类学习的方式,逐渐提高其准确性。 通过使用统计方法,训练算法以进行分类或预测,并发现数据挖掘项目中的关键洞察。

请参阅此 Elasticsearch 机器学习系列中的其他教程:

Databases for Elasticsearch 是付费服务,因此遵循本教程将产生费用。

开始之前

要开始供应过程,请安装一些必备工具:

获取 API 密钥以将基础架构部署到您的帐户

创建 IBM Cloud API 密钥,使 Terraform 能够在您的帐户中供应基础结构。 您最多可以创建 20 个 API 密钥。

出于安全原因,API 密钥仅在创建时才可复制或下载。 如果 API 密钥丢失,必须创建新的 API 密钥。

克隆项目

GitHub 存储库克隆项目。

git clone https://github.com/IBM/elasticsearch-ml-elser-tutorial.git

安装 Elasticsearch 集群

  1. 浏览至克隆项目的 Terraform 文件夹。

    cd elasticsearch-ml-elser-tutorial/terraform
    
  2. 在机器上,使用以下字段创建名为 terraform.tfvars 的文档:

     ibmcloud_api_key = "<your_api_key_from_step_1>"
     region = "<your_region>"
     elastic_password = "<make-up-a-password>"
    

    terraform.tfvars 文档包含您可能希望保密的变量,因此会将其从公共 Github 存储库中排除。

  3. 使用以下命令安装基础架构

    terraform init
    terraform apply --auto-approve
    

最后,将数据库访问 URL 导出到终端环境(后续步骤将需要它)

 terraform output --json
 export ES="<the url value obtained from the output>"
 cd ..

安装 ELSER 模型

需要先安装并启动 ELSER 模型,然后才能使用该模型。 使用类似如下的命令进行安装:

curl -kX PUT "$ES/_ml/trained_models/.elser_model_1?pretty" -H 'Content-Type: application/json' -d'
{
  "input": {
	"field_names": ["text_field"]
  }
}
'

接下来,通过输入以下命令将其启动:

curl -kX POST "$ES/_ml/trained_models/.elser_model_1/deployment/_start?deployment_id=for_search&pretty"

您可能需要等待几分钟以使模型完成安装,然后启动命令才能执行。

为数据创建索引和映射

您应该位于项目文件夹的根目录中。 在终端中,使用类似如下的命令:

curl -kXPUT -H"Content-Type: application/json" -d@mapping.json $ES/test_data

这将在 ES 实例中创建名为 test_data 的索引。 它还将创建一些显式 映射。 这是 Elastic 定义文档及其包含的字段的存储和索引方式的方式。 映射定义存储在 mapping.json 文件中。 它定义了一个名为 ml.tokens 的字段,该字段将用于存储在分析您上载的数据时将创建机器学习算法的所有其他数据 (令牌)。 该数据将包含在名为 text 的字段中,该字段也在映射文档中显式定义。

创建用于分析数据的采集管道

ELSER 模型预安装在 Databases for Elasticsearch的所有白金部署中。 您只需要创建一个使用它来分析传入数据的 管道

curl -kX PUT -H"Content-Type: application/json" -d@pipeline.json $ES/_ingest/pipeline/elser-v1-test

pipeline.json 文档具有管道定义。 它描述了在上载文档时将对其进行的处理。 在这种情况下,它定义 ELSER 模型的使用,并告诉 ES 将任何生成的数据放在索引的 ml.tokens 字段中。

这是一条非常简单的管道。 例如,它不会处理任何摄取错误,而只是废弃这些错误。 但是对于这个演示来说就足够了。

上传数据

import.json 文档包含来自 msmarco-passagetest2019-top1000 数据集的数据,该数据集是 MS MARCO 通道排名数据集的子集。 它由 200 个查询组成,每个查询都附有相关文本段落的列表。 所有唯一段落及其标识都已从该数据集抽取并准备好 批量上载 到 Elasticsearch。

在此步骤中,将数据上载到 Elasticsearch,并在数据上载时通过 ELSER 分析器传递数据。

执行自然语言处理分析是计算密集型操作,因此此过程将需要多个小时 (最多 12 个小时)。 我们将批量上载 100 个条目,以确保管道缓冲区不会过度运行。

因此,首先将 import.json 文档拆分为更小的文档,每个文档包含 100 个条目 (每个条目都是文档中的两行):

split -l 200 -a 4  import.json

这就创造了几百个小文档。 通过运行 upload.sh 脚本将其导入:

./upload.sh

对于每个上载的文档,ELSER 模型尝试推断文本的内容,并将生成一组它认为相关的词以及相关性分数。 以下是摄入文档的一个示例:

{
  "_index": "test_data",
  "_id": "1",
  "_version": 3,
  "_seq_no": 1310,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "text": "This is the definition of RNA along with examples of types of RNA molecules. This is the definition of RNA along with examples of types of RNA molecules. RNA Definition",
    "ml": {
      "tokens": {
        "molecules": 0.9468944,
        "cell": 0.31727117,
        "type": 0.1881346,
        "lab": 0.14050934,
        "example": 0.27423903,
        "strand": 0.11950072,
        "dna": 0.82435495,
        "protein": 0.25066674,
        "term": 0.5622088,
        "definition": 0.21340553,
        "nuclear": 0.03731725,
        "different": 0.026590228,
        "element": 0.42168307,
        "genetic": 0.36145726,
        "types": 0.7244048,
        "characteristics": 0.24549837,
        "adam": 0.15298073,
        "rna": 1.949169,
        "organism": 0.27345642,
        "gene": 0.57350045,
        "substance": 0.006454099,
        "mrna": 1.002312,
        "bond": 0.096653655,
        "structure": 0.1670035,
        "genome": 0.24130683,
        "sequence": 0.21949387,
        "q": 0.028950738,
        "unit": 0.1926791,
        "examples": 1.0590855,
        "material": 0.034060754,
        "chemical": 0.454947,
        "science": 0.20523745,
        "biological": 0.47201967,
        "molecule": 0.92732555,
        "atom": 0.021480415,
        "word": 0.2971402
      },
      "model_id": ".elser_model_1"
    }
  }
}

您可以看到它创建的关系超出了文本上的实际单词。 例如,它已推断此片段是关于 sciencegenesdna 的。

坐下来放松 您的导入需要一些时间。

搜索数据集并比较结果

上载数据集后,即可对其进行测试,尤其是 ELSER NLP 处理器可对搜索结果的质量产生的差异。 以下搜索查询将使用生成的标记来返回看起来最相关的结果:

curl -k -H"Content-Type: application/json" -d@elserquery.json $ES/test_data/_search | jq .

请将其与不使用令牌的查询进行比较,并仅对原始文本进行搜索:

curl -k -H"Content-Type: application/json" -d@query.json $ES/test_data/_search | jq .

您可以通过更改 query.jsonelserquery.json 文件中的文本来尝试其他查询。 尝试类似如下的操作:

what is the best exercise for stiff limbs?

explain how the US president is elected

在所有这些情况下,ELSER 增强的结果更相关。

当然,这并不适用于所有搜索。 例如,搜索 taylor swift 将在这两者上生成类似的结果。 所以这一切都取决于搜索的类型和索引中的数据。 但是,您可以看到,通过应用 ELSER ML 模型,可以显着改进许多搜索。

拆除基础架构

Databases for Elasticsearch 会产生费用。 完成本教程后,可以通过转至项目的 terraform 目录并使用以下命令来除去所有基础结构:

terraform destroy

准备好了吗?

ELSER 只是一个 ML 模型。 还有许多其他计划,通过 Databases for Elasticsearch Platinum 计划,您可以轻松部署其他计划,并改为使用这些计划来分析数据。 我们汇总了一个教程,其中 向您展示了如何执行此操作