Elasticsearch:使用 semantic_text 简化语义搜索

作者:来自 Elastic Carlos Delgado, Mike Pellegrini

semantic_text - 你知道,用于语义搜索!

你是否想开始使用语义搜索来搜索数据,但专注于模型和结果而不是技术细节?我们引入了 semantic_text 字段类型,它将处理你所需的细节和基础架构。

语义搜索(semantic search)是一种复杂的技术,旨在通过利用机器学习模型来增强搜索结果的相关性。与传统的基于关键字的搜索不同,语义搜索专注于理解单词的含义及其使用的上下文。这是通过应用机器学习模型来实现的,这些模型可以提供对文本的更深入的语义理解。

这些模型生成向量嵌入(vector embeddings),它们是捕获文本含义的数字表示。这些嵌入与你的文档数据一起存储,从而启用考虑单词含义和上下文而不是纯词汇匹配的向量搜索技术。

你需要添加什么来添加语义搜索?

要执行语义搜索,你需要执行以下步骤:

  • 选择一个推理模型来创建嵌入,用于索引文档和执行查询。
  • 创建索引映射以存储推理结果,以便之后可以有效地搜索它们。
  • 设置索引,以便为添加到索引中的新文档计算推理结果。
  • 自动处理长文本文档,以便搜索准确并覆盖整个文档。
  • 查询数据以检索结果。

从头开始配置语义搜索可能很复杂。它需要设置映射、提取管道和针对你选择的推理模型量身定制的查询。每个步骤都提供了微调和优化的机会,但也需要仔细配置以确保所有组件无缝协作。

虽然这提供了很大程度的控制,但它使使用语义搜索成为一个详细而深思熟虑的过程,要求你配置彼此相关并与推理模型相关的单独部分。

semantic_text 通过专注于重要的事情来简化此过程:推理模型。一旦你选择了推理模型,semantic_text 将通过提供合理的默认值让你轻松开始使用语义搜索,这样你就可以专注于搜索,而不是如何索引、生成或查询嵌入。

让我们看一下每个步骤,以及 semantic_text 如何简化此设置。

选择一个推理模型

推理模型将为你的文档和查询生成嵌入。不同的模型在以下方面有不同的权衡:

  • 结果的准确性和相关性
  • 可扩展性和性能
  • 语言和多语言支持
  • 成本

Elasticsearch 支持内部和外部推理服务:

  • 内部服务部署在 Elasticsearch 集群中。你可以使用已包含的模型(如 ELSER 和 E5),也可以使用 eland 将外部模型导入集群。
  • 外部服务由模型提供商部署。Elasticsearch 支持以下内容:
    • Cohere
    • Hugging Face
    • Mistral
    • OpenAI
    • Azure AI Studio
    • Azure OpenAI
    • Google AI Studio

选择推理模式后,为其创建推理端点。推理端点标识符将是你设置 semantic_text 所需的唯一配置详细信息。

PUT _inference/sparse_embedding/my-elser-endpoint
{"service": "elser","service_settings": {"num_allocations": 1,"num_threads": 1}
}

创建索引映射

Elasticsearch 需要对模型生成的嵌入进行索引,以便以后可以有效地查询它们。

在使用 semantic_text 之前,你需要了解用于存储嵌入信息的两个主要字段类型:

  • sparse_vector:它对稀疏向量嵌入进行索引,例如 ELSER 生成的嵌入。每个嵌入都由标记和权重对组成。每个嵌入都会生成少量标记。
  • dense_vector:它对包含嵌入信息的数字向量进行索引。模型会生成固定大小的向量,称为向量维度。

要使用的字段类型取决于你选择的模型。如果使用密集向量,你需要配置字段以包含维度计数、用于计算向量接近度的相似度函数以及存储自定义,例如量化或每个元素使用的特定数据类型。

现在,如果你使用 semantic_text,则只需为模型指定推理端点标识符即可定义 semantic_text 字段映射:

