ELSER – 弹性学习稀疏编码器

编辑

Elastic 学习稀疏编码器 - 或 ELSER - 是 Elastic 训练的一个检索模型,使您可以执行语义搜索以检索更相关的搜索结果。此搜索类型根据上下文含义和用户意图提供搜索结果,而不是精确的关键字匹配。

ELSER 是一个域外模型,这意味着它不需要在您自己的数据上进行微调,使其能够开箱即用地适应各种用例。

此模型推荐用于英语文档和查询。如果您想对非英语文档执行语义搜索,请使用E5模型。

虽然 ELSER V2 普遍可用,但 ELSER V1 处于 [预览版] 此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受正式 GA 功能的支持 SLA 的约束。 ,并将保持技术预览状态。

词元 - 非同义词

编辑

ELSER 将已索引和搜索的段落扩展到术语集合中,这些术语经过学习,在各种训练数据中频繁共现。模型将文本扩展到的术语 *并非* 搜索术语的同义词;它们是捕获相关性的学习关联。这些扩展术语具有权重,因为其中一些术语比其他术语更重要。然后,Elasticsearch 的稀疏向量(或排名特征)字段类型用于在索引时存储术语和权重,并在以后进行搜索。

与向量嵌入相比,这种方法提供了更易于理解的搜索体验。但是,尝试直接解释词元和权重可能会产生误导,因为扩展实际上会在非常高维的空间中产生一个向量。因此,某些词元(尤其是权重低的词元)包含与表示中的其他低权重词元交织在一起的信息。在这方面,它们的功能类似于密集向量表示,使得难以分离它们的个体贡献。如果不仔细考虑分析过程,这种复杂性可能会导致误解。

要求

编辑

要使用 ELSER,您必须拥有用于语义搜索的相应订阅级别或已激活试用期。

如果部署自动缩放已关闭,则在 Elasticsearch Service 中部署和使用 ELSER 模型的最小专用 ML 节点大小为 4 GB。建议打开自动缩放,因为它允许您的部署根据需求动态调整资源。通过使用更多分配或每个分配更多线程可以实现更好的性能,这需要更大的 ML 节点。自动缩放会在需要时提供更大的节点。如果自动缩放已关闭,则您必须自己提供大小合适的节点。

建议为您的 ELSER 部署启用已训练模型自动缩放。请参考已训练模型自动缩放了解更多信息。

ELSER v2

编辑

与模型的初始版本相比,ELSER v2 提供了更高的检索精度和更有效的索引。此增强归因于训练数据集的扩展,其中包括高质量的问答对和改进的 FLOPS 正则化器,该正则化器降低了计算查询和文档之间相似性的成本。

ELSER v2 有两个版本:一个跨平台版本,可在任何硬件上运行;另一个版本针对 Intel® 芯片进行了优化。模型管理 > 已训练模型 页面会显示根据您的集群硬件推荐部署哪个版本的 ELSER v2。但是,推荐使用 ELSER 的方法是通过推理 API作为服务,这使得下载和部署模型更加容易,您无需从不同的版本中进行选择。

如果您想了解有关 ELSER V2 改进的更多信息,请参考这篇博文

升级到 ELSER v2
编辑

ELSER v2 与以前版本不兼容。如果您使用 ELSER v1 索引了您的数据,则需要使用引用 ELSER v2 的摄取管道重新索引它才能使用 v2 进行搜索。本教程 向您展示如何使用使用 ELSER v2 的推理处理器创建摄取管道,以及如何通过管道重新索引您的数据。

此外,elasticearch-labs GitHub 存储库包含一个交互式Python 笔记本,其中介绍了将索引升级到 ELSER V2 的过程。

下载和部署 ELSER

编辑

下载和部署 ELSER 最简单且推荐的方法是使用推理 API

  1. 在 Kibana 中,导航到开发控制台
  2. 通过运行以下 API 请求来创建具有 ELSER 服务的推理端点

    PUT _inference/sparse_embedding/my-elser-model
    {
      "service": "elasticsearch",
      "service_settings": {
        "num_allocations": 1,
        "num_threads": 1,
        "model_id": ".elser_model_2_linux-x86_64"
      }
    }

    API 请求会自动启动模型下载,然后部署模型。

