RAG 시스템에서 청크 크기 최적화하기

문제 상황

사내 기술 문서 검색을 위한 RAG 시스템을 구축하던 중, 검색 결과의 정확도가 기대에 못 미쳤다. 특히 긴 문서에서 필요한 정보를 제대로 찾지 못하는 경우가 많았다.

초기에는 OpenAI의 text-embedding-ada-002 모델을 사용하면서 청크 크기를 512 토큰으로 고정했는데, 이 설정이 문제였다.

청크 크기 실험

동일한 100개 문서로 세 가지 청크 크기를 테스트했다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 512 토큰 청크
splitter_512 = RecursiveCharacterTextSplitter(
    chunk_size=512,
    chunk_overlap=50,
    length_function=len
)

# 1024 토큰 청크
splitter_1024 = RecursiveCharacterTextSplitter(
    chunk_size=1024,
    chunk_overlap=100,
    length_function=len
)

각 설정으로 50개의 테스트 쿼리를 실행하고, 검색된 컨텍스트가 정답을 포함하는지 수동으로 평가했다.

결과

  • 512 토큰: 짧은 FAQ는 정확했지만 (85%), 긴 기술 문서는 맥락이 잘려나가는 문제 발생 (62%)
  • 1024 토큰: 기술 문서 검색 품질 향상 (81%), 하지만 FAQ는 오히려 노이즈 증가 (78%)

결국 문서 타입별로 다른 컬렉션을 만들어 청크 크기를 다르게 적용했다.

const chunkConfig = {
  faq: { size: 512, overlap: 50 },
  technical: { size: 1024, overlap: 100 },
  api: { size: 768, overlap: 80 }
};

추가 개선

Chunk overlap을 청크 크기의 10% 정도로 설정하니 경계 부분의 정보 손실이 줄었다. Pinecone의 메타데이터 필터링으로 문서 타입별 검색도 구현했다.

최종적으로 전체 검색 정확도가 67%에서 82%로 개선되었다. 청크 크기는 RAG 시스템에서 생각보다 큰 영향을 미치는 하이퍼파라미터였다.

RAG 시스템에서 청크 크기 최적화하기