DocumentSplitter

DocumentSplitter

텍스트 문서의 목록을 더 짧은 텍스트 문서 목록으로 쪼개 주는 컴포넌트가 바로 DocumentSplitter예요. 긴 텍스트가 언어 모델의 최대 텍스트 길이에 맞지 않을 때 유용하고, 질의응답 속도를 높이는 데도 도움이 돼요.

분할은 인덱싱 파이프라인에서 써요. 문서를 ConverterDocumentCleaner로 변환·정리한 뒤, 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와 호환돼요.

사용법 (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: {}

출처: 공식문서