Field Log · Entry

Reranker 모델 선택: 한국어·도메인·Open Model·API 비교법 (10/14)

한국어와 영어가 섞인 query, 긴 정책 문서, 로컬 GPU와 외부 API 조건을 품질·지연·license 축으로 비교하는 reranker 선택표

이번 글의 결론

  • Public leaderboard는 shortlist 도구입니다. 최종 선택은 내 retriever가 만든 동일한 한국어·도메인 candidate를 replay한 결과로 결정합니다.
  • “Multilingual”은 한국어 monolingual, 한국어 query→영어 document, code-switch, 숫자·제품 ID에서 같은 품질을 보장하지 않습니다. Slice를 분리합니다.
  • Model 크기뿐 아니라 pointwise/listwise protocol, input instruction, max length, license, custom code, serving engine compatibility가 운영 비용을 결정합니다.
  • API는 빠른 통합과 managed scaling이 장점이고, local model은 data control·version pinning·한계 비용 통제가 장점입니다. Traffic과 규정에 따라 답이 달라집니다.
  • Score threshold는 model 사이에 이식하지 않습니다. Model·template·candidate distribution이 바뀌면 calibration을 다시 합니다.

앞 글에서 공정한 평가 protocol을 만들었습니다. 이제 어떤 model을 그 protocol에 넣을지 정합니다.

이 글의 model 목록은 2026년 7월 20일 기준 snapshot입니다. 모델·API 이름과 license·지원 방식은 바뀔 수 있으므로 실제 도입 시 연결된 공식 model card와 문서를 다시 확인해야 합니다.

shortlist
  → model card / license / protocol audit
  → tiny smoke test
  → frozen in-domain bake-off
  → load test
  → shadow traffic
  → guarded release

1. “가장 좋은 Reranker”가 없는 이유

Ranking quality는 model만의 함수가 아닙니다.

quality = f(
  query language and intent,
  candidate retriever,
  document serialization,
  candidate depth,
  max input length,
  instruction,
  corpus domain,
  relevance rubric,
)

Latency도 마찬가지입니다.

latency = f(
  architecture,
  parameter size,
  token lengths,
  batch policy,
  hardware,
  precision,
  serving engine,
  concurrency,
  network,
)

따라서 model name 하나를 “best”로 추천하는 대신 configuration의 Pareto frontier를 찾습니다.

2. 먼저 요구사항을 여섯 축으로 쓴다

Language

ko → ko
ko → en
en → ko
ko + English product IDs
code / SQL / log mixed with Korean

Modality

  • plain text
  • semi-structured JSON·email·table serialization
  • source code
  • scanned PDF page image
  • chart·figure·layout가 중요한 visual document

Relevance Instruction

단순 topical relevance인지, 현재 승인 문서, primary source, 답을 직접 지지 같은 custom criterion이 필요한지 정합니다.

Length

  • query p50/p95 token
  • candidate p50/p95/p99 token
  • title·metadata 포함 여부
  • long document windowing 허용 여부

Deployment

  • CPU / single GPU / multi-GPU
  • on-premise requirement
  • managed API 가능 여부
  • expected concurrency와 SLO

Governance

  • model license
  • commercial use
  • document 외부 전송 허용
  • data retention·training use
  • region·encryption·audit log

3. 2026년 7월 Model Family Snapshot

아래 표는 품질 순위가 아니라 서로 다른 선택지의 성격입니다.

계열protocol·구조적합한 첫 검토주의
cross-encoder/ms-marco-MiniLM-L6-v2작은 encoder-only pointwise Cross-Encoder영어·저비용 smoke baselineMS MARCO 영어 중심, 한국어 기준점으로는 부족
BAAI/bge-reranker-v2-m3multilingual pointwise Cross-Encoder비교적 가벼운 local multilingual baseline실제 한국어·domain 성능과 max length 확인
Qwen/Qwen3-Reranker-{0.6B,4B,8B}decoder-only pair relevance scoring, instruction-awaremodel size별 local quality–cost curve공식 template·yes/no token scoring을 정확히 사용
jinaai/jina-reranker-v30.6B multilingual list-aware “last but not late interaction”여러 후보를 함께 보는 long-list 실험custom code·serving 호환성, CC BY-NC 4.0 license 확인
Cohere rerank-v4.0-pro/fastmanaged multilingual text·semi-structured rerank API빠른 API integration과 pro/fast 비교data policy·network·quota·model version 정책
Voyage rerank-2.5/-litemanaged multilingual·instruction-following rerank API긴 pair와 quality/latency variant 비교token limit·truncation·비용·외부 전송

