Field Log · Entry

Reranker·Generator 학습: RankT5·RA-DIT (8/10)

Dense retriever 후보를 RankT5 reranker가 정렬하고 source가 연결된 context로 generator를 학습하며 LM feedback으로 retriever까지 조정하는 dual tuning 흐름

오늘의 결론

  • Reranker는 corpus 전체가 아니라 실제 first-stage retriever가 만든 어려운 후보 집합에서 학습해야 합니다.
  • Pointwise는 각 문서를, pairwise는 문서 쌍의 순서를, listwise는 후보 목록 전체의 확률 분포를 학습합니다.
  • Generator는 gold context만 보면 production의 noisy retrieval, contradiction, no-answer 상황을 배우지 못합니다.
  • RA-DIT는 language model이 retrieval을 더 잘 사용하게 하는 단계와, LM의 선호를 이용해 retriever를 조정하는 단계를 분리해 생각하게 해 줍니다.
  • 학습 목표는 “정답 문장” 하나가 아니라 answer·citation·support·abstention을 함께 만족하는 contract입니다.

앞 글에서는 bi-encoder가 gold passage를 candidate pool 안으로 가져오도록 학습했습니다. 하지만 top-50 안에 정답이 있어도 generator 앞의 top-5가 틀릴 수 있습니다.

Query: "Orion S2의 emergency shutdown 온도는?"

Retriever candidates:
1. Orion S1 shutdown: 82°C
2. Orion S2 normal operating range: 45–70°C
3. Orion S2 shutdown pressure: 2.4 bar
4. Orion S2 emergency shutdown: 88°C       ← gold
5. Orion S2 draft proposal: 92°C

Dense similarity는 제품명과 shutdown 표현을 잘 찾았지만 version·attribute·status를 충분히 구분하지 못했습니다. Reranker는 query와 각 candidate를 함께 읽어 이 미세한 순서를 다시 만듭니다.

Retriever candidate에서 reranker를 학습하고 grounded generator와 retriever를 dual tune하는 RAG training pipeline

그림 1. Candidate distribution, context distribution, serving distribution을 맞춘다. Reranker와 generator의 학습 artifact는 각각 독립 평가한 뒤 같은 RAG release로 묶는다.


RAG Stack에서 세 Model의 역할

Retriever   corpus millions → candidates 100
Reranker    candidates 100  → ordered evidence 5
Generator   evidence 5      → answer + citation / abstain

세 model은 최적화 목표가 다릅니다.

Component질문대표 실패
Retriever관련 passage를 후보에 넣었는가?gold miss
Reranker후보 중 더 유용한 evidence를 위에 뒀는가?near-topic confusion
Generatorevidence로만 답하고 근거를 연결했는가?unsupported claim

한 model을 키워 모든 문제를 해결하려 하지 말고 first failure를 찾습니다.

Reranker Training Data

최소 example은 query와 후보 목록, relevance label입니다.

type RankingExample = {
  queryId: string;
  query: string;
  candidates: Array<{
    passageId: string;
    text: string;
    retrievalRank: number;
    retrievalScore: number;
    retrievalChannel: string;
    relevanceGrade: 0 | 1 | 2 | 3;
    labelSource: "human" | "teacher" | "behavior";
  }>;
  retrieverVersion: string;
  corpusVersion: string;
  split: "train" | "validation" | "test";
};

Binary Label보다 Graded Relevance

3 = answer를 직접 지지하는 primary evidence
2 = answer에 필요한 일부 evidence 또는 정확한 supporting context
1 = topic은 관련 있지만 answer에는 불충분
0 = irrelevant, outdated, contradicted, wrong entity

Reranker는 3 > 2 > 1 > 0 순서를 배울 수 있습니다. 최신 정책이 필요한 query에서는 과거 version을 0으로 둘 수 있지만, 역사 비교 query에서는 relevant할 수 있습니다. Label은 passage 자체가 아니라 query 조건과 passage의 관계입니다.

실제 Retriever 후보로 학습하라

Random negative만 넣으면 reranker가 쉬운 topic classification을 배웁니다.

Too easy:
query: shutdown temperature
negative: cafeteria menu

