当前位置: 首页 > news >正文

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

作者:来自 Elastic Jeff Vestal

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

在这篇简短的博文中,我将向你展示如何使用 Hugging Face 中的模型在搜索时在你自己的 Elasticsearch 集群中执行语义重新排序。我们将使用 Eland 下载模型,从 Hugging Face 加载数据集,并使用检索器执行示例查询,所有这些都在 Jupyter 笔记本中完成。

概述

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

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

请查看以下链接:

  • 什么是语义重新排名以及如何使用它?
    • 了解在搜索和 RAG 管道中使用语义重新排名的权衡
  • 使用检索器在 Elasticsearch 中进行语义重新排名
    • 本博客包含视频演示和入门所需的所有内容的概述。
  • Elastic 文档 - 语义重新排名
    • 这个优秀的文档指南讨论了用例、编码器模型类型和 Elasticsearch 中的重新排名

本博客和随附笔记本中的代码也将帮助你入门,但我们不会深入讨论是什么和为什么。

另外,请注意,我将在下面展示代码片段,但自己做这件事的最佳方法是按照随附的笔记本进行操作。

步骤零

我还假设你有一个 Elasticsearch 集群或 serverless 项目,你将在本指南中使用它们。如果没有,请前往 cloud.elastic.co 并注册免费试用!你需要一个 Cloud ID 和 Elasticsearch API 密钥。

模型选择

第一步(真正的)是选择用于重新排名的模型。深入讨论选择模型和评估结果超出了本博客的范围。请注意,目前 Elasticsearch 仅支持跨编码(cross-encoder)器模型。

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

  • 评估搜索相关性(三部分系列)
  • 搜索相关性调整:平衡关键字和语义搜索

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

模型加载

要将 Hugging Face 中的 NLP 模型加载到 Elasticsearch,你需要使用 Eland Python 库。

Eland 是 Elastic 的 Python 库,用于数据帧分析以及将监督和 NLP 模型加载到 Elasticsearch。它提供了一个熟悉的 Pandas 兼容 API。你可以参考文章来安装 Eland。

以下代码来自笔记本部分 “Hugging Face Reranking Model.”。

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 集群中。

切到

在笔记本中,你可以按照步骤设置集群以在下一节中运行重新排名查询。下载笔记本中显示的模型后的设置步骤如下:

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

重新排序时间!

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

笔记本中的示例:

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 - 模型将考虑的第一阶段的顶级文档数量。

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

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

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

比较

虽然我不会在本简短指南中对结果进行深入分析,但可能引起普遍兴趣的是查看标准词汇匹配查询的前 5 个结果和上述重新排序查询的结果。

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

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

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

搜索 “sparse vector embedding” 的结果
评分结果重新排序结果
0Compact Speaker Embedding: lrx-vectorScaling Up Sparse Support Vector Machines by Simultaneous Feature and Sample Reduction
1Quantum Sparse Support Vector MachinesSpaceland Embedding of Sparse Stochastic Graphs
2Sparse Support Vector Infinite PushElliptical Ordinal Embedding
3The Sparse Vector Technique, RevisitedMinimum-Distortion Embedding
4L-Vector: Neural Label Embedding for Domain AdaptationFree Gap Information from the Differentially Private Sparse Vector and Noisy Max Mechanisms
5Spaceland Embedding of Sparse Stochastic GraphsInterpolated Discretized Embedding of Single Vectors and Vector Pairs for Classification, Metric Learning and Distance Approximation
6Sparse Signal Recovery in the Presence of Intra-Vector and Inter-Vector CorrelationAttention Word Embedding
7Stable Sparse Subspace Embedding for Dimensionality ReductionBinary Speaker Embedding
8Auto-weighted Mutli-view Sparse Reconstructive EmbeddingNetSMF: Large-Scale Network Embedding as Sparse Matrix Factorization
9Embedding Words in Non-Vector Space with Unsupervised Graph LearningEstimating Vector Fields on Manifolds and the Embedding of Directed Graphs

轮到你了

希望你明白将 Hugging Face 的重新排名模型整合到 Elasticsearch 中是多么容易,这样你就可以开始重新排名了。虽然这不是唯一的重新排名选项,但当你在隔离环境中运行、无法访问外部重新排名服务、想要控制成本或拥有一个特别适合你的数据集的模型时,它会很有帮助。

如果你还没有点击随附笔记本的众多链接之一,现在是时候了!

准备好自己尝试一下了吗?开始免费试用。

想要获得 Elastic 认证吗?了解下一次 Elasticsearch 工程师培训何时举行!

原文:Reranking with an Elasticsearch-hosted cross-encoder from HuggingFace - Search Labs

相关文章:

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

作者:来自 Elastic Jeff Vestal 了解如何使用 Hugging Face 的模型在 Elasticsearch 中托管和执行语义重新排序。 在这篇简短的博文中,我将向你展示如何使用 Hugging Face 中的模型在搜索时在你自己的 Elasticsearch 集群中执行语义重新排序。我们将使用…...

CKA认证 | Day1 k8s核心概念与集群搭建

