2 min read
RAG Chunking 전략 필드 가이드
문서 분할 규칙과 검색 정확도의 상관관계를 측정해 RAG 품질을 개선하는 방법

도입
RAG 품질이 낮을 때 많은 팀이 모델이나 임베딩부터 바꾼다. 하지만 실제 원인은 chunking 규칙인 경우가 많다. 같은 데이터셋이라도 chunk 크기와 overlap, 메타데이터 정책에 따라 검색 정확도가 크게 달라진다.
이 글은 "chunking을 실험 가능한 변수"로 다루는 방법을 설명한다. 핵심은 감각이 아닌 지표로 chunking 전략을 선택하는 것이다.

문제 정의
RAG 도입 초기에 빈번한 문제:
- 문서를 크게 쪼개 recall은 높지만 정답 근거가 뭉개진다.
- 너무 작게 쪼개면 retrieval은 되지만 컨텍스트가 부족해 답변 품질이 떨어진다.
- 문서 유형(가이드/FAQ/코드문서)별로 chunk 정책이 같은 값으로 고정되어 있다.
- offline 평가는 좋은데 online 체감 품질이 낮다.
핵심은 "문서 구조 기반 chunking"과 "질문 유형 기반 평가셋"을 함께 설계하는 것이다.
핵심 개념
| 변수 | 설명 | 권장 시작값 |
|---|---|---|
| chunk_size | 한 chunk의 토큰/문자 길이 | 350~550 토큰 |
| overlap | 인접 chunk 겹침 | 10~20% |
| splitter | 문단/헤더/코드블록 기준 분할 | 구조 우선 분할 |
| metadata | section, source, updated_at | 필수 부착 |
운영에서는 단일 최적값보다 "문서 유형별 정책"이 효과적이다.
코드 예시 1: 구조 기반 Chunker
type Chunk = {
id: string;
text: string;
source: string;
section: string;
};
export function chunkBySection(input: {
source: string;
markdown: string;
size: number;
overlap: number;
}): Chunk[] {
const sections = input.markdown.split(/^##\s+/m).filter(Boolean);
const chunks: Chunk[] = [];
for (const raw of sections) {
const [sectionTitle, ...rest] = raw.split("\n");
const body = rest.join("\n").trim();
let cursor = 0;
while (cursor < body.length) {
const end = Math.min(body.length, cursor + input.size);
const text = body.slice(cursor, end);
chunks.push({
id: `${input.source}-${chunks.length + 1}`,
text,
source: input.source,
section: sectionTitle.trim(),
});
cursor = Math.max(end - input.overlap, cursor + 1);
}
}
return chunks;
}
코드 예시 2: 오프라인 평가(Recall@K)
type Sample = { question: string; expectedSource: string };
export async function evaluateRecallAtK(samples: Sample[], k = 5) {
let hit = 0;
for (const sample of samples) {
const retrieved = await searchChunks(sample.question, { topK: k });
const ok = retrieved.some((item: { source: string }) => item.source === sample.expectedSource);
if (ok) hit += 1;
}
return {
total: samples.length,
recallAtK: samples.length === 0 ? 0 : hit / samples.length,
};
}
아키텍처 흐름
Mermaid diagram rendering...
트레이드오프
- chunk를 크게 하면 문맥 보존은 좋지만 노이즈가 늘어난다.
- chunk를 작게 하면 정확한 매칭은 좋지만 답변 근거가 단편화된다.
- overlap을 키우면 recall은 오르지만 저장 비용과 중복 응답 가능성이 증가한다.
정리
RAG 품질 튜닝에서 chunking은 가장 저렴하면서 효과가 큰 레버다. 문서 구조를 반영한 분할과 Recall@K 기반 평가 루프를 붙이면 모델 교체 없이도 품질을 안정적으로 개선할 수 있다.
이미지 출처
- Cover: source link
- License: CC BY-SA 3.0 / Author: Jorge Royan
- Note: Wikimedia Commons 무료 라이선스 이미지를 다운로드 후 1600px 기준 JPG로 최적화했습니다.