Useful hard candidates:
- same product, wrong attribute
- same attribute, wrong product
- old version
- draft vs approved
- answer keyword present but negated
- partial evidence

Production retriever를 train query에 실행해 후보를 만듭니다.

def build_reranker_example(query, retriever, judgments):
    hits = retriever.search(query.text, k=100)
    candidates = []

    for hit in hits:
        grade = judgments.get((query.id, hit.passage_id))
        if grade is not None:
            candidates.append((hit, grade))

    return ensure_positive_and_hard_negatives(candidates)

Gold가 top-100에 없으면 list에 강제로 추가할 수 있지만, 이 sample은 gold_injected=true로 표시합니다. 그렇지 않으면 training candidate distribution과 serving distribution의 차이를 숨깁니다.

Retriever가 바뀌면 Data도 바뀐다

새 retriever는 다른 hard negative를 만듭니다.

retriever v1 candidate → reranker training set v1
retriever v2 candidate → replay → new confusion clusters

Reranker를 매번 처음부터 학습할 필요는 없지만, 새 후보에서 regression을 평가하고 필요하면 mining을 갱신합니다.

Pointwise Ranking

각 query-passage pair의 relevance를 독립적으로 예측합니다.

input:  (q, d)
target: relevance y
loss:   BCE, regression, classification CE
score = model(query, passage)
loss = binary_cross_entropy_with_logits(score, relevant)

장점:

  • 구현과 batching이 단순합니다.
  • Binary relevance dataset을 바로 쓸 수 있습니다.
  • Score threshold로 filtering하기 쉽습니다.

한계:

  • 같은 query의 후보 간 상대 순서를 직접 학습하지 않습니다.
  • Query마다 score scale이 다를 수 있습니다.
  • Candidate list의 top-heavy metric을 직접 반영하지 않습니다.

monoT5: Ranking을 Text Generation으로 표현하기

monoT5는 T5 sequence-to-sequence model에 query와 document를 넣고 relevance token을 생성하도록 ranking을 구성한 대표적 연구입니다.

Input:
Query: Orion S2 emergency shutdown temperature
Document: The approved S2 safety manual states ... 88°C ...
Relevant:

Target:
true

Inference에서는 truefalse token의 logit 또는 probability로 candidate를 정렬합니다.

score(d) = P("true" | query, document)

Model이 자연어 token prediction으로 ranking을 배우지만, output string을 자유 생성할 필요는 없습니다. 정해진 label token의 score를 읽습니다.

monoT5 사용 시 주의

  • Label token의 tokenizer ID를 정확히 확인합니다.
  • true/false prior가 score calibration에 영향을 줄 수 있습니다.
  • Document truncation이 answer span을 자르지 않게 합니다.
  • Query-document template을 train과 serve에서 동일하게 유지합니다.
  • Candidate를 독립 scoring하므로 batch inference와 cache를 최적화합니다.

Pairwise Ranking

같은 query에서 positive가 negative보다 높은 score를 갖게 합니다.

s⁺ = score(q, d⁺)
s⁻ = score(q, d⁻)

L_pair = -log sigmoid(s⁺ - s⁻)

또는 margin loss를 사용할 수 있습니다.

L_margin = max(0, margin - s⁺ + s⁻)

Pairwise는 “얼마나 relevant한가”보다 “둘 중 누가 위인가”를 직접 학습합니다.

Pair Sampling

Candidate가 100개면 모든 pair는 너무 많습니다. 의미 있는 pair를 고릅니다.

pairs:
  - grade3_vs_grade0
  - grade3_vs_grade2
  - latest_vs_old_version
  - primary_vs_commentary
  - complete_vs_partial_evidence
  - supported_vs_keyword_only

가까운 grade pair가 더 어렵지만 label disagreement도 높을 수 있습니다.

Listwise Ranking

후보 목록 전체를 한 query 단위로 학습합니다. 간단한 ListNet-style 직관은 label과 score를 list distribution으로 바꾸는 것입니다.

P_label(i) = softmax(relevance_i / τ_label)
P_model(i) = softmax(score_i / τ_model)

L_list = -Σᵢ P_label(i) log P_model(i)