Open model도 package와 weights license가 다를 수 있습니다. trust_remote_code=True가 필요한 model은 실행할 repository code를 revision pin하고 security review합니다.

4. BGE Reranker 계열을 볼 때

bge-reranker-v2-m3 model card는 embedding model과 달리 query-document pair를 입력해 relevance score를 직접 내는 multilingual reranker로 설명합니다.

혼동하기 쉬운 이름:

BAAI/bge-m3
  → embedding / sparse / multi-vector capability를 가진 retrieval model

BAAI/bge-reranker-v2-m3
  → query-document pair를 score하는 reranker

Embedding model을 Cross-Encoder처럼 호출하거나 반대로 reranker output을 corpus vector로 저장하지 않습니다.

검증할 것:

  • Korean query-document direction
  • raw logit와 sigmoid option
  • tokenizer max length와 actual truncation
  • Sentence Transformers·Transformers·TEI output parity
  • commercial license와 pinned revision

5. Qwen3-Reranker 계열을 볼 때

Qwen3-Embedding technical report와 공식 blog는 0.6B·4B·8B 크기의 embedding과 reranking model family를 공개했습니다. Reranker는 Qwen3 foundation model의 multilingual·instruction understanding을 ranking에 활용합니다.

공식 model card의 inference template를 그대로 사용해야 합니다. 일반 chat prompt나 Cross-Encoder classification head로 임의 변환하면 같은 model을 평가하는 것이 아닙니다.

instruction + query + document
→ causal LM
→ yes/no label token logits
→ relevance score

선택 실험:

0.6B: latency·memory baseline
4B:   middle Pareto point
8B:   quality ceiling candidate

같은 family여도 quantization·serving engine이 다르면 output parity를 확인합니다. Official weights는 model card 기준 Apache 2.0이지만 release별 card를 다시 확인합니다.

6. Jina Reranker v3를 볼 때

Jina Reranker v3 technical report는 0.6B Qwen3 backbone에서 last but not late interaction이라는 list-aware 구조를 제안합니다. Query와 후보 전체를 한 context에서 처리하되 마지막 layer의 query-document attention으로 candidate score를 구성하는 방향입니다.

이는 독립 pair Cross-Encoder와 다른 실험 변수를 만듭니다.

  • Candidate order
  • List composition
  • Combined context length
  • 한 번에 넣는 document 수
  • Auto-truncation policy

공식 문서는 multilingual과 긴 combined context를 강조하지만, long context가 한국어 long-document ranking을 자동 보장하지 않습니다.

Model card는 weights를 CC BY-NC 4.0으로 표시하고 commercial use에는 별도 문의를 안내합니다. 실험 가능성과 production 사용 권한을 구분합니다.

7. Managed API를 볼 때

Cohere Rerank

2026년 7월 공식 문서는 rerank-v4.0-prorerank-v4.0-fast를 최신 multilingual text·semi-structured rerank option으로 안내합니다.

pro  → complex use case와 quality 지향
fast → lower latency·higher throughput 지향

실제 차이는 내 candidate에서 측정합니다. JSON을 지원한다는 설명이 있어도 field serialization과 business rule을 명시해야 합니다.

Voyage Rerank

공식 문서는 rerank-2.5rerank-2.5-lite를 multilingual·instruction-following option으로 안내하며, query와 개별 document 합산 context limit, 요청 전체 token limit, truncation 동작을 명시합니다.

truncation=true default는 통합을 쉽게 하지만 조용히 answer span을 버릴 수 있습니다. 평가 중에는 overflow를 error로 만들어 length distribution을 먼저 파악하는 방식도 좋습니다.

API 공통 질문

  • 입력 document가 저장되는가?
  • Provider model training에 사용되는가?
  • Region과 encryption은 무엇인가?
  • Model version을 pin할 수 있는가?
  • Rate limit과 burst policy는 무엇인가?
  • Timeout 때 partial result가 있는가?
  • Score scale이 release 사이에 유지되는가?
  • 비용 단위가 request, search unit, token 중 무엇인가?

Marketing benchmark보다 계약과 data flow diagram이 먼저입니다.

8. Local vs API Decision Matrix

