Elasticsearch:将段落向量搜索添加到 Lucene

news2024/11/18 6:47:41

作者:Benjamin Trent

向量搜索是信息检索工具箱中的一个强大工具。 将向量与词法搜索(如 BM25)一起使用很快变得司空见惯。 但向量搜索中仍然存在一些痛点需要解决。 主要的一个是文本嵌入模型和处理更大的文本输入。

像 BM25 这样的词法搜索已经是为长文档设计的,而文本嵌入模型却不是。 所有嵌入模型都对其可以嵌入的 token 数量有限制。 因此,对于较长的文本输入,必须将其分成比模型限制短的段落。 现在,你不再拥有一份包含所有元数据的文档,而是拥有多个段落和嵌入。 如果你想保留元数据,则必须将其添加到每个新文档中。

图 1:现在,你必须为每个句子索引该信息数据,而不是使用指示《小妇人》第一章的单个元数据。

解决这个问题的一种方法是使用 Lucene 的 join 功能。 这是 Elasticsearch 嵌套 (nested) 字段类型的一个组成部分。 它使具有多个嵌套文档的顶级文档成为可能,允许你搜索嵌套文档并连接回其父文档。 这听起来非常适合属于单个顶级文档的多个段落和向量! 这太棒了! 但是,等等,Elasticsearch® 不支持嵌套字段中的向量。 为什么不呢?需要改变什么?

kNN 问题中的父子关系

关键问题是 Lucene 在搜索子向量段落时如何连接回父文档。 就像 kNN
预过滤与后过滤一样,join 发生的时间决定了结果的质量和数量。 如果用户搜索与查询向量最接近的前四个父文档(不是段落),他们通常期望四个文档。 但是,如果他们正在搜索子向量段落并且所有四个最近的向量都来自同一父文档怎么办? 这最终只会返回一份父文档,这将是令人惊讶的。 后过滤也会出现同样的问题。

图 2:文档 3、5、10 是父文档。 1、2 属于 3; 4 属于 5; 6、7、8、9 属于 10。

让我们使用查询向量 A 进行搜索,四个最近的段落向量是 6、7、8、9。使用 “post joining”,你最终只会检索父文档 10。

图 3:向量 “A” 与 10 的所有子元素最接近。

对于这个问题我们能做些什么呢? 一种答案可能是,“只需增加返回向量的数量即可!” 然而,从规模来看,这是站不住脚的。 如果每个父至少有 100 个孩子,而你想要前 1,000 个最近邻居,该怎么办? 这意味着你必须寻找至少 100,000 个孩子! 这很快就会失控。 那么,还有什么解决方案呢?

Pre-joining 加入救援

解决 “post-joining” 问题的方法是 “pre-joining”。 最近对 Lucene 添加的更改允许在搜索 HNSW 图时加入父文档! 与 kNN 预过滤一样,这确保当要求查找查询向量的 k 个最近邻居时,我们可以返回的不是由密集向量表示的 k 个最近的段落,而是返回 k 个最近的文档,由它们的子段落表示与查询向量最相似。 这在实践中实际上是什么样的?

假设我们正在搜索与以前相同的嵌套文档:

图 4:文档 3、5、10 是父文档。 1, 2 属于 3; 4 属于 5; 6、7、8、9 属于 10。

当我们搜索文档并对其进行评分时,我们不是跟踪子文档,而是跟踪父文档并更新其分数。 图 5 显示了一个简单的流程。 对于访问的每个子文档,我们都会获取其分数,然后通过其父文档 ID 对其进行跟踪。 这样,当我们搜索向量并对向量进行评分时,我们只收集父 ID。 这确保了结果的多样化,并且使用 Lucene 中现有的强大工具不会增加 HNSW 算法的复杂性。 所有这一切只需要存储每个向量一个额外的内存位。

图 5:当我们搜索向量时,我们会评分并收集相关的父文档。 仅当分数比之前的分数更具竞争力时才更新分数。

