Elastic Rerank

编辑

Elastic Rerank 是由 Elastic 训练的先进的跨编码器重新排序模型,可通过几个简单的 API 调用帮助您提高搜索相关性。Elastic Rerank 是 Elastic 的首个语义重新排序模型,可在支持的 Elastic 部署中通过 Elasticsearch Inference API 开箱即用。

使用 Elastic Rerank 来改进现有的搜索应用程序,包括

  • 传统的 BM25 评分
  • 混合语义搜索
  • 检索增强生成 (RAG)

该模型可以通过基于对查询和文档的更深层次的语义理解来重新排序结果,从而显著提高搜索结果的质量。

在重新排序 BM25 结果时,它在一个多样化的检索任务基准测试中提供了平均 40% 的排名质量提升,与大小为其 11 倍的模型性能相匹配。

可用性和要求

编辑

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

Elastic Cloud Serverless
编辑

从 2024 年 11 月 25 日起,Elastic Rerank 在 Elasticsearch Serverless 项目中可用。

Elastic Cloud 托管和自管理部署
编辑

Elastic Rerank 在 Elastic Stack 版本 8.17+ 中可用

  • 要使用 Elastic Rerank,您必须拥有适当的订阅级别或激活试用期。
  • 一个 4GB 的 ML 节点

    结合 ELSER(或其他托管模型)部署 Elastic Rerank 模型至少需要一个 8GB 的 ML 节点。试用 ML 节点的当前最大大小为 4GB(默认为 1GB)。

下载和部署

编辑

要下载和部署 Elastic Rerank,请使用 create inference API 创建一个 Elasticsearch 服务 rerank 端点。

有关使用 Elastic Rerank 的端到端示例,请参阅此 Python 笔记本

创建推理端点
编辑
  1. 在 Kibana 中,导航到 Dev Console
  2. 通过运行以下命令,使用 Elastic Rerank 服务创建一个推理端点

    PUT _inference/rerank/my-rerank-model
    {
      "service": "elasticsearch",
      "service_settings": {
        "adaptive_allocations": {
          "enabled": true,
          "min_number_of_allocations": 1,
          "max_number_of_allocations": 10
        },
        "num_threads": 1,
        "model_id": ".rerank-v1"
      }
    }

    API 请求会自动下载并部署模型。此示例使用通过自适应分配进行的自动缩放

使用 Kibana 控制台时,您可能会在响应中看到 502 bad gateway 错误。此错误通常只反映超时,而模型在后台下载。您可以在 Machine Learning UI 中查看下载进度。如果使用 Python 客户端,则可以将 timeout 参数设置为更高的值。

创建 Elastic Rerank 推理端点后,即可将其与 text_similarity_reranker 检索器一起使用。

在气隙环境中部署

编辑

如果要在受限或封闭的网络中部署 Elastic Rerank 模型,您有两种选择

  • 使用模型工件在上面创建您自己的 HTTP/HTTPS 端点
  • 将模型工件放入所有主资格节点的 config 目录内的目录中。
模型工件文件
编辑

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

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

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

您可以使用任何 HTTP 服务来部署模型。此示例使用官方 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/rerank-v1.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. 按照 这些步骤创建一个推理端点以部署模型。

下载模型只需要 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. 按照 这些步骤创建一个推理端点以部署模型。

限制

编辑
  • 仅限英语
  • 最大上下文窗口为 512 个标记

    使用 semantic_text 字段类型时,文本会分成块。默认情况下,每个块包含 250 个单词(大约 400 个标记)。增加块大小时要小心 - 如果您的查询和块文本的总长度超过 512 个标记,则模型将无法访问完整内容。

    当组合输入超过 512 个标记限制时,将使用平衡截断策略。如果查询和输入文本都长于 255 个标记,则会截断两者,否则会截断最长的文本。

性能注意事项

编辑

重要的是要注意,如果您重新排序到深度 n,那么您将需要对每个查询运行 n 次推理。这将包括文档文本,因此比查询嵌入的推理成本要高得多。可以扩展硬件以并行运行这些推理,但我们建议对 CPU 推理进行浅层重新排序:不超过前 30 个结果。您可能会发现,预览版本对于高查询率和低查询延迟要求来说成本过高。我们计划解决 GA 的性能问题。

模型规格

编辑
  • 专为英语内容而构建
  • 相对较小:1.84 亿个参数(8600 万个主干 + 9800 万个嵌入层)
  • 与十亿参数重新排序模型性能相匹配
  • 直接构建到 Elasticsearch 中 - 不需要外部服务或依赖项

模型架构

编辑

Elastic Rerank 基于 DeBERTa v3 语言模型架构构建。

该模型采用几个关键的架构功能,使其在重新排序方面特别有效

  • 解耦注意力机制使模型能够

    • 分别处理单词内容和位置
    • 了解查询和文档文本之间更细微的关系
    • 更好地理解单词位置和关系的语义重要性
  • ELECTRA 式预训练使用

    • 一种类似 GAN 的标记预测方法
    • 同时训练标记生成和检测
    • 与传统的屏蔽语言建模相比,提高了参数效率

训练过程

编辑

以下是 Elastic Rerank 模型训练过程的概述

  • 初始相关性提取

    • 微调预训练的 DeBERTa [CLS] 标记表示
    • 使用 GeLU 激活和 dropout 层
    • 在适应重新排序任务的同时保留重要的预训练知识
  • 通过蒸馏训练

    • 使用双编码器和跨编码器模型的集合作为教师
    • 双编码器提供细微的负例评估
    • 跨编码器有助于区分正例和负例
    • 结合两种模型类型的优势
训练数据
编辑

训练数据包括

  • 开放域问答数据集
  • 自然文档对(如文章标题和摘要)
  • 180,000 个具有不同相关性的合成查询段落对
  • 总共约 300 万个查询

数据准备过程包括

  • 基本清理和模糊去重
  • 针对不同主题的多阶段提示(仅在训练数据的合成部分上进行)
  • 多样的查询类型

    • 关键词搜索
    • 精确短语匹配
    • 简短和较长的自然语言问题
负采样
编辑

该模型使用高级采样策略以确保高质量的排名

  • 使用多种检索方法,从每个查询的前 128 个文档中采样
  • 每个查询使用五个负样本 - 比典型方法更多
  • 应用由文档分数塑造的概率分布进行采样
  • 深度采样的好处

    • 提高模型在不同检索深度上的鲁棒性
    • 增强分数校准
    • 更好地处理文档多样性
训练优化
编辑

训练过程包含几个关键的优化

使用交叉熵损失函数来

  • 将相关性建模为概率分布
  • 学习所有文档分数之间的关系
  • 通过最大似然估计拟合分数

沿优化轨迹实施参数平均

  • 无需传统的学习率调度,并提高最终模型质量

性能

编辑

Elastic Rerank 在各种检索任务中显示出搜索质量的显着提高。

概述
编辑
  • 重新排序 BM25 结果时,排名质量平均提高 40%
  • 1.84 亿参数模型与 20 亿参数模型的性能相匹配
  • 使用 BEIR 基准套件在 21 个不同的数据集上进行评估
主要基准测试结果
编辑
  • 自然问题:提高 90%
  • MS MARCO:提高 85%
  • Climate-FEVER:提高 80%
  • FiQA-2018:提高 76%

有关详细的基准测试信息,包括完整的数据集结果和方法,请参阅Introducing Elastic Rerank 博客

更多资源

编辑

文档:

博客:

Python 笔记本: