使用 retrievers 在 Elasticsearch 中进行语义重新排序

作者:来自 Elastic Adam Demjen, Nick Chow

什么是语义重新排序?

语义重新排序(semantic reranking)是一种方法,它允许我们利用快速检索方法的速度和效率,同时在其上分层语义搜索。它还允许我们立即将语义搜索功能添加到现有的 Elasticsearch 安装中。

随着机器学习驱动的语义搜索的进步,我们拥有越来越多的工具可以从数百万个文档中快速找到匹配项。然而,就像为期末考试而临时抱佛脚一样,优化速度意味着要做出一些权衡,而这通常会以准确度的损失为代价。

为了抵消这一点,我们看到一些工具在梯度的另一端出现并变得越来越可用。虽然这些工具的速度要慢得多,但它们可以更准确地判断文档与查询的匹配程度。

解释一些关键术语:重新排序(reranking)是重新排序一组检索到的文档以提高搜索相关性的过程。在语义重新排序中,这是在重新排序机器学习模型的帮助下完成的,该模型计算输入查询和每个文档之间的相关性分数。

重新排序器通常对前 K 个结果(满足搜索查询的相关候选范围的缩小窗口)进行操作,因为对大量文档进行重新排序的成本极高。

为什么语义重新排序很重要?

语义重新排序(semantic reranking)对于搜索用户来说是一个重要的细化层,原因如下。

首先,用户对搜索的期望更高,正确的结果不在前十名或第一页,而是最佳答案(top answer)。这就像那个古老的搜索笑话 —— 隐藏秘密的最佳位置是搜索结果的第二页。不过,今天它的范围更窄了:任何低于前一、二或三名的结果都可能被丢弃。

这更适用于 RAG(retriieval augmented generation - 检索增强生成)—— 这些生成式 AI 用例需要紧密的上下文窗口。最佳文档可能是第 4 个结果,但如果你只输入前三名,你将无法获得正确答案,模型可能会产生幻觉。

最重要的是,生成式 AI 用例在有效截止(effective cutoff)时效果最佳。你可以定义一个最低分数或计数,直到该分数或计数结果被视为 “良好”,但如果没有一致的评分,这很难做到。

语义重新排序通过重新排序文档来解决这些问题,以便最相关的文档排在最前面。它提供可用、标准化和经过良好校准的分数,因此你可以衡量结果与查询的匹配程度。因此,你可以更可靠地获得更准确的顶级结果以提供给大型语言模型,并且如果前 K 个匹配项的分数大幅下降,你可以切断结果以防止出现幻觉。

那么我们如何进行重新排序?

Rerank inference 类型

Elastic 最近引入了推理端点和相关的 APIs。这一功能使我们可以使用某些服务,如内置或第三方的机器学习模型,来执行推理任务。支持的推理任务形式多样,例如 sparse_embedding 任务就是通过某个机器学习模型(如 ELSER)接收一些文本并生成一组加权术语,而 text_embedding 任务则是从输入中创建向量嵌入。

Elastic Serverless 以及即将发布的 8.14 版本新增了一种任务类型:rerank。在首次迭代中,rerank 支持与 Cohere 的 Rerank API 集成。这意味着你现在可以在 Elastic 中创建一个推理端点,提供你的 Cohere API 密钥,并享受开箱即用的语义重排序功能!

让我们通过一个示例来看一下实际操作,该示例取自 Cohere 博客。

假设你已经使用 Cohere Rerank v3 模型在 Elastic 中设置了你的 rerank 推理端点,我们可以传递一个查询和一个输入文本数组。正如我们所见,这些简短的段落都与 “capital” 一词有关,但不一定与作为政府所在地的含义相关,而查询正是寻找这一含义:

POST _inference/rerank/cohere-rerank-v3-model
{
  "query": "What is the capital of the USA?",
  "input": [
    "Carson City is the capital city of the American state of Nevada. At the 2010 United States Census, Carson City had a population of 55,274.",

    "Capital punishment (the death penalty) has existed in the United States since before the United States was a country. As of 2017, capital punishment is legal in 30 of the 50 states.",

    "The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that are a political division controlled by the United States. Its capital is Saipan.",

    "Washington, D.C. (also known as simply Washington or D.C., and officially as the District of Columbia) is the capital of the United States. It is a federal district.",

    "Charlotte Amalie is the capital and largest city of the United States Virgin Islands. It has about 20,000 people. The city is on the island of Saint Thomas.",

    "North Dakota is a state in the United States. 672,591 people lived in North Dakota in the year 2010. The capital and seat of government is Bismarck."
  ]
}

