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。我们可以参考如下的文章来进行安装:

当我们安装的时候,选择 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 os

load_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 requests

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

相关推荐
我爱一条柴ya1 分钟前
【AI大模型】线性回归:经典算法的深度解析与实战指南
人工智能·python·算法·ai·ai编程
Qiuner7 分钟前
【源力觉醒 创作者计划】开源、易用、强中文:文心一言4.5或是 普通人/非AI程序员 的第一款中文AI?
人工智能·百度·开源·文心一言·gitcode
未来之窗软件服务18 分钟前
chrome webdrive异常处理-session not created falled opening key——仙盟创梦IDE
前端·人工智能·chrome·仙盟创梦ide·东方仙盟·数据调式
AI街潜水的八角35 分钟前
深度学习图像分类数据集—蘑菇识别分类
人工智能·深度学习·分类
Java烘焙师1 小时前
架构师必备:业务扩展模式选型
mysql·elasticsearch·架构·hbase·多维度查询
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
java·数据库·mysql·vue·毕业设计·ssm框架·小区物业管理系统
飞睿科技1 小时前
乐鑫代理商飞睿科技,2025年AI智能语音助手市场发展趋势与乐鑫芯片解决方案分析
人工智能
许泽宇的技术分享1 小时前
从新闻到知识图谱:用大模型和知识工程“八步成诗”打造科技并购大脑
人工智能·科技·知识图谱
坤坤爱学习2.01 小时前
求医十年,病因不明,ChatGPT:你看起来有基因突变
人工智能·ai·chatgpt·程序员·大模型·ai编程·大模型学
蹦蹦跳跳真可爱5892 小时前
Python----循环神经网络(Transformer ----注意力机制)
人工智能·深度学习·nlp·transformer·循环神经网络