프로덕션 RAG 시스템에 Reranking 적용하기

문제 상황

사내 문서 검색 RAG 시스템을 운영 중인데, 사용자들로부터 "관련 없는 답변이 나온다"는 피드백이 계속 들어왔다. 로그를 분석해보니 embedding 기반 vector search만으로는 의미적으로 유사하지만 실제로는 관련 없는 문서를 가져오는 경우가 많았다.

Reranking 도입

Retrieval 단계와 Generation 단계 사이에 Reranking을 추가하기로 했다. Cohere의 Rerank API를 선택했는데, 자체 모델 학습보다 빠르게 적용할 수 있었다.

import cohere
from pinecone import Pinecone

co = cohere.Client(api_key=COHERE_API_KEY)
pc = Pinecone(api_key=PINECONE_API_KEY)

def search_with_rerank(query: str, top_k: int = 5):
    # 1. Vector search로 후보 문서 가져오기 (top_k * 3)
    index = pc.Index("docs")
    embedding = get_embedding(query)
    results = index.query(vector=embedding, top_k=top_k * 3)
    
    # 2. Rerank로 재정렬
    docs = [r.metadata["text"] for r in results.matches]
    reranked = co.rerank(
        query=query,
        documents=docs,
        top_n=top_k,
        model="rerank-english-v2.0"
    )
    
    # 3. 최종 상위 k개만 반환
    return [docs[r.index] for r in reranked]

결과

  • Top-3 정확도: 52% → 68% (사내 테스트셋 기준)
  • 평균 레이턴시: 650ms → 850ms
  • 비용: 쿼리당 약 $0.002 추가

초기 retrieval을 15개로 늘리고 rerank 후 5개만 사용하는 방식이 가장 효과적이었다. 레이턴시 증가는 있지만 답변 품질 개선이 더 중요해서 프로덕션에 적용했다.

개선 포인트

Rerank 비용 절감을 위해 캐싱 전략을 고민 중이다. 동일 쿼리가 자주 들어오는 경우가 많아서 Redis에 결과를 캐싱하면 비용을 30% 정도 줄일 수 있을 것 같다.

프로덕션 RAG 시스템에 Reranking 적용하기