PUT test-index
{"mappings": {"properties": {"infer_field": {"type": "semantic_text","inference_id": "my-elser-endpoint"}}}
}

就是这样。你无需定义其他映射选项,也无需了解需要使用哪种字段类型。

设置索引

一旦你的索引准备好存储嵌入,就该生成它们了。

在 semantic_text 之前,要自动在文档摄取时生成嵌入,你需要设置摄取管道。

摄取管道用于在摄取到索引中时或在摄取过程中明确指定时自动丰富或转换文档。

你需要使用 inference processor 为你的字段生成嵌入。处理器需要使用以下内容进行配置:

  • 从中生成嵌入的文本字段
  • 将添加生成的嵌入的输出字段
  • 根据模型类型,针对文本嵌入或稀疏嵌入的特定推理配置

使用 semantic_text,你只需将文档添加到索引中。semantic_text 字段将使用指定的推理端点自动计算嵌入。

这意味着无需创建推理管道来生成嵌入。使用批量、索引或更新 API 将自动为你执行此操作:

PUT test-index/_doc/doc1
{"infer_field": "These are not the droids you're looking for. He's free to go around"
}

semantic_text 字段中的推理请求也是批量处理的。如果你在 bulk API 请求中有 10 个文档,并且每个文档包含 2 个 semantic_text 字段,那么该请求将一次性向你的推理服务执行包含 20 个文本的单个推理请求,而不是每次发出 10 个包含 2 个文本的单独推理请求。

自动处理长文本段落

选择模型的挑战之一是模型可以生成嵌入的标记数量。模型可以处理的标记数量有限。这被称为模型的上下文窗口。

如果你需要处理的文本比模型的上下文窗口长,你可以截断文本并仅使用其中的一部分来生成嵌入。这并不理想,因为你会丢失信息;生成的嵌入将无法捕获输入文本的完整上下文。

即使你有一个长的上下文窗口,长文本也意味着大量内容将被缩减为单个嵌入,从而使其成为不准确的表示。

此外,返回长文本会让用户难以理解,因为他们必须扫描文本以检查它是否是他们要查找的内容。最好使用较小的片段。

另一种选择是使用分块将长文本分成较小的片段。这些较小的块被添加到每个文档中,以更好地表示完整的文本。然后,你可以使用嵌套查询搜索所有单个片段并检索包含得分最高的块的文档。

在 semantic_text 之前,分块不是开箱即用的 - 推理处理器不支持分块。如果你需要使用分块,则需要在提取文档之前进行分块,或者使用脚本处理器在 Elasticsearch 中执行分块。

使用 semantic_text 意味着在索引时将为你完成分块。长文档将被拆分为 250 个单词的部分,其中有 100 个单词重叠,因此每个部分与前一个部分共享 100 个单词。这种重叠可确保连续性,并防止输入文本中的重要上下文信息因硬中断而丢失。

如果模型和推理服务支持批处理,则分块输入会自动批处理为尽可能少的请求,每个请求的大小都适合推理服务。生成的块将存储在嵌套对象结构中,以便你可以检查每个块中包含的文本。

查询数据

现在文档及其嵌入已在 Elasticsearch 中编入索引,是时候进行一些查询了!

在使用 semantic_text 之前,你需要根据模型生成的嵌入类型(密集或稀疏)使用不同的查询。查询 sparse_vector 字段类型需要 sparse vector query,而搜索 density_vector 字段类型则可以使用 knn search 或  knn query。

查询过程可以进一步定制,以提高性能和相关性。例如,稀疏向量查询可以定义标记修剪(token pruning),以避免考虑不相关的标记。Knn 查询可以指定要考虑的候选数以及要从每个分片返回的前 k 个结果。

使用 semantic_text 时,你无需处理这些细节。你可以使用 single query type 来搜索文档:

GET test-index/_search
{"query": {"semantic": {"field": "inference_field","query": "robots you're searching for"}}
}

