RAG 시스템에서 청크 크기 조정으로 검색 정확도 개선하기

문제 상황

사내 기술 문서 검색을 위한 RAG 시스템을 구축하는 프로젝트를 진행했다. OpenAI의 text-embedding-3-small 모델과 Pinecone을 조합해서 초기 프로토타입을 만들었는데, 검색 결과가 생각보다 부정확했다.

특히 특정 API 사용법을 물어볼 때 관련 없는 문서가 상위에 노출되는 경우가 많았다.

원인 분석

처음에는 청크 크기를 512 토큰으로 설정했었다. 한 청크에 여러 주제가 섞여 있다 보니 임베딩이 모호해지는 문제가 있었다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 기존 설정
splitter = RecursiveCharacterTextSplitter(
    chunk_size=2048,  # 약 512 토큰
    chunk_overlap=200
)

해결 과정

청크 크기를 줄이고 오버랩을 늘리는 방향으로 실험했다.

# 개선된 설정
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1024,  # 약 256 토큰
    chunk_overlap=128,
    separators=["\n\n", "\n", ". ", " ", ""]
)

256 토큰 정도로 줄이니 각 청크가 하나의 개념이나 예제에 집중하게 되었다. 문맥 유지를 위해 오버랩도 기존 200자에서 128자로 조정했다.

결과

10개의 테스트 쿼리로 실험한 결과:

  • 512 토큰: Top-3 정확도 60%
  • 256 토큰: Top-3 정확도 85%

특히 코드 예제가 포함된 문서에서 개선 효과가 컸다. 다만 청크 수가 2배 가까이 늘어나면서 벡터 DB 비용도 증가했다.

교훈

RAG 시스템에서 청크 크기는 문서 특성에 따라 달라져야 한다. 기술 문서처럼 명확한 단위로 나눌 수 있는 경우 작은 청크가 유리했다. 다음엔 동적으로 청크 크기를 조정하는 방법도 시도해볼 예정이다.

RAG 시스템에서 청크 크기 조정으로 검색 정확도 개선하기