Elasticsearch:可配置的推理 API 端点分块设置
作者:来自 Elastic Daniel Rubinstein

Elasticsearch 开放推理 API 现已支持可配置的分块,以便在文档摄取时处理语义文本字段。
Elasticsearch 推理 API 允许用户利用各种提供商的机器学习模型执行推理操作。其中一个常见用例是在索引中支持用于语义搜索的语义文本字段。随着文档数据量的增加,对整个数据创建嵌入可能会导致结果不够准确。此外,一些推理模型对可处理的输入大小有限制。因此,推理 API 采用了一种称为分块(chunking)的处理方式,将摄取到索引的大型文档拆分为较小且更易管理的子部分,即 “块”(chunks)。然后对每个块单独运行推理操作,并将推理结果存储在索引中。
在本篇博客中,我们将介绍分块策略,解析 Elasticsearch 如何进行文本分块,并讲解如何为推理端点配置分块设置。
更多阅读:
- Elasticsearch:为推理端点配置分块设置
-
Elasticsearch:检索增强生成背后的重要思想
可配置的分块设置是什么?
从 8.16 版本开始,用户可以从两种分块策略中进行选择,每种策略都具备可配置的属性。

基于单词的分块策略
用户可配置的参数:
- (必需)max_chunk_size:单个块的最大单词数。
- (必需)overlap:相邻块之间的重叠单词数。
注意:此值不能超过max_chunk_size的一半。
基于单词的分块策略会根据 max_chunk_size 限制,将输入数据拆分成多个块,每个块最多包含指定数量的单词。此策略会尽可能填充一个块达到最大大小后再创建下一个块,除非已处理完整个输入数据。从第二个块开始,每个新块都会包含一部分来自前一个块的单词,其数量由 overlap 参数决定。
这种重叠的目的在于提高推理精度,防止关键上下文因分块而被切断,从而影响推理结果。

基于句子的分块策略
用户可配置的参数:
- (必需)max_chunk_size:单个块的最大单词数。
- (必需)sentence_overlap:相邻块之间的重叠句子数。
注意:此值只能设置为 0 或 1。
基于句子的分块策略会按照完整句子拆分输入数据。每个块仅包含完整的句子,除非某个句子超过 max_chunk_size,此时它会被拆分到多个块中。从第二个块开始,每个新块都会包含一部分来自前一个块的句子,其数量由 sentence_overlap 参数决定。
注意:
- 如果在 8.16 之后创建推理端点时未提供分块设置,默认使用基于句子的策略,
max_chunk_size为 250,sentence_overlap为 1。 - 对于 8.16 之前创建的推理端点,默认使用基于单词的策略,
max_chunk_size为 250,overlap为 1。
如何选择分块策略?
没有通用的最佳分块策略,最适合的策略取决于要处理的文档、使用的模型以及计算资源的限制。建议对部分数据集进行测试,尝试不同的分块策略、块大小和重叠参数,并观察它们对数据摄取时间、搜索延迟、查询结果相关性的影响。例如,可以对不同的块重叠和长度进行参数扫描,并测量其对性能的影响。
以下是一些选择分块策略时的基本原则:
选择分块策略
- 基于句子的分块策略能有效减少上下文信息的丢失,但由于它优先保持句子的完整性,因此可能会生成更多块,增加存储和计算成本。
- 基于单词的分块策略可以优化块的填充效率,通常生成更少的块,提高数据摄取和搜索的效率。
选择合适的块大小
- 选择块大小时,应尽量减少将有价值的上下文信息拆分到不同的块中,同时保持块内部的主题一致性。
- 通常,接近模型最大支持序列长度的块大小效果更好,但较长的块可能包含多个主题,降低检索的精准度。