但是,这如何有效呢? 很高兴你问了! 有一些限制提供了一些非常好的捷径。 从前面的示例中可以看出,所有父文档 ID 都大于子文档 ID。 此外,父文档本身不包含向量,这意味着子文档和父文档是纯粹不相交的集合 (disjoint sets)。 这通过位集(bit sets)提供了一些很好的优化。 位集提供了一种异常快速的结构,用于 “告诉我下一个设置的位”。 对于任何子文档,我们可以询问位集,“嘿,集合中比我大的数字是多少?” 由于这些集合是不相交的,我们知道设置的下一位是父文档 ID。

结论

在这篇文章中,我们探讨了支持大规模密集文档检索的挑战以及我们提出的使用 Lucene 中的嵌套字段和 join 的解决方案。 Lucene 中的这项工作为更自然地存储和搜索文档中长文本段落的密集向量以及 Elasticsearch 中向量搜索的文档建模的整体改进铺平了道路。 这是 Elasticsearch 中向量搜索向前迈出的非常激动人心的一步!

如果你想讨论此问题或与 Elasticsearch 中的向量搜索相关的任何其他内容,请加入我们的讨论论坛。

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

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

相关文章

数据库备份与恢复

数据库备份的重要性 在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因有:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃。 数据库备份的分类 从物理与逻辑的角度&a…

【多面体:知识蒸馏:Pansharpening】

Multipatch Progressive Pansharpening With Knowledge Distillation (基于知识蒸馏的多面体渐进锐化算法) 在这篇文章中,我们提出了一种新的多面体和多级泛锐化方法与知识蒸馏,称为PSDNet。不同于现有的pansharpening方法&…

ASP.NET Core 中基于 Controller 的 Web API

基于 Controller 的 Web API ASP.NET Wep API 的请求架构 客户端发送Http请求,Contoller响应请求,并从数据库读取数据,序列化数据,然后通过 Http Response返回序列化的数据。 ControllerBase 类 Web API 的所有controllers 一般…

中央空调秒变智能 青岛中弘P15面板式空调网关初体验

在智能家居逐步渗透进千家万户的今天,如何将中央空调融入到智能化场景,以实现场景联动、提升家居生活的智能化和科技化程度,中弘给出了新的答案。本期智哪儿就带大家测评一下青岛中弘P15面板式空调网关,一起看看它的价值所在。 高…

The Sandbox 即将参加韩国区块链周,并带来一系列独家周边活动!

韩国区块链周(Korea Blockchain Week)即将到来,届时将有成千上万的 NFT 项目、建设者、社区成员、企业家、投资者和爱好者齐聚首尔,分享 Web3 的最新更新和未来愿景。 继成功举办韩流崛起 LAND 销售并宣布多个合作伙伴关系之后&a…

计算机毕设之基于python+echarts+mysql的图书馆可视化管理系统(文档+代码+部署教程)

系统阐述的是一款图书馆可视化管理系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构…

群晖NAS:DSM7.1激活Advanced Media Extensions【自留记录】

群晖NAS:DSM7.1激活Advanced Media Extensions【自留记录】 本文仅半白群晖可用,不需要安装其他套件或者ssh修改什么 使用DS Video 网页播放视频时候,提示:【不支持当前所选音轨的文件格式, 因此无法播放视频。请尝试…

编程题四大算法思想(二)——回溯法:N皇后问题、子集和问题、地图填色问题、迷宫问题

文章目录 回溯法迷宫游戏 N皇后问题基本概念解空间4后问题的解空间 可行解和最优解回溯法回溯法术语回溯法的关键问题回溯法的基本思想4后问题的约束条件n后问题生成问题状态的基本方法 子集和问题一个朴素的求解方法回溯回溯法的剪枝技术 地图填色问题 回溯法 迷宫游戏 深度优…

Android RecyclerView 之 吸顶效果