只需包含字段和查询文本。无需在稀疏向量和 knn 查询之间做出选择,语义文本会为你完成此操作。

将其与使用具有所有配置参数的特定 knn 搜索进行比较:

{"knn": {"field": "inference-field","k": 10,"num_candidates": 100,"query_vector_builder": {"text_embedding": { "model_id": "my-dense-vector-embedding-model", "model_text": "robots you're searching for" }}}
}

底层原理

要了解 semantic_text 的工作原理,你可以创建一个 semantic_text 索引并检查摄取文档时会发生什么。摄取第一个文档时,推理端点会计算嵌入。索引后,你会注意到索引映射中的变化:

GET test-index
{"test-index": {"mappings": {"properties": {"infer_field": {"type": "semantic_text","inference_id": "my-elser-endpoint","model_settings": {"task_type": "sparse_embedding"}}}}}
}

现在有关于模型设置的附加信息。文本嵌入模型还将包括模型的维度数或相似度函数等信息。

你可以检查文档是否已包含嵌入结果:

GET test-index/_doc/doc1
{"_index": "test-sparse","_id": "doc1","_source": {"infer_field": {"text": "these are not the droids you're looking for. He's free to go around","inference": {"inference_id": "my-elser-endpoint","model_settings": {"task_type": "sparse_embedding"},"chunks": [{"text": "these are not the droids you're looking for. He's free to go around","embeddings": {"##oid": 1.9103845,"##oids": 1.768872,"free": 1.693662,"dr": 1.6103356,"around": 1.4376559,"these": 1.1396849…}}]}}}
}

该字段不仅包含输入文本,还包含一个结构,用于存储原始文本、模型设置以及输入文本被划分成的每个块的信息。

此结构由一个具有两个元素的对象组成:

  • text:包含原始输入文本
  • inference:推理端点添加的推理信息,包括:
    • 推理端点的 inference_id
    • 包含模型属性的 model_settings
    • chunks:嵌套对象,包含从输入文本创建的每个块的元素。每个块包含:
      • 块的 text
      • 块文本的计算 embeddings

自定义语义文本

semantic_text 通过对数据进行索引和查询做出默认决策来简化语义搜索:

  • 根据推理模型类型使用 sparse_vector 或 density_vector 字段类型
  • 根据推理结果自动定义维度数和相似度
  • 对密集向量字段类型使用 int8_hnsw 索引类型来利用标量量化 。
  • 使用查询默认值。sparse_vector 查询不应用任何标记修剪,knn 查询也不设置自定义 k 和 num_candidates。

这些都是合理的默认值,可让你快速轻松地开始使用语义搜索。随着时间的推移,你可能希望自定义查询和数据类型以优化搜索相关性、索引和查询性能以及索引存储。

查询自定义

目前还没有针对语义查询的自定义选项。如果你想针对 semantic_text 字段自定义查询,可以使用显式 knn 和稀疏向量查询执行高级 semantic_text 搜索。

我们计划添加对 semantic_text 的 retrievers 支持,并向 semantic_text 字段添加配置选项,以便在查询时不需要它们。敬请期待!

数据类型自定义

如果你需要对数据索引进行更深入的自定义,则可以使用 sparse_vector 或 density_vector 字段类型。这些字段类型让你可以完全控制嵌入的生成、索引和查询方式。

你需要创建一个带有推理处理器的摄取管道来生成嵌入。本教程将引导你完成整个过程。

下一步是什么?

我们刚刚开始使用 semantic_text!我们将继续致力于许多增强功能,包括:

  • 更好的推理错误处理
  • 自定义分块策略
  • 默认隐藏 _source 中的嵌入,以避免使搜索响应混乱
  • 内部命中支持,用于检索查询的相关信息块
  • 过滤和 retrievers 支持
  • Kibana 支持

试试吧!

使用此笔记本[准备好后添加链接]探索语义文本,快速了解语义文本的工作原理。

如果你已经拥有 Elasticsearch 集群,则可以在本教程中查看使用语义文本测试语义搜索的完整示例。

