ELSER
Elastic Stack 无服务器
Elastic Learned Sparse EncodeR(简称 ELSER)是由 Elastic 训练的检索模型,使您能够执行语义搜索以检索更相关的搜索结果。 这种搜索类型根据上下文含义和用户意图(而不是精确的关键词匹配)为您提供搜索结果。
ELSER 是一个领域外模型,这意味着它不需要对您自己的数据进行微调,使其能够开箱即用地适应各种用例。
建议将此模型用于英语文档和查询。 如果您想对非英语文档执行语义搜索,请使用E5模型。
虽然 ELSER V2 已正式发布,但 ELSER V1 处于 [预览] 状态,并将继续保持技术预览。
ELSER 将索引和搜索的段落扩展为术语集合,这些术语通过学习在各种训练数据集中频繁共现。模型将文本扩展成的术语不是搜索词的同义词;它们是捕获相关性的学习关联。这些扩展的术语被赋予权重,因为其中一些比另一些更重要。 然后,Elasticsearch 稀疏向量(或rank features)字段类型用于在索引时存储术语和权重,并在以后搜索。
与向量嵌入相比,这种方法提供了更易于理解的搜索体验。 但是,尝试直接解释 token 和权重可能会产生误导,因为扩展本质上会导致高维空间中的向量。 因此,某些 token,尤其是权重较低的 token,包含与其他表示形式中低权重 token 交织在一起的信息。 在这方面,它们的功能类似于密集向量表示,因此很难分离它们的各个贡献。 如果在分析过程中没有仔细考虑,这种复杂性可能会导致误解。
要使用 ELSER,您必须具有适用于语义搜索的适当订阅级别或激活试用期。
如果禁用部署自动缩放,则用于部署和使用 ELSER 模型的最小专用 ML 节点大小在 Elastic Cloud Hosted 中为 4 GB。 建议启用自动缩放,因为它允许您的部署根据需求动态调整资源。 通过使用更多的分配或每个分配更多的线程可以获得更好的性能,这需要更大的 ML 节点。 自动缩放在需要时提供更大的节点。 如果禁用自动缩放,则必须自己提供大小合适的节点。
建议为您的 ELSER 部署启用训练模型自动缩放。 请参阅训练模型自动缩放以了解更多信息。
与模型的初始版本相比,ELSER v2 提供了更高的检索准确性和更高效的索引编制。 这种增强归因于训练数据集的扩展,其中包括高质量的问答对和改进的 FLOPS 正则化器,从而降低了计算查询和文档之间相似度的成本。
ELSER v2 有两个版本:一个跨平台版本,可在任何硬件上运行,另一个版本针对 Intel® 芯片进行了优化。 模型管理 > 训练模型页面会根据您集群的硬件显示建议部署的 ELSER v2 版本。 但是,使用 ELSER 的推荐方式是通过inference API作为一种服务,这使得下载和部署模型变得更加容易,并且您无需从不同版本中进行选择。
如果您想了解有关 ELSER V2 改进的更多信息,请参阅此博客文章。
ELSER v2 不向后兼容。 如果您使用 ELSER v1 对数据进行了索引,则需要使用引用 ELSER v2 的摄取管道重新索引数据,才能使用 v2 进行搜索。 本教程向您展示了如何使用 ELSER v2 创建包含推理处理器的摄取管道,以及如何通过该管道重新索引数据。
此外,elasticearch-labs
GitHub 存储库包含一个交互式Python 笔记本,该笔记本介绍了如何将索引升级到 ELSER V2。
下载和部署 ELSER 最简单也是推荐的方式是使用inference API。
- 在 Kibana 中,导航至开发工具。
- 通过运行以下 API 请求,使用 ELSER 服务创建 inference 端点
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 inference 集成文档以了解有关可用设置的更多信息。
创建 ELSER inference 端点后,即可将其用于语义搜索。 在 Elastic Stack 中执行语义搜索的最简单方法是遵循 semantic_text
工作流程。
您还可以从机器学习 > 训练模型、从搜索 > 索引或者通过在开发工具中使用训练模型 API 来下载和部署 ELSER。
- 在大多数情况下,首选版本是英特尔和 Linux 优化模型,建议下载和部署该版本。
- 您可以通过在启动部署时分配唯一部署 ID 来多次部署模型。 它使您可以为不同的目的(例如搜索和摄取)提供专用部署。 这样做可以确保搜索速度不受摄取工作负载的影响,反之亦然。 为搜索和摄取提供单独的部署可以缓解两者之间交互导致的性能问题,这些问题可能难以诊断。
使用“训练模型”页面
使用搜索索引 UI
在开发控制台中使用已训练的模型 API
- 在 Kibana 中,导航至开发工具。
- 运行以下 API 调用来创建 ELSER 模型配置
PUT _ml/trained_models/.elser_model_2
{
"input": {
"field_names": ["text_field"]
}
}
如果模型尚未下载,则 API 调用会自动启动模型下载。
- 使用启动已训练的模型部署 API 和部署 ID 来部署模型
POST _ml/trained_models/.elser_model_2/deployment/_start?deployment_id=for_search
您可以使用不同的部署 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
信息:如果您使用现有的 HTTP 服务器,请注意模型下载器仅支持无密码 HTTP 服务器。
您可以使用任何 HTTP 服务来部署 ELSER。 此示例使用官方 Nginx Docker 镜像来设置新的 HTTP 下载服务。
下载模型工件文件。
将文件放入您选择的子目录中。
运行以下命令
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 镜像,因此首次启动可能需要更长的时间。 后续运行启动速度更快。
通过在浏览器中访问以下 URL 来验证 Nginx 是否正常运行
http://{IP_ADDRESS_OR_HOSTNAME}:8080/elser_model_2.metadata.json
如果 Nginx 运行正常,您会看到模型的 metdata 文件的内容。
通过将以下行添加到
config/elasticsearch.yml
文件中,将您的 Elasticsearch 部署指向 HTTP 服务器上的模型工件xpack.ml.model_repository: http://{IP_ADDRESS_OR_HOSTNAME}:8080
如果您使用自己的 HTTP 或 HTTPS 服务器,请相应地更改地址。 重要的是要指定协议(“http://”或“https://”)。 确保所有符合主节点资格的节点都可以访问您指定的服务器。
在所有符合主节点资格的节点上重复步骤 5。
重启符合主节点资格的节点,一次一个。
从主菜单导航到已训练的模型页面,或使用 Kibana 中的全局搜索字段。 可以在已训练的模型列表中找到 ELSER。
单击添加已训练的模型按钮,选择您在步骤 1 中下载并要部署的 ELSER 模型版本,然后单击下载。 所选模型将从您配置的 HTTP/HTTPS 服务器下载。
下载完成后,单击开始部署按钮来启动部署。
提供部署 ID,选择优先级,并设置每个分配的分配数和线程数值。
单击启动。
HTTP 服务器仅在下载模型时才需要。 下载完成后,您可以停止并删除该服务。 您可以通过运行以下命令来停止本示例中使用的 Docker 镜像
docker stop ml-models
对于基于文件的访问,请按照以下步骤操作
下载模型工件文件。
将文件放入 Elasticsearch 部署的
config
目录中的models
子目录中。通过将以下行添加到
config/elasticsearch.yml
文件中,将您的 Elasticsearch 部署指向模型目录xpack.ml.model_repository: file://${path.home}/config/models/
在所有符合主节点资格的节点上重复步骤 2 和步骤 3。
重启符合主节点资格的节点,一次一个。
从主菜单导航到已训练的模型页面,或使用 Kibana 中的全局搜索字段。 可以在已训练的模型列表中找到 ELSER。
单击添加已训练的模型按钮,选择您在步骤 1 中下载并要部署的 ELSER 模型版本,然后单击下载。 所选模型将从您在步骤 2 中放入的模型目录下载。
下载完成后,单击开始部署按钮来启动部署。
提供部署 ID,选择优先级,并设置每个分配的分配数和线程数值。
单击启动。
您可以在 Kibana 中测试已部署的模型。 从主菜单导航到模型管理 > 已训练的模型,或使用 Kibana 中的全局搜索字段。 在已训练的模型列表中找到已部署的 ELSER 模型,然后从“操作”菜单中选择测试模型。
您可以使用现有索引中的数据来测试模型。 选择索引,然后选择您要测试 ELSER 的索引字段。 提供搜索查询,然后单击测试。 使用与文档相关的查询可以更简单地评估模型召回率。
结果包含所选字段的十个随机值的列表,以及一个显示每个文档与查询的相关性的分数。 分数越高,文档的相关性越高。 您可以通过单击重新加载示例来重新加载示例文档。

- ELSER 最适用于包含自然语言的中小型字段。 对于连接器或 Web 爬虫用例,这与诸如*title*、*description*、*summary* 或 *abstract* 之类的字段最为匹配。 由于 ELSER 对字段的前 512 个令牌进行编码,因此它可能无法为大型字段提供相关的结果。 例如,Web 爬虫文档上的
body_content
,或通过连接器从 office 文档中提取文本产生的正文字段。 对于这些较大的字段,请考虑将内容“分块”为多个值,其中每个块可以少于 512 个令牌。 - 较大的文档在摄取时需要更长的时间,并且每个文档的推理时间也会随着需要处理的文档中字段的增多而增加。
- 您的管道必须对其执行推理的字段越多,每个文档的摄取时间就越长。
要了解有关 ELSER 性能的更多信息,请参阅基准信息。
输入文本的质量会显着影响嵌入的质量。 为了获得最佳效果,建议在生成嵌入之前清理输入文本。 您可能需要执行的确切预处理在很大程度上取决于您的文本。 例如,如果您的文本包含 HTML 标记,请在摄取管道中使用HTML strip 处理器来删除不必要的元素。 始终在摄取之前审查并清理您的输入文本,以消除任何可能影响结果的不相关实体。
为了从 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 与 BM 25 相比的性能。 ELSER V2 有 10 个胜利、1 个平局、1 个失败,并且 NDCG@10 的平均改进为 18%。

BM25 和 ELSER V2 的 BEIR 数据集的 NDCG@10 - 值越高越好
虽然目标是创建一个性能尽可能好的模型,但检索准确性始终优先于速度,这是 ELSER 的设计原则之一。请参阅下表以了解有关预期模型性能的更多信息。这些值是指在两个数据集和不同的硬件配置上执行的操作。您的数据集会对模型性能产生影响。在您自己的数据上运行测试,以便更真实地了解您的用例的模型性能。
总的来说,优化的 V2 模型摄取速度最高为 26 个文档/秒,而 ELSER V1 基准测试中 ELSER V1 的最高速度为 14 个文档/秒,吞吐量提高了 90%。
虚拟核心的性能(即,当分配数量大于 vCPU 的一半时)有所提高。 以前,8 到 16 个分配之间的性能提升约为 7%。 现在已提高到 17%(ELSER V1 on 8.11)和 20%(对于 ELSER V2 优化)。 这些测试是在一台 16vCPU 的机器上进行的,所有文档都包含正好 256 个 token。
特定数据集中文档的长度将对您的吞吐量数字产生重大影响。
请参考这篇博客文章,了解有关 ELSER V2 改进性能的更多信息。

优化的模型结果显示,在达到 8 个分配之前几乎呈线性增长,之后性能改进变得更小。 在这种情况下,8 个分配的性能为 22 个文档/秒,而 16 个分配的性能为 26 个文档/秒,这表明虚拟核心的性能提高了 20%。

跨平台模型的 8 个和 16 个分配的性能分别为 14 个文档/秒和 16 个文档/秒,这表明虚拟核心的性能提高了 12%。
