Elasticsearch:检索多向量文档中的原始信息

作者:来自 Elastic Gilad Gal

Elasticsearch(从 8.11 版本及更高版本开始)支持单个字段中每个文档具有多个向量。 这样的文档可以通过文档的最相似向量的排名或者通过每个文档具有多个结果(可能在同一结果集中文档包含的每个向量含有一个)来排名。 对于密集向量和稀疏向量(例如,使用 ELSER 时)都是如此,但为了简单起见,博客的其余部分将与密集向量相关。

这似乎是一个罕见的用例,但实际上它经常发生。 当检查密集向量搜索的两个主要用例时,原因就很清楚了:

文本(text) - 元数据文本通常旨在允许有效发现。 这对于主题列表或搜索关键字来说当然是正确的,但对于像标题这样的元数据来说也是如此,它很短并且通常旨在描述文档。 像 BM25 这样基于 token 频率的算法往往在此类内容上表现得非常好,因此它通常不需要引入基于 ML 的算法和密集向量搜索,也不需要从引入中显著受益。 然而,对于大块文本来说,情况并非如此,例如, 即使在搜索几段文本时,像 BM25 这样的算法也很难与 NLP 算法竞争,而向量搜索在这种文本类型上表现出显着的优势。 问题在于,大多数分析文本以生成用于排名的密集向量的 ML 模型仅限于 512 个标记,这大约是单个段落的大小。 换句话说,当向量搜索需要密集向量时,通常会有足够的文本来需要为每个文档生成多个向量。

图像(image) - 在许多情况下,图像描绘了现实世界中的某些事物,并且通常有来自不同角度的图像。 这是一个简单的结果,因为图像是二维的,而现实世界中的事物是三维的,因此二维图像提供了有关它们的非常部分的信息。 在电子商务中演示可能是最简单的,其中通常有一些产品图像,但其他图像搜索用例也是如此。 机器学习模型通常为每个图像生成一个向量,因此如果每个产品有多个图像,则每个产品有多个向量。

显示结果时,通常需要显示文档中导致排名的部分,例如 文本或图像中使文档在结果集中排名靠前的部分。 Elasticsearch 通过嵌套字段支持每个文档多个向量,这种结构非常适合检索生成向量的内容。 为此,只需将原始数据添加为另一个嵌套字段即可。

下面是一个示例:使用以下命令创建具有嵌套向量和文本字段的映射。 你可以在任何无状态(stateless)项目或版本 8.11 或更高版本的 Elasticsearch 部署中使用 Kibana 中的开发控制台。

