Link Search Menu Expand Document Documentation Menu

文本分块处理器

text_chunking 处理器将长文档拆分为较短的段落。该处理器支持以下文本拆分算法:

以下是 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_lengthfixed_char_lengthdelimiter。默认值为 fixed_token_length
algorithm.<parameters> 对象 可选 分块算法的参数。默认情况下,包含 fixed_token_length 算法的默认参数。
ignore_missing 布尔型 可选 如果为 true,空字段将从输出中排除。如果为 false,输出将包含每个空字段的空列表。默认值为 false
description 字符串 可选 处理器的简要描述。
tag 字符串 可选 处理器的标识符标签。在调试时非常有用,可以区分同类型的处理器。

要在嵌套字段上执行分块,请将 input_fieldoutput_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 浮点型 可选 令牌算法中的重叠程度。有效值为 00.5(包括)之间的浮点数。默认值为 0
max_chunk_limit 整数 可选 分块算法的块限制。默认值为 100。要禁用此参数,请将其设置为 -1

token_limit 的默认值计算为 512 (令牌) * 0.75 = 384,以便输出段落不超过下游文本嵌入模型的令牌限制。对于 OpenSearch 支持的预训练模型,如 msmarco-distilbert-base-tas-bopensearch-neural-sparse-encoding-v1,输入令牌限制为 512standard 分词器将文本分词为单词。根据 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 浮点型 可选 令牌算法中的重叠程度。有效值为 00.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 中使用模型的信息,请参阅选择模型