장점:

  • 같은 query의 전체 order를 봅니다.
  • Graded relevance를 자연스럽게 반영합니다.
  • Top-k probability mass를 관련 문서에 모을 수 있습니다.

한계:

  • 후보 list batching이 복잡합니다.
  • List length와 sampling policy가 결과에 영향을 줍니다.
  • Cross-encoder가 모든 candidate를 함께 attention하는지, 개별 score 후 list loss만 쓰는지 구분해야 합니다.

RankT5가 던지는 질문

RankT5 연구는 T5를 text ranking에 fine-tune할 때 pointwise뿐 아니라 pairwise·listwise ranking loss를 적용하는 방향을 분석합니다. 중요한 교훈은 “T5니까 label token을 생성해야 한다”가 아니라 ranking task에 맞는 loss와 score head를 선택할 수 있다는 것입니다.

Architecture choice ≠ Objective choice

T5 backbone
├─ token probability pointwise
├─ scalar score + pairwise loss
└─ scalar score + listwise loss

우리 dataset의 relevance grade, candidate list, metric에 맞춰 실험합니다.

Reranker Distillation

큰 cross-encoder teacher는 좋지만 latency가 높을 수 있습니다. 작은 student에 score 또는 order를 증류합니다.

Score Distillation

L = KL(softmax(teacher_scores / T),
       softmax(student_scores / T))

Pairwise Preference Distillation

Teacher가 dA > dB라고 한 pair를 student가 따르게 합니다.

Hybrid Loss

L_total = λ_hard · L_human_label
        + λ_teacher · L_distill
        + λ_pair · L_pairwise

Teacher error를 그대로 복제하지 않도록 human label에 더 높은 신뢰 weight를 줄 수 있습니다.

Reranker Evaluation

Ranking Metric

  • nDCG@k: graded relevance와 상위 순위를 반영합니다.
  • MRR: 첫 relevant passage 위치를 봅니다.
  • Recall@k: 필요한 evidence set이 top-k에 남았는지 봅니다.
  • MAP: 여러 relevant passage의 precision-recall을 봅니다.

Set-Level Metric

Multi-hop 질문은 한 passage만 위에 올리면 부족합니다.

Evidence completeness@k
= all required evidence groups covered in top-k?

Operational Metric

  • candidate당 latency
  • batch throughput
  • p95 rerank latency
  • max document token과 truncation rate
  • GPU memory
  • score calibration

Reranker Oracle Ablation

A. retriever order
B. trained reranker order
C. oracle relevance order
D. gold evidence only

B < C는 ranking ceiling, C < D는 context packing이나 duplicate 문제를 보여 줄 수 있습니다.

이제 Generator를 학습한다

RAG generator training example은 question-answer pair만으로 부족합니다.

type GroundedGenerationExample = {
  question: string;
  contexts: Array<{
    sourceId: string;
    text: string;
    relevance: number;
    supportsClaims: string[];
    status: "active" | "old" | "draft";
  }>;
  answer: string | null;
  claims: Array<{
    claimId: string;
    text: string;
    supportingSourceIds: string[];
  }>;
  shouldAbstain: boolean;
  failureMode: string;
};

Model은 answer text뿐 아니라 어느 source가 어느 claim을 지지하는지 배워야 합니다.

Gold Context만 쓰면 생기는 Distribution Shift

Training:

[perfect gold passage] → clean answer

Production:

[gold + near-topic + old version + duplicated chunk + untrusted instruction]
→ answer + citation / abstain

Training context가 지나치게 깨끗하면 model은 retrieval noise를 구분하지 못합니다.

Context Curriculum

1. Gold Only

정답 형식과 evidence use를 먼저 가르칩니다.

2. Gold + Random Distractor

무관한 context를 무시합니다.

3. Gold + Hard Distractor

같은 entity·wrong attribute·old version을 구분합니다.

4. Multiple Supporting Sources

여러 문서의 evidence를 조합합니다.

5. Contradiction

Active policy와 old draft, source authority와 timestamp를 비교합니다.

6. No Answer

Relevant topic 문서는 있지만 질문의 답은 없습니다.

7. Partial Evidence