我们很乐意听听你使用语义文本的经验!请在论坛中告诉我们你的想法,或在 GitHub 存储库中打开问题。让我们一起让语义搜索更容易!

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

原文:Semantic search simplified with semantic_text — Elastic Search Labs

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

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

相关文章

OpenAI开发者大会:OpenAI如何再次掀起AI领域的浪潮

对于AI行业的从业者来说,他们可能度过了一个不眠之夜。 北京时间2023年11月7日凌晨,美国人工智能公司OpenAI的开发者大会隆重举行。OpenAI的创始人Sam Altman与同事仅用短短45分钟的时间,在台上发布了他们团队的最新成果——GPT-4 Turbo。这一…

vue+canvas画布实现网页签名效果

1、签名自定义组件代码示例&#xff1a; qianMing.vue <template><!-- 容器&#xff0c;包含画布和清除按钮 --><div class"signature-pad-container"><!-- 画布元素&#xff0c;用于用户签名 --><canvasref"canvas" <!--…

学习金字塔模型

学习金字塔模型由美国缅因州巴特尔教育研究所&#xff08;National Training Laboratories, Bethel, Maine&#xff09;开发&#xff0c;它展示了不同学习活动的平均知识保留率。这种方法可以帮助人们理解不同学习方式的有效性&#xff0c;从而更好地选择适合的学习方法。学习金…

关键时刻,了解可燃气体报警器探头使用年限至关重要

可燃气体报警器是工业生产、商业场所及家庭安全中不可或缺的重要设备&#xff0c;它能够实时监测环境中可燃气体&#xff08;如天然气、液化石油气等&#xff09;的浓度&#xff0c;并在浓度达到预设的阈值时发出警报&#xff0c;以预防火灾和爆炸等危险事件。 而作为报警器核…

来聊聊Redis所实现的Reactor模型

写在文章开头 我们都知道解决C10k问题的最好方案就是通过在IO多路复用的基础上通过reactor模型实现高性能的网络并发程序&#xff0c;借助这个设计&#xff0c;redis的主线程也是基于IO多路复用以reactor模型的思路实现了一个高性能的单线程内存数据&#xff0c;本文将带领读者…

一种改进最大相关峭度解卷积的滚动轴承故障诊断方法(MATLAB)

近年来&#xff0c;最大相关峭度解卷积受到了研究人员越来越多的关注&#xff0c;陆续有多篇研究论文将该方法应用于滚动轴轴承故障诊断。MCKD是由McDonald提出的一种解卷积方法&#xff0c;其算法中设计了一个新的目标函数——相关峭度&#xff0c;并以此为优化目标设计一系列…

HTML(24)——过渡

过渡 作用&#xff1a;可以为一个元素在不同的状态之间切换的时候添加过渡效果 属性名&#xff1a;transition(复合属性) 属性值&#xff1a;过渡的属性 花费时间(s) 提示&#xff1a; 过渡的属性可以是具体的CSS属性也可以为all&#xff08;两个状态属性值不同的所有属性…

HTML基础入门知识

HTML基础使用 文章目录 HTML基础使用1、什么是HTML2、web标准4、HTML语法规则5、常用的标签标题标签段落标签换行标签文本格式化标签div和span标签图片标签路径链接标签注释 1、什么是HTML 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示…

完美世界否认大规模裁员,存在项目和人员的正常调整

原标题&#xff1a;完美世界回应裁员传闻&#xff1a;确实存在人员调整 项目继续正常研发 易采游戏网6月25日消息&#xff1a;网络上热传完美世界进行史上最大规模裁员&#xff0c;甚至有消息称其两栋办公楼已近乎搬空&#xff0c;同时备受瞩目的游戏项目《完美新世界》和《一拳…

日立EX-PROII+系列全新升级,智慧随心控畅享新生活