第一章 Kubernetes 核心概念 1、主流的容器集群管理系统 容器编排系统: KubernetesSwarmMesos Marathon 2、Kubernetes介绍 Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8s。 Kubernetes用于容器化应用程序的部署&#x…...

[极客大挑战 2019]PHP 1

[极客大挑战 2019]PHP 1 审题 猜测备份在www.zip中,输入下载文件。 知识点 反序列化 解题 查看代码 看到index.php中包含了class.php,直接看class.php中的代码 查看条件 当usernameadmin,password100时输出flag 构造反序列化 输入select中&#…...

【c++丨STL】vector模拟实现

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 一、vector底层刨析 二、模拟实现 1. 属性、迭代器以及函数声明 2. 功能实现 交换两个容器的内容 构造函数 拷贝构造 赋值重载 析构…...

SQLAlchemy 介绍与实践

postgresql 实践 pydantic 实践 1. SQLAlchemy 介绍 SQLAlchemy 是一个 ORM 框架。SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射(ORM)库。它允许你通过 Python 代码来与关系型数据库交互,而不必直接编写SQL语句。 简单介绍一下…...

docker进行SRS直播服务器搭建

docker进行SRS直播服务器搭建 docker构建参考地址: 地址: https://github.com/ossrs/srs https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \-p 8000:8000/udp -p 10080:10080/udp ossrs/sr…...

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的,但专门设计用于服务器环境,而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…...

数据结构(8.7_2)——败者树

多路平衡归并带来的问题 什么是败者树 败者树的构造 败者树的使用 败者树在多路平衡归并中的应用 败者树的实现思路 总结...

设计模式-七个基本原则之一-里氏替换原则

里氏替换原则(LSP)面向对象六个基本原则之一 子类与父类的替代性:子类应当能够替代父类出现的任何地方,且表现出相同的行为。行为的一致性:子类的行为必须与父类保持一致,包括输入和输出、异常处理等。接口…...

k8s中基于overlay网络和underlay网络的网络插件分别有哪些

在 Kubernetes 中,不同的网络插件会使用 overlay 或 underlay 网络来连接 Pod 和节点。以下是基于 overlay 网络和 underlay 网络的常见 Kubernetes 网络插件: 1. 基于 Overlay 网络的插件 这些插件通过隧道封装技术(如 VXLAN、GRE 等&#…...

一文详解java的数据类型

1. 题记 Java是一门对数据类型敏感的语言,本博文主要总结介绍java语言的数据类型。 2. java的数据类型 Java 的数据类型分为基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。 2.1 基本数…...

Flink API 的层次结构

Apache Flink 提供了多层 API,每层 API 针对不同的抽象层次和用途,使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明:...

lua入门教程:math

在Lua中,math库是一个非常重要的内置库,它提供了许多用于数学计算的函数。这些函数可以处理各种数学运算,包括基本的算术运算、三角函数、对数函数、随机数生成等。结合你之前提到的Lua中的数字遵循IEEE 754双精度浮点标准,我们可…...

ROS2简介与Ubuntu24.04中安装指南

之前安装了一个版本,但是不愿意写blog,现在想想自己就是个沙子立个flag,每次配置项目,写流程blog ROS简介 ROS(Robot Operating System)是一个开源的机器人软件平台,提供了许多工具和库来帮助…...

命令行工具PowerShell使用体验

命令行工具PowerShell使用 PowerShell是微软开发的一种面向对象的命令行Shell和脚本语言环境,它允许用户通过命令行的方式管理操作系统。相较于传统CMD,PowerShell增加了面向对象的程序设计框架,拥有更强大的功能和扩展性。使用PowerShell可…...

MongoDB 详解:深入理解与探索

在当今的数据库领域,MongoDB 以其独特的特性和强大的功能,成为了众多开发者和企业的首选。本文将对 MongoDB 进行详细的介绍,包括其特点、应用场景、流程图以及源码分析。 一、MongoDB 概述 MongoDB 是一个基于分布式文件存储的开源数据库系…...

使用 Elasticsearch 构建食谱搜索(一)

作者:来自 Elastic Andre Luiz 了解如何使用 Elasticsearch 构建基于语义搜索的食谱搜索。 简介 许多电子商务网站都希望增强其食谱搜索体验。正确使用语义搜索可以让客户根据更自然的查询(例如 “something for Valentines Day - 情人节的礼物” 或 “…...

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中,在集群master-1上安装了dockerharbor,却发现master-1节点NotReady,使用的网络插件为 Cilium #安装docker和harbor(docker运行正常) rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…...

使用vite+react+ts+Ant Design开发后台管理项目(五)

前言 本文将引导开发者从零基础开始,运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术…...

Spring Boot实现多数据源连接和切换

文章目录 前言一、多数据源配置与切换方案二、实现步骤1. 创建多个 DataSource 配置类2. 创建 DataSource 配置类3. 创建动态数据源路由类4. 实现 DynamicDataSource 类5. 创建 DataSourceContextHolder 来存储当前的数据源标识6. AOP 方式切换数据源7. 自定义注解来指定数据源…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

云原生时代的系统设计:架构转型的战略支点

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器

从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...