加载中

ELSER

Elastic Learned Sparse EncodeR(简称 ELSER)是由 Elastic 训练的检索模型,可让您执行 语义搜索 以检索更相关的搜索结果。这种搜索类型根据上下文含义和用户意图提供搜索结果,而不是精确的关键字匹配。

ELSER 是一个跨领域模型,这意味着它不需要对您自己的数据进行微调,从而能够开箱即用地适应各种用例。

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

重要提示

尽管 ELSER V2 已经正式发布(GA),但 ELSER V1 目前是且将继续处于技术预览阶段。

ELSER 将索引和搜索的段落扩展为一组词条,这些词条是通过在多样化的训练数据集中学习频繁共同出现的。模型将文本扩展成的词条并不是搜索词条的同义词;它们是捕获相关性的习得关联。这些扩展的词条会被赋予权重,因为其中一些比另一些更重要。然后,Elasticsearch 稀疏向量(或 排序特征)字段类型用于在索引时存储词条和权重,以便以后进行搜索。

与向量嵌入相比,这种方法提供了更容易理解的搜索体验。然而,试图直接解释 token 和权重可能会产生误导,因为扩展本质上会产生一个高维空间中的向量。因此,某些 token(尤其是低权重的 token)包含与其他低权重 token 在表示中交织在一起的信息。在这方面,它们的作用类似于稠密向量表示,使得分离各自的贡献变得具有挑战性。如果在分析过程中没有仔细考虑,这种复杂性可能会导致错误解释。

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

注意
  • 您可以通过 Elastic 推理服务 (EIS) 使用 ELSER 模型。如果您在 EIS 上使用 ELSER,则无需管理 ELSER 模型所需的底层架构和资源,因为它不占用您节点的资源。

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

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

与模型的初始版本相比,ELSER v2 提供了更高的检索准确率和更高效的索引。这一改进归功于训练数据集的扩展(其中包括高质量的问题和答案对)以及改进的 FLOPS 正则化器,它降低了计算查询与文档之间相似度的成本。

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

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

ELSER v2 不具备向后兼容性。如果您使用 ELSER v1 对数据进行了索引,则需要使用引用 ELSER v2 的摄入管道对其进行重新索引,以便能够使用 v2 进行搜索。本教程向您展示了如何创建带有使用 ELSER v2 的推理处理器的摄入管道,以及如何通过该管道重新索引您的数据。

此外,elasticsearch-labs GitHub 仓库包含一个交互式的 Python notebook,其中详细介绍了将索引升级到 ELSER V2 的过程。

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

  1. 在 Kibana 中,导航到 Dev Console(开发控制台)
  2. 通过运行以下 API 请求,使用 ELSER 服务创建一个推理端点
				PUT _inference/sparse_embedding/my-elser-endpoint
					    {
      "service": "elasticsearch",
      "service_settings": {
        "adaptive_allocations": {
          "enabled": true,
          "min_number_of_allocations": 1,
          "max_number_of_allocations": 10
        },
        "num_threads": 1,
        "model_id": ".elser_model_2"
      }
    }
		

该 API 请求会自动启动模型下载,然后部署模型。本示例使用通过自适应分配的自动扩缩容

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

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

您还可以从 Machine Learning(机器学习) > Trained Models(已训练模型)Search(搜索) > Indices(索引),或者通过在开发控制台中使用已训练模型 API 来下载和部署 ELSER。

注意
  • 在大多数情况下,首选版本是 Intel 和 Linux 优化版模型,建议下载和部署该版本。
  • 您可以通过在启动部署时分配一个唯一的部署 ID 来多次部署该模型。这使您可以针对不同目的(例如搜索和摄入)拥有专用的部署。通过这样做,您可以确保搜索速度不受摄入工作负载的影响,反之亦然。为搜索和摄入拥有独立的部署可以缓解由于两者交互导致的性能问题,此类问题通常很难诊断。

如果您想在受限或封闭的网络中部署 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
		

