2 min read

RAG Chunking 전략 필드 가이드

문서 분할 규칙과 검색 정확도의 상관관계를 측정해 RAG 품질을 개선하는 방법

RAG Chunking 전략 필드 가이드 thumbnail

도입

RAG 품질이 낮을 때 많은 팀이 모델이나 임베딩부터 바꾼다. 하지만 실제 원인은 chunking 규칙인 경우가 많다. 같은 데이터셋이라도 chunk 크기와 overlap, 메타데이터 정책에 따라 검색 정확도가 크게 달라진다.

이 글은 "chunking을 실험 가능한 변수"로 다루는 방법을 설명한다. 핵심은 감각이 아닌 지표로 chunking 전략을 선택하는 것이다.

RAG Chunking 전략 필드 가이드 커버
Wikimedia Commons 기반 무료 이미지

문제 정의

RAG 도입 초기에 빈번한 문제:

  • 문서를 크게 쪼개 recall은 높지만 정답 근거가 뭉개진다.
  • 너무 작게 쪼개면 retrieval은 되지만 컨텍스트가 부족해 답변 품질이 떨어진다.
  • 문서 유형(가이드/FAQ/코드문서)별로 chunk 정책이 같은 값으로 고정되어 있다.
  • offline 평가는 좋은데 online 체감 품질이 낮다.

핵심은 "문서 구조 기반 chunking"과 "질문 유형 기반 평가셋"을 함께 설계하는 것이다.

핵심 개념

변수설명권장 시작값
chunk_size한 chunk의 토큰/문자 길이350~550 토큰
overlap인접 chunk 겹침10~20%
splitter문단/헤더/코드블록 기준 분할구조 우선 분할
metadatasection, 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로 최적화했습니다.

댓글