请参考ELSER 推理服务文档以了解有关可用设置的更多信息。

创建 ELSER 推理端点后,即可用于语义搜索。在 Elastic Stack 中执行语义搜索最简单的方法是遵循semantic_text工作流程

下载和部署 ELSER 的替代方法
编辑

您还可以从机器学习 > 已训练模型、从搜索 > 索引下载和部署 ELSER,或者使用开发控制台中的已训练模型 API。

  • 对于大多数情况,首选版本是针对 Intel 和 Linux 优化的模型,建议下载和部署该版本。
  • 您可以通过在启动部署时分配唯一的部署 ID 来多次部署模型。这使您可以为不同目的(例如搜索和摄取)创建专用部署。这样可以确保搜索速度不受摄取工作负载的影响,反之亦然。为搜索和摄取创建单独的部署可以减少由于两者之间的交互而导致的性能问题,而这些问题可能难以诊断。
使用“已训练模型”页面
使用“已训练模型”页面
编辑
  1. 在 Kibana 中,导航到机器学习 > 已训练模型。ELSER 可以在已训练模型列表中找到。有两个版本可用:一个便携式版本,可在任何硬件上运行;另一个版本针对 Intel® 芯片进行了优化。您可以根据您的硬件配置查看推荐使用的模型。
  2. 单击添加已训练模型按钮。在打开的模式窗口中选择要使用的 ELSER 模型版本。根据您的硬件配置推荐的模型将突出显示。单击下载。您可以在通知页面上检查下载状态。

    Downloading ELSER

    或者,单击已训练模型列表中操作下的下载模型按钮。

  3. 下载完成后,单击开始部署按钮开始部署。
  4. 提供部署 ID,选择优先级,并设置每个分配的分配和线程数的值。

    Deploying ELSER
  5. 单击开始
使用搜索索引 UI
使用搜索索引 UI
编辑

或者,您可以使用搜索索引 UI 将 ELSER 下载并部署到推理管道。

  1. 在 Kibana 中,导航到搜索 > 索引
  2. 从列表中选择具有要使用 ELSER 的推理管道的索引。
  3. 导航到管道选项卡。
  4. 机器学习推理管道下,单击部署按钮开始下载 ELSER 模型。这可能需要几分钟时间,具体取决于您的网络。

    Deploying ELSER in Elasticsearch
  5. 下载模型后,单击启动单线程按钮以使用基本配置启动模型,或选择微调性能选项以导航到已训练模型页面,您可以在其中配置模型部署。

    Start ELSER in Elasticsearch
在开发控制台中使用已训练模型 API
在开发控制台中使用已训练模型 API
编辑
  1. 在 Kibana 中,导航到开发控制台
  2. 通过运行以下 API 调用来创建 ELSER 模型配置

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

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

  3. 使用启动已训练模型部署 API和部署 ID 部署模型

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

    您可以使用不同的部署 ID 多次部署模型。

在断开连接的环境中部署 ELSER

编辑

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

  • 在您的网络中创建自己的 HTTP/HTTPS 端点,并存放模型工件。
  • 将模型工件放入所有可担任主节点的节点的 config 目录下的某个目录中。
模型工件文件
编辑

对于跨平台版本,您的系统需要以下文件:

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

对于优化版本,您的系统需要以下文件:

https://ml-models.elastic.co/elser_model_2_linux-x86_64.metadata.json
https://ml-models.elastic.co/elser_model_2_linux-x86_64.pt
https://ml-models.elastic.co/elser_model_2_linux-x86_64.vocab.json
使用 HTTP 服务器
编辑

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

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

  1. 下载模型工件文件
  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_2.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. 逐个重启可担任主节点的节点。
  8. 在 Kibana 中导航到已训练模型页面,您可以在已训练模型列表中找到 ELSER。
  9. 单击添加已训练模型按钮,选择您在步骤 1 中下载并想要部署的 ELSER 模型版本,然后单击下载。所选模型将从您配置的 HTTP/HTTPS 服务器下载。
  10. 下载完成后,单击开始部署按钮开始部署。
  11. 提供部署 ID,选择优先级,并设置每个分配的分配和线程数的值。
  12. 单击开始

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