重新排序任务通过分数和文档索引数组进行响应:

{
  "rerank": [
    {
      "index": "3",
      "relevance_score": "0.99838966"
    },
    {
      "index": "1",
      "relevance_score": "0.587174"
    },
    {
      "index": "0",
      "relevance_score": "0.061199225"
    },
    {
      "index": "2",
      "relevance_score": "0.032283258"
    },
    {
      "index": "4",
      "relevance_score": "0.015365342"
    },
    {
      "index": "5",
      "relevance_score": "0.0040072887"
    }
  ]
}

最上面的条目告诉我们,相关性得分最高的 99.8% 是原始列表中的第 4 个文档(“index”:3,索引从零开始),又名 “Washington, D.C. ...”。其余文档在语义上与原始查询的相关性较低。

此重新排名推理步骤是优化搜索体验的重要拼图,现在我们准备将其放入拼图板中!

立即通过你的应用程序对搜索结果进行重新排序

利用语义重新排序功能的一种方法是在搜索应用程序中实现如下工作流程:

  1. 用户在你的应用程序的 UI 中输入查询。
  2. 搜索引擎组件检索与此查询匹配的一组文档。可以使用任何检索策略来完成此操作:词汇 (BM25)、向量搜索(例如 kNN)或结合两者的方法,例如 RRF。
  3. 应用程序获取前 K 个文档,从每个文档中提取我们要查询的文本字段,然后将此文本列表发送到重新排序推理端点,该端点配置为使用 Cohere。
  4. 推理端点将文档和查询传递给 Cohere。
  5. 结果是与每个分数匹配的分数和索引列表。你的应用程序获取这些分数,将它们分配给文档,并按此分数按降序重新排序。这有效地将语义上最相关的文档移到顶部。
  6. 如果在 RAG 中使用此流程为生成式 LLM 提供一些来源(例如总结答案),那么你可以放心,它将在正确的上下文中工作并提供答案。

这种方法效果很好,但涉及很多步骤、数据修改以及包含许多移动部件的复杂处理逻辑。我们可以简化它吗?

未来用检索器重新排序搜索结果

让我们花一点时间来讨论一下检索器(retrievers)。检索器(retriever)是一种新的抽象类型,在 _search API 中,不仅仅是一个简单的查询。它是一个用于端到端搜索流程的构建模块,用于获取命中结果并可能修改文档的得分和顺序。

检索器可以在流水线模式中使用,每个检索器单元在搜索过程中执行不同的任务。例如,我们可以配置一个第一阶段的检索器来获取文档,然后将结果传递给第二阶段的检索器,与其他结果结合,减少候选数量等等。作为最后一个阶段,检索器可以更新文档的相关性得分。

很快,我们将使用检索器增加新的重排序功能,第一个功能是文本相似性重排序检索器。这将通过调用重排序推理端点对前 K 个命中结果进行重排序。工作流程将简化为一个隐藏所有复杂性的单一 API 调用!

这就是前面描述的多阶段工作流程在单一检索器查询中的样子:

text_similarity_reranker 检索器配置了以下详细信息:

  • 嵌套检索器
  • Reranker 推理配置
  • 其他控制,例如用于消除不相关匹配的最低分数截止值

以下是 text_similarity_reranker 查询的示例。让我们剖析一下,以更好地理解每个部分!

POST my-index/_search
{
  "retriever": { // Retriever query
    "text_similarity_reranker": { // Outermost retriever will perform reranking
      "retriever": {
        "standard": { // First-stage retriever is a standard Elasticsearch query
          "query": {
            "match": { // BM25 matching
              "text": "What is the capital of the USA?"
            }
          }
        }
      },
      "field": "text", // Document field to send to reranker
      "window_size": 100, // Reranking will work on top K hits
      "inference_id": "cohere-rerank-v3-model", // Inference endpoint
      "inference_text": "What is the capital of the USA?",
      "min_score": 0.6 // Minimum relevance score
    }
  }
}

