[Production RAG] Day 1: 청킹 전략 - 문서를 어떻게 나눌 것인가
서론: 청킹은 RAG 품질의 출발점이다
RAG에서 검색 품질이 낮다면 임베딩 모델이나 벡터 DB보다 먼저 청킹 전략을 의심해야 한다. 청크가 너무 크면 검색 노이즈가 증가하고, 너무 작으면 문맥이 잘려 모델이 정확한 답을 생성하지 못한다.
청킹은 단순한 텍스트 분할이 아니라 “모델이 답을 만들 때 필요한 정보를 어떤 단위로 전달할 것인가”의 설계 결정이다.
1. 고정 크기 청킹
가장 단순한 방법이다. 토큰 또는 문자 수를 기준으로 일정 크기로 분할한다.
1
2
[문서 전체]
→ [0:512], [512:1024], [1024:1536], ...
오버랩(overlap)을 두면 경계 부근의 문맥 단절을 줄인다.
1
2
chunk_size = 512 # 토큰
chunk_overlap = 64 # 앞 청크와 겹치는 토큰 수
장점: 구현 단순, 인덱스 크기 예측 가능 단점: 문장·단락 경계를 무시해 의미 단위가 잘릴 수 있음
2. 재귀적 문자 분할
단락 → 문장 → 단어 순으로 구분자를 계층적으로 적용한다.
1
구분자 우선순위: ["\n\n", "\n", ".", " "]
자연스러운 경계에서 먼저 분할하고, 그래도 크기 초과 시 다음 구분자를 사용한다. 고정 크기 청킹보다 의미 단위를 더 잘 유지한다.
3. 의미 단위 청킹
텍스트의 내용 변화(의미 경계)를 감지해 분할한다.
1
2
3
연속 문장의 임베딩 유사도를 계산
└─ 유사도가 급락하는 지점 = 주제 전환 경계
└─ 그 지점에서 분할
문서 구조를 몰라도 주제가 바뀌는 곳에서 정확히 나눌 수 있다. 계산 비용이 높아 대용량 인덱싱에는 주의가 필요하다.
4. 문서 구조 기반 청킹
마크다운, HTML, PDF 등 문서 포맷의 구조를 활용한다.
1
2
3
4
5
6
7
8
Markdown:
H1 → 최상위 청크 경계
H2 → 하위 청크 경계
코드 블록 → 단일 청크로 유지
PDF:
페이지/섹션 단위로 분리
표는 행 분할 없이 전체 청크로 유지
구조 정보가 있는 문서에서는 가장 의미 있는 경계를 만든다.
5. 부모-자식 청킹 (Parent-Child)
작은 자식 청크로 정밀하게 검색하되, 실제 LLM에 전달하는 컨텍스트는 더 넓은 부모 청크를 사용한다.
1
2
3
4
5
6
7
Parent Chunk (1024 tokens): 광범위한 문맥
└─ Child Chunk A (256 tokens): 검색용 정밀 단위
└─ Child Chunk B (256 tokens)
└─ Child Chunk C (256 tokens)
Retrieval: Child Chunk B 매칭
└─ LLM에게 전달: Parent Chunk (전체 문맥)
검색 정밀도와 응답 품질을 동시에 높이는 효과적인 패턴이다.
6. 청킹 전략 선택 가이드
| 문서 유형 | 권장 전략 |
|---|---|
| 일반 텍스트 | 재귀적 문자 분할 |
| 구조화 문서 (Markdown, HTML) | 구조 기반 청킹 |
| 긴 기술 문서 | 부모-자식 청킹 |
| 다양한 주제가 섞인 문서 | 의미 단위 청킹 |
7. Day 1 체크리스트
- 문서 유형에 맞는 청킹 전략을 선택했다.
- 청크 크기와 오버랩을 실험으로 결정했다.
- 청크 경계에서 코드 블록·표가 분리되지 않도록 처리했다.
- 청킹 결과를 샘플링해 의미 단위 보존 여부를 수동 검토했다.
다음 글 예고
Day 2에서는 임베딩 선택과 인덱스 설계를 다룬다. 임베딩 모델 비교, 차원 선택, 벡터 인덱스 알고리즘(HNSW, IVF)의 트레이드오프를 분석한다.