DocumentSplitter
DocumentSplitter
텍스트 문서의 목록을 더 짧은 텍스트 문서 목록으로 쪼개 주는 컴포넌트가 바로 DocumentSplitter예요. 긴 텍스트가 언어 모델의 최대 텍스트 길이에 맞지 않을 때 유용하고, 질의응답 속도를 높이는 데도 도움이 돼요.
분할은 인덱싱 파이프라인에서 써요. 문서를 Converter와 DocumentCleaner로 변환·정리한 뒤, Classifier보다 앞 단계에 위치해요.
개요 (Overview)
DocumentSplitter는 문서 목록을 입력으로 받아, 텍스트가 분할된 문서 목록을 반환해요. 각 입력 문서를 split_by 기준으로, split_length 단위만큼씩, split_overlap 단위의 겹침을 두고 쪼개요. 이 추가 파라미터들은 컴포넌트를 초기화할 때 설정할 수 있어요.
split_by는"word","sentence","passage"(문단),"page","line","period","token","function"중 하나가 될 수 있어요.split_length는 청크 크기를 나타내는 정수예요. 즉 단어나 문장·문단 개수예요.split_overlap은 청크 사이에 겹치는 단어·문장·문단의 수를 나타내는 정수예요.split_threshold는 문서 조각이 가져야 할 최소 단어·문장·문단 수를 나타내는 정수예요. 조각이 이 기준보다 작으면 이전 조각에 붙여요.
각 문서의 meta 데이터에는 원본 문서가 무엇인지 추적할 수 있도록 "source_id" 필드가 추가돼요. 또 원본 문서에서 몇 번째 페이지에 속했는지 추적하기 위해 "page_number"라는 meta 필드도 각 문서에 추가돼요. 나머지 메타데이터는 원본 문서에서 그대로 복사돼요.
DocumentSplitter는 다음 DocumentStore와 호환돼요.
- AstraDocumentStore
- ChromaDocumentStore – 제한적 지원, 겹침 정보는 저장되지 않아요.
- ElasticsearchDocumentStore
- OpenSearchDocumentStore
- PgvectorDocumentStore
- PineconeDocumentStore – 제한적 지원, 겹침 정보는 저장되지 않아요.
- QdrantDocumentStore
- WeaviateDocumentStore
- MilvusDocumentStore
- Neo4jDocumentStore
사용법 (Usage)
단독으로 (On its own)
파이프라인 밖에서도 이 컴포넌트를 써서 문서를 짧게 만들 수 있어요.
from haystack import Document
from haystack.components.preprocessors import DocumentSplitter
doc = Document(
content="Moonlight shimmered softly, wolves howled nearby, night enveloped everything.",
)
splitter = DocumentSplitter(split_by="word", split_length=3, split_overlap=0)
result = splitter.run(documents=[doc])
파이프라인 안에서 (In a pipeline)
인덱싱 파이프라인에서 DocumentSplitter를 쓰는 방법이에요.
from pathlib import Path
from haystack import Document
from haystack import Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.converters.txt import TextFileToDocument
from haystack.components.preprocessors import DocumentCleaner
from haystack.components.preprocessors import DocumentSplitter
from haystack.components.writers import DocumentWriter
document_store = InMemoryDocumentStore()
p = Pipeline()
p.add_component(instance=TextFileToDocument(), name="text_file_converter")
p.add_component(instance=DocumentCleaner(), name="cleaner")
p.add_component(
instance=DocumentSplitter(split_by="sentence", split_length=1),
name="splitter",
)
p.add_component(instance=DocumentWriter(document_store=document_store), name="writer")
p.connect("text_file_converter.documents", "cleaner.documents")
p.connect("cleaner.documents", "splitter.documents")
p.connect("splitter.documents", "writer.documents")
path = "path/to/your/files"
files = list(Path(path).glob("*.md"))
p.run({"text_file_converter": {"sources": files}})
YAML로 (In YAML)
위 인덱싱 파이프라인을 YAML로 나타내면 다음과 같아요. 텍스트 파일을 읽고, 텍스트를 정리하고, 개별 문장으로 쪼갠 뒤 인메모리 문서 저장소에 써 넣는 흐름이에요.
components:
cleaner:
init_parameters:
ascii_only: false
keep_id: false
remove_empty_lines: true
remove_extra_whitespaces: true
remove_regex: null
remove_repeated_substrings: false
remove_substrings: null
replace_regexes: null
strip_whitespaces: false
unicode_normalization: null
type: haystack.components.preprocessors.document_cleaner.DocumentCleaner
splitter:
init_parameters:
extend_abbreviations: true
language: en
respect_sentence_boundary: false
skip_empty_documents: true
split_by: sentence
split_length: 1
split_overlap: 0
split_threshold: 0
use_split_rules: true
type: haystack.components.preprocessors.document_splitter.DocumentSplitter
text_file_converter:
init_parameters:
encoding: utf-8
store_full_path: false
type: haystack.components.converters.txt.TextFileToDocument
writer:
init_parameters:
document_store:
init_parameters:
bm25_algorithm: BM25L
bm25_parameters: {}
bm25_tokenization_regex: (?u)\b\w+\b
embedding_similarity_function: dot_product
index: 64e4f9ab-87fb-47fd-b390-dabcfda61447
return_embedding: true
type: haystack.document_stores.in_memory.document_store.InMemoryDocumentStore
policy: NONE
type: haystack.components.writers.document_writer.DocumentWriter
connection_type_validation: true
connections:
- receiver: cleaner.documents
sender: text_file_converter.documents
- receiver: splitter.documents
sender: cleaner.documents
- receiver: writer.documents
sender: splitter.documents
max_runs_per_component: 100
metadata: {}
출처: 공식문서