Elasticsearch:使用标记修剪提高文本扩展性能

作者:来自 Elastic Kathleen DeRusso

本博客讨论了 ELSER 性能的令人兴奋的新增强功能,该增强功能即将在 Elasticsearch 的下一版本中推出!

标记(token)修剪背后的策略

我们已经详细讨论了 Elasticsearch 中的词汇和语义搜索以及使用向量字段的文本相似性搜索。 这些文章对向量搜索的工作原理提供了精彩、深入的解释。

我们过去还讨论过通过使用 ELSER v2 优化检索来降低检索成本。 虽然 Elasticsearch 限制为每个推理字段 512 个标记,但 ELSER 仍然可以为多术语查询生成大量唯一标记。 这会导致非常大的析取查询(disjunction query),并且将返回比单个关键字搜索更多的文档 - 事实上,具有大量结果查询的查询可能会匹配索引中的大多数或全部文档!

现在,让我们更详细地了解使用 ELSER v2 的示例。 使用 infer API,我们可以查看短语 “Is Pluto a planet?” 的预测值。

POST /_ml/trained_models/.elser_model_2_linux-x86_64/_infer
{"docs":[{"text_field": "is Pluto a planet?"}]
}

这将返回以下推理结果:

{"inference_results": [{"predicted_value": {"pluto": 3.014208,"planet": 2.6253395,"planets": 1.7399588,"alien": 1.1358738,"mars": 0.8806293,"genus": 0.8014013,"europa": 0.6215426,"a": 0.5890018,"asteroid": 0.5530223,"neptune": 0.5525891,"universe": 0.5023148,"venus": 0.47205976,"god": 0.37106854,"galaxy": 0.36435634,"discovered": 0.3450894,"any": 0.3425274,"jupiter": 0.3314228,"planetary": 0.3290833,"particle": 0.30925226,"moon": 0.29885328,"earth": 0.29008925,"geography": 0.27968466,"gravity": 0.26251012,"astro": 0.2522782,"biology": 0.2520054,"aliens": 0.25142986,"island": 0.25103575,"species": 0.2500962,"uninhabited": 0.23360424,"orbit": 0.2327767,"existence": 0.21717428,"physics": 0.2001011,"nuclear": 0.1603676,"space": 0.15076339,"asteroids": 0.14343098,"astronomy": 0.10858688,"ocean": 0.08870865,"some": 0.065543786,"science": 0.051665734,"satellite": 0.042373143,"ari": 0.024783766,"list": 0.019822711,"poly": 0.018234596,"sphere": 0.01611787,"dino": 0.006902895,"rocky": 0.0062791444}}]
}

这些是将作为文本扩展搜索的输入发送的推理结果。 当我们运行文本扩展查询时,这些术语最终会在一个大型加权布尔查询中连接在一起,例如:

{"query": {"bool": {"should": [{"match": {"pluto": {"query": "pluto","boost": 3.014208}}},{"match": {"planet": {"query": "planet","boost": 2.6253395}}},...{"match": {"planets": {"query": "dino","boost": 0.006902895}}},{"match": {"planets": {"query": "rocky","boost": 0.0062791444}}}]}}
}

通过删除标记来加快速度

鉴于 ELSER 文本扩展产生大量标记,实现性能改进的最快方法是减少进入最终布尔查询的标记数量。 这减少了 Elasticsearch 在执行搜索时投入的总工作量。 我们可以通过识别文本扩展产生的非重要标记并将它们从最终查询中删除来实现这一点。

非重要令牌可以定义为满足以下两个条件的令牌:

  1. 权重/分数太低,以至于该标记可能与原始术语不太相关
  2. 该标记比大多数标记出现的频率要高得多,表明它是一个非常常见的单词,可能不会对整体搜索结果带来太大好处。

基于使用 ELSER v2 的内部实验,我们从一些默认规则开始识别不重要的标记:

  • 频率:比该领域所有标记的平均标记频率高出 5 倍以上
  • 得分:低于最佳得分标记的 40%
  • 缺失:如果我们看到频率为 0 的文档,则意味着它根本不会出现,可以安全地修剪

如果你将文本扩展与 ELSER 以外的模型一起使用,则可能需要调整这些值才能返回最佳结果。

