RAG 시스템에 Reranking 단계 추가하기
문제 상황
사내 문서 검색 RAG 시스템을 운영 중인데, 벡터 유사도만으로 검색하다 보니 관련성이 떨어지는 문서가 상위에 노출되는 경우가 잦았다. 특히 키워드는 일치하지만 맥락이 다른 문서들이 포함되어 LLM이 엉뚱한 답변을 생성하는 문제가 발생했다.
Reranking 도입
Reranking은 초기 검색 결과를 다시 정렬하는 단계다. 벡터 검색으로 넓게 가져온 후, 더 정교한 모델로 질문과의 관련성을 재평가한다.
Cohere의 Rerank API를 선택했다. 사용법이 간단하고 한국어도 지원했다.
import cohere
co = cohere.Client(api_key=COHERE_API_KEY)
# 1. 벡터 검색으로 top 20 가져오기
initial_results = vector_search(query, top_k=20)
# 2. Reranking
rerank_response = co.rerank(
query=query,
documents=[doc['content'] for doc in initial_results],
top_n=5,
model='rerank-multilingual-v2.0'
)
# 3. 재정렬된 상위 5개만 LLM에 전달
final_docs = [initial_results[r.index] for r in rerank_response]
결과
정성 평가로 100개 질문을 테스트했을 때 답변 정확도가 체감상 30% 정도 개선되었다. 특히 애매한 질문에서 효과가 컸다.
API 호출이 한 번 더 늘어나 레이턴시는 200ms 증가했지만, 정확도 향상이 더 중요하다고 판단했다. 비용은 요청당 약 $0.002로 감당 가능한 수준이었다.
추가 개선 방향
향후에는 Hybrid Search(키워드 + 벡터)와 조합하거나, 자체 Reranker 모델 파인튜닝도 고려해볼 예정이다.