Field Log · Entry
Reranker란 무엇인가: 두 단계 검색과 전체 지도 (1/14)
이번 글의 결론
- Retriever는 거대한 corpus에서 정답을 놓치지 않는 후보 집합을 만들고, reranker는 그 안에서 상위 순서를 더 정확하게 만듭니다.
- Reranker는 candidate 안에 없는 문서를 되살릴 수 없습니다. 따라서
Recall@N → nDCG@k → end-to-end answer quality순서로 봐야 합니다.- Cross-Encoder, ColBERT, monoT5, LLM listwise ranker는 같은 축의 이름이 아닙니다. interaction 구조, scoring 단위, 학습 목표를 분리해야 정확히 비교할 수 있습니다.
- Reranking은 fusion, filtering, diversification, context packing과 다릅니다. Production에서는 이 단계들을 명시적인 contract로 연결해야 합니다.
- 가장 큰 model을 고르는 것이 출발점이 아닙니다. 고정 candidate set에서 품질·p95 latency·비용을 함께 재는 작은 baseline이 출발점입니다.
RAG 검색 계층 시리즈의 reranking 입문 글에서는 Cross-Encoder·monoT5·ColBERT를 한 번에 비교했습니다. 이번 시리즈는 그 한 단계를 독립된 engineering discipline으로 확대합니다. 수학적 기초, model 구조, 학습 데이터, 평가, 한국어 model 선택, serving, RAG utility, 멀티모달·reasoning 연구를 14편에 걸쳐 연결합니다.
질문 q
│
├─ Stage 1: BM25 / dense ANN / hybrid
│ corpus 10,000,000 → candidates 100
│ 목표: 정답을 후보에 넣기
│
├─ Stage 2: reranker
│ candidates 100 → ordered candidates 10
│ 목표: 유용한 문서를 위로 올리기
│
└─ Stage 3: selector / packer / generator
candidates 10 → evidence 4 → answer
목표: 충분하고 안전한 context로 답하기
1. Reranker를 한 문장으로 정의한다
Reranker는 첫 검색기가 반환한 유한한 후보 집합을 더 비싼 relevance function으로 다시 점수화하거나 직접 순열로 만들어 상위 결과의 품질을 높이는 구성 요소입니다.
Corpus를 (D), query를 (q), first-stage retriever를 (R)라고 합시다.
C_N(q) = R(q, D, N)
C_N(q)는 corpus 전체가 아니라 최대 N개의 후보입니다. Pointwise reranker라면 각 후보에 score를 붙입니다.
s_i = fθ(q, d_i)
π = argsort_desc([s_1, ..., s_N])
Listwise reranker라면 후보 목록을 함께 읽고 순열을 직접 예측할 수 있습니다.
π = gθ(q, [d_1, ..., d_N])
최종 top_k는 π의 앞부분입니다. 이 정의에서 중요한 사실은 입력 범위가 D가 아니라 C_N(q)라는 점입니다.
2. 왜 한 Model로 전부 검색하지 않는가
정확한 relevance 판단에는 query와 document의 세부 관계를 읽는 계산이 필요합니다. 하지만 corpus가 수백만 개라면 모든 query-document pair에 full attention을 계산할 수 없습니다.
full scan cost ≈ |D| × pair_cost
rerank cost ≈ N × pair_cost
|D| = 10,000,000
N = 100
그래서 검색 시스템은 역할을 나눕니다.
| 단계 | 주된 최적화 | 버리는 정보 | 대표 방식 |
|---|---|---|---|
| Candidate retrieval | recall·throughput | 정밀한 query-document interaction | BM25, dense vector, learned sparse, hybrid |
| Reranking | top-rank precision·ordering | corpus 전체 탐색 가능성 | LambdaMART, Cross-Encoder, monoT5, LLM ranker |
| Context selection | coverage·diversity·budget | 단순 relevance 순서 | MMR, set cover, evidence graph, dynamic selection |
| Generation | answer utility·faithfulness | 검색 metric 자체 | grounded LLM, citation, abstention |
두 단계 구조는 “약한 model 뒤에 강한 model”이라는 말보다 정확합니다. 첫 단계와 둘째 단계는 서로 다른 search space와 실패 비용을 갖습니다.
3. Reranker의 절대 상한은 Candidate Recall이다
Gold document 집합을 G(q)라고 하겠습니다. 후보가 gold를 하나라도 포함하는지 보는 binary candidate recall은 다음과 같습니다.
hit_N(q) = 1 if C_N(q) ∩ G(q) ≠ ∅ else 0
Recall@N = mean_q hit_N(q)
질문 1,000개에서 Recall@100 = 0.86이라면 최소 140개 질문은 reranker가 아무리 좋아도 gold를 위로 올릴 수 없습니다.
gold ∉ candidates
→ reranker가 관찰할 수 없음
→ final top-k에도 넣을 수 없음
이 때문에 다음 두 문장은 전혀 다릅니다.
- “Reranker가 나빠서 정답 passage가 top-5에 없다.”
- “Retriever가 정답 passage를 top-100에 넣지 못했다.”
첫 문장은 ordering 문제이고, 둘째는 candidate generation 문제입니다. Trace에 gold_in_candidates를 남기지 않으면 두 실패가 섞입니다.
여러 Gold가 필요한 질문
Multi-hop 질문은 gold 하나가 아니라 evidence set 전체가 필요할 수 있습니다.
Question: A 회사가 인수한 B 제품의 현재 지원 종료일은?
Evidence A: A가 B를 인수했다.
Evidence B: B의 지원 종료일은 2027-03-31이다.
이때 하나라도 포함하는 recall은 너무 낙관적입니다.
evidence coverage@N
= |C_N(q) ∩ G(q)| / |G(q)|
Reranker가 pointwise relevance만 최적화하면 비슷한 evidence A 여러 개를 위에 두고 evidence B를 밀어낼 수도 있습니다. 이 문제는 12편에서 set utility와 context selection으로 다시 다룹니다.
4. Reranker와 자주 혼동하는 네 단계
Fusion
BM25와 dense 결과처럼 서로 다른 ranked list를 합칩니다.
BM25 ranks + dense ranks
→ RRF / weighted score fusion
→ merged candidate list
RRF도 순위를 바꾸지만 보통 query-document text를 새 model로 읽지 않습니다. 후보 source의 rank signal을 결합하는 fusion입니다.
Filtering
ACL, tenant, 날짜, 문서 상태 같은 hard constraint를 적용합니다.
visibility = allowed(user, document)
status = approved
valid_at = query_time
권한 없는 문서를 rerank한 뒤 숨기는 것이 아니라, 가능한 한 검색 전에 security filter를 적용해야 합니다. Reranker score는 authorization 판정이 아닙니다.
Diversification
상위 문서가 거의 같은 내용을 반복하지 않도록 novelty를 반영합니다. MMR처럼 query relevance와 이미 선택한 문서와의 중복을 함께 볼 수 있습니다.
Context Packing
선택한 chunk를 원문 순서, source authority, token budget에 맞춰 LLM prompt로 배치합니다. Search rank 1이 prompt position 1이어야 한다는 법은 없습니다.
5. 종류를 외우기 전에 분류축을 세운다
Reranker 이름이 혼란스러운 이유는 서로 직교하는 분류축을 한 줄에 섞기 때문입니다.
축 A · 후보를 몇 개씩 비교하는가
| 방식 | 한 번의 판단 | 결과 | 주요 trade-off |
|---|---|---|---|
| Pointwise | (q, d_i) | 후보별 score | 병렬화가 쉽지만 후보 간 관계를 직접 보지 않음 |
| Pairwise | (q, d_i, d_j) | d_i > d_j 선호 | 상대 비교가 자연스럽지만 비교 수가 커질 수 있음 |
| Setwise | (q, subset) | subset의 승자·score | pairwise보다 호출 수를 줄일 수 있음 |
| Listwise | (q, d_1...d_n) | 전체 score·순열 | global context를 보지만 길이·순서 bias가 큼 |
축 B · Query와 Document가 어디서 상호작용하는가
| 구조 | interaction | document 사전 계산 | 대표 예 |
|---|---|---|---|
| Feature LTR | 수작업·검색 feature 결합 | 가능 | LambdaMART |
| Single-vector bi-encoder | 마지막 dot product | 가능 | dense retriever |
| Late interaction | token vector 간 MaxSim | 가능 | ColBERT |
| Cross-Encoder | 모든 layer의 joint attention | 불가 | monoBERT, MiniLM reranker |
| Encoder-decoder | joint encoding + label/score decoder | 불가 | monoT5, RankT5 |
| Decoder-only LLM | prompt 내 비교·생성·logit | model에 따라 다름 | RankGPT, RankZephyr, Qwen3-Reranker |
ColBERT는 corpus 전체를 검색하면 retriever이고, first-stage 후보에만 MaxSim을 적용하면 reranker 역할입니다. Architecture 이름만으로 pipeline 역할이 정해지지 않습니다.
축 C · 무엇으로 학습하는가
human qrels
click / purchase / dwell-time behavior
teacher scores or permutations
synthetic query-document judgments
downstream answer utility
reinforcement learning reward
zero-shot instruction only
같은 Cross-Encoder도 binary label로 pointwise 학습할 수 있고, pairwise loss나 listwise softmax로 학습할 수 있습니다. Model 구조와 loss를 분리해서 기록해야 합니다.
축 D · 무엇을 최적화하는가
- topical relevance
- exact answer support
- freshness·authority
- task-specific instruction following
- multiple evidence coverage
- final generator confidence·correctness
- latency·token cost까지 포함한 utility
“관련 있다”는 label 정의가 달라지면 같은 query-document도 정답이 달라집니다.
6. Reranking이 특히 잘 듣는 실패
다음은 넓은 후보 검색에는 성공했지만 세부 조건을 구분하지 못한 경우입니다.
Query: Orion S2 승인된 emergency shutdown 온도
1차 후보:
1. Orion S1 emergency shutdown: 82°C
2. Orion S2 draft shutdown proposal: 92°C
3. Orion S2 normal operating range: 45–70°C
4. Orion S2 approved emergency shutdown: 88°C
5. Orion S2 shutdown pressure: 2.4 bar
좋은 reranker는 다음 interaction을 읽어야 합니다.
S2와S1의 entity mismatchapproved와draft의 status 차이temperature와pressure의 attribute 차이emergency shutdown과normal range의 event 차이
Embedding similarity 하나로 압축하기 어려운 부정, 숫자, version, entity relation, source status가 reranking의 대표 이득 구간입니다.
7. Reranker를 붙여도 해결되지 않는 실패
Gold가 Candidate에 없음
First-stage recall, query rewriting, parsing, chunking, index freshness를 고쳐야 합니다.
잘못된 Chunk 경계
제목은 candidate 1에 있고 답은 candidate 2에 찢겨 있다면 pair 하나만 읽는 reranker도 의미를 복원하지 못할 수 있습니다.
Label이 제품 목표와 다름
연구 benchmark의 topical relevance가 실제 제품의 최신 승인 문서나 답을 직접 지지하는 근거를 보장하지 않습니다.
권한·정책 문제
높은 relevance score가 문서 공개 허가를 뜻하지 않습니다.
후보가 이미 완벽함
Baseline top-k가 충분히 좋으면 reranking gain보다 latency와 운영 복잡성이 클 수 있습니다. “대부분의 RAG에는 reranker가 필수” 같은 일반화는 실험 없이 받아들이지 않습니다.
8. 품질만이 아니라 Cost Model을 먼저 쓴다
Pointwise Cross-Encoder의 요청당 token work를 거칠게 쓰면 다음과 같습니다.
work ≈ Σ_i tokens(query + candidate_i)
latency ≠ work / batch_size # 완전한 선형식이 아님
후보 수 N, 평균 pair 길이 L, model cost를 c(L)라 하면:
total compute ≈ N × c(L)
Listwise LLM은 후보를 한 prompt에 모으지만 공짜가 아닙니다.
input tokens ≈ query + Σ candidate tokens + delimiters
attention cost grows with the combined sequence
output tokens depend on ranking protocol
Batching은 device utilization을 높이지만 개별 request의 queue time을 늘릴 수 있습니다. 그래서 최소한 다음을 함께 기록합니다.
| 품질 | 시스템 | 비용 |
|---|---|---|
| Recall@N, MRR, nDCG@k | p50/p95/p99, timeout rate | pair 수, input token, GPU·API 비용 |
| context precision | pairs/s, tokens/s | memory, energy 또는 request 단가 |
| answer correctness·faithfulness | queue·compute 분해 | fallback 비율 |
9. 첫 실험의 Contract
Model을 고르기 전에 하나의 평가 record를 정합니다.
type RerankTrace = {
queryId: string;
query: string;
retrieverVersion: string;
corpusVersion: string;
candidateDepth: number;
goldInCandidates: boolean | null;
candidates: Array<{
documentId: string;
retrievalRank: number;
retrievalScore: number | null;
retrievalChannels: string[];
rerankRank: number;
rerankScore: number | null;
tokenCount: number;
truncated: boolean;
}>;
rerankerVersion: string;
latencyMs: number;
};
다음 네 run만 있어도 출발할 수 있습니다.
A. 현재 first-stage top-k
B. first-stage top-20 → reranker → top-k
C. first-stage top-50 → reranker → top-k
D. first-stage top-100 → reranker → top-k
같은 candidate list를 저장해 여러 reranker에 replay해야 model 차이와 retrieval 변동을 분리할 수 있습니다.
10. 14편 학습 지도
| 편 | 질문 | 결과물 |
|---|---|---|
| 1 | Reranker는 pipeline에서 무엇인가? | 공통 용어와 단계 contract |
| 2 | Pointwise·pairwise·listwise는 무엇이 다른가? | Learning to Rank 수학 |
| 3 | Cross-Encoder는 왜 정확하고 비싼가? | local baseline |
| 4 | monoT5·duoT5·RankT5·ListT5는 어떻게 다른가? | 생성형 ranking 지도 |
| 5 | ColBERT late interaction은 어느 지점인가? | multi-vector 설계 판단 |
| 6 | LLM은 어떻게 point·pair·set·listwise로 순위를 매기는가? | prompt ranker 실험 |
| 7 | 어떤 positive·negative를 모아야 하는가? | dataset contract |
| 8 | 어떤 loss·distillation·calibration을 쓸 것인가? | training recipe |
| 9 | 개선을 어떻게 증명하는가? | offline·online 평가표 |
| 10 | 한국어·도메인·API·open model을 어떻게 고르는가? | model bake-off |
| 11 | p95 latency와 비용을 어떻게 줄이는가? | serving·cascade 설계 |
| 12 | RAG에는 relevance보다 무엇이 더 필요한가? | utility·보안·멀티홉 선택 |
| 13 | 2024~2026 연구는 어디로 가는가? | 연구 동향과 읽을 논문 |
| 14 | 처음부터 production 실험을 어떻게 만드는가? | end-to-end implementation |
순서대로 읽어도 되고, 이미 기본 pipeline이 있다면 3 → 9 → 11 → 14편을 먼저 읽어도 됩니다.
11. 도입 전 체크리스트
- 현재
Recall@N,nDCG@k, answer quality, p95가 기록돼 있다. - Gold miss와 ordering failure를 구분할 수 있다.
- Candidate list를 고정해 model끼리 replay할 수 있다.
- Relevance label에 freshness·authority·answer support가 필요한지 정의했다.
- ACL·tenant filter가 reranker와 독립적으로 강제된다.
- Long document truncation 정책을 기록한다.
- 품질 gain이 없을 때 reranker를 우회할 fallback이 있다.
- 외부 API라면 문서 전송·보존 정책을 확인했다.
스스로 확인하기
Recall@100 = 0인 질문을 reranker가 고칠 수 없는 이유는 무엇인가?- RRF와 Cross-Encoder reranking은 입력 signal이 어떻게 다른가?
- Pointwise·listwise와 Cross-Encoder·LLM은 왜 같은 분류축이 아닌가?
- ColBERT가 어떤 pipeline에서는 retriever이고 다른 pipeline에서는 reranker일 수 있는 이유는 무엇인가?
- RAG의 최종 목표가 answer correctness라면 topical relevance만으로 부족한 경우는 언제인가?
다음 글에서는 neural reranker 이전부터 이어진 Learning to Rank를 pointwise·pairwise·listwise loss와 nDCG 관점으로 정리합니다.