본문 바로가기
WIKI 기술 지식 베이스

Text chunking processor

원문 보기 위키 갱신

출처: 문서

본문

텍스트 청킹 프로세서

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 Object 필수 텍스트 필드를 출력 필드에 매핑하는 정보를 지정하는 키-값 쌍을 담고 있어요.
field_map.<input_field> String 필수 청킹된 구절을 생성하기 위해 텍스트를 가져올 필드의 이름이에요.
field_map.<output_field> String 필수 청킹 결과를 저장할 필드의 이름이에요.
algorithm Object 필수 청킹 알고리즘과 파라미터를 지정하는 키-값 쌍을 최대 하나 담고 있어요.
algorithm.<name> String 선택 청킹 알고리즘의 이름이에요. 유효한 값은 fixed_token_length, fixed_char_length, delimiter이에요. 기본값은 fixed_token_length예요.
algorithm.<parameters> Object 선택 청킹 알고리즘의 파라미터예요. 기본적으로는 fixed_token_length 알고리즘의 기본 파라미터를 담고 있어요.
ignore_missing Boolean 선택 true이면 빈 필드는 출력에서 제외돼요. false이면 출력에 빈 필드마다 빈 리스트가 포함돼요. 기본값은 false예요.
description String 선택 프로세서에 대한 간단한 설명이에요.
tag String 선택 프로세서의 식별자 태그예요. 같은 타입의 프로세서들을 구분할 수 있어서 디버깅할 때 유용해요.

중첩 필드에 대해 청킹을 수행하려면 input_field와 output_field 값을 JSON 객체로 지정하세요. 중첩 필드의 dot 경로는 지원되지 않아요. 예를 들어 "field_map": { "foo.bar": "foo.bar_chunk"} 대신 "field_map": { "foo": { "bar": "bar_chunk"} }를 사용하세요. {: .note}

fixed token length 알고리즘

다음 표는 fixed_token_length 알고리즘의 선택 파라미터를 정리한 거예요.

파라미터 데이터 타입 필수/선택 설명
token_limit Integer 선택 청킹 알고리즘의 토큰 제한이에요. 유효한 값은 1 이상의 정수예요. 기본값은 384예요.
tokenizer String 선택 word tokenizer의 이름이에요. 기본값은 standard예요.
overlap_rate Float 선택 토큰 알고리즘에서의 겹침 정도예요. 유효한 값은 0부터 0.5까지(경계값 포함)의 float예요. 기본값은 0이에요.
max_chunk_limit Integer 선택 청킹 알고리즘의 청크 제한이에요. 기본값은 100이에요. 이 파라미터를 비활성화하려면 -1로 설정하세요.

token_limit의 기본값은 출력 구절이 다운스트림 텍스트 임베딩 모델의 토큰 제한 제약을 초과하지 않도록 512 (tokens) * 0.75 = 384로 계산돼요. msmarco-distilbert-base-tas-b, opensearch-neural-sparse-encoding-v1 같은 OpenSearch가 지원하는 사전 학습 모델의 경우 입력 토큰 제한은 512예요. standard 토크나이저는 텍스트를 단어 단위로 토크나이즈해요. OpenAI에 따르면 토큰 1개는 영어 텍스트 약 0.75 단어에 해당해요. {: .note}

overlap_rate는 0--0.5 범위(경계값 포함)의 소수점 퍼센트 값으로 설정할 수 있어요. Amazon Bedrock의 제안에 따르면, 정확도를 높이려면 이 파라미터를 0–0.2 값으로 설정하는 것을 추천해요. {: .note}

max_chunk_limit 파라미터는 청킹된 구절 수를 제한해요. 프로세서가 생성한 구절 수가 이 제한을 초과하면 초과된 텍스트는 마지막 청크에 추가돼요. {: .note}

fixed character length 알고리즘

다음 표는 fixed_char_length 알고리즘의 선택 파라미터를 정리한 거예요.

파라미터 데이터 타입 필수/선택 설명
char_limit Integer 선택 청킹 알고리즘의 문자 제한이에요. 유효한 값은 1 이상의 정수예요. 기본값은 2048예요.
overlap_rate Float 선택 토큰 알고리즘에서의 겹침 정도예요. 유효한 값은 0부터 0.5까지(경계값 포함)의 float예요. 기본값은 0이에요.
max_chunk_limit Integer 선택 청킹 알고리즘의 청크 제한이에요. 기본값은 100이에요. 이 파라미터를 비활성화하려면 -1로 설정하세요.

