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 中使用如下的命令:

相关文章:
Elasticsearch:为推理端点配置分块设置
推理端点对一次可处理的文本量有限,具体取决于模型的输入容量。分块(Chunking) 是指将输入文本拆分成符合这些限制的小块的过程,在将文档摄取到 semantic_text 字段时会进行分块。分块不仅有助于保持输入文本在可处理范围内&#…...
如何使用webpack预加载 CSS 中定义的资源和预加载 CSS 文件
在 Webpack 中预加载 CSS 文件及其内部定义的资源(如图片、字体等),可以通过 资源预加载(Preloading) 技术优化关键资源的加载优先级。以下是具体的实现方法和步骤: 一、预加载 CSS 文件 1. 使用 vue/prel…...
[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)
导语: 在工业控制领域,设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码,威胁设备稳定运行。本文将手把手教你使用 DriverView工具,高效完成工控机驱动安全检查,精准识别可疑驱动&a…...
解决 React Native 0.76 中 com.facebook.react.settings 插件缺失问题
在使用 React Native 0.76 创建项目时,遇到以下错误: FAILURE: Build failed with an exception. * Where: Settings file /Users/wangxp/learn/AwesomeProject/android/settings.gradle line: 2 * What went wrong: Plugin [id: com.facebook.react.se…...
多无人车协同探索开源包启动文件介绍(上)
在之前介绍的《多无人车协同探索开源包部署教程及常见报错解决方式》中运行多无人车协同探索时,先后运行了两个launch文件 multiple_tb3_house.launch 和three_robots.launch ,本文来进一步看一下这两个启动文件以及其调用的move_base .launch 和multi_t…...
Linux驱动学习笔记(三)
并发与竞争 1.在编写驱动程序的时候,要尽量避免让驱动程序存在并发和竞争,Linux内核里面提供了几种处理并发与竞争的方法,分别是:原子操作、自旋锁、信号量和互斥体。 原子操作:Linux的原子操作基于atomic_t数据类型…...
【QT5 多线程示例】互斥锁
互斥锁 互斥锁介绍:【C并发编程】(三)互斥锁:std::mutex。原理都一样,这里就不赘述了。 QMutex 是 Qt 框架中提供的一个互斥锁类,主要包括以下成员函数: lock():试图锁定互斥量。…...
SaaS系统的销售微服务与权限微服务边界设计
在设计SaaS系统的销售微服务与权限微服务的边界时,需要结合领域驱动设计(DDD)和微服务拆分原则,确保高内聚、低耦合。以下是结合微服务架构原则、多租户SaaS需求及权限管理场景的完整设计方案,整合了权限服务与销售服务…...
leetcode热题100道——两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...
C语言经典代码练习题
1.输入一个4位数:输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个4位数:");scanf("%d",&a);printf("个位:%d\n"…...
Git远程拉取和推送配置
Git进行远程代码拉取和推送时候提示配置user.name 和 user.email 背景:换新电脑后使用Git进行代码拉取和推送过程中,提示“Make sure you configure your “user.name” and “user.email” in git.”。这个配置针对git的正常使用仅需要配置一次…...
MySQL WHERE 子句详解
MySQL WHERE 子句详解 引言 在数据库操作中,WHERE 子句是用于筛选记录的重要工具。它允许我们在查询中指定条件,从而只选择满足特定条件的记录。本文将详细介绍 MySQL 中的 WHERE 子句,包括其语法、用法以及一些高级技巧。 WHERE 子句的基…...
基于SpringBoot+Vue3实现的宠物领养管理平台功能七
一、前言介绍: 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高,越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员,人们对于宠物的关爱和照顾也日益增加。然而,传统的宠物领养流程存在诸多不便&a…...
【leetcode hot 100 994】腐烂的橘子
多源广度优先搜索 所有的腐烂橘子在广度优先搜索上是等价于同一层的节点的。假设这些腐烂橘子刚开始是新鲜的,而有一个腐烂橘子(我们令其为超级源点)会在下一秒把这些橘子都变腐烂,而这个腐烂橘子刚开始在的时间是 −1,那么按照广度优先搜索…...
精挑20题:MySQL 8.0高频面试题深度解析——掌握核心知识点、新特性和优化技巧
1. MySQL 8.0 中,为什么查询缓存被移除? 答案: 原因:查询缓存对频繁更新的表效果差,任何对该表的写操作都会清空所有相关缓存,导致缓存命中率低,反而增加开销。 替代方案: 使用应用…...
调研报告:Hadoop 3.x Ozone 全景解析
Ozone 是 Hadoop 的分布式对象存储系统,具有易扩展和冗余存储的特点。 Ozone 不仅能存储数十亿个不同大小的对象,还支持在容器化环境(比如 Kubernetes)中运行。 Apache Spark、Hive 和 YARN 等应用无需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…...
深入理解 RLP 编码与 JSON:原理、应用与比较
在区块链和数据存储领域,RLP(Recursive Length Prefix)编码和**JSON(JavaScript Object Notation)**是两种重要的数据编码方式。它们分别适用于不同的应用场景,并具有不同的优缺点。本文将系统性地分析 RLP…...
【Linux】Makefile秘籍
> 🍃 本系列为Linux的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享🔍 >如果本篇文章有问题,还请多多包涵&a…...
玩转物联网-4G模块如何快速将数据上传到巴法云(TCP篇)
目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 巴法云平台设备创建 3.1 创建账号 3.2 进入巴法云 3.3 获取联网参数 4 连接巴法云 4.1 打开配置工具读取基本信息 4.2 设置连接参数进行数据交互 4.2.1 建立TCP连接 4.2.2 订阅主题 4.2.3 发布信…...
postgresql 高版本pgsql备份在低版本pgsql中恢复失败,报错:“unsupported version”
关键字 PostgreSQL、pg_restore、版本兼容性、数据库迁移、pg_dump、备份恢复、unsupported version in file header 背景环境 系统配置 环境类型操作系统PostgreSQL版本内存工具链测试环境Windows 111616GBNavicat/PgAdmin生产环境Windows Server 2012 R2128GBPgAdmin/命令…...
html相关常用语法
html相关常用语法 HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页的标准标记语言 HTML使用标记语言描述Web页面的结构 HTML元素是HTML页面的建构快 HTML元素通过标签tag来表示 HTML标签是“标题”、”段落“、”表格“等内…...
vue3+ts心得
1、Vue3核心 1、setup setup里弱化this,return可以返回函数,返回后页面也显示那个函数值 data里面是可以用this.来获取setup里的值,这个是单向的 vue3两个script标签不要觉得奇怪,一个是配置组合式api的,一个是配置组…...
单片机flash存储也做磨损均衡
最近在做一个项目,需要保存设置数据,掉电不丢失。那么首先想到的是加个24c02,是一个eeprom,但是客户板太小,没有办法进行扩展。后面就找了一个带ee的OTP单片机,发现擦写次数有限,只有1000次&…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(10)
1.问题描述: 离线推送,锁屏的时候没有弹出消息,只有下拉在通知中心里面显示。请问是否是正常的? 解决方案: 检查一下是否存在图片风控:https://developer.huawei.com/consumer/cn/doc/harmonyos-referen…...
SQLark中如何进行数据筛选与排序
本文将为你介绍在 SQLark 中如何进行数据筛选与排序,掌握这些操作能够极大提升你的工作效率。 SQLark官网链接:www.sqlark.com 数据筛选 在数据库操作中,数据筛选是一项关键功能,它依据特定条件对数据进行过滤,帮助用户从海量数据…...
token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)
思路: 首先,用户的需求是确保使用同一个Token的外部调用都在一个Session中处理。 需要考虑Token与Session绑定、安全措施、Session管理、分布式处理等。 使用Redis作为Session存储, 在Java中 通过Spring Data Redis或Lettuce库实现。 2.生成…...
VSTO(C#)Excel开发11:自定义任务窗格与多个工作簿
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
python:AI+ music21 构建LSTM模型生成爵士风格音乐
这是一个使用 python的 music21 和 TensorFlow/Keras 构建 LSTM 模型生成爵士风格音乐的完整脚本。该脚本包含MIDI数据处理、模型训练和音乐生成全流程: # -*- coding: utf-8 -*- """AI music21 和 TensorFlow/Keras 构建LSTM模型生成爵士风格音乐 …...
vscode查看文件历史git commit记录
方案一:GitLens 在vscode扩展商店下载GitLens 选中要查看的文件,vscode界面右上角点击GitLens的图标,选择Toggle File Blame 界面显示当前打开文件的所有修改历史记录 鼠标放到某条记录上,可以看到记录详情,选中O…...
使用netDxf扩充LaserGRBL使它支持Dxf文件格式
为 LaserGRBL 扩展支持 DXF 文件格式,需要了解 LaserGRBL 的代码结构,并在其基础上添加 DXF 文件的解析和转换逻辑。以下是详细的扩展方案: 1. 了解 LaserGRBL LaserGRBL 是一个用于控制激光雕刻机的开源软件,支持 G 代码文件的加…...