标记频率阈值和权重阈值都必须显示标记不重要,以便对标记进行修剪。 这可以让我们确保保留得分非常高的频繁标记或得分可能不那么高的非常罕见的标记。

性能改进

我们使用 MS Marco Passage Ranking 基准对这些变化进行基准测试。 通过此基准测试,我们观察到,使用上述默认值启用标记修剪可使第 99 个 pctile 延迟提高 3-4 倍!

相关性影响

一旦我们测量到了真正的性能改进,我们就想验证相关性仍然是合理的。 我们使用一个小数据集来对抗 MS Marco 通道排名数据集。 我们确实观察到修剪标记时对相关性的影响; 然而,当我们将修剪后的标记添加回重新评分块中时,相关性接近于原始的未修剪结果,而延迟仅略有增加。 重新评分会添加先前修剪的标记,仅针对从先前查询返回的文档查询修剪的标记。 然后它会更新分数,包括之前留下的维度。

使用包含 44 个查询的样本,并对 MS Marco Passage Ranking 数据集进行判断:

Top KNum CandidatesAvg rescored recall vs controlControl NDCG@KPruned NDCG@KRescored NDCG@K
10100.9560.6530.6570.657
1010010.6530.6570.653
10100010.6530.6570.653
1001000.9530.510.3720.514
100100010.510.3720.51

现在,这只是一个数据集 - 但即使在较小的规模上看到这一点也是令人鼓舞的!

如何使用

修剪配置将在我们的下一个版本中作为实验性功能推出。 这是一项可选的选择加入功能,因此如果你在不指定修剪的情况下执行文本扩展查询,则文本扩展查询的制定方式不会发生任何变化 - 并且性能也不会发生变化。

我们在文本扩展查询文档中提供了一些如何使用新修剪配置的示例。

下面是一个包含修剪配置和重新评分的文本扩展查询示例:

GET my-index/_search
{"query":{"text_expansion":{"ml.tokens":{"model_id":".elser_model_2","model_text":"Is pluto a planet?"},"pruning_config": {"tokens_freq_ratio_threshold": 5,"tokens_weight_threshold": 0.4,"only_score_pruned_tokens": false}}},"rescore": {"window_size": 100,"query": {"rescore_query": {"text_expansion": {"ml.tokens": {"model_id": ".elser_model_2","model_text": "Is pluto a planet?"},"pruning_config": {"tokens_freq_ratio_threshold": 5,"tokens_weight_threshold": 0.4,"only_score_pruned_tokens": false}}}}}
}

请注意,重新评分查询将 only_score_pruned_tokens 设置为 false,因此它仅将那些最初修剪的标记添加回重新评分算法中。

加权标记查询 - weighted tokens queries

我们还引入了新的加权标记查询

这种新查询类型有两个主要用例:

  • 在查询时发送你自己的预先计算的推理,而不是使用推理 API
  • 快速原型设计,因此你可以尝试更改(例如修剪配置!)

用法相同:

