文本分块处理器
text_chunking
处理器将长文档拆分为较短的段落。该处理器支持以下文本拆分算法:
fixed_token_length
: 将文本拆分为由令牌数指定的长度的段落。fixed_char_length
: 将文本拆分为由字符数指定的长度的段落。delimiter
: 按分隔符将文本拆分为段落。
以下是 text_chunking
处理器的语法:
{
"text_chunking": {
"field_map": {
"<input_field>": "<output_field>"
},
"algorithm": {
"<name>": "<parameters>"
}
}
}
配置参数
下表列出了 text_chunking
处理器所需和可选的参数。
参数 | 数据类型 | 必需/可选 | 描述 |
---|---|---|---|
field_map | 对象 | 必需 | 包含指定文本字段到输出字段映射的键值对。 |
field_map.<input_field> | 字符串 | 必需 | 用于获取文本以生成分块段落的字段名称。 |
field_map.<output_field> | 字符串 | 必需 | 用于存储分块结果的字段名称。 |
algorithm | 对象 | 必需 | 包含至多一个键值对,用于指定分块算法和参数。 |
algorithm.<name> | 字符串 | 可选 | 分块算法的名称。有效值为 fixed_token_length 、fixed_char_length 和 delimiter 。默认值为 fixed_token_length 。 |
algorithm.<parameters> | 对象 | 可选 | 分块算法的参数。默认情况下,包含 fixed_token_length 算法的默认参数。 |
ignore_missing | 布尔型 | 可选 | 如果为 true ,空字段将从输出中排除。如果为 false ,输出将包含每个空字段的空列表。默认值为 false 。 |
description | 字符串 | 可选 | 处理器的简要描述。 |
tag | 字符串 | 可选 | 处理器的标识符标签。在调试时非常有用,可以区分同类型的处理器。 |
要在嵌套字段上执行分块,请将 input_field
和 output_field
值指定为 JSON 对象。不支持嵌套字段的点路径。例如,使用 "field_map": { "foo": { "bar": "bar_chunk"} }
而不是 "field_map": { "foo.bar": "foo.bar_chunk"}
。
固定令牌长度算法
下表列出了 fixed_token_length
算法的可选参数。
参数 | 数据类型 | 必需/可选 | 描述 |
---|---|---|---|
token_limit | 整数 | 可选 | 分块算法的令牌限制。有效值为至少为 1 的整数。默认值为 384 。 |
tokenizer | 字符串 | 可选 | 分词器名称。默认值为 standard 。 |
overlap_rate | 浮点型 | 可选 | 令牌算法中的重叠程度。有效值为 0 到 0.5 (包括)之间的浮点数。默认值为 0 。 |
max_chunk_limit | 整数 | 可选 | 分块算法的块限制。默认值为 100 。要禁用此参数,请将其设置为 -1 。 |
token_limit
的默认值计算为 512 (令牌) * 0.75 = 384
,以便输出段落不超过下游文本嵌入模型的令牌限制。对于 OpenSearch 支持的预训练模型,如 msmarco-distilbert-base-tas-b
和 opensearch-neural-sparse-encoding-v1
,输入令牌限制为 512
。standard
分词器将文本分词为单词。根据 OpenAI,1 个令牌大约等于 0.75 个英文单词。
您可以将 overlap_rate
设置为 0–0.5(包括)范围内的十进制百分比值。根据 Amazon Bedrock 的建议,我们建议将此参数设置为 0–0.2 的值以提高准确性。
max_chunk_limit
参数限制了分块段落的数量。如果处理器生成的段落数量超过限制,则多余的文本将添加到最后一个块中。
固定字符长度算法
下表列出了 fixed_char_length
算法的可选参数。
参数 | 数据类型 | 必需/可选 | 描述 |
---|---|---|---|
char_limit | 整数 | 可选 | 分块算法的字符限制。有效值为至少为 1 的整数。默认值为 2048 。 |
overlap_rate | 浮点型 | 可选 | 令牌算法中的重叠程度。有效值为 0 到 0.5 (包括)之间的浮点数。默认值为 0 。 |
max_chunk_limit | 整数 | 可选 | 分块算法的块限制。默认值为 100 。要禁用此参数,请将其设置为 -1 。 |
默认的 char_limit
计算为 512 (令牌) * 4 (字符) = 2048
,因为 512 个令牌是文本嵌入模型的常见限制。根据 OpenAI,1 个令牌大约等于 4 个英文字符。
您可以将 overlap_rate
设置为 0–0.5(包括)范围内的十进制百分比值。根据 Amazon Bedrock 的建议,我们建议将此参数设置为 0–0.2 的值以提高准确性。
max_chunk_limit
参数限制了分块段落的数量。如果处理器生成的段落数量超过限制,则多余的文本将添加到最后一个块中。
分隔符算法
下表列出了 delimiter
算法的可选参数。
参数 | 数据类型 | 必需/可选 | 描述 |
---|---|---|---|
delimiter | 字符串 | 可选 | 用于拆分文本的字符串分隔符。您可以将 delimiter 设置为任何字符串,例如 \n (按换行符将文本拆分为段落)或 . (将文本拆分为句子)。默认值为 \n\n (按两个换行符将文本拆分为段落)。 |
max_chunk_limit | 整数 | 可选 | 分块算法的块限制。默认值为 100 。要禁用此参数,请将其设置为 -1 。 |
max_chunk_limit
参数限制了分块段落的数量。如果处理器生成的段落数量超过限制,则多余的文本将添加到最后一个块中。
使用处理器
按照以下步骤在管道中使用该处理器。您可以在创建处理器时指定分块算法。如果您不提供算法名称,分块处理器将使用默认的 fixed_token_length
算法及其所有默认参数。
步骤 1:创建管道
以下示例请求创建了一个摄入管道,将 passage_text
字段中的文本转换为分块段落,并将其存储在 passage_chunk
字段中:
PUT _ingest/pipeline/text-chunking-ingest-pipeline
{
"description": "A text chunking ingest pipeline",
"processors": [
{
"text_chunking": {
"algorithm": {
"fixed_token_length": {
"token_limit": 10,
"overlap_rate": 0.2,
"tokenizer": "standard"
}
},
"field_map": {
"passage_text": "passage_chunk"
}
}
}
]
}
步骤 2(可选):测试管道
建议您在摄入文档之前测试您的管道。
要测试管道,请运行以下查询
POST _ingest/pipeline/text-chunking-ingest-pipeline/_simulate
{
"docs": [
{
"_index": "testindex",
"_id": "1",
"_source":{
"passage_text": "This is an example document to be chunked. The document contains a single paragraph, two sentences and 24 tokens by standard tokenizer in OpenSearch."
}
}
]
}
响应
响应确认,除了 passage_text
字段外,处理器还在 passage_chunk
字段中生成了分块结果。处理器将段落分成了 10 个单词的块。由于 overlap
设置为 0.2,因此一个块的最后 2 个单词会在下一个块中重复。
{
"docs": [
{
"doc": {
"_index": "testindex",
"_id": "1",
"_source": {
"passage_text": "This is an example document to be chunked. The document contains a single paragraph, two sentences and 24 tokens by standard tokenizer in OpenSearch.",
"passage_chunk": [
"This is an example document to be chunked. The document ",
"The document contains a single paragraph, two sentences and 24 ",
"and 24 tokens by standard tokenizer in OpenSearch."
]
},
"_ingest": {
"timestamp": "2024-03-20T02:55:25.642366Z"
}
}
}
]
}
创建摄入管道后,您需要为文档摄入创建一个索引。要了解更多信息,请参阅 文本分块。
级联文本分块处理器
您可以将多个文本分块处理器串联起来。例如,要将文档拆分为段落,可以应用 delimiter
算法并将参数指定为 \n\n
。为了防止段落超出令牌限制,可以附加另一个使用 fixed_token_length
算法的文本分块处理器。您可以按如下方式配置此示例的摄入管道:
PUT _ingest/pipeline/text-chunking-cascade-ingest-pipeline
{
"description": "A text chunking pipeline with cascaded algorithms",
"processors": [
{
"text_chunking": {
"algorithm": {
"delimiter": {
"delimiter": "\n\n"
}
},
"field_map": {
"passage_text": "passage_chunk1"
}
}
},
{
"text_chunking": {
"algorithm": {
"fixed_token_length": {
"token_limit": 500,
"overlap_rate": 0.2,
"tokenizer": "standard"
}
},
"field_map": {
"passage_chunk1": "passage_chunk2"
}
}
}
]
}
使用级联处理器进行递归文本分块
为了更高级的控制,您可以串联两个以上的处理器以创建递归分块效果。此策略涉及将文本解构为逐渐缩小、语义更小的单元。
例如,您可以首先将文档拆分为段落(\n\n
),然后将每个段落拆分为句子(.
)。最后,您可以使用 fixed_char_length
算法对每个句子进行分块,以确保最终的段落不超过特定长度。这种分层方法有助于在最终大小限制内尽可能多地保留语义上下文。
以下示例配置了一个三阶段递归分块管道:
PUT _ingest/pipeline/recursively-text-chunking-cascade-ingest-pipeline
{
"description": "A pipeline that recursively chunks text by paragraph, then sentence, then character length.",
"processors": [
{
"text_chunking": {
"algorithm": {
"delimiter": {
"delimiter": "\n\n"
}
},
"field_map": {
"original_text": "paragraph_chunks"
}
}
},
{
"text_chunking": {
"algorithm": {
"delimiter": {
"delimiter": ". "
}
},
"field_map": {
"paragraph_chunks": "sentence_chunks"
}
}
},
{
"text_chunking": {
"algorithm": {
"fixed_char_length": {
"char_limit": 300,
"overlap_rate": 0.1
}
},
"field_map": {
"sentence_chunks": "final_recursive_chunks"
}
}
}
]
}
后续步骤
- 有关完整示例,请参阅 文本分块。
- 要了解有关语义搜索的更多信息,请参阅 语义搜索。
- 要了解有关稀疏搜索的更多信息,请参阅 神经稀疏搜索。
- 要了解更多关于在 OpenSearch 中使用模型的信息,请参阅选择模型。