信息 (INFO):如果您使用现有的 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 更改为模型构件文件所在的子目录路径。

    这些命令启动一个本地 Docker 镜像,其中包含带有包含模型文件的子目录的 Nginx 服务器。由于必须下载和构建 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. 从主菜单导航到 Trained Models(已训练模型)页面,或者在 Kibana 中使用全局搜索字段。可以在已训练模型列表中找到 ELSER。

  9. 点击 Add trained model(添加已训练模型)按钮,选择您在步骤 1 中下载且要部署的 ELSER 模型版本,然后点击 Download(下载)。所选模型将从您配置的 HTTP/HTTPS 服务器下载。

  10. 下载完成后,点击 Start deployment(开始部署)按钮开始部署。

  11. 提供部署 ID,选择优先级,并设置分配数和每个分配的线程数的值。

  12. 点击 Start(开始)

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. 从主菜单导航到 Trained Models(已训练模型)页面,或者在 Kibana 中使用全局搜索字段。可以在已训练模型列表中找到 ELSER。

  7. 点击 Add trained model(添加已训练模型)按钮,选择您在步骤 1 中下载且要部署的 ELSER 模型版本,然后点击 Download(下载)。所选模型将从您在步骤 2 中放置文件的模型目录中下载。

  8. 下载完成后,点击 Start deployment(开始部署)按钮开始部署。

  9. 提供部署 ID,选择优先级,并设置分配数和每个分配的线程数的值。

  10. 点击 Start(开始)

您可以在 Kibana 中测试部署的模型。从主菜单导航到 Trained Models(已训练模型)页面,或者在 Kibana 中使用全局搜索字段。在已训练模型列表中找到部署的 ELSER 模型,然后从操作菜单中选择 Test model(测试模型)

您可以使用现有索引中的数据来测试模型。选择索引,然后选择要对其测试 ELSER 的索引字段。提供搜索查询并点击 Test(测试)。当使用与文档相关的查询时,评估模型召回率会更简单。

结果包含所选字段的十个随机值列表,以及显示每个文档与查询相关程度的分数。分数越高,文档越相关。您可以通过点击 Reload examples(重新加载示例)来重新加载示例文档。

Testing ELSER
  • ELSER 在包含自然语言的中小型字段上效果最佳。对于连接器或网络爬虫用例,这与 titledescriptionsummaryabstract 等字段最匹配。由于 ELSER 对字段的前 512 个 token 进行编码,因此它可能无法为大字段提供同样相关的结果。例如,网络爬虫文档上的 body_content,或者通过连接器从 Office 文档中提取文本得到的正文字段。对于像这样较大的字段,请考虑将内容“分块”成多个值,其中每个块可以小于 512 个 token。
  • 较大的文档在摄入时需要更长的时间,并且文档中需要处理的字段越多,每个文档的推理时间也会增加。
  • 管道需要对其执行推理的字段越多,每个文档摄入花费的时间就越长。

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

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

为了从 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 模型——即优化为仅在具有 x86-64 CPU 架构的 Linux 上运行的模型。优化版模型旨在搭载更新的 Intel CPU 时发挥最佳性能,但它在 AMD CPU 上也能很好地运行。建议所有 ELSER 的新用户使用新的优化版 Linux-x86-64 模型,因为它比可在任何平台上运行的跨平台模型明显更快。ELSER V2 产生的嵌入质量明显高于 ELSER V1。无论您使用哪种 ELSER V2 模型(优化版还是跨平台版),产生的具体嵌入都是相同的。

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

下表显示了 ELSER V2 与 BM25 相比的性能。ELSER V2 取得了 10 胜、1 平、1 负的成绩,NDCG@10 平均提升了 18%。

ELSER V2 benchmarks compared to BM25

针对 BM25 和 ELSER V2 的 BEIR 数据集的 NDCG@10 - 值越高越好

重要提示

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

总体而言,优化版 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 个 token。

重要提示

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

请参考这篇博客文章以了解有关 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
© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.