프로덕션 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에 넘기는 건 비효율적이었다.