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 시스템에서 생각보다 큰 영향을 미치는 하이퍼파라미터였다.