23개 평가셋 × 3 전략(legacy/rrf/rrf_boost) 측정 + 분석. 핵심 발견: - 전체 NDCG: legacy 0.705 → rrf 0.699 → rrf_boost 0.700 (미세 차이) - RRF가 약간 나쁜 이유: kw_001(산업안전보건법 제6장)에서 RRF가 4041 (근로기준법 안전과 보건)을 false positive로 promotion. NDCG 1.000→0.906. - boost가 가치 입증한 사례: news_004(guerre en Iran)에서 RRF의 미스를 완벽 보정해 legacy NDCG 복원. - RRF의 진짜 가치는 Phase 1+ 다중 신호(trigram, reranker, multi-query) 통합 시 발휘됨. 현 평가셋은 너무 단순해서 차이가 noise에 묻힘. 결정: rrf_boost를 default로 유지. Phase 1 후 재측정. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.7 KiB
4.7 KiB
Phase 0.5 Fusion 전략 비교 — 2026-04-07
tests/search_eval/queries.yaml v0.1 (23개 쿼리)을 3가지 fusion 전략으로 실행한 비교.
전체 지표
| 지표 | legacy (기존 weighted-sum) | rrf (k=60) | rrf_boost (default) |
|---|---|---|---|
| Recall@10 | 0.788 | 0.788 | 0.788 |
| MRR@10 | 0.751 | 0.747 | 0.747 |
| NDCG@10 | 0.705 | 0.699 | 0.700 |
| Top-3 hit | 0.950 | 0.950 | 0.950 |
| Latency p95 | 554ms | 554ms | 556ms |
| Failure precision | 0/3 | 0/3 | 0/3 |
현재 평가셋에서 RRF는 legacy 대비 측정 가능한 개선을 주지 못함 (NDCG -0.005, MRR -0.004). 오히려 미세하게 나쁘다. 그러나 rrf_boost는 rrf의 일부 손실을 복구한다.
쿼리별 차이 분석 (top5 ordering 변화 7건)
kw_001 — RRF의 가장 큰 손실 (NDCG 1.000 → 0.906)
쿼리: 산업안전보건법 제6장
| 전략 | top5 |
|---|---|
| legacy | 3856, 3868, 3879, 3912, 3950 |
| rrf/boost | 3856, 4041, 3868, 3879, 3912 |
- 정답: [3856, 3868, 3879] (산안법 본법 + 시행령 + 시행규칙 6장)
- RRF가 4041(근로기준법 제6장 안전과 보건)을 2위로 끌어올림. 텍스트+벡터 둘 다에서 잡혀서 RRF가 보상.
- boost가 잡지 못한 이유: 4041 title도 "제6장"을 포함하지만 boost의
LEGAL_ARTICLE_RE는제\d+조(조)만 매치,제\d+장(장)은 매치 안 함. 의도적 한계. - RRF의 단점이 극명히 드러나는 사례 — false positive가 두 retriever에서 동시에 잡히면 promotion됨.
news_004 — boost가 RRF를 정확히 보정한 사례
쿼리: guerre en Iran (불어 뉴스)
| 전략 | top5 |
|---|---|
| legacy | 4199, 4507, 4521, 4363, 4519 |
| rrf | 4199, 4507, 4519, 4211, 4521 |
| boost | 4199, 4507, 4521, 4363, 4519 ← legacy와 동일 |
- rrf는 4211(불어 비-정답)을 4위로 올렸으나, boost가 4363(텍스트 매치)을 다시 끌어올려 legacy NDCG 복원 (0.822).
- boost의 가치를 보여주는 유일한 사례.
kw_002 — 같은 NDCG, 다른 ordering
쿼리: 중대재해 처벌 등에 관한 법률 제2장 중대산업재해
| 전략 | top5 |
|---|---|
| legacy | 3921, 3917, 3916, 3922, 3920 |
| rrf/boost | 3917, 3921, 3916, 3922, 3920 |
- 정답: [3917, 3921] — RRF가 본법(3917)을 1위로 올림. 사람 직관에 더 부합.
- legacy는 시행령(3921)을 1위로 — 점수 합산 우연.
- NDCG 같음(둘 다 1.0) — 평가 metric이 ordering 차이를 잡지 못함.
misc_001 — RRF가 약간 더 좋음
쿼리: 강체의 평면 운동학
NDCG: legacy 0.605 → rrf/boost 0.624 (+0.019)
- 미세하지만 RRF가 정답을 약간 위로.
news_002, news_003 — 둘 다 미세하게 나쁨
미세 차이. 평가셋에 가린 신호.
핵심 인사이트
1. 현재 평가셋에선 fusion 전략 차이가 미미
- 이유: 평가셋이 23개로 작고, exact_keyword 카테고리가 이미 NDCG 1.0이라 fusion 차이가 noise에 묻힘.
- 시사: queries.yaml v0.2에서 graded relevance + 더 어려운 ranking 케이스가 필요.
2. RRF 단독은 RRF-friendly false positive에 취약
- 두 retriever 모두에서 쿼리와 부분 매치하는 doc은 RRF가 promotion.
- kw_001의 4041(근로기준법)이 대표 사례. 텍스트엔 "제6장 안전과 보건"이 있고, 벡터 임베딩도 의미상 가깝다.
- legacy의 weighted-sum은 텍스트 점수의 절대값을 보존해서 이런 부분 매치를 덜 promotion함.
3. boost는 일부 케이스만 보정
- news_004는 완벽 보정 (legacy 수준 복원).
- kw_001은 보정 실패 — 법령 "장" vs "조" 구분이 한계.
- 확장 후보:
제\d+장패턴, 도메인 일치 boost(법령 쿼리에 대해 법령 결과 우선) — Phase 2 QueryAnalyzer 도입 시.
4. RRF의 진짜 가치는 Phase 1+ 인프라
- RRF가 빛을 발하는 시점:
- Phase 1: trigram + reranker가 추가 retrieval 신호로 들어올 때 (3+ 신호 합치는 데 RRF가 normalize 부담을 흡수)
- Phase 2: multi-query (한국어 + 영어) 임베딩 결과 fusion할 때
- 현 시점에서 legacy → rrf 교체의 손익분기점은 Phase 1에 도달.
결정
- default = rrf_boost 유지. 다음 이유:
- legacy 대비 손실이 작음(NDCG -0.005, MRR -0.004).
- 인프라(FusionStrategy ABC)가 Phase 1+ 신호 추가 시 즉시 활용됨.
- boost가 일부 케이스(news_004)에서 가치 입증.
- legacy 보존. Phase 1 reranker 통합 후 재비교를 위해 옵션 유지.
- 평가셋 v0.2 우선순위 상승: graded relevance + ordering 민감 케이스 추가가 fusion 평가에 필요.
부수 개선
normalize_display_scores: SearchResult.score를 [0..1] 랭크 기반 정규화. 기존 frontend의score*100표시 깨짐(>100% 또는 <5%) 수정.