GET my-index/_search
{"query":{"weighted_tokens": {"query_expansion_field": {"tokens": {"pluto":3.014208,"planet":2.6253395,"planets":1.7399588,"alien":1.1358738,"mars":0.8806293,"genus":0.8014013,"europa":0.6215426,"a":0.5890018,"asteroid":0.5530223,"neptune":0.5525891,"universe":0.5023148,"venus":0.47205976,"god":0.37106854,"galaxy":0.36435634,"discovered":0.3450894,"any":0.3425274,"jupiter":0.3314228,"planetary":0.3290833,"particle":0.30925226,"moon":0.29885328,"earth":0.29008925,"geography":0.27968466,"gravity":0.26251012,"astro":0.2522782,"biology":0.2520054,"aliens":0.25142986,"island":0.25103575,"species":0.2500962,"uninhabited":0.23360424,"orbit":0.2327767,"existence":0.21717428,"physics":0.2001011,"nuclear":0.1603676,"space":0.15076339,"asteroids":0.14343098,"astronomy":0.10858688,"ocean":0.08870865,"some":0.065543786,"science":0.051665734,"satellite":0.042373143,"ari":0.024783766,"list":0.019822711,"poly":0.018234596,"sphere":0.01611787,"dino":0.006902895,"rocky":0.0062791444},"pruning_config": {"tokens_freq_ratio_threshold": 5,"tokens_weight_threshold": 0.4,"only_score_pruned_tokens": false}}}},"rescore": {"window_size": 100,"query": {"rescore_query": {"weighted_tokens": {"query_expansion_field": {"tokens": {"pluto":3.014208,"planet":2.6253395,"planets":1.7399588,"alien":1.1358738,"mars":0.8806293,"genus":0.8014013,"europa":0.6215426,"a":0.5890018,"asteroid":0.5530223,"neptune":0.5525891,"universe":0.5023148,"venus":0.47205976,"god":0.37106854,"galaxy":0.36435634,"discovered":0.3450894,"any":0.3425274,"jupiter":0.3314228,"planetary":0.3290833,"particle":0.30925226,"moon":0.29885328,"earth":0.29008925,"geography":0.27968466,"gravity":0.26251012,"astro":0.2522782,"biology":0.2520054,"aliens":0.25142986,"island":0.25103575,"species":0.2500962,"uninhabited":0.23360424,"orbit":0.2327767,"existence":0.21717428,"physics":0.2001011,"nuclear":0.1603676,"space":0.15076339,"asteroids":0.14343098,"astronomy":0.10858688,"ocean":0.08870865,"some":0.065543786,"science":0.051665734,"satellite":0.042373143,"ari":0.024783766,"list":0.019822711,"poly":0.018234596,"sphere":0.01611787,"dino":0.006902895,"rocky":0.0062791444},"pruning_config": {"tokens_freq_ratio_threshold": 5,"tokens_weight_threshold": 0.4,"only_score_pruned_tokens": true}}}}}}
}

此功能将在即将推出的 Elastic stack 版本中作为技术预览功能发布。 你可以先睹为快,使用我们 main 分支的最新版本,或者一旦发布,你就可以在云中试用! 请务必前往我们的讨论论坛并让我们知道你的想法。

原文:Improving text expansion performance using token pruning — Elastic Search Labs

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#十大排序总结

一、冒泡排序 传送门 一、C#冒泡排序算法-CSDN博客 未完待续。。。

CS架构和BS架构

