Elasticsearch:为推理端点配置分块设置

推理端点对一次可处理的文本量有限,具体取决于模型的输入容量。分块(Chunking) 是指将输入文本拆分成符合这些限制的小块的过程,在将文档摄取到 semantic_text 字段时会进行分块。分块不仅有助于保持输入文本在可处理范围内,还能使内容更加易读。相比返回一整篇长文档,在搜索结果中提供最相关的文本片段更有价值。

每个分块都会包含 文本片段 以及 从中生成的对应嵌入

默认情况下,文档会被拆分为 句子(sentence),然后按 最多 250 个单词 进行分组,并且设置 1 句重叠,使得每个分块都会与前一个分块共享一个句子。这种重叠方式可以保持上下文的连续性,防止重要信息因硬性拆分而丢失。

Elasticsearch 使用 ICU4J 库来检测单词和句子的边界。在确定单词边界时,该库遵循一系列规则,而不仅仅依赖空格字符。对于像 中文或日文 这类不使用空格分隔单词的书写语言,系统会利用 字典查找 来识别单词边界。

分块策略

Elasticsearch 提供了 两种分块策略句子策略(sentence)单词策略(word)

  • 句子策略(sentence)
    该策略按 句子边界 拆分文本,每个分块包含一个或多个完整的句子,以确保句子级别的语境完整性。

    • 若某个句子导致分块超出 max_chunk_size 设定的单词数上限,该句子会被拆分至多个分块中。
    • sentence_overlap 选项控制前一个分块中的 多少个句子 应该包含在当前分块中,可选值为 0 或 1
  • 单词策略(word)
    该策略按 单词 拆分文本,直至 max_chunk_size 限制。

    • overlap 选项控制当前分块应包含前一个分块中的 多少个单词

默认分块策略句子策略(sentence)

注意:对于 8.16 版本之前创建的推理端点,默认的分块策略是 单词策略(word)

可以在文章 “Elasticsearch:使用阿里 infererence API 及 semantic text 进行向量搜索” 查看更为详尽的示例。

安装

Elasticsarch 及 Kibana

 我们首先需要安装 Elasticsearch 及 Kibana。我们可以参考如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

当我们安装的时候,选择 Elastic Stack 8.x 的文章来进行安装。在本展示中,我们将使用 Elastic Stack 8.17.2 来进行展示。当我们首次运行 Elasticsearch 时,我们可以看到如下的界面:

请记下上面的 elastic 超级用户的密码,以备在下面进行使用。

下载代码

为了展示方便,我们在地址 https://github.com/liu-xiao-guo/elasticsearch-labs/blob/main/notebooks/document-chunking/configuring-chunking-settings-for-inference-endpoints.ipynb下载最新的代码。

拷贝证书

为了能够使得我们的代码能够正常工作,我们必须拷贝 Elasticsearch 的证书:

cp ~/elastic/elasticsearch-8.17.2/config/certs/http_ca.crt .
$ pwd
/Users/liuxg/python/elasticsearch-labs-liuxg/notebooks/document-chunking
$ cp ~/elastic/elasticsearch-8.17.2/config/certs/http_ca.crt .

创建一个 .env 文件

我们还需要创建一个叫做 .env 的本地文件,并置于项目的根目录下:

ES_USER="elastic"
ES_PASSWORD="zhHdJmd5oBEVwEfoH2Cr"
ES_ENDPOINT="localhost"
$ pwd
/Users/liuxg/python/elasticsearch-labs-liuxg/notebooks/document-chunking
$ cat .env
ES_USER="elastic"
ES_PASSWORD="zhHdJmd5oBEVwEfoH2Cr"
ES_ENDPOINT="localhost"

你需要根据自己的 Elasticsearch 安装进行相应的修改。

安装 Python 依赖项

pip3 install elasticsearch python-dotenv 

安装  ELSER 模型

你可以参考文章 “部署 ELSER - Elastic Learned Sparse EncoderR”。最后,我们可以看到如下的页面:

代码展示

我们使用 jupyter 打开我们的笔记本:

jupyter notebook configuring-chunking-settings-for-inference-endpoints.ipynb

建立 Elasticsearch 客户端连接

from elasticsearch import Elasticsearch
from dotenv import load_dotenv
import osload_dotenv()ES_USER= os.getenv("ES_USER")
ES_PASSWORD = os.getenv("ES_PASSWORD")
ES_ENDPOINT = os.getenv("ES_ENDPOINT")url = f"https://{ES_USER}:{ES_PASSWORD}@{ES_ENDPOINT}:9200"
client = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)print(es.info())