조건Local model 쪽 이점Managed API 쪽 이점
민감 문서외부 전송 없음provider가 요구 인증·region을 충족할 때 가능
Traffic 초기GPU 없이 시작 가능하나 운영 필요작은 traffic에서 빠른 시작
Traffic 큼·안정적높은 utilization이면 단가 통제autoscaling·capacity 관리 위임
Version 재현weights·runtime pin 가능provider version pin 지원 여부에 의존
Custom fine-tuning직접 가능지원 범위에 의존
긴 tail latency직접 batch·queue 제어network·quota 영향
운영 인력serving stack 필요integration이 단순한 편

API와 local을 둘 다 adapter 뒤에 두면 shadow comparison과 fallback이 쉬워집니다.

9. 공통 Adapter Contract

from dataclasses import dataclass
from typing import Protocol


@dataclass(frozen=True)
class Document:
    document_id: str
    text: str


@dataclass(frozen=True)
class Score:
    document_id: str
    value: float
    original_index: int


class Reranker(Protocol):
    model_version: str

    def score(self, query: str, documents: list[Document]) -> list[Score]:
        """Return exactly one score for every input document."""
        ...


def validate_scores(documents: list[Document], scores: list[Score]) -> None:
    expected = {document.document_id for document in documents}
    actual = {score.document_id for score in scores}

    if len(scores) != len(documents):
        raise ValueError("reranker returned the wrong number of scores")
    if actual != expected:
        raise ValueError("reranker changed document identity")

Listwise permutation API도 내부에서 per-document Score 또는 stable rank로 normalize할 수 있습니다. Score가 없는 경우 value=-rank처럼 임시 변환하되 probability처럼 쓰지 않습니다.

10. Document Serialization을 먼저 고정한다

Model마다 special prompt는 달라도 source field의 의미와 순서는 가능한 한 공통으로 둡니다.

title: Orion S2 Safety Manual
status: approved
effective_date: 2026-04-01
source_type: primary_manual
body: ...

비교해야 할 serializer:

  1. Body only
  2. Title + body
  3. Title + status + date + body
  4. Query instruction + structured fields

모든 model에 가장 유리한 전용 template를 쓸 수 있지만, 그때 비교 대상은 model weight가 아니라 best validated configuration입니다. 둘 다 유효한 비교이며 report에서 구분합니다.

11. 한국어 Bake-off Dataset

Public multilingual 평균보다 작은 in-domain set이 더 중요합니다. 초기에는 300~1,000 query도 충분히 model 차이를 찾을 수 있습니다. Critical system이면 더 큰 set과 human adjudication이 필요합니다.

Language Slice

language:
  ko_to_ko: 0.55
  ko_to_en: 0.15
  en_to_ko: 0.05
  ko_en_code_switch: 0.20
  code_log_mixed: 0.05

한국어 특유의 Failure Probe

  • 조사 변화: 환불이, 환불은, 환불로
  • 띄어쓰기 변화: 재 인증, 재인증
  • 한글·영문 제품명: 오리온 S2, Orion S2
  • 약어·영문 error code: E104 인증 만료
  • 숫자·단위: 3개월, 90일, 0.25년
  • 존댓말·구어체 query
  • 생략된 주어와 대화 coreference
  • 번역투 manual과 자연스러운 한국어 query

Intent Slice

  • exact lookup
  • troubleshooting
  • current policy
  • comparison
  • exception·negation
  • multi-hop
  • no-answer

Model 평균뿐 아니라 slice별 rank regression을 봅니다.

12. Long Document Bake-off

Model context length 숫자만 비교하면 부족합니다.

long context available
≠ answer span used
≠ latency acceptable
≠ listwise position robust

세 configuration을 비교합니다.

A. head truncation
B. query-aware windows + max aggregation
C. long-context full document

기록:

  • answer span retention
  • nDCG by answer offset quartile
  • token p95/p99
  • p95 latency
  • cost
  • middle-position degradation

API auto-chunking은 aggregation 방식과 chunk overlap을 provider가 어떻게 처리하는지 확인합니다.

13. Instruction-following 평가

Instruction-aware reranker에는 task instruction을 바꾼 contrast set을 만듭니다.

Instruction A:
주제 관련성을 기준으로 순위를 매겨라.

Instruction B:
현재 유효한 primary source이면서 질문에 직접 답하는 문서를 우선하라.

Expected rank가 바뀌는 candidate를 준비합니다.

