RAG 시스템 청크 크기 최적화 실험 결과

문제 상황

사내 기술 문서 검색용 RAG 시스템을 운영 중인데, 사용자들이 "답변이 맥락과 안 맞는다"는 피드백을 계속 주었다. 특히 코드 예시나 단계별 가이드를 물어볼 때 중간이 잘리거나 불완전한 답변이 많았다.

기존 설정은 청크 크기 512 토큰, 오버랩 없음이었다. 문서를 너무 크게 나누다 보니 의미 단위가 분리되는 문제가 있었다.

실험 설정

청크 크기와 오버랩을 조합해 4가지 케이스를 테스트했다.

test_configs = [
    {"chunk_size": 512, "overlap": 0},   # 기존
    {"chunk_size": 256, "overlap": 0},
    {"chunk_size": 256, "overlap": 50},
    {"chunk_size": 128, "overlap": 30}
]

평가 지표는 검색 정확도(Top-3 Hit Rate)와 응답 완결성(사람이 5점 척도로 평가)이었다. 샘플 질문 50개로 각 설정을 테스트했다.

결과

256/50 조합이 가장 좋았다. Hit Rate 76% → 93%, 완결성 3.2 → 4.1점으로 개선되었다. 128 토큰은 너무 잘게 쪼개져서 오히려 맥락이 손실되었다.

청크가 작으면 검색 정밀도는 올라가지만, 너무 작으면 LLM이 답변 생성할 때 필요한 컨텍스트가 부족해진다. 오버랩을 주니 경계에 걸친 내용도 제대로 검색되었다.

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=256,
    chunk_overlap=50,
    separators=["\n\n", "\n", ".", " "]
)

교훈

RAG 시스템에서 청크 크기는 문서 특성에 따라 달라진다. 기술 문서처럼 구조화된 내용은 작은 청크가, 긴 서술형 텍스트는 큰 청크가 유리했다. 무조건 작게 나누는 게 능사가 아니었다.

오버랩은 약 20%가 적당했다. 50/256이면 19.5%다. 이 정도면 경계 정보를 보존하면서도 중복이 과하지 않았다.