RAG 시스템 구축하며 마주친 청크 사이즈 문제

배경

사내 기술 문서 검색 시스템을 RAG 방식으로 전환하는 작업을 진행했다. OpenAI Embeddings API와 Pinecone을 조합해 구성했고, GPT-4를 답변 생성에 사용했다.

초기 테스트에서 검색 결과는 나오지만 답변 품질이 기대에 못 미쳤다. 특히 구체적인 코드 예시나 설정값을 물어보면 엉뚱한 답변이 돌아왔다.

문제 원인

청크 사이즈를 512 토큰으로 설정했는데, 이게 문제였다. 문서를 큰 단위로 나누다 보니 하나의 청크에 여러 주제가 섞였고, 임베딩 벡터가 특정 주제를 정확히 표현하지 못했다.

예를 들어 "Redis 연결 설정" 내용과 "캐시 무효화 전략"이 같은 청크에 들어가면서, Redis 설정만 검색해도 캐시 무효화 내용이 함께 반환됐다.

해결 과정

청크 사이즈를 256 토큰으로 줄이고, 오버랩을 50 토큰으로 설정했다.

function chunkDocument(text: string, chunkSize: number = 256, overlap: number = 50) {
  const tokens = encode(text); // tiktoken 사용
  const chunks = [];
  
  for (let i = 0; i < tokens.length; i += chunkSize - overlap) {
    const chunk = tokens.slice(i, i + chunkSize);
    chunks.push(decode(chunk));
  }
  
  return chunks;
}

결과적으로 검색 정확도가 체감상 30% 이상 개선됐다. 특히 구체적인 설정값이나 코드 스니펫 검색에서 효과가 컸다.

추가 고려사항

청크가 작아지니 저장 비용과 검색 시간이 늘었다. 청크 수가 2배 이상 증가했고, Pinecone 비용도 함께 올랐다. Top-K를 5에서 3으로 줄여 일부 상쇄했다.

문서 특성에 따라 최적 청크 사이즈가 다르다는 걸 확인했다. API 레퍼런스는 128 토큰, 가이드 문서는 256 토큰이 적절했다. 문서 타입별로 다른 전략을 적용하는 게 다음 과제다.

RAG 시스템 구축하며 마주친 청크 사이즈 문제