076c0e1802
round-2-review-mighty-starfish.md v2.1 (Phase 2B Reranker Diagnose) plan 실행.
Phase 2A 의 CANDIDATE_BACKEND_MAP 패턴 재사용 + RERANKER_BACKEND_MAP 신규.
코드 변경 (4 파일):
- app/services/search/rerank_service.py:
- RERANKER_BACKEND_MAP allowlist (baseline / cand_gte_ml_base, slug-based resolve)
- _resolve_reranker(slug) → endpoint URL or None
- _rerank_via_candidate_endpoint() — 후보 TEI POST /rerank
- rerank_chunks() 시그니처에 reranker_backend + snapshot_*_id_max 추가 + dispatch log
- app/services/search/search_pipeline.py: run_search() threading
- app/api/search.py: reranker_backend Query parameter + 400 unknown_reranker_backend 에러 매핑
- tests/search_eval/run_eval.py: --reranker-backend flag + call_search/evaluate threading
infra:
- docker-compose.override.rerank-cand.yml: 3 후보 service (gte_ml_base / mxbai_large / bge_v2_gemma_2b),
profile 'rerank-cand' 격리, restart=unless-stopped
측정 산출물 (51 case, scored=46, failure=5):
- reports/v0_2_phase2b_baseline_snapshot_2026-05-23.csv (NDCG 0.659, Phase 2A 와 일치 = 재현성 PASS)
- reports/v0_2_phase2b_gte_ml_base_2026-05-23.csv
- tests/search_eval/baselines/v0_2_phase2b_{baseline_snapshot,gte_ml_base}_2026-05-23.json
- reports/phase_2b_reranker_decision_2026-05-23.md
- tests/fixtures/tei_rerank_response.json (G0-1 한국어+영어 mixed sample sanity PASS)
후보 TEI 1.7 호환성 (Phase 1 smoke gate):
- cand_gte_ml_base : ✅ PASS (xlm-roberta-based, TEI 호환)
- cand_mxbai_large : ❌ deberta-v2 미지원 → Phase 2B-Extended (sentence-transformers wrapper)
- cand_bge_v2_gemma_2b : ❌ LLM-based reranker, 1_Pooling/config.json 부재 → Phase 2B-Extended (FlagEmbedding wrapper)
결과 (1 후보 측정 + baseline rebaseline):
| Candidate | NDCG | Δ baseline | mixed | korean | exam | p50 ms |
|------------------------------------|------:|-----------:|------:|-------:|------:|-------:|
| bge-reranker-v2-m3 (baseline) | 0.659 | — | 0.39 | 0.51 | 0.74 | 454 |
| cand_gte_ml_base | 0.604 | -0.055 | 0.38 | 0.41 | 0.62 | 345 |
Decision (H3): bge-reranker-v2-m3 유지. gte 의 reranker quality 가 production 보다 약함 (korean_only -0.10, exam -0.12, overall -0.055).
후속 PR 백로그 (6건):
- PR-Search-Query-Rewrite-1 (Phase 2Q, korean_only/mixed 보완 권고)
- PR-2B-Extended-Mxbai-Large (sentence-transformers wrapper)
- PR-2B-Extended-Bge-V2-Gemma (FlagEmbedding LayerwiseReranker wrapper)
- PR-2B-Extended-Jina-V2-ML (license 결정 후, 개인 비영리 가정)
- PR-2B-Cloud-Reranker-Scaffold-1 (Cohere scaffold-only, 선택)
- PR-2B-Rerank-Cand-Cleanup-1 (1주 후 cand 컨테이너 정리)
production 영향:
- production reranker (bge-reranker-v2-m3) 변경 0
- config.yaml ai.models.rerank.endpoint 변경 0
- embedding (bge-m3 ollama) 변경 0 (Phase 2A 결정 보존)
- documents / document_chunks 변경 0 (21365 docs / 30605 chunks 그대로)
- 4 smoke PASS (baseline / baseline+snapshot / cand_gte_ml_base / cand_invalid → 400)
- dispatch log 박제 verify (endpoint + snapshot id)
closure gate: 16 항목 PASS (flex closure 조항 적용 — 1 후보 측정, 2 후보 TEI 호환 탈락 사유 명시).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.7 KiB
6.7 KiB
Phase 2B Reranker Decision Report (2026-05-23)
Parent:
round-2-review-mighty-starfish.mdv2.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)
- G0-1 fixture 박제 commit (한국어+영어 mixed sample, sanity ASME>고압가스>weather PASS)
- (flex) gte_ml_base 측정 완주 (
overall.n = 51, scored 46). bge_v2_gemma_2b + mxbai_large 는 TEI 호환 탈락으로 제외 (사유 § 1 명시) - baseline rebaseline 51 case 측정 완료 (snapshot filter 적용, NDCG 0.659 Phase 2A 와 동일 = 재현성 PASS)
- 후보 baseline json 1개 + baseline_snapshot json 1개 박제
- decision md 박제 (본 파일)
- Apply 권고 1줄 (H3 bge-reranker-v2-m3 유지)
- production reranker (bge-reranker-v2-m3) 변경 0 verify (
docker compose psreranker UP,config.yamldiff 0) - production documents / document_chunks 변경 0 verify (Phase 2A 결과 보존, 21365 docs / 30605 chunks)
- embedding (bge-m3 ollama) 변경 0 verify
- dispatcher 호출 시 unknown slug → HTTP 400 verify (smoke
cand_invalidPASS) - reranker dispatch log audit (silent fallback 0, snapshot id 박제 verify)
- 후보 컨테이너 1주 dormant 후 cleanup chore 등록 (PR-2B-Rerank-Cand-Cleanup-1)
- DOCSRV_TOKEN 만료 사고 0 (3 측정 + smoke 모두 15분 이내)
- Phase 2A 의 후보 컨테이너 (
embedding-cand-*) 와 충돌 0 (별 profilererank-cand) - commit 직전
git branch --show-currentverify (feedback_multi_session_file_unit_division)
Phase 2B Diagnose PR closure: PASS (flex closure — 1 후보 측정, 2 후보 TEI 호환 탈락 사유 명시).