RAG 시스템에서 청크 크기가 검색 정확도에 미치는 영향
문제 상황
사내 기술 문서 검색을 위한 RAG 시스템을 구축하면서 청크 크기 설정에 고민이 생겼다. OpenAI의 text-embedding-3-small 모델을 사용 중인데, 청크가 너무 작으면 맥락이 끊기고 너무 크면 노이즈가 많아질 것 같았다.
실험 설계
약 200개의 기술 문서(API 명세, 아키텍처 문서, 트러블슈팅 가이드)를 대상으로 3가지 청크 크기를 테스트했다.
- 256 토큰 (오버랩 50)
- 512 토큰 (오버랩 100)
- 1024 토큰 (오버랩 200)
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=100,
length_function=tiktoken_len
)
chunks = splitter.split_documents(documents)
결과
50개의 실제 질문으로 테스트한 결과:
- API 명세 같은 구조화된 문서: 256 토큰이 가장 정확했다. 필요한 파라미터 정보만 정확히 검색되었다.
- 아키텍처 설명 문서: 512 토큰이 적절했다. 앞뒤 맥락이 함께 검색되어 이해도가 높았다.
- 긴 트러블슈팅 가이드: 1024 토큰에서 관련 없는 내용까지 포함되어 오히려 정확도가 떨어졌다.
최종 적용
문서 타입별로 다른 청크 크기를 적용하는 방식으로 변경했다. Pinecone의 메타데이터에 doc_type을 저장하고, 검색 시 필터링하여 사용한다.
metadata = {
"doc_type": "api_spec",
"chunk_size": 256
}
LLM 응답 품질은 측정하기 어렵지만, 사용자 피드백 기반으로 관련성이 30% 정도 개선된 것으로 보인다.