blog commentary: topic relevant, current, secondary
old manual:      direct answer, expired, primary
new manual:      direct answer, current, primary

Instruction을 붙였는데 모든 순위가 동일하면 model이 instruction을 사용하지 않을 수 있습니다. 반대로 작은 wording 변화에 순위가 크게 흔들리면 robustness 문제가 있습니다.

14. Model Card Audit

Checklist:

model_audit:
  model_id: exact
  revision: commit_sha
  license: exact SPDX or custom text
  commercial_use_reviewed: true
  base_model: known
  architecture: pointwise_or_listwise
  input_template: pinned
  languages_claimed: recorded
  korean_evaluated_in_house: true
  max_length: recorded
  truncation_policy: recorded
  custom_code: reviewed
  serving_engines_tested: [transformers, target_engine]
  output_parity_tolerance: defined

latest branch를 production에서 직접 당겨 쓰지 않습니다.

15. Score와 Threshold Migration

Model A의 threshold 0.35를 model B에 복사하지 않습니다.

model A: sigmoid over classifier logit
model B: yes/no token probability
model C: listwise contextual score
API D: provider relevance score

Candidate composition까지 score에 영향을 줄 수 있습니다. 새 model마다 calibration·abstention curve를 다시 만듭니다.

threshold sweep
→ precision / recall of direct evidence
→ no-answer false accept rate
→ escalation rate
→ downstream answer support

16. Shortlist를 줄이는 순서

Step 1 · Hard Filter

  • License 불가
  • Data egress 불가
  • GPU memory 불가
  • Modality 불일치
  • SLO 물리적으로 불가

Step 2 · Smoke Test

20개 hand-crafted contrast set으로 template·score direction·Korean tokenization·truncation을 확인합니다.

Step 3 · Offline Bake-off

Frozen top-50·top-100에서 nDCG·MRR·slice·paired CI를 계산합니다.

Step 4 · Load Test

실제 token distribution과 concurrency에서 p95/p99·throughput·cost를 측정합니다.

Step 5 · RAG Evaluation

Fixed generator와 context budget에서 answer support가 오르는지 봅니다.

Step 6 · Shadow·Canary

실제 traffic을 복제하되 사용자 결과에 반영하지 않고 diff를 수집한 뒤 작은 canary로 갑니다.

17. 의사결정 표

요구첫 shortlist 방향
작은 local multilingual baselineBGE v2 M3 같은 encoder Cross-Encoder
instruction + size curveQwen3-Reranker 0.6B→4B→8B
후보 전체 context 실험Jina Reranker v3 같은 list-aware model
빠른 managed text·JSON 통합Cohere pro/fast 비교
managed long-pair·instructionVoyage quality/lite 비교
visual PDF pagetext reranker가 아닌 multimodal reranker, 13편 참조
매우 낮은 latencysmall Cross-Encoder + candidate depth 축소·cascade
복합 reasoning query만 어려움small default + reasoning reranker escalation

이 표는 후보 생성용이고 결론은 in-domain evaluation이 냅니다.

18. 선택 체크리스트

  • Language direction과 modality를 먼저 hard filter했다.
  • Official input template와 score extraction을 사용한다.
  • Model revision·license·custom code를 audit했다.
  • 한국어·code-switch·exact ID·숫자 slice가 있다.
  • 같은 frozen candidate와 qrel로 비교한다.
  • Model별 best serializer 비교인지 weights-only 비교인지 명시했다.
  • Long document의 answer offset별 성능과 truncation을 측정했다.
  • 실제 concurrency에서 p95/p99와 비용을 측정했다.
  • API document data flow와 retention을 승인받았다.
  • 새 model score를 재calibration했다.

스스로 확인하기

  1. Multilingual benchmark 평균이 한국어 RAG 품질을 보장하지 않는 이유는 무엇인가?
  2. BGE-M3 embedding model과 BGE reranker를 구분해야 하는 이유는 무엇인가?
  3. List-aware model 평가에서 candidate order와 composition을 추가로 봐야 하는 이유는 무엇인가?
  4. API와 local model의 latency를 비교할 때 어느 구간을 포함해야 공정한가?
  5. Model을 교체할 때 기존 relevance threshold를 그대로 쓸 수 없는 이유는 무엇인가?

다음 글에서는 선택한 model을 dynamic batching·length bucket·quantization·adaptive depth·small→large cascade로 SLO 안에 serving합니다.

참고자료