docker stop ml-models
使用基于文件的方法
编辑

对于基于文件的方法,请按照以下步骤操作:

  1. 下载模型工件文件
  2. 将文件放入 Elasticsearch 部署的 config 目录内的 models 子目录中。
  3. 通过将以下行添加到 config/elasticsearch.yml 文件中,将您的 Elasticsearch 部署指向模型目录:

    xpack.ml.model_repository: file://${path.home}/config/models/`
  4. 在所有可担任主节点的节点上重复步骤 2 和步骤 3。
  5. 逐个重启可担任主节点的节点。
  6. 在 Kibana 中导航到已训练模型页面,您可以在已训练模型列表中找到 ELSER。
  7. 单击添加已训练模型按钮,选择您在步骤 1 中下载并想要部署的 ELSER 模型版本,然后单击下载。所选模型将从您在步骤 2 中放置的模型目录下载。
  8. 下载完成后,单击开始部署按钮开始部署。
  9. 提供部署 ID,选择优先级,并设置每个分配的分配和线程数的值。
  10. 单击开始

测试 ELSER

编辑

您可以在 Kibana 中测试已部署的模型。导航到模型管理 > 已训练模型,在已训练模型列表中找到已部署的 ELSER 模型,然后从“操作”菜单中选择测试模型

您可以使用现有索引中的数据来测试模型。选择索引,然后选择要在其上测试 ELSER 的索引字段。提供搜索查询,然后单击测试。使用与文档相关的查询可以更轻松地评估模型召回率。

结果包含所选字段的十个随机值的列表,以及显示每个文档与查询的相关性的分数。分数越高,文档的相关性越高。您可以单击重新加载示例来重新加载示例文档。

Testing ELSER

性能注意事项

编辑
  • ELSER 最适合用于包含自然语言的小到中等大小的字段。对于连接器或网络爬虫用例,这最适合诸如 _title_、_description_、_summary_ 或 _abstract_ 之类的字段。由于 ELSER 对字段的前 512 个标记进行编码,因此对于大型字段,它可能无法提供相关性较高的结果。例如,网络爬虫文档上的 body_content,或使用连接器从办公文档中提取文本后生成的正文字段。对于此类较大的字段,请考虑将内容“分块”成多个值,其中每个块可以少于 512 个标记。
  • 较大的文档在摄取时间会花费更长的时间,并且每个文档的推理时间也会随着需要处理的文档中的字段数量的增加而增加。
  • 您的管道需要执行推理的字段越多,每个文档的摄取时间就越长。

要了解有关 ELSER 性能的更多信息,请参阅基准信息

预清理输入文本

编辑

输入文本的质量会显著影响嵌入的质量。为了获得最佳结果,建议在生成嵌入之前清理输入文本。您可能需要进行的确切预处理在很大程度上取决于您的文本。例如,如果您的文本包含 HTML 标签,请在摄取管道中使用HTML 去除处理器来移除不必要的元素。在摄取之前始终检查和清理输入文本,以消除任何可能影响结果的不相关实体。

使用 ELSER 的建议

编辑

