RAG에서 관련 문서가 Top 50에는 있지만 Top 5에 들지 못하면 LLM에 전달되지 않을 수 있습니다. 임베딩 검색은 대규모 문서를 빠르게 줄이는 데 좋지만, 질의와 문서를 하나의 벡터로 각각 압축하기 때문에 단어 간 세밀한 상호작용을 놓칠 수 있습니다.
Reranker는 빠른 1차 검색이 만든 작은 후보 집합을 더 강한 모델로 다시 정렬합니다. 실전에서는 Bi-Encoder가 Recall을 확보하고 Cross-Encoder가 Precision을 높이는 2단계 구조가 대표적입니다.
핵심 요약
- Bi-Encoder는 질의와 문서를 따로 임베딩해 대규모 검색에 빠릅니다.
- Cross-Encoder는 질의·문서 쌍을 함께 읽어 정밀하지만 모든 문서에 적용하기에는 비쌉니다.
- 1차 후보에 관련 문서가 없으면 Reranker도 복구할 수 없습니다.
- 후보 수를 늘리면 Recall은 좋아질 수 있지만 Reranking 지연시간도 거의 함께 증가합니다.
- Reranker 적용 전후를 Recall@k·MRR·nDCG와 P95 지연시간으로 비교해야 합니다.
1. Bi-Encoder와 Cross-Encoder 차이
구분Bi-EncoderCross-Encoder
| 입력 | 질의와 문서를 별도 인코딩 | [질의, 문서]를 한 쌍으로 인코딩 |
| 문서 벡터 | 미리 계산 가능 | 질의마다 다시 계산 |
| 속도 | 대규모 ANN 검색에 적합 | 후보 수에 비례해 느려짐 |
| 정밀도 | 단일 벡터 정보 손실 가능 | 토큰 간 상호작용을 자세히 반영 |
| 역할 | 후보 생성 | 후보 재정렬 |
2. 표준 2단계 파이프라인
질의
↓
Dense/BM25/Hybrid 1차 검색 (Top 50)
↓
Cross-Encoder 점수 계산 (질의, 문서) × 50
↓
재정렬 Top 5
↓
LLM Context 구성
Sentence Transformers에서는 CrossEncoder.predict()로 질의·문서 쌍 점수를 계산할 수 있습니다.
from sentence_transformers import CrossEncoder
model = CrossEncoder("YOUR_RERANKER_MODEL")
pairs = [(query, doc["text"]) for doc in candidates]
scores = model.predict(pairs, batch_size=32)
reranked = sorted(
zip(candidates, scores),
key=lambda x: float(x[1]),
reverse=True,
)
모델에 따라 점수 범위와 방향이 다를 수 있습니다. 절대값에 공통 임계치를 적용하기 전에 모델 카드와 실제 분포를 확인해야 합니다.
3. 후보 수는 어떻게 정하나
후보 수는 품질과 지연시간을 연결하는 핵심 파라미터입니다. Top 10, 20, 50, 100을 비교하면서 다음 표를 만듭니다.
후보 수1차 RecallRerank nDCG@10P95 지연시간
| 10 | 측정값 | 측정값 | 측정값 |
| 20 | 측정값 | 측정값 | 측정값 |
| 50 | 측정값 | 측정값 | 측정값 |
| 100 | 측정값 | 측정값 | 측정값 |
특정 숫자를 정답처럼 쓰기보다 관련 문서 Recall이 충분해지는 지점과 서비스 지연 예산이 만나는 값을 선택합니다.
4. 문서 전체보다 Passage를 재정렬하라
Reranker의 입력 길이에는 제한이 있습니다. 긴 문서를 잘라 앞부분만 넣으면 뒤쪽의 핵심 문장을 잃을 수 있습니다. 그래서 1차 색인과 동일한 Passage 또는 주변 문맥을 포함한 짧은 단위를 사용합니다.
- 제목과 섹션 경로를 Passage 앞에 붙입니다.
- 표의 행·열 제목이 본문에서 떨어지지 않게 Chunking합니다.
- 중복 Chunk가 Top-k를 점유하면 문서·섹션 단위 다양성 규칙을 적용합니다.
- Reranker 최대 토큰을 넘는 입력은 임의 절단 대신 의미 단위로 줄입니다.
5. 지연시간 줄이는 방법
- 질의 유형별로 Reranker가 필요한 요청만 라우팅합니다.
- GPU 배치 추론으로 여러 질의·문서 쌍을 함께 처리합니다.
- 후보 수와 최대 입력 길이를 제한합니다.
- 같은 질의·문서 쌍은 모델 버전을 키로 캐시합니다.
- Cross-Encoder 전 단계에서 메타데이터 필터와 중복 제거를 수행합니다.
- 낮은 지연시간이 중요하면 작은 Reranker와 Late Interaction 모델도 비교합니다.
6. 평가에서 흔한 실수
- Reranker 점수만 평가: 1차 검색이 관련 문서를 가져오는지 먼저 봐야 합니다.
- 다른 후보 집합을 비교: 모델 비교 시 같은 후보와 라벨을 사용합니다.
- 오프라인 nDCG만 승인: 온라인 P95 지연과 LLM 답변 근거성도 확인합니다.
- 도메인 불일치: 범용 Reranker가 법률·의료·코드 문서에서 같은 순위를 보장하지 않습니다.
- 하드 네거티브 부재: 비슷하지만 틀린 문서를 평가 세트에 포함해야 차이가 드러납니다.
7. 운영 체크리스트
- Retriever와 Reranker 모델 버전을 함께 로그에 남깁니다.
- 1차 순위, 재정렬 점수, 최종 순위를 추적합니다.
- 모델 교체 시 전체 평가 세트로 회귀 테스트합니다.
- Timeout 시 1차 검색 결과로 안전하게 폴백할지 정책을 정합니다.
- 질문 유형별 Recall·nDCG·Latency 대시보드를 분리합니다.
공식 자료
- Sentence Transformers Cross-Encoder Applications
- Cross-Encoder Evaluation
- Qdrant Reranking Hybrid Search
정리: Reranker는 검색을 새로 하는 모델이 아니라 이미 찾은 후보의 순서를 개선하는 모델입니다. 1차 Recall을 먼저 확보하고, 후보 수와 배치 크기를 지연 예산 안에서 조정해야 품질 이득이 실제 서비스 가치로 이어집니다.
'AI·LLM 엔지니어링' 카테고리의 다른 글
| AI 에이전트 설계 패턴 완전정리 — ReAct·Plan-Execute·Multi-Agent 선택 기준 (0) | 2026.08.10 |
|---|---|
| vLLM 멀티 GPU 서빙 완전정리 — Tensor·Pipeline·Data Parallel 선택 기준 (0) | 2026.08.09 |
| RAG Hybrid Search 실전 가이드 — Dense·BM25·RRF로 검색 정확도 높이기 (0) | 2026.07.26 |
| vLLM Speculative Decoding 실전 가이드 — Draft Model·N-gram·EAGLE 선택법 (0) | 2026.07.26 |
| vLLM Structured Outputs 완전정리 — JSON Schema·Regex·Grammar로 출력 고정하기 (0) | 2026.07.26 |