请求将 retriever 查询定义为根属性。最外层的检索器将最后执行,在本例中为 text_similarity_reranker。它指定 standard 第一阶段检索器,负责获取一些文档。标准检索器接受 Elasticsearch query,在示例中为 BM25 match。

文本相似性重新排序器指向包含要进行语义重新排序的文本的 text 文档字段。前 100 个文档将被发送到我们已使用 Cohere 配置的 cohere-rerank-v3-model 重新排序推理端点进行重新排序。只有在重新排序过程中获得至少 60% 相关性分数的文档才会被返回。

响应的结构与 search 查询的结构完全相同。_score 属性是来自重新排序过程的语义相关性分数,_rank 指的是文档的排名顺序。

{
  "took": 213,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.99838966,
    "hits": [
      {
        "_index": "my-index",
        "_id": "W7CDBo8BJDa_bRWhW1KH",
        "_score": 0.99838966,
        "_rank": 1,
        "_source": {
          "text": "Washington, D.C. (also known as simply Washington or D.C., and officially as the District of Columbia) is the capital of the United States. It is a federal district."
        }
      }
    ]
  }
}

在即将发布的 Elastic 版本中,将很快提供使用检索器进行语义重新排序的功能。

结论

语义重新排名是一种非常强大的工具,可以提升搜索体验或 RAG 工具的性能。它可以用作直接推理调用、搜索体验上下文或作为检索器简化搜索流程的一部分。用户可以选择最适合其用例和上下文的工具集。

祝你重新排名愉快!😃

准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建你的下一个 GenAI 应用程序!

原文:Semantic Reranking in Elasticsearch with Retrievers — Elastic Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JS基础语法04】运算符分类以及运用

一:赋值运算符 1 类型 赋值运算符包括以下:、、-、*、/ 2 原理 ,是将等号右边的数赋值给左边以为例(-、*、/和运算逻辑是相同的) let num 5 num2 等价于 let num 5 numnum2 //num7 二:一元运算符 1怎么判断运算符是几元…

GeoJson和WKT数据格式解析

1. GeoJson数据格式 GEOJSON是gis地图中常用的数据格式,制作地图时用于存储各种地理数据,使用时通过OpenLayer、Leaflet、mapLibre-gl或者Cesium加载GEOJSON即可渲染出GEOJSON中描述的地理要素。 GeoJSON是一种对各种地理数据结构进行编码的格式&#xf…

拍摄的视频内容怎么做成二维码?视频在线转换成二维码的方法

怎么把拍的个人才艺视频做成二维码呢?现在扫码看视频是实现内容快速传播的一种常用方式,所以很多人会将自己拍摄的视频制作二维码图片,然后分享给其他人扫码获取内容,对于内容的传播速度及用户体验有很好的提升,在很多…

Comfyui导出图片的命名技巧,日期文件夹

种子序号命名:%KSampler.seed% 图片宽高序号命名:%Empty Latent Image.width%x%Empty Latent Image.height% 年月日:%date:yyyy-MM-dd% 时分秒:%date:hhmmss% 年月日种子序号:%date:yyyy-MM-dd%/%KSampler.seed%

以果决其行,只为文化的传承

从他们每一个人的身上,我们看到传神的东西,就是他们都能用结果,去指引自己前进的方向,这正是我要解读倪海厦老师的原因,看倪海厦2012年已经去世,到现在已经十几年时间了,但是我们看现在自学中医…

TC3xx分析--如何提高系统运行效率(2)

目录 1.概述 2.限定符对于代码的影响 3.小结 1.概述 上文TC3xx分析--如何提高系统运行效率(1)-CSDN博客讲解了Tasking中lsl的某些关键定义,简述了Tricore寻址模式,接下来我们继续看,不同memory限定符对于代码的影响。 2.限定符对于代码的…

查询sqlserver表占用空间,查询当前数据库缓存的所有数据页面,查询当前数据库经常访问的表

查询某张表的磁盘占用情况: --第一种 EXEC sp_spaceused 表_测试表;--第二种 SELECT OBJECT_NAME(object_id) AS TableName,SUM(used_page_count) * 8 AS UsedSpaceKB FROM sys.dm_db_partition_stats GROUP BY object_id;查询当前数据库缓存的所有数据页面&#x…