选择合适的块重叠
- 较大的重叠值(最多可达块长度的一半)有助于提高检索质量,因为它减少了上下文信息的丢失。
- 但重叠越大,生成的块数量也会增加,导致存储和计算成本上升。因此,选择合适的重叠值需要在检索质量和计算资源之间权衡。
Elasticsearch 如何对文本进行分块?
Elasticsearch 使用 ICU4J 库 来检测单词和句子的边界。
单词边界识别
- 并不仅依赖空格字符来划分单词,而是遵循一系列规则来确定单词边界。
- 对于不使用空格的语言(如中文、日文),Elasticsearch 使用词典查找方法来识别单词边界。
句子边界识别
- 并不仅依赖句号(".")等标点符号来确定句子边界,而是遵循更复杂的句子划分规则。
- 这可以确保不同语言的句子边界都能被准确识别,即使句子结构和断句方式不同。
额外的上下文信息
- 在某些情况下,简单的分块策略可能无法保留长距离的上下文信息。
- 如果计算资源允许,可以为块添加额外的生成式上下文,以增强理解和检索质量。
- 具体方法和讨论请参考这个讨论。
如何为推理端点配置分块设置?
前置要求
在配置分块设置之前,请确保满足以下条件:
- 持有有效的企业许可证(enterprise license)。
- 对于连接到第三方集成的推理端点,需设置必要的访问权限(如创建账户、获取 API 密钥等)。
在本指南中,我们将使用 Elastic 的 ELSER 模型 来配置推理端点的分块设置,因此唯一的要求是拥有有效的企业许可证。如果要为第三方集成创建推理端点,请参考 create inference endpoint API 文档获取相关信息。
步骤 1:在推理端点创建时配置分块设置
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}}
)
步骤 2:将推理端点链接到索引中的 semantic text 字段
client.indices.create(
index="my_index",
mappings={"properties": {"infer_field": {"type": "semantic_text","inference_id": "my_elser_endpoint"}}}
)
步骤 3:将文档摄取到索引
使用 Index Document API 将文档摄取到索引:
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 键中找到。要查看存储的块,可以使用搜索 API 查找索引中的所有文档:
client.search(index="my_index", body = {'size' : 100,'query': {'match_all' : {}},'fields': [ '_inference_fields' ]
})
在响应中可以看到这些块。在 8.18 之前,块是作为完整的文本值存储的。从 8.18 开始,块作为字符偏移值的列表存储:
...
'chunks': {'infer_field': [{'start_offset': 0, 'end_offset': 117, 'embeddings':[...]},{'start_offset': 34, 'end_offset': 198, 'embeddings':[...]},{'start_offset': 120, 'end_offset': 242, 'embeddings':[...]}]
}
...
立即开始使用可配置的分块功能!
有关如何使用此功能的更多信息,请查看配置分块的文档。尝试此笔记本,以开始使用可配置的分块设置:配置推理端点的分块设置。
Elasticsearch 与行业领先的生成 AI 工具和提供商有原生集成。查看我们的网络研讨会,了解如何超越 RAG 基础,或构建生产就绪的应用程序 Elastic 向量数据库。
为了构建最适合你用例的搜索解决方案,现在开始免费云试用,或立即在本地机器上尝试 Elastic。
原文:Configurable chunking settings for inference API endpoints - Elasticsearch Labs
相关文章:
Elasticsearch:可配置的推理 API 端点分块设置
作者:来自 Elastic Daniel Rubinstein Elasticsearch 开放推理 API 现已支持可配置的分块,以便在文档摄取时处理语义文本字段。 Elasticsearch 推理 API 允许用户利用各种提供商的机器学习模型执行推理操作。其中一个常见用例是在索引中支持用于语义搜索…...
数据结构之链表(双链表)
目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点: 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插: 头插: 4.双链表的尾删和头删 尾删: 头删: …...
uniapp从 vue2 项目迁移到 vue3流程
以下是必须为迁移到 vue3 进行调整的要点,以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…...
案例:网络命名空间模拟隔离主机场景
场景描述 假设我们需要在同一台物理机上模拟两台独立的主机(Host A 和 Host B),它们分别位于不同的网络命名空间中,并通过虚拟以太网对(veth pair)进行通信。目标是展示网络命名空间的隔离性和跨命名空间的…...
23种设计模式-生成器(Builder)设计模式
工厂方法设计模式 🚩什么是生成器设计模式?🚩生成器设计模式的特点🚩生成器设计模式的结构🚩生成器设计模式的优缺点🚩生成器设计模式的Java实现🚩代码总结🚩总结 🚩什么…...
算法训练营第二十二天 | 回溯算法(四)
文章目录 前言一、Leetcode 491.递增子序列二、Leetcode 46.全排列三、Leetcode 47.全排列Ⅱ 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启…...
NLP高频面试题(十一)——RLHF的流程有哪些
随着大语言模型(如GPT系列)的快速发展,RLHF(Reinforcement Learning from Human Feedback,即基于人类反馈的强化学习)逐渐成为训练高质量模型的重要方法。本文将简单清晰地介绍RLHF的整体流程。 一、RLHF …...
测试用例设计方法与Prompt转化:一键生成高效提示词的实用指南
在测试工程师的日常工作中,设计测试用例是确保软件质量的关键环节。然而,如何快速、高效地设计出覆盖率高、逻辑严密的测试用例却是一个常见的挑战。本文将结合常用的测试用例设计方法,探索如何通过Prompt(提示词)转化…...
蓝桥杯备考:BFS最短路径之Meteor Shower S流星雨
本题是一个BFS最短路问题,我们可以先把时刻的矩阵搞出来,哪些时刻哪些方块儿不能走用来剪枝 如果第一次走到永远不会被扎到的区域,那时候就是我们的最短距离 定义方向向量 #include <iostream> #include <queue> #include <c…...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整活…...
【深度学习与大模型基础】第8章-概率分布
一、概率质量函数 什么是概率质量函数? 概率质量函数是用来描述离散随机变量的概率分布的工具。它告诉我们,某个离散随机变量取某一个特定值的概率是多少。 举个例子:抛硬币 假设你有一个程序,模拟抛硬币的结果。硬币有两个可能…...
数据结构5(初):排序
目录 1、排序的概念以及常见的排序算法 1.1、排序的概念 1.2、常见的排序算法 2、常见排序算法的实现 2.1、插入排序 2.1.1、直接插入排序 2.1.2、希尔排序 2.2、选择排序 2.2.1、直接选择排序 2.2.2、堆排序 2.3、交换排序 2.3.1、冒泡排序 2.3.2、快速排序 2.3.…...
表达式括号匹配(stack)(信息学奥赛一本通-1353)
【题目描述】 假设一个表达式有英文字母(小写)、运算符(,—,∗,/)和左右小(圆)括号构成,以“ ”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号…...
RabbitMQ 详细原理解析
RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的开源消息代理中间件,广泛用于分布式系统中的异步通信、服务解耦、流量削峰等场景。其核心设计围绕生产者、消费者、队列、交换机和虚拟主机等组件,结合 AMQP …...
2025-03-23 学习记录--C/C++-C语言 sprintf()实现将多个值按指定格式拼接成字符串
C语言 sprintf()实现将多个值按指定格式拼接成字符串 举个例子 🌰:将字符串 “m” 与数字 0、1、2 动态拼接成 “m0”、“m1”、“m2”:👇🏻 #include <stdio.h> // 包含标准输入输出库,用于使用输入…...
【小程序开发】完整项目结构长啥样?
Hello,欢迎来到AI技术库。AI写代码的时代,人人都可以成为程序员。欢迎继续【小程序开发】系列课。上节课中,我们学习了【手把手教你小程序开发】什么是大前端?,本节课,我们学习第二篇 小程序的完整项目结构。 本文适合阅读对象: 1. 非计算机专业AI爱好者;2. 小程序开发…...
JVM的组成及各部分的作用
JVM(Java虚拟机)是Java程序运行的核心环境,负责将Java字节码转换为机器码并执行。以下是JVM的主要组成部分及其作用: 1. 类加载器子系统(Class Loader Subsystem) 作用 加载:将 .class 文件加载…...
计算机网络精讲day2———计算机网络的性能指标(下)
性能指标5:时延带宽积 时延带宽积传播时延*带宽 这里要注意是传播时延不是发送时延 重点:管道法解析时延带宽积 我们以一个圆柱形管道来代表链路,管道的长度是链路的传播时延(以时间作为单位单位表示链路长度)&#x…...
Android LiveData 的 `setValue` 与 `postValue` 区别详解
Android LiveData 的 setValue 与 postValue 区别详解 一、核心区别 线程限制 • setValue:必须且仅能在主线程调用,否则会抛出 IllegalStateException。 • postValue:可在任意线程调用,内部通过 Handler 将任务切换到主线程执行 setValue。 数据更新机制 • setValue:同…...
【多线程】初始线程和Thread类
一. 线程 1. 线程的引入 虽然进程已经可以解决并发编程这种问题,但是进程在频繁进行创建和销毁的时候,系统开销非常大,如果一个服务器向你发送多个请求,针对每一个请求,都需要创建一个进程来应答,每个进程…...
WebLogic中间件常见漏洞
一、后台弱⼝令GetShell 1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.访问网站并登陆后台 /console/login/LoginForm.jsp 默认账号密码:weblogic/Oracle123 3.点击部署,点击安装ÿ…...
[笔记.AI]多头自注意力机制(Multi-Head Attention)
多头自注意力是深度学习领域,特别是自然语言处理(NLP)和Transformer模型中的关键概念。其发展源于对序列数据中复杂依赖关系的建模需求,特别是在Transformer架构的背景下。 举例 比喻-读长篇文章 用一个简单的比喻来理解“多头注…...
【基于ROS的A*算法实现路径规划】A* | ROS | 路径规划 | Python
### 记录一下使用Python实现ROS平台A*算法路径规划 ### 代码可自取 :Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git 目录 一、思路分析 二、算法实现 三、路径规划实现 一、思路分析 要求使用A*算法实现路径规划,可以将该任务分为三…...
keda基于postgresql伸缩dify-api服务
1 概述 dify-api使用postgresql来存储数据,在dify控制台每新建一个聊天机器的聊天框,就会在conversations表里新插入一条记录,并且不断地更新字段updated_at,示例如下: dify# select * from conversations limit 1; …...
趣味极简品牌海报艺术贴纸设计圆润边缘无衬线粗体装饰字体 Chunko Bold - Sans Serif Font
Chunko Bold 是一种功能强大的显示字体,体现了大胆极简主义的原则 – 当代设计的主流趋势。这种自信的字体将粗犷的几何形状与现代的趣味性相结合,具有圆润的边缘和强烈的存在感,与当今的极简主义设计方法完美契合。无论是用于鲜明的构图还是…...
VoLTE(Voice over Long-Term Evolution)
VoLTE,即Voice over Long-Term Evolution,是一种基于4G LTE网络的高质量语音通话技术。与传统的2G和3G网络中的语音通话不同,VoLTE将语音信号转换为数据包,通过LTE网络进行传输,从而实现了更快的连接速度和更高的通话质…...
指针,数组 易混题解析(一)
目录 一.相关知识点 1.数组名是什么? 两个例外: 2.strlen 3.sizeof 4. * ( ) 与 [ ] 的互换 二.一维数组 三.字符数组 1. 字符 (1)sizeof (2)strlen 2.字符串 (1)si…...
Java 基础篇:数组
前言 数组(Array)是 Java 中最基本的数据结构之一,它用于存储相同类型的元素,并且在内存中是连续存储的。数组具有高效的索引访问特点,但长度固定,不能动态调整。 本文将介绍数组的基本概念、声明和初始化方…...
从汽车 BCM 方案看国产 MCU 芯片的突围与挑战
摘要 :汽车车身控制模块(BCM)作为汽车电子系统的核心控制单元,其性能高度依赖于微控制单元(MCU)芯片。随着汽车智能化与电动化的发展,国产 MCU 芯片在 BCM 领域的应用逐渐扩大。本文结合行业数据…...
深入理解 Spring 框架中的 IOC 容器
一、Spring 框架概述 Spring 框架是一个轻量级的 Java 开发框架,由 Rod Johnson 在 2003 年创建。它的诞生旨在简化企业级应用开发的复杂性。Spring 框架提供了诸如 IoC(控制反转)和 AOP(面向切面编程)等核心功能&…...
