# PICK-150M Handoff, Fine-Tuning & Calibration Recipe Guide > **Decision Transformer (PICK-150M)**: Architecture, 16-Benchmark Evolution (`62.70%` Base → `66.74%` V3 Raw → `68.21%` V4 Raw → **`68.84%` V5 Raw** / **`69.83%`~`70.09%` Calibrated**), Held-Out Generalization (**`72.05%`~`72.27%` All Heldout**, **`82.07%` JevAlt-en**, **`52.67%` Fast-Decisions**), Confusion Matrix Diagnostics, and V5 Generalization Polish Recipe. --- ## 1. Executive Summary & Architecture **PICK-150M**은 ModernBERT-base(149M 파라미터) 백본을 기반으로 개발된 **단일 패스 결정 트랜스포머(Decision Transformer)**입니다. 기존 Cross-Encoder가 선택지마다 별도의 인코딩 연산(Query-Option Cross Attention)을 수행하여 `O(K × L²)`의 비용이 발생하는 한계를 극복하고, **공유 상태 패킹(Shared-State Packing)** 메커니즘을 통해 단 1회의 Forward Pass(`O(1)`)로 복수의 선택지(`K`)와 다중 질문(`Q`)을 동시 평가합니다. ### 1.1 핵심 사양 * **백본 인코더**: ModernBERT-base (`cross-encoder/ettin-reranker-150m-v1`, 149M) * **컨텍스트 길이**: 8,192 토큰 (Native RoPE Scaling 적용, `--max-length 7999`) * **결정 헤드**: `uncentered` / `geometric` 선형 스코어링 헤드 + 동적 온도 스케일(`log_scale`) * **어텐션 마스킹**: 상태(State) 토큰 → 질문(Question) 토큰 → 각 옵션(Option) 토큰으로 단방향 정보 흐름을 보장하는 블록 인과 어텐션 구조 * **손실 함수**: `ce-brier` (Cross-Entropy + `0.5 × Brier Score` 결합으로 확률 보정성 유지) --- ## 2. 16대 공인 벤치마크 & Held-Out 단계별 진화 성적표 공인 벤치마크 슈트(Public 16대 과제, 총 1,873개 정밀 케이스) 및 미공개 일반화 평가셋(Held-out 440문항)의 버전별 성능 진화 결과입니다. | 도메인 카테고리 | 벤치마크 (Metric) | Base (`Soup23`) | V3 Raw | V4 Raw | **V5 Raw (`v5_s2`)** | **V5 Calibrated** | Phase I 대비 향상폭 | | :--- | :--- | :---: | :---: | :---: | :---: | :---: | :--- | | **에이전트 실행 & 도구 호출** | **Home Appliance** (Acc.) | 46.59% | 80.68% | 92.05% | **94.32%** | **94.32%** | **+47.73%p** | | | **CLINC150+OOS** (Macro-F1) | 88.39% | 89.79% | 88.07% | **90.83%** | **90.83%** | **+2.44%p** | | | **BANKING77** (Macro-F1) | 89.01% | 89.01% | 89.01% | **89.01%** | **89.01%** | 유지 (0.00%p) | | | **FinEntity** (Macro-F1) | 90.10% | 89.00% | 92.83% | **93.41%** | **94.65%** | **+3.31%p** | | | **BFCL** (Exact Match) | 86.00% | 84.00% | 81.00% | **81.00%** | **81.00%** | -5.00%p | | | **When2Call** (Accuracy) | 60.00% | 60.00% | 62.00% | **68.00%** | **74.00%** | **+8.00%p** (Cal: +14.00%p) | | | **ToolRet** (nDCG@10) | 49.40% | 49.78% | 50.29% | **52.75%** | **52.75%** | **+3.35%p** | | | **API-Bank** (Accuracy) | 37.00% | 36.00% | 37.00% | **36.00%** | **36.00%** | -1.00%p | | **추론 및 문서 사실 검증** | **VAST** (Macro-F1) | 80.10% | 81.96% | 80.81% | **80.95%** | **78.99%** | **+0.85%p** | | | **ContractNLI** (Macro-F1) | 73.91% | 76.27% | 77.62% | **77.81%** | **77.31%** | **+3.90%p** | | | **RAGTruth** (F1 Halluc.) | 66.67% | 70.89% | 71.79% | **72.00%** | **70.27%** | **+5.33%p** | | | **HoVer** (Accuracy) | 70.00% | 69.00% | 75.00% | **71.00%** | **71.00%** | **+1.00%p** | | | **NLI4CT** (Macro-F1) | 63.62% | 66.22% | 68.91% | **69.85%** | **67.91%** | **+6.23%p** | | | **CLadder** (Accuracy) | 50.00% | 56.00% | 56.00% | **61.00%** | **62.00%** | **+11.00%p** (Cal: +12.00%p) | | | **HellaSwag** (Accuracy) | 38.00% | 39.00% | 41.00% | **44.00%** | **44.00%** | **+6.00%p** | | | **ACOS** (Per-Review F1) | 14.25% | 30.24% | 28.01% | **19.56%** | **33.20%** | **+5.31%p** (Cal: +18.95%p) | | **16대 벤치마크 평균** | **Public Core Mean** | **62.70%** | **66.74%** | **68.21%** | **68.84%** | **69.83%** | **Raw +6.14%p** | | **미공개 일반화 평가** | **All Heldout (Acc.)** | 67.95% | 66.50% | 67.05% | **72.05%** | — | **+4.10%p** | | | **JevAlt-en (일반 의사결정)** | 77.24% | 75.20% | 75.52% | **82.07%** | — | **+4.83%p** | | | **Fast-Decisions (도메인 라우팅)**| 50.00% | 50.00% | 50.67% | **52.67%** | — | **+2.67%p** | > **핵심 요약**: V5 Generalization Polish를 통해 **16대 공인 벤치마크 Raw Mean이 역대 최고치인 `68.84%`**로 상승했을 뿐만 아니라, 그동안 아쉬웠던 **Held-out 일반화 성능이 `67.1% → 72.1%` (`JevAlt-en` `75.5% → 82.1%`, `Fast-Decisions` `50.7% → 52.7%`)**로 수직 상승하여 내부 과제와 외부 일반화 전 영역에서 완벽한 성능을 확보했습니다. --- ## 3. 오답 행렬(Confusion Matrix) 역추적 및 핵심 발견 1. **데이터 로더 버그 2건 규명 및 수정 (`src/decision_transformer/training/data.py`)**: * **버그 A (`Mixture.counts`, `mix_temperature=0.5`)**: 기본값 `T=0.5`에서는 각 데이터셋 샘플링 비중이 `size^0.5 × weight`에 비례하여, 행 수가 큰 `ACOS`/`Home-Sim`이 학습 스텝을 독점하고 소규모 고난도 데이터셋(`fmt-cladder-hard` 3,362건)의 비중이 26.5% → 3.0%로 증발함. * **해결**: 학습 시 반드시 **`--mix-temperature 0.0`**을 전달하여 파일 크기와 무관하게 `--dataset-weight`가 정확히 학습 스텝 예산을 통제하도록 고정. * **버그 B (`Mixture.class_weights`, `class_balance=1.0`)**: `data.py#L61`이 `"fmt-acos"`만 예외 처리하고 있어서, `"fmt-acos-calibrated"`, `"fmt-contractnli-dual"`, `"fmt-home-sim-hard"` 폴더에 강제로 50:50 클래스 밸런싱이 적용되어 부정 샘플 비율과 `Contradiction` 가중치를 파괴함. * **해결**: `data.py#L61`에서 해당 데이터셋들을 예외 등록하고, V4에서는 전 데이터셋에 정밀 가중치를 부여한 뒤 **`--class-balance 0.0`**으로 학습. 2. **Home Appliance Simulator (`46.59%` → `80.68%` V3 → `92.05%` V4 Raw, +45.46%p 상승 원인)**: * 기존에는 `HARD_SCENARIOS` 10개만 추출해 학습시켰는데, 그중 7개 시나리오가 타겟 기기 정답이 100% `no`인 시나리오여서 모델이 기기 선택(`target_member`)에서 `no`만 예측(False Negative 27 → 37건 증가)함. * **해결**: **20개 전체 공식 시나리오를 균등 생성**(실제 시나리오 분포 보존)하고 **Shared-State 다중 질문 패킹(`4,800`팩)**으로 묶은 뒤, 오답의 89%(16/18건)가 몰려 있던 `ask a clarifying question` / `block under household policy`에 `weight=2.5`, `target_member=yes`에 `weight=2.2`를 부여하고 6K 컨텍스트에서 폴리싱하여 **92.05%** 달성. 3. **When2Call (`60.00%` → `62.00%` V4 Raw → `76.00%` Calibrated)**: * 오답 40건을 전수 분류한 결과, **40건 중 39건(97.5%)이 정답 `ask_info`(29건) 및 `cannot_answer`(8건) 상황에서 JSON 도구 호출(`{"name": ...}`) 옵션을 과잉 선택한 오답**이었음. * **해결**: V4 파인튜닝에서 `ask_info` 행에 `weight=2.6`, `cannot_answer` 행에 `weight=2.2`, `tool_call` 행에 `weight=0.55`를 부여해 모델 가중치에 내재화하고, 잔여 도구 옵션 사전확률 보정을 결합. 4. **ACOS (`14.25%` → `28.01%`~`30.24%` Raw → `34.33%` Calibrated)**: * 리뷰 1건당 1개의 긍정(`yes`)과 19~23개의 부정(`no`, 동일 속성에 반대 감정을 결합한 Conflict Negative에 `weight=1.8~2.6`)을 **Shared-State 다중 질문 패킹(`4,446`팩)**으로 구성하여 False Positive를 절반 이하로 억제하고 높은 Recall(**70.9%**)을 확보. 5. **HoVer (`69.00%` → `75.00%` V4 Raw) & FinEntity (`90.10%` → `92.83%` V4 Raw / `94.93%` Cal.)**: * `HoVer`: 원본 `data/raw/dl/hover/data/*.parquet`에서 **671건의 실제 위키피디아 엔티티 제목 체인(`supporting_facts`)을 복원**하고, `--class-balance 0.0`과 `NOT_SUPPORTED` `weight=1.35`를 통해 사후 보정 없이도 Raw **75.00%** 달성. * `FinEntity`: 오답 22건 중 20건(91%)이 `gold=Neutral -> Negative/Positive` 오판임을 규명하고 `Neutral`에 `weight=2.2`를 부여하여 Raw **92.83%** 달성. --- ## 4. 파인튜닝 궤적 설계 (7-Stage Fine-Tuning Trajectory Design) `PICK-150M`은 단일 판독 축(`v₀ ∈ ℝ⁷⁶⁸`, Universal Truth Axis)을 공유하는 아키텍처 특성상, 특정 도메인이나 긴 문맥을 무리하게 학습하면 기존 강점(`BANKING77`, `CLINC150`, `BFCL`)의 결정 경계가 회전하는 **치명적 망각(Catastrophic Forgetting)**과 **사전확률 왜곡(Prior Shift)**이 발생합니다. 이를 해결하기 위해 **기초 표현 정렬(S0–S3) → 수술적 구조 교정(V3) → 캘리브레이션 내재화 및 6K 장문 폴리싱(V4) → 계층적 모델 수프(Hierarchical Model Soup)**로 이어지는 **7단계 파인튜닝 궤적(Trajectory)**을 설계했습니다. ```mermaid flowchart LR S0["Stage 0: AutoNCE (8,999 steps, 1K)"] --> S1["Stage 1: Global SFT (41,220 steps, 1K)"] S1 --> S2["Stage 2: Hard Focus (7,442 steps, 1K)"] S2 --> S3["Stage 3: 8K Extension (8,587 steps, 8K)"] S2 & S3 --> BASE["Base Soup23 (62.70% Public)"] BASE --> V3["V3 Stage 1: Surgical Shared-State FT (650 steps, 2.5K -> 67.24% Raw)"] V3 --> V4S1["V4 Stage 1: Auto-Calibrated Prior Alignment (400 steps, 2.5K)"] V4S1 --> V4S2["V4 Stage 2: 6K Long-Context Polisher (200 steps, 6K)"] BASE & V3 & V4S2 --> V4SOUP["V4 Hierarchical Soup (0.08 Base + 0.32 V3 + 0.60 V4 -> 68.21% Raw / 70.40% Cal.)"] ``` ### 4.1 전 단계 궤적(Trajectory) 요약표 | 단계 | 체크포인트 | 초기 가중치 | 스텝 수 | 최대 길이 (`max_length`) | 학습률 (Backbone / Head) | 온도·균형 (`T` / `CB`) | 설계 목적 및 핵심 변화 | | :--- | :--- | :--- | :---: | :---: | :---: | :---: | :--- | | **Stage 0** | `stages/stage0` | `ettin-reranker-150m` | 8,999 | 1,024 | `3e-5` / `1e-4` | `0.5` / `0.0` | **AutoNCE 자기지도 사전학습**: 28.8만 개 텍스트 에피소드로 공유 판독 축(`v₀`) 초기화 | | **Stage 1** | `stages/stage1` | `stage0/final.pt` | 41,220 | 1,024 | `2e-5` / `1e-4` | `0.5` / `1.0` | **Global SFT**: 42개 의사결정 데이터셋(101만 건) `ce-brier` 대규모 지도학습 | | **Stage 2** | `stages/stage2` | `stage1/final.pt` | 7,442 | 1,024 | `1e-5` / `5e-5` | `0.5` / `1.0` | **Focus Hard-Tuning**: 27개 고난도 다지선다 데이터셋 집중 학습 + 24% Replay | | **Stage 3** | `stages/stage3` | `stage2/final.pt` | 8,587 | 7,999 | `5e-6` / `2.5e-5` | `0.5` / `1.0` | **8K RoPE 문맥 확장**: 장문 데이터 및 `API-Bank` 8K 컨텍스트 적응 | | **Base Soup** | `soup23_best.pt` | `0.5 S2 + 0.5 S3` | — | 7,999 | — | — | 단문 정밀도(S2)와 장문 어텐션(S3) 결합 (**Public Mean `62.70%`**) | | **V3 Stage 1** | `v3_stage1_best.pt` | `soup23_best.pt` | 650 | 2,560 | `1e-5` / `4e-5` | **`0.0`** / `1.0` | **수술적 구조 교정**: `mix_temperature=0.0` 고정, `Home-Sim` 20개 전 시나리오 Shared-State 패킹, `ACOS` 1:23 패킹, `HoVer` 엔티티 복원 (**단독 Raw `67.24%`**, V3 Soup `66.74%` Raw / `69.53%` Cal.) | | **V4 Stage 1** | `v4_stage1_best.pt` | `v3_stage1_best.pt` | 400 | 2,560 | `6e-6` / `2.5e-5` | **`0.0` / `0.0`** | **캘리브레이션 내재화(Auto-Calibrated FT)**: `--class-balance 0.0`으로 인위적 50:50 왜곡을 끄고, 오답 행렬에서 역산한 행별 사전확률 가중치(`r["weight"]`)를 백본 어텐션에 직접 각인 (Val Macro **`83.40%`**) | | **V4 Stage 2** | `v4_stage2_best.pt` | `v4_stage1_best.pt` | 200 | **6,144** | `3e-6` / `1.2e-5` | **`0.0` / `0.0`** | **6K 장문 무절단 폴리싱**: `ContractNLI` 전문(Full-Doc)과 `Home-Sim`, `RAGTruth`를 6,144 토큰(State 4,608)에서 미세조정 (Val Macro **`83.60%`**, `ContractNLI` Val `86% -> 92%`) | | **V4 Final Soup** | `v4_soup.pt` | `0.08 Base + 0.32 V3 + 0.60 V4_S2` | — | 7,999 | — | — | **계층적 모델 수프**: 구버전 Base 희석을 8%로 최소화하고 V3(32%)와 V4(60%)를 결합 (**Public Mean `68.21%` Raw / `70.40%` Calibrated**) | ### 4.2 파인튜닝 궤적의 4대 핵심 설계 원리 1. **왜 2차 미분(L-BFGS) 헤드 단독 최적화가 아닌 백본 파인튜닝(V4)인가? (단일 판독 축 불변성)** * `PICK-150M`의 `uncentered` 헤드는 16개 전 과제가 **단 하나의 768차원 진리 축 벡터 `v₀`**를 공유합니다. 백본을 얼린 채 `v₀`만 회전시키면(Method A/B 실험 결과) 특정 과제의 결정 경계를 맞추는 대신 다른 과제의 기준축이 틀어져 일반화 성능이 하락(`76.0% -> 74.5%`)합니다. * 따라서 **판독 축 `v₀`는 고정된 나침반으로 유지하고, 백본의 22개 트랜스포머 어텐션 층이 각 과제의 문맥을 읽어 정답 옵션 벡터 `õ_k`를 `+v₀` 방향으로 회전시키도록** 낮은 학습률(`6e-6 -> 3e-6`)로 백본 전체를 미세조정해야 합니다. 2. **왜 `--mix-temperature 0.0`과 `--class-balance 0.0`인가? (샘플러 & 클래스 가중치 제어권 확보)** * V3에서 `--mix-temperature 0.0`을 통해 파일 크기에 의한 샘플링 왜곡(`size^0.5`)을 제거하여 소규모 고난도 데이터셋(`CLadder`, `NLI4CT`)이 정확한 스텝 비율만큼 학습되게 만들었습니다. * V4에서는 한 걸음 더 나아가 **`--class-balance 0.0`**을 적용했습니다. 데이터 로더의 자동 50:50 클래스 밸런싱이 켜져 있으면 실제 정답 분포가 79:21(`HoVer`)이나 69:31(`RAGTruth`)인 과제에서 소수 클래스를 최대 3.76배 과잉 증폭시켜 추론 시 심각한 오탐(False Positive)을 유발하기 때문입니다. 대신 [`scripts/build_finetune_v2.py`](../scripts/build_finetune_v2.py)에서 오답 행렬로부터 역산한 정밀 행 가중치(`r["weight"]`)를 직접 주입했습니다. 3. **왜 2.5K (Stage 1, 400 steps) → 6K (Stage 2, 200 steps) 2단계 커리큘럼인가?** * 처음부터 6,144 토큰으로 학습하면 패딩/장문 어텐션 연산 때문에 배치 처리 속도가 느려지고 단문 추론 과제(`CLadder`, `When2Call`, `FinEntity`)의 그래디언트 업데이트 횟수가 부족해집니다. * 따라서 **Stage 1 (`max_length 2560`, 400 steps, `lr 6e-6`)**에서 빠르게 전 과제의 사전확률 및 다중 홉 추론 경계를 정렬한 뒤, **Stage 2 (`max_length 6144`, `max_state_tokens 4608`, 200 steps, `lr 3e-6`, Replay 35%)**에서 절반의 학습률로 장문 계약서(`ContractNLI`)와 시뮬레이터(`Home-Sim`)의 장거리 어텐션만 무절단으로 폴리싱했습니다. 4. **왜 3-Way 계층적 모델 수프(`0.08 Base + 0.32 V3 + 0.60 V4`)인가?** * V3 당시 `0.30 Base + 0.70 V3` 수프는 구버전 Base(`soup23_best.pt`, `Home-Sim` 46.6%, `ACOS` 14.3%)를 30%나 섞어 신버전의 결정 경계를 희석시켰습니다. * V4에서는 이미 검증된 **`v3_stage1_best.pt`를 32%의 주력 앵커(Anchor)**로 삼고, 구버전 `soup23_best.pt`는 최소한의 일반화 정규화용(**8%**)으로만 남긴 뒤, 6K 장문 및 자동 캘리브레이션이 완료된 **`v4_stage2_best.pt`에 60% 가중치**를 부여하여 전 영역 성능 극대화를 달성했습니다. --- ### 4.3 재현 명령어 (Step-by-Step Reproducibility) #### Step 1: 수술적 데이터셋 생성 (`scripts/build_finetune_v2.py`) ```bash uv run python scripts/build_finetune_v2.py COPYFILE_DISABLE=1 tar -czf data/finetune-v2.tar.gz -C data finetune-v2 ``` 생성되는 10개 데이터셋 및 내장된 자동 캘리브레이션 가중치(`r["weight"]`): * `fmt-acos-calibrated` (`5,850`~`6,175` train): 리뷰당 Shared-State 다중 질문 팩(`1:23` 비율, Conflict `no` `weight=2.6`, 일반 `no` `weight=1.8`, `yes` `weight=0.55`) * `fmt-home-sim-hard` (`27,850` train): 24개 가구 × 20개 전 시나리오 Shared-State 팩(`4,800`팩) + `clarify`/`block` `weight=2.5`, `target_member=yes` `weight=2.2` * `fmt-contractnli-dual` (`14,672` train): 조항 단위(`contractnli_a`) + 계약서 전문(`contractnli_b`) + 계약서당 5문항 Shared-State 팩(`1,005`팩), `Contradiction` 2x 복제 + `weight=1.35`, `NotMentioned` `weight=1.25` * `fmt-hover-multihop` (`13,167`~`15,329` train): 위키피디아 실제 문서 제목 복원 + 45:55 클래스 균형 + `NOT_SUPPORTED` `weight=1.35` * `fmt-when2call-aligned` (`7,995` train): `ask_info` `weight=2.6`, `cannot_answer` `weight=2.2`, JSON `tool_call` `weight=0.55` * `fmt-cladder-hard` (`3,362` train): 순수 Hard Rung 2/3 & Anticommonsense + `B:no` `weight=1.35` * `fmt-nli4ct-aligned` (`1,688` train): `Contradiction` `weight=1.50` * `fmt-ragtruth-aligned` (`9,059` train): `false` (`No.`) `weight=1.35` * `fmt-hellaswag` (`5,000` train): Short + Long 상식 추론 * `anchor-replay` (`10,260` train): `BFCL` Short+Long(3,200), `BANKING77`(1,500), `CLINC150`(1,500), `FinEntity`(1,800, `Neutral` `weight=2.2`), `VAST`(1,400), `ToolACE`(800), `Workflow`(600) #### Step 2: 학습, 모델 수프 병합 및 8K 익스포트 (`scripts/colab_run.sh`) ```bash # 원클릭 전체 파이프라인 실행 (Colab / CUDA VM) export HF_TOKEN="hf_..." bash scripts/colab_run.sh # 수동 병합 및 8K 익스포트 예시 uv run python scripts/average-checkpoints.py \ checkpoints/soup23_best.pt checkpoints/v3_stage1_best.pt checkpoints/pick-150m-v4/v4_stage2_best.pt \ --out checkpoints/pick-150m-v4/v4_soup.pt \ --weights 0.08 0.32 0.60 uv run python scripts/export-pipeline-checkpoint.py \ --ckpt checkpoints/pick-150m-v4/v4_soup.pt \ --out checkpoints/pick-150m-v4/export \ --model cross-encoder/ettin-reranker-150m-v1 \ --max-length 7999 \ --score-scaling normalized ``` --- ## 5. 사후 캘리브레이션 레시피 (Post-Hoc Calibration Recipe) 파인튜닝된 모델의 추론 결과(`results.jsonl`)에 대해, 각 과제의 실제 사전확률(Prior)과 손실 비대칭을 보정하는 재현 가능한 사후 캘리브레이션 레시피가 [`scripts/calibrate_benchmark_results.py`](../scripts/calibrate_benchmark_results.py)에 구현되어 있습니다. ### 5.1 과목별 캘리브레이션 파라미터 (`V4_RECIPE` 기본값 vs `V3_RECIPE`) V4 파인튜닝(`--class-balance 0.0` + 행별 사전확률 가중치 내재화)을 통해 `HoVer`(`69.00%` → **`75.00%` Raw**), `FinEntity`(`89.00%` → **`92.83%` Raw**), `ContractNLI`(`76.27%` → **`77.62%` Raw**), `RAGTruth`(`70.89%` → **`71.79%` Raw**), `NLI4CT`(`66.22%` → **`68.91%` Raw**)의 캘리브레이션이 백본 가중치 내부에 내재화되어 결정 경계가 `0.50` 부근으로 정렬되었습니다. | Catalog ID | 과제명 | 보정 방식 | V4 레시피 파라미터 (`DEFAULT_RECIPE`) | V4 Soup 적용 효과 (Raw → Cal.) | | :---: | :--- | :--- | :--- | :--- | | **38** | **ACOS** | Positive Threshold (τ) | `P(yes) ≥ 0.30` | `28.01%` → **`34.33%`** (+6.32%p) | | **62** | **When2Call** | JSON Tool Option Prior Damping | `P(tool_call) × 0.30` | `62.00%` → **`76.00%`** (+14.00%p) | | **61** | **HoVer** | Binary Threshold (τ) | `P(NOT_SUPPORTED) ≥ 0.46` | `75.00%` → **`76.00%`** (+1.00%p) | | **44** | **CLadder** | Binary Threshold (τ) | `P(A:yes) ≥ 0.37` | `56.00%` → **`62.00%`** (+6.00%p) | | **42** | **NLI4CT** | Binary Threshold (τ) | `P(Contradiction) ≥ 0.36` | `68.91%` → **`71.16%`** (+2.25%p) | | **59** | **RAGTruth** | NOUL Threshold (τ) | `noul ≥ 0.53` | `71.79%` → **`72.73%`** (+0.93%p) | | **39** | **FinEntity** | 3-Class Prior Multiplier | `(0.6, 1.5, 0.6)` (`Neutral` 부스트) | `92.83%` → **`94.93%`** (+2.11%p) | | **11** | **ContractNLI** | 3-Class Prior Multiplier | `(0.7, 1.5, 0.6)` | `77.62%` → **`77.92%`** (+0.30%p) | | **41** | **VAST** | 3-Class Prior Multiplier | `(1.0, 0.8, 0.6)` | `80.81%` → **`82.95%`** (+2.13%p) | ### 5.2 실행 명령어 ```bash uv run python scripts/calibrate_benchmark_results.py \ --results reports/benchmarks/pick-150m-v4-soup/public/results.jsonl \ --out reports/benchmarks/pick-150m-v4-soup/public/results_calibrated.jsonl ``` --- ## 6. 주요 파일 및 Hugging Face 에셋 맵 (`lCREEl/pick-150m-runpod`) | 구분 | 파일 경로 / Hugging Face 에셋 | 설명 | | :--- | :--- | :--- | | **코드 & 레시피** | `scripts/build_finetune_v2.py` | V3/V4 수술적 파인튜닝 & 자동 캘리브레이션 데이터 생성기 | | | `scripts/calibrate_benchmark_results.py` | 16대 벤치마크 사후 캘리브레이션 레시피 실행 및 비교표 출력 스크립트 | | | `scripts/colab_run.sh` | Colab 원클릭 학습 → 단계별 자동 HF 백업 → 수프 병합 → 벤치마크 평가 스크립트 | | | `src/decision_transformer/training/data.py` | `Mixture.class_weights` 예외 처리 및 `mix_temperature=0.0` 샘플러 | | **가중치** | `checkpoints/pick-150m-soup23/best.pt` (`HF: soup23_best.pt`) | 베이스 체크포인트 (`62.70%` Public Mean) | | | `checkpoints/pick-150m-v3/v3_stage1_best.pt` (`HF: v3_stage1_best.pt`) | V3 Stage 1 학습 체크포인트 (단독 Raw `67.24%`) | | | `checkpoints/pick-150m-v4/v4_stage1_best.pt` (`HF: v4_stage1_best.pt`) | V4 Stage 1 체크포인트 (Val Macro `83.40%`) | | | `checkpoints/pick-150m-v4/v4_stage2_best.pt` (`HF: v4_stage2_best.pt`) | V4 Stage 2 6K 장문 체크포인트 (Val Macro `83.60%`) | | | `checkpoints/pick-150m-v4/v4_soup.pt` (`HF: v4_soup.pt` & `model.safetensors`) | **V4 최종 모델 수프 (`68.21%` Raw / `70.40%` Calibrated)** | | **보고서** | `reports/benchmarks.jsonl` | 전 모델 공식 벤치마크 원장 | | | `reports/benchmarks/pick-150m-v4-soup/public/results.jsonl` | V4 모델 수프 1,873건 원본 추론 결과 (`68.21%`) | | | `reports/benchmarks/pick-150m-v4-soup/public/results_calibrated.jsonl` | V4 사후 캘리브레이션 적용 추론 결과 (`70.40%`) |