mmu之TLB的来源与实现

TLB的由来 遇到的问题 对于两级页表(Page Table)的设计,需要访问两次物理内存才可以得到虚拟地址对应的物理地址(一次访问第一级页表,另一次访问第二级页表),而物理内存的运行速度相对于处理器本身来说,有几十倍的差距; 因此在处…

zabbix事件告警监控:如何实现对相同部件触发器告警及恢复的强关联

有一定Zabbix使用经验的小伙伴可能会发现,接收告警事件时,其中可能包含着大量不同的部件名,同一部件的事件在逻辑上具有很强关联性,理论上应保持一致的告警/恢复状态,但Zabbix默认并未对它们进行关联,直接后…

单片机+DAC0832信号发生器的仿真设计(方波、三角波、梯形波、锯齿波)

仿真原理图如下(proteus仿真工程文件可留意下载) 一、设计要求 设计一个能产生方波、三角波、梯形波、锯齿波的波形发生器。 二、方案论证 方案一 :利用单片机AT89C51编写程序,然后将产生信号通过DAC0832(数模转换器)转化成模拟信号,输入信号经运放电路后信号放大,低…

Make-An-Audio——用于语音生成的提示增强扩散模型

0.引言 论文提出了一个从文本生成语音的扩散模型 Make-An-Audio。该模型将文本提示作为输入,并据此生成语音。例如,输入 “一只猫在喵喵叫,一个年轻女人的声音”,就会输出猫在喵喵叫,一个女人在说话的音频。这项研究已…

做抖音小店什么类目最容易爆单?搞懂这三点就明白了!

大家好,我是电商糖果 我们刚接触电商的时候,一定经常听一些同行念叨,选择大于努力,类目大于一切。 很多电商人把选类目比做定生死。 类目选对了,让你轻松飞升不是问题,类目选错了,基本被判了…

某烟草企业数字化转型物流信息化咨询项目规划方案(117页PPT)

方案介绍: 烟草企业数字化转型物流信息化咨询项目规划方案将为企业带来多方面的价值,包括提升物流运营效率、降低物流成本、优化供应链管理、增强企业竞争力和促进可持续发展等。这些价值的实现将有助于企业在激烈的市场竞争中保持领先地位并实现可持续…

【C++奇妙冒险】拷贝构造函数、运算符重载(赋值重载|const成员|取地址重载|const取地址重载)

文章目录 前言🚩拷贝构造函数🫧概念🫧特征🫧默认生成的拷贝构造🫧default关键字(浅谈) 🚩运算符重载🫧概念🫧运算符重载注意事项🫧封装如何保证&a…

梳理清楚的echarts地图下钻和标点信息组件

效果图 说明 默认数据没有就是全国地图, $bus.off("onresize")是地图容器变化刷新地图适配的,可以你们自己写 getEchartsFontSize是适配字体大小的,getEchartsFontSize(0.12) 12 mapScatter是base64图片就是图上那个标点的底图 Ge…

理解多线程看这一篇就够了

一、基本概念与关系 程序 程序是含有指令和数据的文件,静态地存储在磁盘等存储设备上。它是软件的实体,但未被激活。 进程 进程是程序的一次执行过程,是系统运行程序的基本单位。当程序被操作系统加载并执行时,就成为一个进程&a…

SAP 消息号VF501科目确定期间出错

在销售开票VF02的时候,经常出现报错:“科目确定期间出错”,这个报错,目前检查步骤: 1、BP客户主数据,销售代码层数据(销售与分销)-开票-会计-客户科目分配组,要与销售订…

卷积计算过程详解(含图示和代码)

什么是卷积? 卷积是一种数学运算,通过两个函数f和g生成第三个函数,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。卷积在泛函分析中扮演重要角色,可以被看作是“滑动平…

【大数据】Hadoop 2.X和1.X升级优化对比

目录 1.前言 2.hadoop 1.X的缺点和优化方向 3.解决NameNode的局限性 3.1.Hadoop HA 3.2.Haddop federation 4.yarn 5.周边组件 1.前言 本文是作者大数据系列中的一文,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?spm10…

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第74讲。 扎气球最高分&…