Skip to main content
1차 검색(Retrieval)은 수백만 문서에서 후보를 빠르게 추려내는 단계입니다. 하지만 속도를 위해 정밀도를 희생합니다. Re-ranking은 추려낸 소수의 후보를 더 정교한 모델로 재평가하여, 최종적으로 LLM에 전달할 최고의 문서를 선별합니다.

2단계 검색 패턴: Recall과 Precision의 분리

이 패턴을 이해하려면 두 가지 핵심 지표를 먼저 알아야 합니다:
  • Recall (재현율): 전체 정답 문서 중 실제로 검색된 비율. “정답을 얼마나 빠뜨리지 않았는가?” 를 측정합니다.
  • Precision (정밀도): 검색된 문서 중 실제 정답의 비율. “검색 결과에 쓸모없는 문서가 얼마나 섞여 있는가?” 를 측정합니다.
이 두 지표는 트레이드오프 관계에 있어, 한쪽을 높이면 다른 쪽이 낮아지는 경향이 있습니다. 2단계 검색 패턴은 이 트레이드오프를 각 단계에 역할을 분리하여 해결합니다. RAG 검색은 두 단계로 나뉩니다:
[100만 문서]
     ↓ 1단계: Retrieval (Bi-encoder) — Recall 중시
[상위 20개 후보]
     ↓ 2단계: Re-ranking (Cross-encoder) — Precision 중시
[상위 5개 문서]
     ↓ LLM에 전달
[최종 답변 생성]
  • 1단계 (Recall 중시): “관련 있을 수 있는 문서를 하나도 빠뜨리지 말자” → 빠르지만 다소 부정확
  • 2단계 (Precision 중시): “이 후보들 중 진짜 관련 있는 것만 골라내자” → 느리지만 매우 정확
참고 왜 한 번에 정밀하게 하지 않는가? 100만 문서를 Cross-encoder로 평가하면 한 쿼리당 수 분이 걸립니다. 20개 문서만 평가하면 수백 밀리초면 충분합니다. 비용 대비 효과 를 최적화하는 것이 2단계 패턴의 핵심입니다.

Bi-encoder vs Cross-encoder: 깊이 있는 비교

Bi-encoder (1차 검색용)

질문과 문서를 각각 독립적으로 임베딩합니다:
질문: "Databricks에서 벡터 검색 설정하는 방법" → [0.23, -0.41, ...] (768차원)
문서: "Vector Search 인덱스 생성 가이드"       → [0.25, -0.39, ...] (768차원)

→ 코사인 유사도 계산: 0.93
  (코사인 유사도: 두 벡터가 가리키는 방향이 얼마나 같은지를 -1~1 사이 값으로 측정.
   1에 가까울수록 의미가 유사하고, 0이면 관련 없음)
핵심 특성: 질문 벡터와 문서 벡터가 서로에 대한 정보 없이 독립적으로 생성됩니다. 문서 벡터는 미리 계산해서 저장 해둘 수 있습니다 (오프라인 인덱싱). 한계: 질문과 문서 사이의 세밀한 상호작용 을 포착하지 못합니다. 예를 들어, 질문의 특정 단어가 문서의 특정 구절과 정확히 대응되는지 판단하기 어렵습니다.

Cross-encoder (Re-ranking용)

질문과 문서를 하나의 입력으로 결합 하여 Transformer에 통째로 넣습니다.
참고 Transformer란? GPT, BERT 등 현대 AI 모델의 기반 아키텍처입니다. 핵심 메커니즘은 Attention(어텐션) 으로, 입력 텍스트의 모든 단어가 다른 모든 단어와의 관련성을 계산하는 방식입니다. 예를 들어 “나는 은행 에서 돈을 인출했다”라는 문장에서, Attention은 “은행”이 “돈”과 강하게 연결됨을 파악하여 금융기관의 “은행”임을 이해합니다. 이 메커니즘 덕분에 Cross-encoder는 질문과 문서 사이의 세밀한 의미 관계를 포착할 수 있습니다.
입력: "[CLS] Databricks에서 벡터 검색 설정하는 방법 [SEP] Vector Search 인덱스 생성 가이드 [SEP]"

※ [CLS]는 "문장 전체의 의미를 대표하는 위치" 표시 토큰,
  [SEP]는 "여기서 질문과 문서가 구분된다"는 경계 표시 토큰입니다.

Transformer 내부에서 Attention이 작동하는 방식:
- "벡터 검색" ←→ "Vector Search" 사이의 Attention 발생
  (같은 개념의 한국어/영어 표현임을 인식)
- "설정하는 방법" ←→ "생성 가이드" 사이의 Attention 발생
  (유사한 의도를 가진 표현임을 인식)
- 이런 교차 상호작용을 통해 정밀한 관련성 점수 산출

→ 관련성 점수: 0.97
핵심 특성: 질문의 모든 토큰이 문서의 모든 토큰과 직접 상호작용(Cross-attention) 합니다. 여기서 Cross-attention이란, 질문 쪽 토큰이 문서 쪽 토큰에 대해 “이 단어가 나와 얼마나 관련 있는가?”를 계산하는 과정입니다. 이를 통해 “질문의 이 부분이 문서의 저 부분과 정확히 대응된다”는 세밀한 판단이 가능합니다. 한계: 질문-문서 쌍마다 전체 Transformer를 실행해야 하므로 매우 느립니다. 사전 계산이 불가능합니다.

