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 %}
다음 단계
- 전체 예제는 텍스트 청킹을 참고하세요.
- 시맨틱 검색에 대해 자세히 알아보려면 시맨틱 검색을 참고하세요.
- 스파스 검색에 대해 자세히 알아보려면 뉴럴 스파스 검색을 참고하세요.
- OpenSearch에서 모델을 사용하는 방법에 대해 자세히 알아보려면 모델 선택하기를 참고하세요.