일부 claim만 답하고 나머지는 부족하다고 표시합니다.

context_mix:
  gold_only: 0.15
  gold_plus_random: 0.15
  gold_plus_hard: 0.25
  multi_source: 0.15
  contradiction: 0.10
  no_answer: 0.15
  partial: 0.05

비율은 예시입니다. Production trace distribution과 risk를 반영합니다.

No-Answer Example이 어려운 이유

다음은 easy no-answer입니다.

Question: shutdown 온도?
Context: cafeteria menu

다음은 useful no-answer입니다.

Question: Orion S2 emergency shutdown 온도?
Context:
- Orion S2 operating temperature range
- Orion S2 emergency pressure
- Orion S1 emergency shutdown temperature

Topic과 entity가 겹치지만 answer attribute가 없습니다. Model이 plausible number를 복사하지 않고 insufficient evidence라고 말해야 합니다.

Contradiction Example

Source A · draft · 2026-01: shutdown at 92°C
Source B · approved · 2026-03: shutdown at 88°C
Question: current approved shutdown temperature?

Target은 무조건 두 값을 평균내는 것이 아닙니다.

{
  "answer": "88°C",
  "citations": ["source-B"],
  "conflict": {
    "ignored_source": "source-A",
    "reason": "draft superseded by approved version"
  }
}

Source authority와 validity time이 context에 명시돼 있어야 model이 배울 수 있습니다.

Grounded Output Contract

{
  "answer": "현재 승인된 기준은 88°C입니다.",
  "claims": [
    {
      "claim": "승인된 S2 emergency shutdown 기준은 88°C다.",
      "source_ids": ["manual-s2@v7#sec-4.2"]
    }
  ],
  "insufficient": false,
  "conflicts": []
}

학습 전에 serving parser가 이 schema를 강제할 수 있는지 확인합니다. Citation token이 생성됐다고 source가 실제 support하는 것은 아니므로 post-hoc verifier가 필요합니다.

Generator Loss 설계

기본 next-token loss만으로 answer와 citation 형식을 학습할 수 있습니다.

L_answer = CE(target_answer_tokens)

추가 supervision이 있다면 다음을 결합할 수 있습니다.

L_total = λ_answer · L_answer
        + λ_cite · L_citation
        + λ_support · L_support_classification
        + λ_abstain · L_abstention

Loss weight를 임의로 고정하지 않습니다. 한 objective가 좋아지며 다른 objective가 무너지는지 Pareto curve를 봅니다.

Citation 위치

문장 끝 source token만 학습할 수도 있고 claim별 structured field를 만들 수도 있습니다.

Weak:  전체 answer 끝에 [1][2]
Better: claim A [1], claim B [2]
Best for audit: claims[] with supportingSourceIds[]

Retrieved Context로 학습해야 한다

Gold context에 noise를 수동으로 섞는 것만으로 부족합니다. 실제 retriever + reranker stack을 train question에 실행합니다.

training question
  → production-like retrieval
  → production-like reranking
  → context packing
  → attach gold answer and support labels

Gold가 빠진 example도 중요합니다. 이때 target은 hallucinated answer가 아니라 retrieval failure 또는 abstention이어야 합니다.

retriever_version, reranker_version, packer_version을 example lineage에 남깁니다.

RA-DIT: Retrieval-Augmented Dual Instruction Tuning

RA-DIT는 retrieval-augmented language model을 두 측면에서 instruction tune하는 접근을 제시합니다.

LM Fine-Tuning

Language model이 retrieved context를 task instruction에 맞게 더 잘 사용하도록 학습합니다.

instruction + retrieved documents
  → useful evidence selection
  → grounded task output

즉 “문서를 넣어 주면 알아서 쓸 것”이라고 가정하지 않고 retrieval-conditioned generation을 학습합니다.

Retriever Fine-Tuning

Language model이 task output에 유용하다고 평가하는 document signal을 이용해 retriever를 조정합니다.

candidate documents
  → LM-based relevance / preference signal
  → retriever learns task-useful ranking

핵심은 lexical relevance가 아니라 LM이 정답을 생성하는 데 유용한 evidence를 retriever가 찾게 하는 것입니다.