비유로 이해하기

관점Bi-encoderCross-encoder
채용 비유이력서 키워드 스크리닝: 이력서와 채용 공고를 각각 분석하여 키워드 매칭. 빠르지만 맥락 파악 불가심층 면접: 지원자와 면접관이 직접 대화하며 적합성 평가. 느리지만 정밀
번역 비유두 문장을 각각 요약한 뒤 요약끼리 비교두 문장을 나란히 놓고 단어 대 단어로 대조
속도100만 문서: ~100ms20 문서: ~200ms
정확도좋음매우 좋음

주요 Re-ranking 모델 비교

모델제공자특징한국어 지원
Cohere RerankerCohereAPI 방식, 높은 정확도, 다국어 지원좋음
BGE Reranker v2BAAI오픈소스, Self-hosting 가능좋음
Jina RerankerJina AI오픈소스, 가벼움보통
ms-marco MiniLMMicrosoft가벼움, 영어 특화미지원
참고 Databricks에서의 선택: Cohere Reranker는 Foundation Model API를 통해 쉽게 사용할 수 있습니다. 오픈소스를 선호한다면 BGE Reranker v2를 Model Serving Endpoint로 배포하여 사용할 수 있습니다.

성능 영향: Re-ranking이 만드는 차이

실험 결과 (일반적인 벤치마크 기준)

검색 방식                          | Top-5 Precision | Top-5 Recall
----------------------------------|-----------------|-------------
Dense만 (Bi-encoder)              | 62%             | 78%
Dense + BM25 하이브리드            | 71%             | 85%
Dense + BM25 + Re-ranking         | 84%             | 88%
                                     ↑ +13%p 향상!
Re-ranking을 추가하면 Top-5 Precision이 10-30%p 향상되는 것이 일반적입니다. 특히 질문이 모호하거나, 비슷한 주제의 문서가 많은 경우 Re-ranking의 효과가 극대화됩니다.

왜 이런 차이가 나는가?

1차 검색(Bi-encoder)에서는 “대략적으로 관련 있는 20개”를 뽑습니다. 이 중에는:
  • 진짜 관련 있는 문서 5개: 질문에 정확히 답할 수 있는 문서
  • 약간 관련 있는 문서 10개: 주제는 비슷하지만 직접적 답변이 아닌 문서
  • 거의 관련 없는 문서 5개: 키워드만 겹치는 문서
Re-ranking의 Cross-encoder가 이 20개를 정밀하게 재평가하면, “진짜 관련 있는 5개”가 상위에 올라오고 나머지는 밀려납니다.

실무 파이프라인: Retrieve 20 → Rerank → Top 5

권장 설정

# 1단계: 넓게 검색 (Recall 중시)
initial_results = vs_index.similarity_search(
    query_text=question,
    num_results=20,           # 넉넉하게 20개 후보 추출
    query_type="hybrid"       # Dense + BM25 하이브리드
)

# 2단계: 정밀 재정렬 (Precision 중시)
reranked = reranker.rerank(
    query=question,
    documents=initial_results,
    top_n=5                   # 최종 5개만 선택
)

# 3단계: LLM에 전달
context = "\n\n".join([doc.text for doc in reranked])
answer = llm.generate(prompt_template.format(context=context, question=question))

숫자의 의미

파라미터이유
1차 검색 수20Recall을 충분히 확보. 30-50으로 늘려도 되지만 Re-ranking 시간 증가
Re-ranking 결과 수5LLM 컨텍스트 윈도우를 고려한 최적값. 3-7 범위 권장
주의 지연 시간 고려: Re-ranking은 20개 문서 기준 약 100-300ms가 추가됩니다. 실시간 챗봇에서는 전체 응답 시간에 영향을 줄 수 있으므로, Re-ranking 대상 수(1차 검색 결과 수)를 적절히 조절하세요. 50개 이상은 대부분 불필요합니다.

Re-ranking 없이 성능을 높이는 대안

Re-ranking 도입이 어려운 경우 다음 대안을 고려하세요:
  1. 임베딩 모델 업그레이드: 더 좋은 Bi-encoder 모델로 1차 검색 품질 자체를 높임
  2. 청킹 최적화: 적절한 크기와 오버랩으로 검색 단위 자체의 품질 향상
  3. 쿼리 확장: 사용자 질문을 LLM으로 확장/변환하여 검색. HyDE(Hypothetical Document Embeddings) 는 LLM에게 “이 질문에 대한 가상의 답변”을 먼저 생성하게 한 뒤, 그 가상 답변의 임베딩으로 검색하는 기법입니다. Query Expansion 은 원래 질문을 여러 변형으로 확장하여 검색 범위를 넓히는 방식입니다.
  4. 메타데이터 필터링: 카테고리, 날짜 등으로 검색 범위를 사전에 좁힘

이전으로 돌아가기: 핵심 개념 사전 목록