본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 16. 06:14

RAG Rerank: 검색 파이프라인을 위한 가장 영향력 있는 업그레이드

요약

RAG 시스템의 답변 정확도를 높이기 위해 검색 파이프라인에 리랭커(Reranker)를 도입하는 방법을 설명합니다. Bi-encoder의 속도와 Cross-encoder의 정밀함을 결합하여 효율적인 검색 전략을 구축하는 패턴을 제시합니다.

핵심 포인트

  • 임베딩 모델 교체보다 리랭커 추가가 RAG 성능 향상에 더 효과적임
  • Bi-encoder는 빠르지만 근사치를 제공하고, Cross-encoder는 느리지만 정밀함
  • 넓게 검색(Retrieve)하고, 리랭크(Rerank)한 뒤, 상위 결과만 유지하는 패턴 권장
  • 전용 모델 대신 LLM을 활용하여 후보군에 점수를 매기는 방식도 가능함

만약 당신의 RAG 앱이 데이터베이스에 올바른 문서가 있음에도 불구하고 가끔 잘못된 문서로부터 답변을 한다면, 그 해결책은 보통 더 나은 임베딩 모델 (embedding model)을 사용하는 것이 아니라 **리랭커 (reranker)**를 추가하는 것입니다. 이것은 기본적인 검색 파이프라인(retrieval pipeline)에 적용할 수 있는 단일 항목 중 가장 영향력이 큰 업그레이드이며, 쉽게 결합할 수 있습니다.

이 글은 제가 매일 하나의 기술을 분석하는 PromptFromZero의 8일 차 내용입니다.

일반적인 검색(plain retrieval)이 순서를 틀리는 이유

표준 RAG는 질문을 임베딩 (embed)하고 가장 가까운 문서 벡터 (document vectors)를 가져옵니다. 이는 매우 빠르지만, 임베딩은 전체 구절을 하나의 벡터로 압축하기 때문에, 질문에 실제로 답하는 문서보다 단순히 질문과 단어를 공유하는 문서를 더 높은 순위로 매기는 경우가 많습니다. 첫 번째 단계(first pass)로는 충분할지 모르지만, LLM에 바로 전달하기에는 충분하지 않습니다.

const candidates = await vectorSearch(query, { k: 25 });  // 빠르고 대략적임

Bi-encoder vs cross-encoder (핵심적인 차이점)

검색(Retrieval)은 bi-encoder를 사용합니다. 이는 쿼리 (query)와 각 문서를 각각 인코딩 (encode)한 다음 벡터를 비교합니다. 모든 문서가 한 번씩 미리 인코딩되어 있기 때문에 빠르지만, 쿼리와 문서가 함께 있는 상태를 결코 보지 못합니다.

A cross-encoder는 쌍(pair)을 모델에 함께 입력하여, 전체 문맥(context)을 바탕으로 진정한 관련성을 판단할 수 있게 합니다. 후보(candidate)당 한 번씩 실행해야 한다는 비용이 들지만, 훨씬 더 정확합니다.

bi-encoder:    sim(embed(query), embed(doc))   ← 빠름, 근사치
cross-encoder: model(query + doc) → score      ← 느림, 정밀함

패턴: 넓게 검색하고, 리랭크하고, 좁게 유지하라

수백만 개의 문서에 대해 비용이 많이 드는 cross-encoder를 실행할 수는 없습니다. 따라서 다음과 같이 진행합니다:

  1. 넓은 후보군을 저렴하게 검색(Retrieve) 합니다. 상위 3개가 아니라 상위 25개를 가져옵니다.
  2. 그 25개에 대해서만 cross-encoder로 리랭크(Rerank) 합니다. 이는 각 (query, doc) 쌍을 다시 읽고 정밀한 관련성 점수(relevance score)를 할당합니다.
  3. 프롬프트(prompt)를 위해 가장 좋은 2~4개만 유지합니다.
const scored  = await reranker.rank(query, candidates);
const context = scored.sort((a, b) => b.score - a.score).slice(0, 3);

페이지의 인터랙티브 데모에서 질문을 하나 선택하여, 일반적인 검색 (plain retrieval) 시에는 정말 관련 있는 문서(초록색으로 강조됨)가 5위에 머물다가, 재순위화 (reranking) 이후에는 1위로 올라가는 것을 확인해 보세요. 동일한 문서들이지만, 순서는 훨씬 더 좋아졌습니다.

재순위화 모델이 없다면? LLM으로도 가능합니다

전용 재순위화 모델 (Cohere Rerank, bge-reranker 등)을 사용하고 싶지 않다면, LLM에게 각 후보군을 점수 매기도록 요청하기만 하면 됩니다:

이 구절이 질문에 얼마나 잘 답하는지 0-10점으로 평가하세요.
질문: {q}
구절: {doc}
...

각 후보군에 대해 이를 실행하고 점수에 따라 정렬하세요. 쿼리당 속도는 더 느리고 비용은 더 많이 들지만, 추가적인 인프라가 전혀 필요 없으며 놀라울 정도로 강력합니다.

왜 더 적고 더 나은 구절이 승리하는가

재순위화(Reranking)를 거치면 대부분의 후보군을 버리게 됩니다. 더 적고 품질이 높은 구절을 사용한다는 것은 프롬프트 (prompt)가 짧아지고, 비용이 낮아지며, 우연히 키워드를 공유하는 무관한 청크 (chunk) 때문에 모델이 주의를 분산시킬 가능성이 훨씬 낮아짐을 의미합니다. RAG에서는 컨텍스트 (context)의 양보다 질이 언제나 승리합니다.

트레이드오프 (The tradeoff)

재순위화는 단계가 추가되므로 지연 시간 (latency)과 약간의 비용이 발생합니다. 하지만 잘못된 답변의 대가가 큰 분야(고객 지원, 법률, 의료, 내부 검색 등)라면, 정확도의 향상은 그만한 가치가 충분합니다. 만약 당신의 RAG가 정답을 "알고" 있음에도 불구하고 이를 제대로 보여주지 못한다면, 가장 먼저 재순위화 모델을 고려하세요.

👉 실시간으로 순서가 바뀌는 것을 확인하세요 (올바른 문서가 올라가는 것을 확인하세요): https://dev48v.infy.uk/prompt/day8-rag-rerank.html

🌐 모든 기술: https://dev48v.infy.uk/promptfromzero.php

내일: HyDE — 먼저 가상의 답변을 작성한 다음, 그 답변으로 검색합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0