创建推理端点对象

让我们使用 Create Inference API 创建推理端点。

在此示例中,你将为 ELSER 集成创建一个推理端点,该端点将在你的集群中部署 Elastic 的 ELSER 模型。对于任何具有嵌入任务类型的推理端点,分块设置都是可配置的。完整的可用集成列表可在 Create Inference API 文档中找到。

要配置分块设置,请在请求体中包含一个 chunking_settings 映射,其中包含 strategy 值以及所选分块策略的任何必需值。在本示例中,你将为 sentence 策略配置分块设置,最大分块大小为 25 个单词,每个分块与前一个分块重叠 1 个句子。有关可用分块策略及其可配置值的更多信息,请参阅分块策略文档。

import requeststry: client.inference.put(task_type="sparse_embedding",inference_id="my_elser_endpoint",body={"service": "elasticsearch","service_settings": {"num_allocations": 1,"num_threads": 1,"model_id": ".elser_model_2",},"chunking_settings": {"strategy": "sentence","max_chunk_size": 25,"sentence_overlap": 1,},},)
except Exception as e:print(f"Error: {e}")

创建索引

要查看你配置的分块设置如何生效,需要将文档摄取到索引的 semantic_text 字段中。让我们创建一个索引,其中包含一个 semantic_text 字段,并将其链接到上一步创建的推理端点。

client.indices.create(index="my_index",mappings={"properties": {"infer_field": {"type": "semantic_text","inference_id": "my_elser_endpoint",}}},
)

摄入一个文档

现在,让我们将一个文档摄取到上一步创建的索引中。

注意:Elasticsearch 在创建推理端点时会启动 ELSER 模型部署,分配节点可能需要一些时间。在执行以下请求之前,你需要等待部署被分配到节点。

client.index(index="my_index",document={"infer_field": "This is some sample document data. The data is being used to demonstrate the configurable chunking settings feature. The configured chunking settings will determine how this text is broken down into chunks to help increase inference accuracy."},
)

查看分块

生成的分块及其对应的推理结果存储在索引中文档的 _inference_fields 元字段下的 chunks 键中。这些分块以字符偏移值列表的形式存储。让我们查看在上一步摄取文档时生成的分块。

为了能够看得清楚我们的分块,我们在 Kibana 中使用如下的命令:

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

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

相关文章

Unity打包Android平台调用sherpa-onnx

https://github.com/xue-fei/sherpa-onnx-unity 最初测试了PC的Win和Linux平台,直接从nuget缓存包中拷贝相关文件,按示例写了语音转文字和文字转语音的测试代码,功能都正常。 然后是Android端,看了示例发现有编译好的jni.so之类的…

传统会议室接入神旗视讯-2 Android会议室大屏设备 (Maxhub, Newline, TCL等)

随着企业对视频会议安全性、稳定性和统一管理的需求日益增长,私有化视频会议系统凭借其全平台兼容性、高安全性部署和智能化会控能力,成为政企客户的核心选择。Android会议室大屏设备(Maxhub, Newline, TCL等)作为国内主流智能会议…

个人blog系统 前后端分离 前端js后端go

系统设计: 1.使用语言:前端使用vue,并使用axios向后端发送数据。后端使用的是go的gin框架,并使用grom连接数据库实现数据存储读取。 2.设计结构: 最终展示:仅展示添加模块,其他模块基本相似 前…

分支结构- P5717-三角形分类-第二十一天

洛谷题单 第二十一天&#xff1a;3.18&#xff08;周二&#xff09; 题目&#xff1a;分支结构–P5717 代码 #include <stdio.h>//本题目卡住的点&#xff1a;1.逻辑问题 2.对if-else if-else结构的运行理解&#xff0c;导致了逻辑混乱//注意&#xff1a;程序会组个…

华为OD机试 - 最长回文字符串 - 贪心算法(Java 2024 E卷 100分)

