C.W.K.
Stream
Lesson 03 of 05 · published

Cross-Encoder Reranking

~22 min · hybrid, reranking

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

2-stage retrieval

벡터 검색과 BM25 는 bi-encoder — query 와 각 document 를 독립적으로 인코딩 후 결과 비교. 빠른데 모델이 query 와 document 같이 본 적 없어.

Cross-encoder 는 query 와 candidate document 받고 transformer 로 같이 통과. pairwise context 반영하는 single relevance score 생성. 훨씬 정확, 훨씬 느림 (precompute 불가) — 그래서 표준 아키텍처:

  1. Stage 1 — 빠른 retriever (vector + BM25) 가 top-50 candidate 반환.
  2. Stage 2 — cross-encoder 가 그 50 을 re-rank 해서 진짜 top-5 찾음.

알아둘 만한 오픈소스 cross-encoder

  • BGE-reranker-v2-m3 — 다국어, 2026 초 오픈소스 패키지의 best
  • cross-encoder/ms-marco-MiniLM-L-6-v2 — 작은 영어, CPU 에서 작동
  • jina-reranker-v2-base-multilingual — 빠르고 다국어, 매우 작음

Code

sentence-transformers CrossEncoder 로 top-50 re-rank·python
from sentence_transformers import CrossEncoder

reranker = CrossEncoder('BAAI/bge-reranker-v2-m3', max_length=512)

def rerank(query: str, candidates: list[dict], top_k: int = 5) -> list[dict]:
    pairs = [(query, c['text']) for c in candidates]
    scores = reranker.predict(pairs, batch_size=16)
    for c, s in zip(candidates, scores):
        c['rerank_score'] = float(s)
    candidates.sort(key=lambda c: -c['rerank_score'])
    return candidates[:top_k]

stage1 = vector_then_bm25(query, k=50)
final  = rerank(query, stage1, top_k=5)
호스티드 reranker (Cohere)·python
import cohere
co = cohere.Client()

resp = co.rerank(
    model='rerank-english-v3.0',
    query=query,
    documents=[c['text'] for c in stage1],
    top_n=5,
)
for r in resp.results:
    print(r.relevance_score, stage1[r.index]['text'][:80])

External links

Exercise

수동 라벨링된 top-3 ground truth 있는 query 30개. nDCG@5 비교: vector only, vector + BM25 RRF fused, RRF + cross-encoder rerank. 보통 reranker 추가에서 가장 큰 점프 — 얼마나 큰지 측정.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.