프로덕션 RAG 시스템의 컨텍스트 윈도우 최적화

문제 상황

사내 기술 문서 검색을 위한 RAG 시스템을 운영 중이었다. Claude 3.5 Sonnet을 사용했고, 초기에는 1024 토큰 크기로 문서를 청킹했다. 문제는 복잡한 질문에 대해 관련 청크 5~6개를 모두 컨텍스트에 넣으면 토큰이 부족해지거나, 정작 중요한 정보가 누락되는 경우가 잦았다.

특히 API 문서처럼 코드 예시가 많은 경우 청크 하나만으로도 800~900 토큰을 차지했다.

해결 과정

1. 적응형 청크 사이즈

문서 타입별로 청크 크기를 다르게 설정했다.

const getChunkSize = (docType: string): number => {
  const sizeMap: Record<string, number> = {
    'api-reference': 512,
    'tutorial': 768,
    'architecture': 1024
  };
  return sizeMap[docType] || 640;
};

2. 2단계 검색 전략

먼저 벡터 유사도로 10개를 가져온 뒤, LLM에게 질문과의 관련도를 평가하게 해서 상위 3~4개만 최종 컨텍스트에 포함시켰다.

const relevantChunks = await rerank({
  query: userQuery,
  chunks: initialResults,
  maxResults: 3,
  model: 'claude-3-5-sonnet'
});

3. 메타데이터 활용

청크에 문서 제목, 섹션, 작성일 등 메타데이터를 추가해서 LLM이 컨텍스트 없이도 판단할 수 있게 했다.

결과

  • 평균 응답 품질: 3.2/5 → 4.5/5 (사내 평가)
  • 컨텍스트 토큰 사용량: 평균 6800 → 4200
  • 응답 시간: 4.2초 → 3.1초

RAG는 벡터 DB만의 문제가 아니라 전체 파이프라인 최적화가 중요하다는 걸 다시 느꼈다. 특히 리랭킹 단계를 추가한 것이 가장 효과적이었다.