char_limit의 기본값은 512 (tokens) * 4 (chars) = 2048로 계산되는데, 512 토큰이 텍스트 임베딩 모델의 일반적인 제한이기 때문이에요. OpenAI에 따르면 토큰 1개는 영어 텍스트 약 4자에 해당해요. {: .note}

overlap_rate는 0--0.5 범위(경계값 포함)의 소수점 퍼센트 값으로 설정할 수 있어요. Amazon Bedrock의 제안에 따르면, 정확도를 높이려면 이 파라미터를 0–0.2 값으로 설정하는 것을 추천해요. {: .note}

max_chunk_limit 파라미터는 청킹된 구절 수를 제한해요. 프로세서가 생성한 구절 수가 이 제한을 초과하면 초과된 텍스트는 마지막 청크에 추가돼요. {: .note}

delimiter 알고리즘

다음 표는 delimiter 알고리즘의 선택 파라미터를 정리한 거예요.

파라미터 데이터 타입 필수/선택 설명
delimiter String 선택 텍스트를 분할할 때 사용하는 문자열 구분자예요. delimiter는 아무 문자열로나 설정할 수 있어요. 예를 들어 \n(새 줄을 기준으로 텍스트를 단락으로 분할)이나 .(텍스트를 문장으로 분할)처럼요. 기본값은 \n\n(새 줄 문자 두 개를 기준으로 텍스트를 단락으로 분할)이에요.
max_chunk_limit Integer 선택 청킹 알고리즘의 청크 제한이에요. 기본값은 100이에요. 이 파라미터를 비활성화하려면 -1로 설정하세요.

max_chunk_limit 파라미터는 청킹된 구절 수를 제한해요. 프로세서가 생성한 구절 수가 이 제한을 초과하면 초과된 텍스트는 마지막 청크에 추가돼요. {: .note}

프로세서 사용하기

파이프라인에서 프로세서를 사용하려면 다음 단계를 따르세요. 프로세서를 생성할 때 청킹 알고리즘을 지정할 수 있어요. 알고리즘 이름을 지정하지 않으면 청킹 프로세서는 기본값인 fixed_token_length 알고리즘과 모든 기본 파라미터를 사용해요.

1단계: 파이프라인 생성하기

다음 예제 요청은 passage_text 필드의 텍스트를 청킹된 구절로 변환해서 passage_chunk 필드에 저장하는 ingest 파이프라인을 생성해요:

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"
        }
      }
    }
  ]
}

{% include copy-curl.html %}

2단계(선택 사항): 파이프라인 테스트하기

문서를 ingest하기 전에 파이프라인을 테스트해 보는 것을 추천해요. {: .tip}

파이프라인을 테스트하려면 다음 쿼리를 실행하세요:

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."
      }
    }
  ]
}

{% include copy-curl.html %}

응답

응답을 보면 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"
        }
      }
    }
  ]
}

ingest 파이프라인을 만든 후에는 문서를 ingest하기 위한 인덱스를 만들어야 해요. 자세한 내용은 텍스트 청킹을 참고하세요.

캐스케이딩 텍스트 청킹 프로세서

여러 텍스트 청킹 프로세서를 체인처럼 연결할 수 있어요. 예를 들어 문서를 단락으로 분할하려면 delimiter 알고리즘을 적용하고 파라미터를 \n\n으로 지정하세요. 단락이 토큰 제한을 초과하지 않도록 하려면 fixed_token_length 알고리즘을 사용하는 텍스트 청킹 프로세서를 뒤에 하나 더 추가하세요. 이 예제의 ingest 파이프라인은 다음과 같이 설정할 수 있어요:

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"
        }
      }
    }
  ]
}

{% include copy-curl.html %}

캐스케이드된 프로세서를 사용한 재귀적 텍스트 청킹

더 정교한 제어를 위해서는 프로세서를 셋 이상 연결해서 재귀적인 청킹 효과를 만들 수 있어요. 이 전략은 텍스트를 점점 더 작고 의미적으로 더 응집된 단위로 분해해 나가는 방식이에요.

예를 들어 먼저 문서를 단락(\n\n) 단위로 분할하고, 그다음 각 단락을 문장(. ) 단위로 분할할 수 있어요. 마지막으로 fixed_char_length 알고리즘을 사용해 각 문장을 청킹하면 최종 구절이 특정 길이를 초과하지 않도록 보장할 수 있어요. 이러한 계층적 접근 방식은 최종 크기 제약 안에서 최대한 많은 의미적 맥락을 유지하는 데 도움이 돼요.

다음 예제는 3단계 재귀 청킹 파이프라인을 설정한 거예요:

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"
        }
      }
    }
  ]
}

{% include copy-curl.html %}

다음 단계

더 알아보기 (Learn more)