为了充分利用 ELSER 已训练模型的价值,请考虑遵循以下建议列表。

  • 如果快速响应时间对您的用例很重要,请通过将 min_allocations 设置为 1 来始终保持机器学习资源可用。
  • 对于非关键用例或测试环境,将 min_allocations 设置为 0 可以节省成本。
  • 通过自适应分配或自适应资源启用自动缩放,使 Elasticsearch 能够根据流程上的负载来扩展或缩减 ELSER 部署的可用资源。
  • 对于摄取和搜索用例,请使用专用的、优化的 ELSER 推理端点。

    • 在 Kibana 中部署已训练模型时,您可以选择要优化 ELSER 部署的用例。
    • 如果您使用已训练模型或推理 API 并想要优化 ELSER 已训练模型部署或推理端点以进行摄取,请将线程数设置为 1 ("num_threads": 1)。
    • 如果您使用已训练模型或推理 API 并想要优化 ELSER 已训练模型部署或推理端点以进行搜索,请将线程数设置为大于 1

进一步阅读

编辑

基准信息

编辑

推荐使用 ELSER 的方法是将其作为服务通过推理 API来使用。

以下部分提供有关 ELSER 在不同硬件上的性能以及模型性能与 Elasticsearch BM25 和其他强大基准的比较信息。

版本概述
编辑

ELSER V2 具有一个优化版,该版本设计为仅在具有 x86-64 CPU 架构的 Linux 上运行,以及一个可在任何平台上运行的跨平台版

ELSER V2
编辑

除了性能改进之外,ELSER V2 中最大的变化是引入了第一个特定于平台的 ELSER 模型,即一个仅针对在具有 x86-64 CPU 架构的 Linux 上运行而优化的模型。此优化模型旨在与较新的英特尔 CPU 最佳配合,但它也适用于 AMD CPU。建议所有 ELSER 新用户都使用新的优化版 Linux-x86-64 模型,因为它比可在任何平台上运行的跨平台模型快得多。ELSER V2 生成的嵌入质量明显高于 ELSER V1。无论您使用哪个 ELSER V2 模型(优化版或跨平台版),生成的特定嵌入都是相同的。

定性基准
编辑

用于评估 ELSER 排序能力的指标是归一化折损累计增益 (NDCG),它可以处理多个相关文档和细粒度的文档评分。此指标应用于固定大小的检索文档列表,在本例中为前 10 个文档 (NDCG@10)。

下表显示了 ELSER V2 与 BM 25 的性能比较。ELSER V2 赢了 10 次,平局 1 次,输了 1 次,NDCG@10 的平均改进为 18%。

ELSER V2 benchmarks compared to BM25

BEIR 数据集的 NDCG@10(用于 BM25 和 ELSER V2——值越高越好)

硬件基准
编辑

虽然目标是创建尽可能高性能的模型,但检索准确性始终优先于速度,这是 ELSER 的设计原则之一。请参阅下表,了解有关预期模型性能的更多信息。这些值指的是对两个数据集和不同硬件配置执行的操作。您的数据集会影响模型性能。在您自己的数据上运行测试,以便更实际地了解模型在您用例中的性能。

ELSER V2
编辑

总的来说,优化后的 V2 模型的最大摄取率为 26 docs/s,而 ELSER V1 基准测试中的 ELSER V1 最大摄取率为 14 docs/s,吞吐量提高了 90%。

虚拟核心的性能(即,当分配数量大于 vCPU 的一半时)有所提高。以前,8 个和 16 个分配之间的性能提升约为 7%。它已增加到 17%(8.11 上的 ELSER V1)和 20%(对于优化的 ELSER V2)。这些测试是在一台 16vCPU 机器上进行的,所有文档都包含正好 256 个标记。

您特定数据集中文档的长度会对您的吞吐量数字产生重大影响。

请参阅这篇博文,了解有关 ELSER V2 性能改进的更多信息。

Summary of ELSER V1 and V2 benchmark reports

优化模型的结果显示出近乎线性的增长,直到达到 8 个分配,之后性能改进变得越来越小。在这种情况下,8 个分配时的性能为 22 docs/s,而 16 个分配时的性能为 26 docs/s,表明由于虚拟核心而性能提高了 20%。

ELSER V2 optimized benchmarks

跨平台 模型在 8 个和 16 个分配下的性能分别为 14 docs/s 和 16 docs/s,这表明由于虚拟核心的增加,性能提升了 12%。

ELSER V2 cross-platform benchmarks