Skip to main content

문자 기반 청킹 (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최대 청크 크기 (문자 수)4000500~2000
chunk_overlap청크 간 중복 크기200chunk_size의 10~20%
strip_whitespace앞뒤 공백 제거TrueTrue

장단점

장점단점
구현이 매우 단순문장/문단 중간에서 잘릴 수 있음
예측 가능한 청크 크기의미 단위를 무시
빠른 처리 속도문맥 손실 가능
디버깅이 쉬움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-SizeRecursive
분할 기준단일 구분자다중 구분자 (우선순위)
문단 경계 존중XO
문장 경계 존중XO (구분자에 포함 시)
청크 크기 균일성매우 균일비교적 균일
구현 복잡도매우 낮음낮음
추천 여부프로토타이핑용대부분의 경우 기본 선택
시작 추천: RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)로 시작하세요. 이후 검색 품질 평가 결과에 따라 chunk_size와 separator를 조정합니다.