随着科技的进步&#xff0c;各种智能家电也开始走入人们的生活&#xff0c;而在这个领域&#xff0c;日立用技术创新生活&#xff0c;不断为新时代注入活力&#xff0c;推出日立 EX-PROII系列家用净化中央空调&#xff0c;贯彻“小身材&#xff0c;大能量”核心设计理念&#x…

Docker编译nanopc-t4源码流程介绍

官方文档 Android系统编译 vnc加环境变量配置 https://github.com/friendlyarm/docker-cross-compiler-novnc 下载 git clone https://github.com/friendlyarm/docker-ubuntu-lxde-novnc cd docker-ubuntu-lxde-novnc docker build --no-cache -t docker-ubuntu-lxde-novnc …

【期末复习】计算机组成原理

海明码 最通俗的海明码计算方法&#xff0c;不需记公式&#xff0c;套步骤即可&#xff08;可能都不需要理解&#xff09; https://www.bilibili.com/video/BV1tL4y1h7Fd/ 接上一海明码视频&#xff08;海明码的纠错&#xff09; https://www.bilibili.com/video/BV1tf4y1A7NX/…

使用官方新工具手动升级 Quest 操作系统

Meta 近期推出了一款用于手动升级 Meta Quest 系统的工具&#xff0c;为用户提供了更多选择。本文将详细介绍如何使用这一工具进行系统升级。 优势与劣势 优势&#xff1a; 安装迅速&#xff1a;升级速度相比在线自动升级快&#xff0c;且可实时查看进度 即时升级&#xff1…

全国计算机等级考试WPS如何报名

全国计算机等级考试WPS如何报名&#xff1f; 注册并登录 全国计算机等级考试官网选择 考试服务-在线报名选择报考省份-开始报名

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。 介绍安装使用示例与文档 介绍 Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。用于实现可调节窗口&#xff0c;支持Vue2、Vue3。 安装 Vue3 npm install splitpanesVue2 npm install splitpaneslegac…

东昂科技从创业板改道北交所:大客户依赖症明显,巨额分红又募投补流

《港湾商业观察》施子夫 黄懿 2024年6月24日&#xff0c;厦门东昂科技股份有限公司&#xff08;以下简称&#xff0c;东昂科技&#xff09;在北交所网站披露第二轮审核问询函的回复。自2024年1月IPO申请获北交所受理以来&#xff0c;东昂科技已经收到北交所下发的两轮审核问询…

项目实训-接口测试(十八)

项目实训-后端接口测试&#xff08;十八&#xff09; 文章目录 项目实训-后端接口测试&#xff08;十八&#xff09;1.概述2.测试对象3.测试一4.测试二 1.概述 本篇博客将记录我在后端接口测试中的工作。 2.测试对象 3.测试一 这段代码是一个单元测试方法&#xff0c;用于验证…

echarts+vue2实战(二)

目录 一、WebSocket【双向通信】的使用 1.1、前端 1.2、后端 二、前端组件的合并与优化 三、全屏切换 3.1、单页面切换 3.2、同页面多端联动 四、主题切换 4.1、单页面切换 4.2、同页面多端联动 一、WebSocket【双向通信】的使用 1.1、前端 在utils文件夹里创建soc…

ArkUI开发学习随机——得物卡片,京东登录界面

案例一&#xff1a;得物卡片 代码&#xff1a; Column(){Column(){Image($r("app.media.mihoyo")).width(200).height(200)Row(){Text("今晚玩这个 | 每日游戏打卡").fontWeight(700).fontSize(16).padding(4)}.width(200)Text("No.12").fontWe…

盲盒小程序开发:解锁未知,探索无限惊喜

一、开启新篇章 在追求独特与新颖的时代&#xff0c;盲盒以其神秘感与未知性&#xff0c;成为了年轻人热衷的购物新方式。为了满足这一市场需求&#xff0c;我们精心打造了一款全新的盲盒小程序&#xff0c;带您步入一个充满未知与惊喜的购物新领域。 二、产品亮点 精选商品&…