使用 HuggingFace 的 Elasticsearch 托管交叉编码器进行重新排序

了解如何使用来自 Hugging Face 的模型在 Elasticsearch 中托管和执行语义重新排序。

在本篇简短的博文中,我将向您展示如何在搜索时使用来自 Hugging Face 的模型在您自己的 Elasticsearch 集群中执行语义重新排序。我们将在 Jupyter Notebook 中使用 Eland 下载模型,加载来自 Hugging Face 的数据集,并使用检索器执行示例查询。

概述

如果您不熟悉语义文本,请查看以下资源

  • 什么是语义文本
  • 为什么要使用它
  • 如何创建推理 API 并将其连接到外部服务
  • 如何使用检索器查询进行重新排序

请查看以下链接

本博客和附带的 Notebook 中的代码也将帮助您入门,但我们不会深入探讨其原理和原因。

另外,请注意,我将在下面显示代码片段,但最好的方法是自己按照附带的 Notebook操作。

第一步

我还假设您有一个 Elasticsearch 集群或无服务器项目可用于本指南。如果没有,请访问cloud.elastic.co并注册免费试用!您将需要一个云 IDElasticsearch API 密钥

请稍等...

模型选择

第一步(真正意义上的第一步)是选择用于重新排序的模型。关于模型选择和评估结果的深入讨论不在本博文的讨论范围之内。请注意,目前Elasticsearch 仅支持交叉编码器模型

虽然没有直接涵盖模型选择,但以下博客很好地概述了如何评估搜索相关性。

在本指南中,我们将使用cross-encoder/ms-marco-MiniLM-L-6-v2。此模型使用 MS Marco 数据集进行检索和重新排序。

模型加载

要将 NLP 模型从 Hugging Face 加载到 Elasticsearch 中,您将使用 Eland Python 库。

Eland 是 Elastic 的 Python 库,用于数据帧分析以及将监督和 NLP 模型加载到 Elasticsearch 中。它提供了熟悉的与 Pandas 兼容的 API。

以下代码来自Notebook中的“Hugging Face 重新排序模型”部分。

model_id = "cross-encoder/ms-marco-MiniLM-L-6-v2"

cloud_id = "my_super_cloud_id"
api_key = "my_super_secred_api_key!"

!eland_import_hub_model \
--cloud-id $cloud_id \
--es-api-key $api_key \
--hub-model-id $model_id \
--task-type text_similarity

Eland 没有特定的 `rerank` 任务类型;我们使用 text_similarity 类型加载模型。

此步骤将下载运行代码所在的本地模型,将其拆分并加载到 Elasticsearch 集群中。

跳转到

在 Notebook 中,您可以按照说明设置集群,以便在下一节中运行重新排序查询。在 Notebook 中显示的下载模型后的设置步骤如下

  • 使用重新排序任务创建推理端点
    • 这还将在 Elasticsearch 机器学习节点上部署我们的重新排序模型
  • 创建索引映射
  • 从 Hugging Face 下载数据集 - CShorten/ML-ArXiv-Papers
  • 将数据索引到 Elasticsearch 中

重新排序时间!

在一切设置就绪后,我们可以使用 text_similarity_reranker 检索器进行查询。文本相似性重新排序器是一个两阶段重新排序器。这意味着首先运行指定的检索器,然后将这些结果传递到第二个重新排序阶段。

来自Notebook的示例

query = "sparse vector embedding"

# Query with Semantic Reranker
response_reranked = es.search(
    index="arxiv-papers-lexical",
    body={
      "size": 10,
      "retriever": {
        "text_similarity_reranker": {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "title": query
                }
              }
            }
          },
        "field": "abstract",
        "inference_id": "semantic-reranking",
        "inference_text": query,
        "rank_window_size": 100
      }
    },
    "fields": [
      "title", 
      "abstract"
    ], 
    "_source": False
    }
)

上面 text_similarity_reranker 的参数

  • `retriever - 在这里,我们使用标准检索器进行简单的匹配查询,以进行词汇第一阶段检索。您还可以在这里使用knn检索器或rrf检索器。
  • field - 来自第一阶段结果的字段,重新排序模型将使用该字段进行相似性比较。
  • inference_id - 用于重新排序的推理服务的 ID。在这里,我们使用之前加载的模型。
  • inference_text - 用于相似性排序的字符串
  • rank_window_size - 模型将考虑的第一阶段前 N 个文档的数量。

您可能想知道为什么 `rank_window_size` 设置为 100,即使您最终可能只需要前 10 个结果。

在两阶段搜索设置中,初始词汇搜索为语义重新排序器提供了广泛的文档集以供评估。返回 100 个较大的结果集可以增加语义重新排序器能够识别并根据语义内容而不是仅根据词汇匹配重新排序的相关文档的机会。这种方法弥补了词汇搜索在捕捉细微含义方面的局限性,允许语义模型筛选更广泛的可能性。

但是,找到合适的 `rank_window_size` 需要权衡。虽然更大的候选集可以提高准确性,但也可能会增加资源需求,因此需要进行一些调整才能在召回率和资源之间取得最佳平衡。

比较

虽然在本篇简短的指南中我不会提供对结果的深入分析,但可能普遍感兴趣的是查看标准词汇匹配查询的前 5 个结果以及上面重新排序查询的结果。

此数据集包含关于机器学习的 ArXiv 论文的子集。列出的结果是论文的标题。

“**评分结果**”是使用标准检索器获得的前 10 个结果

“**重新排序的结果**”是重新排序后的前 10 个结果

评分结果重新排序的结果
0紧凑型说话人嵌入:lrx-vector通过同时进行特征和样本减少来扩展稀疏支持向量机
1量子稀疏支持向量机稀疏随机图的空间嵌入
2稀疏支持向量无限推椭圆序数嵌入
3重新审视稀疏向量技术最小失真嵌入
4L-向量:用于域自适应的神经标签嵌入来自差分隐私稀疏向量和噪声最大机制的免费间隙信息
5稀疏随机图的空间嵌入用于分类、度量学习和距离近似的单个向量和向量对的插值离散嵌入
6存在向量内和向量间相关性的稀疏信号恢复注意力词嵌入
7用于降维的稳定稀疏子空间嵌入二进制说话人嵌入
8自动加权多视图稀疏重构嵌入NetSMF:作为稀疏矩阵分解的大规模网络嵌入
9使用无监督图学习将单词嵌入到非向量空间中估计流形上的向量场以及有向图的嵌入

轮到你了

希望您了解将来自 Hugging Face 的重新排序模型集成到 Elasticsearch 中以开始重新排序是多么容易。虽然这不是唯一的重新排序选项,但在您运行脱机环境、无法访问外部重新排序服务、希望控制成本或拥有特别适合您数据集的模型时,它可能会有所帮助。

立即尝试!

您可以在免费的实时研讨会环境中尝试随附的 Notebook!

点击此处立即前往实验室。

如果您还没有点击众多链接中的任何一个来访问配套笔记本,现在正是时候了!

Elasticsearch 充满了新功能,可以帮助您为您的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在您的本地机器上试用 Elastic。

准备好构建最先进的搜索体验了吗?

足够先进的搜索并非一人之力所能及。Elasticsearch 由数据科学家、ML Ops、工程师以及许多其他同样热衷于搜索的人员提供支持,他们与您一样热爱搜索。让我们携手合作,共同构建神奇的搜索体验,帮助您获得想要的结果。

亲自尝试