在软件开发领域,CS架构和BS架构是两种常见的架构模式,用于描述客户端和服务器之间的交互方式。这两种架构模式分别代表Client/Server架构和Browser/Server架构。 CS架构(Client/Server架构): 客户端(Client…

测试用例执行计划(100%用例) C卷(JavaPythonC++Node.jsC语言)

某个产品当前迭代周期内有N个特性({F1,F2,., })需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用例({T1,T2.……,Tm}),每个用例对应了一个覆盖特性的集合,测试用例使用其ID作为下标进行标识,测试用例的优先级定义为其覆盖…

KY211 特殊排序

描述&#xff1a; 输入一系列整数&#xff0c;将其中最大的数挑出(如果有多个&#xff0c;则挑出一个即可)&#xff0c;并将剩下的数进行排序&#xff0c;如果无剩余的数&#xff0c;则输出-1。 输入描述&#xff1a; 输入第一行包括1个整数N&#xff0c;1<N<1000&#x…

公式排序算法实际运用

试想下这个么个场景&#xff1a;用户可以自己配置多个公式&#xff0c;公式与公式之间又有依赖关系。比如ABC &#xff0c;BCD。需要做个算法来排序这些公式。实际我们可以分为两个步骤来看这个问题。 1&#xff0c;配置的公式之间不能死循环依赖。比如ABC ,BAC。这种A依赖…

Landsat、哨兵等免费数据下载地址汇总

我们科研和一些工程化应用中&#xff0c;经常会用到免费的Landsat、哨兵1/2/3等数据。下面介绍常用的下载网址&#xff1a; 1.哨兵系列数据 哨兵系列数据在https://scihub.copernicus.eu/dhus 上简单注册一个用户就可以下载&#xff0c;就是速度慢点&#xff0c;还限制一个用…

如何查看并详细了解一个R包

查看并拆解一个R包&#xff0c;如ggplot2&#xff0c;是一种深入了解其功能和内部工作原理的好方法。这个过程可以帮助你更好地理解包的结构&#xff0c;使用方式&#xff0c;以及如何扩展或修改其功能以满足你的需求。以下是一些基本步骤和技巧&#xff0c;以ggplot2为例进行解…

vue2——new Vue({router,store, render: h => h(App) }).$mount(‘#app‘);分析

router render: h > h(App) 是下面内容的缩写&#xff1a; render: function (createElement) {return createElement(App); } 进一步缩写为(ES6 语法)&#xff1a; render (createElement) {return createElement(App); } 再进一步缩写为&#xff1a; render (h){retur…

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体&#xff0c;以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如&#xff1a;多个线程同时要求读写同一个EEPROM芯片&#xff0c;这个EEPROM就是共享资源&#x…

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…

远程办公、企业内网服务器的Code-Server上如何配置使用CodeGeeX插件

很多小伙伴都会在工作中使用code-server&#xff0c;比如说远程办公&#xff0c;当你需要在家访问你的工作环境&#xff0c;亦或者是你们公司的Docker是放入服务器中。code-server 无疑是最好的选择&#xff0c;它可以让你通过互联网安全地连接到远程服务器上的开发环境并且使用…

【保姆级】GPT的Oops问题快速解决方案

GPT的"Oops"问题通常指的是GPT在处理请求时突然遇到错误或无法提供预期输出的情况。要快速解决这个问题&#xff0c;可以尝试以下分步策略&#xff1a; 确认问题范围&#xff1a; 首先&#xff0c;确认问题是偶发的还是持续存在的。如果是偶发的&#xff0c;可能是临…

【Python】【os.path】【pathlib】告别os.path,拥抱pathlib

目录 1. os.path VS pathlib 1.1. 路径规范化 1.2. 字符串和对象 1.3. 读写文件 2. pathlib的性能 3. 总结 pathlib 模块是在Python3.4版本中首次被引入到标准库中的&#xff0c;作为一个可选模块。 从Python3.6开始&#xff0c;内置的 open 函数以及 os 、 shutil 和 os…

环境安装篇 之 Kind 搭建 kubernetes 测试集群

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 环境安装 系列文章&#xff0c;介绍 使用Kind工具 快速安装 kubernetes 测试集群的详细步骤 1.Kind简介 Kind 是一个使用 Docker 容器“节点”运行本地 Kubernetes 集群的工具。Kind 主要用于测试kubernetes本…

微博热搜榜单采集,微博热搜榜单爬虫,微博热搜榜单解析,完整代码(话题榜+热搜榜+文娱榜和要闻榜)

文章目录 代码1. 话题榜2. 热搜榜3. 文娱榜和要闻榜 过程1. 话题榜2. 热搜榜3. 文娱榜和要闻榜 代码 1. 话题榜 import requests import pandas as pd import urllib from urllib import parse headers { authority: weibo.com, accept: application/json, text/pl…

win10磁盘删除卷里面数据怎么恢复 win10磁盘删除卷怎么恢复

大家好&#xff0c;我是你们的小助手&#xff0c;今天我们来聊一下一个非常重要的话题——win10磁盘删除卷里面数据怎么恢复&#xff1f;相信很多小伙伴都曾经遇到过这种情况&#xff0c;不小心把重要的文件删掉了&#xff0c;或者格式化了整个磁盘&#xff0c;导致数据丢失。那…

【华为OD机试】CPU 算力分配【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 现有两组服务器A和B,每组有多个算力不同的CPU,其中 A[i] 是 A 组第 i 个CPU的运算能力, B[i] 是 B组 第 i 个CPU的运算能力。 一组服务器的总算力是各CPU的算力之和。 为了让两组服务器…

LeetCode350:两个数组的交集Ⅱ

题目描述 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑输出结果的顺序。…

Halcon中的交集、补集、全选和反选等操作

1、交集&#xff1a;两个ROI相交的部分 dev_open_window (0, 0, 512, 512, black, WindowHandle) gen_circle (ROI_0, 65, 150, 43) gen_circle (ROI_1, 155, 180, 63) * 交集&#xff1a;两个ROI相交的部分 intersection (ROI_0, ROI_1, RegionIntersection) dev_set_color (…

ResNet学习笔记

一、residual结构 优点&#xff1a; &#xff08;1&#xff09;超深的网络结构(突破1000层) &#xff08;2&#xff09;提出residual模块 &#xff08;3&#xff09;使用Batch Normalization加速训练(丢弃dropout) 解决问题&#xff1a; &#xff08;1&#xff09; 梯度消失和…