Skip to main content

Cross-encoder Reranking

Cross-encoder는 쿼리와 문서를 하나의 입력으로 결합하여 관련성 점수를 직접 예측하는 재순위화 모델입니다.

Bi-encoder vs Cross-encoder

항목Bi-encoderCross-encoder
입력 방식쿼리, 문서를 독립 인코딩쿼리+문서를 함께 인코딩
상호작용없음 (독립 벡터)토큰 수준의 상호작용
속도빠름 (사전 인코딩 가능)느림 (매번 쌍으로 인코딩)
정밀도보통높음
사용 단계1차 검색 (대량 후보)재순위화 (소량 후보)
확장성수백만 문서 가능수십~수백 문서

LangChain 구현

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder

# Cross-encoder 모델 로드
model = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3")
compressor = CrossEncoderReranker(model=model, top_n=4)

# 재순위화 적용
reranking_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=retriever,  # 1차 검색기 (top-20)
)

results = reranking_retriever.invoke("RAG에서 검색 품질을 높이는 방법은?")

주요 Cross-encoder 모델

모델크기다국어한국어특징
BAAI/bge-reranker-v2-m3568MO우수다국어 최강, 프로덕션 추천
BAAI/bge-reranker-large560MO우수범용 고성능
BAAI/bge-reranker-base278MO좋음속도-성능 균형
cross-encoder/ms-marco-MiniLM-L-12-v233MXX영어 전용, 경량
cross-encoder/ms-marco-MiniLM-L-6-v222MXX영어 전용, 초경량

모델 선택 가이드

요구사항추천 모델
한국어 RAGBAAI/bge-reranker-v2-m3
영어 전용 + 속도 중시cross-encoder/ms-marco-MiniLM-L-6-v2
영어 전용 + 품질 중시cross-encoder/ms-marco-MiniLM-L-12-v2
다국어 + 균형BAAI/bge-reranker-base
최고 품질 (언어 무관)BAAI/bge-reranker-v2-m3

성능 최적화

Top-K 설정

1차 검색의 K값과 재순위화의 top_n을 적절히 설정해야 합니다.
1차 검색 K재순위화 top_n효과
103~4빠르지만 관련 문서 누락 가능
204~5균형 잡힌 기본 설정
505~10높은 재현율, 느린 속도
1차 검색의 K값을 너무 작게 설정하면 관련 문서가 후보에서 제외되어 재순위화의 효과가 제한됩니다. 반대로 너무 크면 Cross-encoder의 처리 시간이 증가합니다.

GPU 가속

import torch

# GPU 사용 가능 시 자동 활용
model = HuggingFaceCrossEncoder(
    model_name="BAAI/bge-reranker-v2-m3",
    model_kwargs={"device": "cuda" if torch.cuda.is_available() else "cpu"},
)
한국어 RAG 프로덕션 추천: BAAI/bge-reranker-v2-m3 + 1차 검색 top-20 + 재순위화 top-4. GPU가 없어도 CPU에서 동작하며, 20개 문서 재순위화에 약 200~500ms 소요됩니다.