前言 上一篇文章已经实现了列表跟宫格布局的动态切换,这篇文章主要来说通过 CoordinatorLayout 和 AppbarLayout 的配合,以及 NestedScrollView 来实现吸顶效果 。效果如下。 一、CoordinatorLayout 是什么? CoordinatorLayout 是 Androi…

pnpm快速创建 Vue.js 项目(npm类似)

目录 pnpm 创建一个 Vue.js 项目 前提准备: 运行创建命令: 选择项目配置:(按需选择) cd 项目名:(进入项目终端) 安装项目依赖: 运行项目: pnpm 创建一…

文献速读|5分的生信+免疫组化:单细胞测序转录组联合bulk转录组肿瘤预后模型

今天给大家分享一篇IF5.8的纯生信单细胞联合Bulk转录组构建预后模型的文章,于2023年3月19日发表在Cancer Immunology Immunotherapy上:Integrative analyses of bulk and single-cell RNA-seq identified cancer-associated fibroblasts-related signatu…

Docker安装详细步骤

Docker安装详细步骤 1、安装环境准备 主机:192.168.40.5 zch01 设置主机名 # hostnamectl set-hostname zch01 && bash 配置hosts文件 [root ~]# vi /etc/hosts 添加如下内容: 192.168.40.5 zch01 关闭防火墙 [rootzch01 ~]# systemct…

W5500-EVB-PICO通过SNTP获取网络时间(十一)

前言 上一章我们用W5500_EVB_PICO 开发板做Ping数据测试IP检测连通性,那么本章我们进行W5500_EVB_PICO SNTP的测试。 什么是NTP? NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计…

如何高效进行测试用例评审

1.用例评审的目的 为了减少测试人员执行阶段做无效工作,执行无效case,提交无效缺陷(可以友情提醒研发同学,讲到自己负责的相关模块时,注意下是否存在异议点)为了避免三方(产品、研发、测试&…

多项式求逆

已知 F F F,求 G G G 考虑倍增 F ( x ) ∗ H ( x ) ≡ 1 ( m o d x n / 2 ) F(x) * H(x) \equiv 1 \pmod{x^{n/2}} F(x)∗H(x)≡1(modxn/2) F ( x ) ∗ G ( x ) ≡ 1 ( m o d x n / 2 ) F(x) * G(x) \equiv 1 \pmod{x^{n/2}} F(x)∗G(x)≡1(modxn/2) 假设 H H…

噪声的产生机理和来源

引言:噪声广泛存在于自然界,上节揭示了噪声的本质,噪声按照噪声携带能量的强弱分为功率型噪声和信号型噪声,功率型噪声持续时间短,能量强,对设备的寿命具有很大的影响,而信号型噪声顾名思义来源…

不想出门?那就把“自然”搬进家里吧!

为自然主题房间寻找灵感: 简单创意 以自然为主题的房间将自然灵感的色调(棕色、灰色、米色、白色、蓝色和绿色)与皮革、木材、黄麻和藤条等纹理相结合。就像真实的户外一样,它也懂得平衡的力量。户外: 每一片树丛&…

云备份——第三方库简单介绍并使用(上)

目录 一,Jsoncpp库序列化和反序列化 二,bundle文件压缩库 2.1 文件压缩 2.2 文件解压 一,Jsoncpp库序列化和反序列化 首先我们需要先了解一下json是什么,json是一种数据交换格式,采用完全独立于编程语言的文本格式来…

开学有哪些电容笔值得买?平价电容笔排行榜

苹果的原装Pencil,无疑是一款性能出色的电容笔,但它的价格也很高,如果不小心弄丢了或者弄坏了,那就太让人心痛。再说了,一支价值不菲的电容笔,要是不是用于专业绘画,实在是大材小用。不过&#…

01. 二进制原理

道家阴阳启发了莱布尼茨提出二进制! 1. 为什么是二进制? 1.1 二进制与硬盘(磁盘) 硬盘也叫磁盘,它内部是排列整齐的一个个小磁体。 磁盘上面有“电刷”,磁盘可以转动,“电刷”也可以上下移动…