왜 Dual인가

LM side:        retrieve된 정보를 더 잘 읽는다.
Retriever side: LM에게 더 유용한 정보를 가져온다.

두 부분을 분리하면 어느 tuning이 이득을 만들었는지 ablation하기 쉽습니다.

A. base retriever + base LM
B. base retriever + tuned LM
C. tuned retriever + base LM
D. tuned retriever + tuned LM

RA-DIT 논문의 결과를 모든 domain에 보장된 recipe로 해석하지 말고, 이 dual decomposition을 실험 설계로 가져옵니다.

Joint Training의 위험

Retriever와 generator를 동시에 계속 바꾸면 target distribution이 움직입니다.

retriever update
  → retrieved contexts change
  → generator loss distribution changes
  → LM preference changes
  → retriever target changes again

Non-Stationarity

어제의 hard negative가 오늘 retriever에서는 후보에 없을 수 있습니다. Reproducibility가 낮아집니다.

Index Refresh

Document encoder를 update하면 전체 corpus vector가 stale해집니다. 매 training step에 full reindex할 수 없습니다.

Reward Shortcut

LM feedback만 쓰면 retriever가 answer phrase가 그대로 들어 있는 document를 선호하고, 더 신뢰할 수 있는 근거를 놓칠 수 있습니다.

안전한 시작

Stage 1: freeze retriever → tune LM on fixed retrieved contexts
Stage 2: freeze LM     → tune retriever with fixed LM feedback
Stage 3: rebuild index → evaluate full stack
Stage 4: repeat only if measured gain remains

이 방식은 완전한 end-to-end gradient보다 느릴 수 있지만 audit와 rollback이 쉽습니다.

LM Feedback를 Label로 쓸 때

type LMDocumentUtility = {
  queryId: string;
  passageId: string;
  answerLogLikelihoodDelta: number;
  supportJudgment: number;
  sourceAuthority: number;
  contradictionRisk: number;
  lmVersion: string;
  promptHash: string;
};

단순히 answer likelihood가 오르는 document를 positive로 두면 잘못된 answer를 강화할 수 있습니다. Human relevance, source authority, support check를 함께 씁니다.

utility = answer_helpfulness
        + grounded_support
        + source_authority
        - contradiction_risk

Weight와 threshold는 validation에서 calibration합니다.

Training Data Leakage

Answer Leakage

Synthetic context나 query에 target answer가 비정상적으로 반복됩니다.

Test Corpus Leakage

Test document에서 train query를 생성합니다.

Teacher Leakage

Teacher가 benchmark answer를 memorization했을 수 있습니다.

Candidate Leakage

Gold passage를 항상 rank 1 위치에 넣어 model이 position을 label로 사용합니다.

Citation Leakage

gold-source 같은 ID 이름이 relevance를 알려 줍니다.

Split은 document·entity·time 단위로 고정하고, context 순서를 randomize하되 source semantics는 유지합니다.

Evaluation Matrix

Reranker

metrics:
  - nDCG@10
  - MRR@10
  - evidence_set_recall@5
  - current_version_precision@5
slices:
  - same_entity_wrong_attribute
  - old_vs_current
  - draft_vs_approved
  - negation
  - partial_evidence

Generator

metrics:
  - answer_correctness
  - claim_faithfulness
  - citation_precision
  - citation_recall
  - abstention_precision
  - abstention_recall
  - contradiction_resolution
slices:
  - gold_only
  - hard_distractor
  - no_answer
  - partial
  - multi_source
  - conflicting_versions

Full Stack

  • end-to-end accuracy
  • supported answer rate
  • unsupported claim rate
  • retrieval/rerank/generation latency
  • token·GPU·index 비용
  • human escalation rate

Prompt Baseline과 비교하라

Fine-tuning 전에 다음 baseline을 충분히 강하게 만듭니다.

1. Better context labels and delimiters
2. Source authority + timestamp metadata
3. Explicit no-answer instruction
4. Claim-level citation schema
5. Few-shot contradiction examples
6. Post-generation support verifier

Prompt와 context packing만으로 목표에 도달하면 학습 유지비를 피할 수 있습니다.

