검색 정확도: 너무 큰 청크는 관련 없는 정보를 포함하고, 너무 작은 청크는 컨텍스트 부족
계산 효율성: 적절한 크기의 청크는 임베딩 생성 및 검색 처리 효율성 향상
의미 단위 보존: 문서의 의미론적 단위를 유지하여 검색 관련성 향상
종류
Text Splitter
주요 특징
작동 방식
적합한 사용 사례
장점
단점
CharacterTextSplitter
문자 기반의 가장 기본적인 분할기
지정된 구분자(기본값: \n\n)를 기준으로 텍스트를 분할
단순한 텍스트 분할이 필요한 경우
- 구현이 간단하고 직관적
빠른 처리 속도 | - 의미적 맥락을 고려하지 않음
구분자에 크게 의존하여 문맥 손실 가능성 |
| RecursiveCharacterTextSplitter | 여러 구분자를 계층적으로 시도하는 분할기 | 구분자 리스트(기본값: ["\n\n", "\n", " ", ""])를 순차적으로 시도하여 분할 | 일반적인 텍스트 처리, 대부분의 사용 사례에 권장 | - 다양한 구분자를 통한 더 나은 청킹
맥락 보존에 효과적
유연성이 높음 | - CharacterTextSplitter보다 복잡
구분자 리스트 최적화 필요 |
| TokenTextSplitter | 토큰 수를 기준으로 분할 | LLM이 사용하는 토큰화 방식에 따라 분할 (tiktoken 등 활용) | 토큰 제한이 있는 LLM과 함께 사용할 때 | - 정확한 토큰 수 계산
LLM 입력에 최적화됨 | - 처리 속도가 느릴 수 있음
토큰화 라이브러리 의존성 |
| SemanticChunker
(Semantic Text Splitter) | 의미적 유사성에 기반한 분할 | 임베딩을 사용하여 의미적으로 유사한 부분을 함께 묶음 | 의미적 맥락이 중요한 복잡한 문서 | - 의미 기반 분할로 맥락 보존
더 관련성 높은 검색 결과 | - 계산 비용이 높음
임베딩 모델 의존성 설정이 복잡함 |
| CodeTextSplitter | 프로그래밍 언어 구문에 최적화된 분할기 | 언어별 구분자와 코드 구조를 인식하여 분할 | 코드 문서, 프로그래밍 관련 문서 | - 코드 구조 보존
언어별 최적화 | - 일반 텍스트에는 비효율적
지원 언어에 제한 있음 |
| MarkdownTextSplitter | 마크다운 구조를 인식하는 분할기 | 마크다운 헤더, 목록 등의 구조를 고려하여 분할 | 마크다운 문서, 기술 문서 | - 마크다운 구조 보존
문서 계층 구조 유지 | - 마크다운 아닌 문서에 부적합
복잡한 마크다운 구조에서 일관성 문제 |
| HTMLTextSplitter | HTML 태그 구조를 인식하는 분할기 | HTML 태그와 DOM 구조를 고려하여 분할 | 웹 페이지, HTML 문서 | - HTML 구조 보존
태그 기반 분할로 의미 단위 유지 | - HTML 아닌 문서에 부적합
복잡한 중첩 구조 처리 어려움 |
| RecursiveJsonSplitter | JSON 구조를 인식하여 재귀적으로 분할 | JSON 객체의 계층 구조를 따라 재귀적으로 분할 | JSON 데이터, API 응답, 구조화된 데이터 | - JSON 구조 보존