PUT my-long-text-index
{"mappings": {"properties": {"my_long_text_field": {"type": "nested", //because there can be multiple vectors per doc"properties": {"vector": {"type": "dense_vector" //the vector used for ranking},"text_chunk": {"type": "text" //the text from which the vector was created}}}}}
}
PUT my-long-text-index/_doc/1
{"my_long_text_field" : [{"vector" : [23,14,8],"text_chunk" :  "doc 1 chunk 1"},{"vector" : [34,95,17],"text_chunk" :  "doc 1 chunk 2"}]
}
PUT my-long-text-index/_doc/2
{"my_long_text_field" : [{"vector" : [3,2,890],"text_chunk" :  "doc 2 chunk 1"},{"vector" : [129,765,13],"text_chunk" :  "doc 2 chunk 2"}]
}

使用 inner_hits 查询索引并返回相关文本块:

GET my-long-text-index/_search
{"knn": {"field": "my_long_text_field.vector","query_vector": [23,14,9],"k": 1,"num_candidates": 10,"inner_hits":{"_source": false,"fields": [ "my_long_text_field.text_chunk"],"size": 1}}
}

你的结果应如下所示:

Result:
{"took": 4,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0.999715,"hits": [{"_index": "my-long-text-index","_id": "1","_score": 0.999715,"_source": {"my_long_text_field": [{"vector": [23,14,8],"text_chunk": "doc 1 chunk 1"},{"vector": [34,95,17],"text_chunk": "doc 1 chunk 2"}]},"inner_hits": {"my_long_text_field": {"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 0.999715,"hits": [{"_index": "my-long-text-index","_id": "1","_nested": {"field": "my_long_text_field","offset": 0},"_score": 0.999715,"fields": {"my_long_text_field": [{"text_chunk": ["doc 1 chunk 1"]}]}}]}}}}]}
}

如果希望显示同一文档的多个结果,例如 如果文档是教科书,并且向 RAG 提供同一本书中的几个相关章节(每本书都索引为单个文档)很有用,则查询可以如下所示:

GET my-long-text-index/_search
{"knn": {"field": "my_long_text_field.vector","query_vector": [23,14,9],"k": 3,"num_candidates": 10,"inner_hits":{"size": 3,"_source": false,"fields": [ "my_long_text_field.text_chunk"]}}
}

结果如下:

{"took": 5,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 0.999715,"hits": [{"_index": "my-long-text-index","_id": "1","_score": 0.999715,"_source": {"my_long_text_field": [{"vector": [23,14,8],"text_chunk": "doc 1 chunk 1"},{"vector": [34,95,17],"text_chunk": "doc 1 chunk 2"}]},"inner_hits": {"my_long_text_field": {"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 0.999715,"hits": [{"_index": "my-long-text-index","_id": "1","_nested": {"field": "my_long_text_field","offset": 0},"_score": 0.999715,"fields": {"my_long_text_field": [{"text_chunk": ["doc 1 chunk 1"]}]}},{"_index": "my-long-text-index","_id": "1","_nested": {"field": "my_long_text_field","offset": 1},"_score": 0.88984984,"fields": {"my_long_text_field": [{"text_chunk": ["doc 1 chunk 2"]}]}}]}}}},{"_index": "my-long-text-index","_id": "2","_score": 0.81309915,"_source": {"my_long_text_field": [{"vector": [3,2,890],"text_chunk": "doc 2 chunk 1"},{"vector": [129,765,13],"text_chunk": "doc 2 chunk 2"}]},"inner_hits": {"my_long_text_field": {"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 0.81309915,"hits": [{"_index": "my-long-text-index","_id": "2","_nested": {"field": "my_long_text_field","offset": 1},"_score": 0.81309915,"fields": {"my_long_text_field": [{"text_chunk": ["doc 2 chunk 2"]}]}},{"_index": "my-long-text-index","_id": "2","_nested": {"field": "my_long_text_field","offset": 0},"_score": 0.6604239,"fields": {"my_long_text_field": [{"text_chunk": ["doc 2 chunk 1"]}]}}]}}}}]}
}

准备好将 RAG 构建到你的应用程序中了吗? 想要尝试使用向量数据库的不同 LLMs?
在 Github 上查看我们的 LangChain、Cohere 等示例笔记本,并参加即将开始的 Elasticsearch 工程师培训!

原文:Retrieval of originating information in multi-vector documents — Elastic Search Labs

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

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

相关文章

搜索引擎的设计与实现(四)

目录 6 系统测试 6.1测试重要性 6.2测试用例 结 论 参 考 文 献 前面内容请移步 搜索引擎的设计与实现(三) 免费源代码&毕业设计论文 搜索引擎的设计与实现 6 系统测试 6.1测试重要性 该项目是在本地服务器上进行运行和调试,…

【从零开始学习Redis | 第十一篇】快速介绍Redis持久化策略

前言: Redis 作为一种快速、高效的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景。然而,由于其特性是基于内存的,一旦服务器进程退出,内存中的数据就会丢失。为了解决这一问题,Redis 提供了持久…

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维,提高工作效率。 2、我用代码批判思维,逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员,是哪些重要的专业习惯,让我如此优秀? 2、可以免费获取到的IT资源 1、《软件工程&a…

paddle ocr 版面分析

教程 https://github.com/PaddlePaddle/PaddleOCR/blob/a4b7d3ba4a8333a23bab1fc1472aa18deec211d1/ppstructure/layout/README_ch.md 额外的模型,但是yolov2的模型缺少yml配置文件,找不到 https://github.com/PaddlePaddle/PaddleOCR/blob/main/ppstruc…

【嵌入式模块芯片开发】ADXL345的优化精确测量和角度计算(中断单次测量、卡尔曼滤波)

【嵌入式模块芯片开发】ADXL345的优化精确测量和角度计算(中断单次测量、卡尔曼滤波) 文章目录 ADXL345的一般读取方式ADXL345的中断读取方式(单次测量)角度计算卡尔曼滤波优化后完整代码附录:压缩字符串、大小端格式…

面向对象 04:三大特性之——封装,封装的含义和作用,以及在 Java 中的使用方式,附完整的测试案例代码

一、前言 记录时间 [2024-05-11] 系列文章简摘: 面向对象 01:Java 面向对象相关内容整体概述 面向对象 02:区分面向过程与面向对象,类和对象的关系 面向对象 03:类与对象的创建、初始化和使用,通过 new 关键…

@vueuse/core 常用方法

createGlobalState | VueUse中文文档 <template><div class"container"><div>{{ x }}-{{ y }}</div><div>{{ store }}</div><div><button click"addNum">add-{{ counter }}</button></div>…

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”&#xff0c;这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。小编将…

【JAVA】数组的应用场景

1 保存数据 public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i < array.length; i){System.out.println(array[i] " ");} } 2 作为函数的参数 1. 参数传基本数据类型 public static void main(String[] args) {int num 0;fu…

917.仅仅反转字母(leetcode)

给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s "ab-cd" 输出&#xff1a;"dc-ba&quo…

手撸XXL-JOB(三)——本地定时任务管理平台

引言 在XXL-JOB中&#xff0c;有一个xxl-job-admin项目&#xff0c;这个就相当于定时任务的调度平台&#xff0c;我们参考XXL-JOB&#xff0c;也添加这么一个调度平台&#xff0c;由于篇幅有限&#xff0c;我们先实现一个本地的定时任务调度平台&#xff0c;至于如何调用远程的…

蓝桥杯备战13.赦免战俘

P5461 赦免战俘 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n //#define int long long const int N 2e510; int n,p1,a[1050][1050]; void di(int x,int l,int q)//x是正方形边长&#xff0c;l、q是正方…

算法练习day8

反转字符串 代码随想录 0344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.05小时&#xff09; 思路 这道题很简单也很经典。 字符串的反转方法有很多&#xff0c;我这里是用for循环通过数组长度和下标计算来交换。…

【小积累】@Qualifier注解

今天在看rabbitMQ的时候需要绑定交换机和队列&#xff0c;交换机和队列都已经注入到spring容器中&#xff0c;写了一个配置类&#xff0c;使用了bean注解注入的。所以这时候绑定的时候需要使用容器中的交换机和队列&#xff0c;必须要使用Qualifier去确定是容器中的哪个bean对象…

vue2 v-model 绑定不同的表单元素,绑定不同表单元素的属性

输入框 input:text --> value文本域 textarea --> value复选框 input:checkbox --> checked单选框 input:radio --> checked下拉菜单 select–> value 1、绑定输入框 input typetext / password / number <!--绑定的是 typetext / password 的 value值 --…

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程&#xff0c;可以理解为将屏幕上的一个像素&#xff08;下文用像素表示&#xff09;映射到纹理上的一个像素&#xff08;下文用纹素表示&#xff09;&#xff0c;然后用纹理上的这个像素的颜色进行显示。 理想情况下&#xff0c;屏幕…

Optional用法

说明&#xff1a;Optional和Stream一样&#xff0c;是Java8引入的特性&#xff0c;本文介绍Optional的几个实际用法。Steam流使用&#xff0c;参考下面这篇文章&#xff1a; Stream流使用 使用 1.保证值存在 // 1.保证值存在&#xff0c;pageNumber&#xff0c;pageSizeInte…

HTTP基础概念和HTTP缓存技术

什么是HTTP HTTP是超文本传输协议&#xff0c;主要分为三个部分&#xff1a;超文本、传输、协议。 超文本是指&#xff1a;文字、图片、视频的混合体。传输是指&#xff1a;点与点之间的信息通信。协议是指&#xff1a;通信时的行为规范或约定 HTTP常见字段 字段名 解释 例…

【代码随想录37期】Day07四数相加Ⅱ、赎金信、三数之和、四数之和

四数相加Ⅱ 代码随想录 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; v1.0:直接超时&#xff0c;完全可以把0 - nums1[i]-nums2[j]作为一组&#xff0c;避免了三重循环&#xff01; class Solution { public:int fourSumCount(vector<int>& nums1, v…

收集垃圾的最少总时间- (LeetCode)

题目 给你一个下标从 0 开始的字符串数组 garbage &#xff0c;其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字符 M &#xff0c;P 和 G &#xff0c;但可能包含多个相同字符&#xff0c;每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位的任何…