RAG 시스템에 Reranking 레이어 추가하기
문제 상황
사내 문서 검색 RAG 시스템을 운영 중인데, 사용자들이 검색 결과가 부정확하다는 피드백을 계속 주었다. OpenAI embedding과 Pinecone으로 구성한 기본 RAG 구조였는데, vector similarity만으로는 의미적으로 유사하지만 질문과 관련 없는 문서들이 상위에 노출되는 문제가 있었다.
Reranking 도입
Cohere의 Rerank API를 추가 레이어로 도입했다. 기존 vector search로 top 20개를 가져온 후, reranker로 재정렬해서 상위 5개만 LLM에 전달하는 방식이다.
async function searchWithRerank(query: string) {
// 1. Vector search로 후보군 확보
const candidates = await pinecone.query({
vector: await getEmbedding(query),
topK: 20
});
// 2. Rerank로 정확도 높은 문서 필터링
const reranked = await cohere.rerank({
query,
documents: candidates.map(c => c.metadata.text),
topN: 5,
model: 'rerank-english-v2.0'
});
return reranked.results;
}
결과
정성적으로 체감되는 정확도가 확실히 올라갔다. 특히 기술 문서처럼 유사한 키워드가 많이 등장하는 도메인에서 효과가 컸다. Rerank API 호출 비용이 추가되지만, 불필요한 LLM 호출을 줄여서 전체 비용은 오히려 감소했다.
Vector search와 reranking의 two-stage retrieval 패턴은 이제 RAG 시스템의 사실상 표준이 되어가는 것 같다.