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

문제 상황

사내 문서 검색 RAG 시스템을 운영한 지 한 달, GPT-4o 토큰 비용이 예상의 3배로 나왔다. 벡터 DB에서 top-k=10으로 청크를 가져오는데, 각 청크가 평균 800토큰이라 매 쿼리마다 8000토큰 이상을 소비하고 있었다.

해결 과정

1. 리랭킹 모델 도입

벡터 유사도만으로는 실제 관련성을 정확히 판단하기 어려웠다. Cohere rerank API를 추가해 top-10을 top-3으로 압축했다.

import cohere

co = cohere.Client(api_key=COHERE_KEY)

# 벡터 검색 결과
initial_chunks = vector_db.search(query, top_k=10)

# 리랭킹
reranked = co.rerank(
    query=query,
    documents=[c.text for c in initial_chunks],
    top_n=3,
    model="rerank-multilingual-v3.0"
)

final_chunks = [initial_chunks[r.index] for r in reranked.results]

2. 청크 요약

선택된 3개 청크도 여전히 길 때가 많았다. Claude 3.5 Haiku로 각 청크를 200토큰 이내로 요약하는 단계를 추가했다. 비용은 늘지만 GPT-4o 입력 토큰 절감 효과가 더 컸다.

3. 캐싱 전략

같은 문서에 대한 반복 질문이 많아 벡터 검색 결과를 Redis에 캐싱했다. 쿼리 임베딩 유사도 0.95 이상이면 캐시를 재사용하도록 했다.

결과

  • 평균 입력 토큰: 8000 → 3200 (60% 감소)
  • 응답 품질: 오히려 개선 (노이즈 제거 효과)
  • 월 비용: $2,400 → $960

리랭킹 단계만 추가해도 효과가 컸다. RAG 시스템에서 검색 결과를 그대로 LLM에 넘기는 건 비효율적이었다.