학습을 선택할 근거

  • 충분한 labeled failure가 있습니다.
  • Prompt 변경으로 해결되지 않는 반복 error가 있습니다.
  • Serving model을 고정해야 하거나 더 작은 model로 latency를 낮춰야 합니다.
  • Domain output contract가 안정적입니다.
  • Offline gain이 online supported-answer rate로 이어집니다.

Release Manifest

rag_model_release:
  release_id: rag-models-2026-07-16-03
  retriever:
    model: retriever-v4
    index: corpus-index-v181
  reranker:
    model: rankt5-v3
    candidate_contract: retriever-v4-top100
  generator:
    model: grounded-lm-v2
    context_contract: context-packer-v7
    output_schema: grounded-answer-v3
  datasets:
    ranking: ranking-ds-v12
    generation: grounded-ds-v9
  evaluation: eval-report-552

Reranker만 rollback할지 generator도 함께 rollback할지 호환성 matrix를 둡니다.

흔한 오해와 처방

1. Reranker Negative는 Corpus Random이면 된다

Production 후보의 미세한 confusion을 배우지 못합니다.

처방: 실제 retriever top-k에서 hard candidate를 만듭니다.

2. Pointwise Score가 높으면 List 순서도 최적이다

독립 relevance와 query 내 상대 order는 다른 objective입니다.

처방: pairwise·listwise loss와 nDCG를 비교합니다.

3. Gold Context로 Generator를 학습하면 Grounded해진다

Noise와 no-answer를 본 적 없으면 production에서 무리하게 답할 수 있습니다.

처방: 실제 retrieval context와 hard no-answer를 넣습니다.

4. Citation Token이 있으면 Faithful하다

Model이 아무 source ID나 생성할 수 있습니다.

처방: claim-source entailment를 별도 verifier로 검사합니다.

5. Retriever와 LM을 함께 계속 Update하면 더 좋다

Index staleness와 moving target으로 재현성이 무너질 수 있습니다.

처방: freeze-tune-reindex-evaluate stage를 분리합니다.

6. LM이 좋아하는 문서는 모두 Good Positive다

Memorized answer나 spurious phrase가 likelihood를 높일 수 있습니다.

처방: support·authority·human label과 결합합니다.

Production 체크리스트

  • reranker train 후보가 실제 first-stage retriever에서 왔다.
  • injected gold와 organically retrieved gold를 구분한다.
  • graded relevance와 query condition을 함께 label한다.
  • pointwise·pairwise·listwise를 같은 candidate set에서 비교한다.
  • actual serving truncation과 template을 training에 반영한다.
  • retriever version이 바뀔 때 hard candidate를 replay한다.
  • generator가 production-like retrieved context로 학습된다.
  • hard no-answer와 partial evidence example이 있다.
  • old·draft·approved contradiction을 평가한다.
  • claim-level citation과 support verifier가 있다.
  • LM tuning과 retriever tuning을 각각 ablation한다.
  • retriever update 후 full index refresh를 수행한다.
  • LM feedback에 source authority와 human signal을 결합한다.
  • prompt baseline 대비 학습 이득과 유지비를 비교한다.
  • model·index·candidate·context·output contract를 versioning한다.
  • component별 atomic rollback 경로가 있다.

스스로 확인하기

  1. Reranker를 random negative가 아니라 retriever top-k candidate로 학습해야 하는 이유는 무엇인가?
  2. Pointwise, pairwise, listwise loss가 각각 직접 최적화하는 대상은 무엇인가?
  3. Gold-only context로 학습한 generator가 no-answer 상황에서 실패하는 이유는 무엇인가?
  4. Citation을 생성했다는 사실과 claim이 source에 의해 지지된다는 사실은 왜 다른가?
  5. RA-DIT식 dual tuning에서 retriever와 LM 단계를 분리해 평가해야 하는 이유는 무엇인가?

다음 글에서는 model이 검색할지, 언제 검색할지, 어느 source로 갈지, 언제 멈출지를 배우는 Self-RAG·FLARE·Adaptive-RAG·RouteRAG식 retrieval policy를 다룹니다.

참고자료