题目描述 如果一个字符串正读和反读都一样(大小写敏感),则称之为一个「回文串」。例如: level 是一个「回文串」,因为它的正读和反读都是 level。art 不是一个「回文串」,因为它的反读 tra 与正读不同。Level 不是一个「回文串」,因为它的反读 leveL 与正读不同(因大小…

C语言文件操作入门

本节重点 理解文件的形式与基本概念二进制文件与文本文件文件的打开与关闭文件读写函数、文件缓冲区 正文开始--------------------------------------------------------------------------------------------------------------------- 一、为什么使用文件 程序运行时数据存…

Doris:联邦认证

LDAP​ 接入第三方 LDAP 服务为 Doris 提供验证登录和组授权服务。 LDAP 验证登录​ LDAP 验证登录指的是接入 LDAP 服务的密码验证来补充 Doris 的验证登录。Doris 优先使用 LDAP 验证用户密码&#xff0c;如果 LDAP 服务中不存在该用户则继续使用 Doris 验证密码&#xff…

stm32第六天继电器

一&#xff1a;继电器 1.继电器的工作原理 继电器是一个电控开关&#xff0c;工作原理基于电磁感应&#xff0c;继电器包括一个电磁线圈和一组触点。常用于控制高电流或高电压的电路&#xff0c;例如自动控制原理&#xff0c;电力系统和自动化设备中&#xff0c;由于可靠性和电…

Vue渲染函数 - render 函数

文章目录 Vue渲染函数 - render 函数1. 什么是 render 函数2、页面展示过程3、render 函数的参数4. 如何使用&#xff08;1&#xff09;基本渲染&#xff08;2&#xff09;传递属性和事件&#xff08;3&#xff09;条件渲染 5. render 函数的实际使用6.View Design 组件中的使用…

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…

go回调函数的使用

在Go语言中&#xff0c;回调函数可以有参数&#xff0c;也可以没有参数。它们的定义和使用方式略有不同&#xff0c;但本质上都是将函数作为参数传递给另一个函数&#xff0c;并在适当的时候调用它。以下是带参数和不带参数的回调函数的示例和说明。 1. 不带参数的回调函数 不…

在 Ubuntu 中配置 NFS 共享服务的完整指南

前言 网络文件系统&#xff08;NFS&#xff09;作为 Linux 系统间实现文件共享的标准协议&#xff0c;在分布式计算和容器化部署场景中具有重要作用。本文将详细演示如何在 Ubuntu 系统上配置 NFS 服务端与客户端&#xff0c;并实现可靠的持久化挂载。 一、环境准备 系统要求…

TypeScript Symbols 深度解析:在 Vue3 中的高级应用实践

一、Symbols 核心特性解析 1.1 什么是 Symbol&#xff1f; Symbol 是 ES6 引入的原始数据类型&#xff0c;表示唯一且不可变的值&#xff0c;主要解决对象属性名冲突问题。在 TypeScript 中&#xff0c;我们通过 symbol 类型获得完整的类型支持&#xff1a; const SERIAL_KE…

无需刷机、root,畅享原生安卓的丝滑体验。

Apex Launcher 是一款历史悠久的 Android 桌面启动器&#xff0c;诞生于 Android 系统早期&#xff08;Android 4.0 时代&#xff09;。当时&#xff0c;Android 系统的默认界面被认为较为简陋&#xff0c;无法满足一些追求个性化和高效操作的用户需求。因此&#xff0c;许多开…

Visual Studio Code安装配置优化全攻略:打造高效开发环境

目录 一、背景与意义 二、安装与配置基础 2.1 下载与安装 2.2 核心配置目录 三、深度优化配置指南 3.1 主题与界面优化 3.2 必装效率插件&#xff08;精选TOP10&#xff09; 3.3 性能优化设置 四、实战案例&#xff1a;前端开发环境配置 4.1 项目初始化 4.2 调试配置…

味觉传送器E-Taste:开启虚拟世界的味觉之门

味觉传送器E-Taste&#xff1a;开启虚拟世界的味觉之门 一、发明背景与动机 随着虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术的飞速发展&#xff0c;人们在虚拟世界中的沉浸感不断提升&#xff0c;视觉和听觉体验已经取得了显著的突破。然而…

判断质数与合数

判断质数与合数的逻辑很相似&#xff0c;都是判断一个属除了1和它本身&#xff0c;能不能被其他数整除。 其他数包括质数与合数&#xff0c;合数能表示能质数的乘积&#xff0c;因此问题就转化为&#xff1a;一个数能不能被除了1和它本身之外的其他质数整除。 质数2&#xff…

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek&#xff1f;2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代&#xff0c;企业越来越重视数据的价值。为了…

Cursor在内网环境配置自定义DeepSeek API

关键字 Cursor、DeepSeek、API配置、内网代理、HTTP/2 背景环境 使用Cursor集成环境开发程序。但是我使用公司的内网并不能使用cursor自带的模型&#xff0c;于是我就想使用DeepSeek官方的API服务。 环境&#xff1a;Windows 11系统 解决过程 网络检测 首先进行环境检测&am…