# Phase 2B Reranker Decision Report (2026-05-23) > Parent: `round-2-review-mighty-starfish.md` v2.1 > > 본 보고서 = Phase 4 산출물. Decision Tree H1~H4 중 권고 1개 + 후속 PR 후보. ## 1. Summary | | Value | |---|---| | baseline (bge-reranker-v2-m3, snapshot 범위) | NDCG@10 (graded) **0.659** / mixed 0.39 / korean_only 0.51 / failure 0/5 / p50 454ms / p95 1573ms | | 측정 후보 (A 그룹 1종) | cand_gte_ml_base (Alibaba-NLP/gte-multilingual-reranker-base, 305M, Apache 2.0) | | **TEI 1.7 호환성 탈락 후보 (2종 → Phase 2B-Extended)** | (a) `cand_mxbai_large` — deberta-v2 architecture not supported by TEI candle backend. (b) `cand_bge_v2_gemma_2b` — LLM-based reranker, `1_Pooling/config.json` 부재 (FlagEmbedding LayerwiseReranker wrapper 필요) | | 폐기 (라이센스) | jinaai/jina-reranker-v2-base-multilingual — CC-BY-NC 4.0 (v1.1 결정) | 본 PR 은 plan 의 closure gate flex 조항 ("후보 탈락 시 N 후보 + baseline 으로 closure 가능, decision md 에 제외 사유 명시") 적용. **3 후보 원칙 → 1 후보 측정** (2 후보 TEI 호환 X). ## 2. 후보별 Δ NDCG (vs baseline rebaseline, snapshot 범위) | Candidate | overall NDCG | Δ overall | mixed | Δ mixed | korean_only | Δ korean | standards | english_only | exam | failure | p50 ms | p95 ms | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| | **bge-reranker-v2-m3 snapshot rebaseline** | **0.659** | — | **0.39** | — | **0.51** | — | 0.87 | 0.78 | 0.74 | 0/5 | 454 | 1573 | | cand_gte_ml_base (gte-multilingual-reranker-base) | 0.604 | **-0.055** | 0.38 | -0.01 | 0.41 | **-0.10** | 0.86 | 0.72 | 0.62 | 0/5 | 345 | 1460 | **관찰**: - **overall NDCG**: -0.055 (회귀, 통계적 의미 있는 수준). - **korean_only**: -0.10 (큰 회귀 — Phase 2B 가 공략 대상이던 약점이 더 악화). - **mixed**: -0.01 (거의 같음). - **standards / english_only / exam**: 모두 회귀 (-0.01 ~ -0.12). - **latency**: p50 -109ms 단축 (gte 305M 가 production 568M 보다 적은 compute), p95 -113ms 단축. ## 3. 베이스라인 재현성 (Phase 2A 와 비교) | | Phase 2A baseline_snapshot (2026-05-23) | Phase 2B baseline_snapshot (2026-05-23) | diff | |---|---:|---:|---:| | overall NDCG | 0.659 | 0.659 | 0.000 | | mixed | 0.39 | 0.39 | 0.000 | | korean_only | 0.51 | 0.51 | 0.000 | | p50 ms | 464 | 454 | -10 | **Snapshot filter path 안정**. dispatcher 추가 후 production 회귀 0 verify. ## 4. Decision (H3 — bge-reranker-v2-m3 유지) | | H1 swap 권고 | H2 부분 개선 | **H3 무개선 (✅ 선택)** | H4 latency 회귀 | |---|---|---|---|---| | 조건 | korean_only + mixed 둘 다 명확 개선 | 한쪽만 개선 | 모두 baseline 대비 개선 없음 | p95 ≥ 3000ms | | 결과 | ❌ 둘 다 회귀 (korean -0.10, mixed -0.01) | ❌ 회귀만 있음 | ✅ **확정** | ❌ p95 1460ms < 3000 | **최종 권고**: **bge-reranker-v2-m3 유지** (Apply PR 진입 X). 근거: - gte_ml_base 의 reranker quality 가 production bge-reranker-v2-m3 보다 명확 약함 (특히 한국어 -0.10). - mxbai_large + bge_v2_gemma_2b 의 TEI 1.7 호환 X → A 그룹 측정 culture 다 활용 못함. Extended PR 가능성은 있으나 본 PR scope 외. - korean_only / mixed 약점 보완은 **다른 layer (Phase 2Q query rewrite / 보다 강력한 reranker 의 native 호출 경로 등)** 가 더 유망. ## 5. Apply / 보완 / 보류 권고 - **Apply** (production reranker swap): **하지 않음**. - **보완** (다른 트랙): - **Phase 2Q (Query rewrite)** 우선 권고 — korean_only / mixed query 의 자연어 → 명사구 추출 / multilingual normalize. - mxbai-rerank-large-v1 sentence-transformers 직접 호출 (TEI 우회) → Phase 2B-Extended. - bge-reranker-v2-gemma FlagEmbedding LayerwiseReranker wrapper → Phase 2B-Extended. - **보류** (Phase 2B-Extended): - cand_mxbai_large (sentence-transformers direct, TEI 우회) - cand_bge_v2_gemma_2b (FlagEmbedding wrapper) - cand_jina_v2_ml (CC-BY-NC license 결정 후, 개인 비영리 사용 결정 시) ## 6. 후보 cleanup 일정 - `rerank-cand-gte-ml-base` 컨테이너 = **1주 dormant 유지** (Phase 2Q 또는 Extended PR 비교 baseline 가능성). - 1주 후 별 chore `PR-2B-Rerank-Cand-Cleanup-1` 에서 컨테이너 정리 + docker-compose.override.rerank-cand.yml 제거. ## 7. 후속 PR 후보 (백로그) | PR 가칭 | trigger | scope | |---|---|---| | `PR-Search-Query-Rewrite-1` (Phase 2Q) | korean_only / mixed 약점 보완 | LLM-driven query expansion + multilingual normalize. korean_only 0.51 / mixed 0.39 출발점. | | `PR-2B-Extended-Mxbai-Large` | (선택) sentence-transformers 트랙 | TEI 우회. sentence-transformers 직접 호출 wrapper. deberta-v2 지원. | | `PR-2B-Extended-Bge-V2-Gemma` | (선택) FlagEmbedding 트랙 | LayerwiseReranker wrapper. 9B variant int8 quantization 옵션. | | `PR-2B-Extended-Jina-V2-ML` | (선택) license 결정 후 | jinaai/jina-reranker-v2-base-multilingual 측정. CC-BY-NC 라이센스 + 개인 비영리 사용 가정. | | `PR-2B-Cloud-Reranker-Scaffold-1` | (선택) self-hosted 무개선 확정 | Cohere rerank-multilingual-v3.0 scaffold-only ([[feedback_scaffold_first_for_external_cost_pr]]). 실비 0. | | `PR-2B-Rerank-Cand-Cleanup-1` | 본 PR closure 후 1주 | rerank-cand-gte-ml-base 컨테이너 + override yml 제거. | ## 8. Closure gate verify (§ 7 본 plan) - [x] G0-1 fixture 박제 commit (한국어+영어 mixed sample, sanity ASME>고압가스>weather PASS) - [x] (flex) gte_ml_base 측정 완주 (`overall.n = 51`, scored 46). bge_v2_gemma_2b + mxbai_large 는 TEI 호환 탈락으로 제외 (사유 § 1 명시) - [x] baseline rebaseline 51 case 측정 완료 (snapshot filter 적용, NDCG 0.659 Phase 2A 와 동일 = 재현성 PASS) - [x] 후보 baseline json 1개 + baseline_snapshot json 1개 박제 - [x] decision md 박제 (본 파일) - [x] Apply 권고 1줄 (H3 bge-reranker-v2-m3 유지) - [x] production reranker (bge-reranker-v2-m3) 변경 0 verify (`docker compose ps` reranker UP, `config.yaml` diff 0) - [x] production documents / document_chunks 변경 0 verify (Phase 2A 결과 보존, 21365 docs / 30605 chunks) - [x] embedding (bge-m3 ollama) 변경 0 verify - [x] dispatcher 호출 시 unknown slug → HTTP 400 verify (smoke `cand_invalid` PASS) - [x] reranker dispatch log audit (silent fallback 0, snapshot id 박제 verify) - [x] 후보 컨테이너 1주 dormant 후 cleanup chore 등록 (PR-2B-Rerank-Cand-Cleanup-1) - [x] DOCSRV_TOKEN 만료 사고 0 (3 측정 + smoke 모두 15분 이내) - [x] Phase 2A 의 후보 컨테이너 (`embedding-cand-*`) 와 충돌 0 (별 profile `rerank-cand`) - [x] commit 직전 `git branch --show-current` verify ([[feedback_multi_session_file_unit_division]]) **Phase 2B Diagnose PR closure: PASS** (flex closure — 1 후보 측정, 2 후보 TEI 호환 탈락 사유 명시).