문자 기반 청킹 (Character-based Chunking)
가장 기본적이면서 널리 사용되는 청킹 방식입니다. 문자 수 또는 구분자를 기준으로 문서를 분할합니다.
Fixed-Size Chunking
고정된 문자 수로 문서를 기계적으로 분할하는 가장 단순한 방법입니다.
고정 크기로 자르되, chunk_overlap만큼 이전 청크의 끝 부분을 다음 청크의 시작에 포함시킵니다.
코드 예제
from langchain_text_splitters import CharacterTextSplitter
splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1000,
chunk_overlap=200,
)
chunks = splitter.split_documents(docs)
# 결과 확인
for i, chunk in enumerate(chunks[:3]):
print(f"청크 {i+1}: {len(chunk.page_content)}자")
print(chunk.page_content[:100], "...\n")
파라미터 튜닝
| 파라미터 | 설명 | 기본값 | 권장 범위 |
|---|
separator | 분할 기준 문자 | "\n\n" | "\n", ". ", " " |
chunk_size | 최대 청크 크기 (문자 수) | 4000 | 500~2000 |
chunk_overlap | 청크 간 중복 크기 | 200 | chunk_size의 10~20% |
strip_whitespace | 앞뒤 공백 제거 | True | True |
장단점
| 장점 | 단점 |
|---|
| 구현이 매우 단순 | 문장/문단 중간에서 잘릴 수 있음 |
| 예측 가능한 청크 크기 | 의미 단위를 무시 |
| 빠른 처리 속도 | 문맥 손실 가능 |
| 디버깅이 쉬움 | separator에 의존적 |
Recursive Character Splitting
여러 구분자를 우선순위에 따라 순차적으로 적용하는 방식으로, 가장 널리 사용되는 기본 청킹 전략입니다.
큰 구분자(문단)부터 시도하고, 청크가 여전히 크면 작은 구분자(문장, 공백)로 재귀적으로 분할합니다.
코드 예제
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 기본 설정 (대부분의 경우 추천)
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", ". ", " ", ""],
# 1순위: 빈 줄 (문단)
# 2순위: 줄바꿈
# 3순위: 문장 끝
# 4순위: 공백
# 5순위: 글자 단위 (최후 수단)
)
chunks = splitter.split_documents(docs)
한국어 최적화
한국어 문서에서는 구분자를 조정하면 더 나은 결과를 얻을 수 있습니다.
# 한국어 최적화 설정
korean_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=[
"\n\n", # 문단
"\n", # 줄바꿈
"다. ", # 한국어 문장 종결
"요. ", # 한국어 문장 종결
". ", # 영문 문장
" ", # 공백
"", # 글자 단위
],
)
separator 설정 가이드
| 문서 유형 | 권장 separators | 이유 |
|---|
| 일반 텍스트 | ["\n\n", "\n", ". ", " ", ""] | 문단 → 줄 → 문장 순서 |
| 한국어 문서 | ["\n\n", "\n", "다. ", "요. ", ". ", " ", ""] | 한국어 종결어미 반영 |
| 법률 문서 | ["\n\n\n", "\n\n", "\n", ". ", ""] | 조항 단위 보존 |
| 대화 로그 | ["\n\n", "\n"] | 발화 단위 보존 |
Fixed-Size vs Recursive 비교
| 항목 | Fixed-Size | Recursive |
|---|
| 분할 기준 | 단일 구분자 | 다중 구분자 (우선순위) |
| 문단 경계 존중 | X | O |
| 문장 경계 존중 | X | O (구분자에 포함 시) |
| 청크 크기 균일성 | 매우 균일 | 비교적 균일 |
| 구현 복잡도 | 매우 낮음 | 낮음 |
| 추천 여부 | 프로토타이핑용 | 대부분의 경우 기본 선택 |
시작 추천: RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)로 시작하세요. 이후 검색 품질 평가 결과에 따라 chunk_size와 separator를 조정합니다.