# Hier vs Legacy 검색 교체 go/no-go — Decision

**PR**: PR-DocSrv-Hier-Replace-Diagnose-1 (plan `hier-hazy-waffle.md`)
**측정일**: 2026-05-25 | **branch**: `feat/hier-replace-diagnose`
**결정**: 🔴 **NO-GO** — 절(leaf) 단위 청크로 검색 코퍼스를 교체하지 않는다.

---

## 질문

대형/구조화 문서를 절(clause/leaf) 단위로 분해한 hier 청크가 기존 고정윈도우(legacy) 청크보다 **doc-level 검색 품질이 좋은가?** 좋으면 검색 코퍼스를 교체(`in_corpus` 플립)한다.

## 측정 설계 (비파괴)

- **변종 3종 (chunk leg 뷰 교체, doc-level + fts/trgm = documents 무관)**: `prehier`(legacy baseline, legacy 30952 + null-source 375) / `hier_sim_raw`(post-replace 시뮬, builder 산출 그대로) / `hier_sim_clean`(+ childless-tiny<30자 leaf 제외).
- **exact KNN 양쪽 강제** (`enable_indexscan/bitmapscan=off`) → ivfflat 근사 변수 제거, 청킹 전략만 분리. **공정 비교 = prehier exact vs hier_sim exact.**
- **커버리지 보정 (Phase A)**: eval 타깃 미분해 non-news 47 doc(law 21+library 24+document 2) 분해+임베딩(additive, in_corpus=false). 법령 native 장→절→조 포함 (DOC_MIN_CHARS=4000 게이트 우회). builder spot-check = **held-out 법령**(eval 타깃 제외)으로 검수 → eval 과적합 차단(B1).
- snapshot freeze (doc_id_max=25912, chunk_id_max=71164). in_corpus 634 전 구간 불변.
- **dedup audit (B4)**: 전 변종 0/51 cases — inflation 0, NDCG ≤ 1.0. **회귀는 artifact 아닌 실제값.**

## 결과

### Overall (full-51, graded NDCG@10)
| variant | NDCG | Δ vs prehier | p50 lat |
|---|---:|---:|---:|
| **prehier exact** (legacy 기준) | **0.672** | — | 416ms |
| hier_sim_clean exact | 0.606 | **−0.066** | 1025ms |
| hier_sim_raw exact | 0.603 | −0.069 | 581ms |
| (harness sanity: production path) | 0.671 | — | 485ms |

- harness sanity 0.671 ≈ PR-Eval-V0_2 baseline 0.659 (+0.012 = 634 pilot leaf 편입 + corpus 성장). 측정 체인 정상.
- prehier exact ≈ sanity (0.672 vs 0.671) → 소형 corpus 라 ivfflat ≈ exact.

### 결정權 = 분해-subset (B2)
full-51 은 변종 미영향 doc(news/단일청크 등)으로 희석됨. **hier 가 실제 영향 주는 query(graded 타깃이 분해된 doc) 41건**:

| subset | n | prehier | clean | Δ | raw | Δ |
|---|---:|---:|---:|---:|---:|---:|
| **AFFECTED (결정權)** | 41 | **0.748** | **0.675** | **−0.074** | 0.673 | −0.075 |
| UNCHANGED (sanity) | 10 | 0.023 | 0.023 | +0.000 | 0.016 | −0.007 |

→ 분해된 doc query 에서 hier 가 **−0.074 NDCG 회귀**. unchanged subset 은 변동 0 (변종이 안 건드릴 곳은 안 건드림 ✓).

### 카테고리별 (affected subset, prehier → clean)
| category | n | prehier | clean | Δ |
|---|---:|---:|---:|---:|
| **standards (법령, hier 최적 가설)** | 11 | 0.837 | 0.834 | **−0.002 (flat)** |
| mixed | 8 | 0.494 | 0.463 | −0.031 |
| english_only | 8 | 0.885 | 0.796 | −0.088 |
| korean_only | 7 | 0.723 | 0.614 | −0.109 |
| **exam** | 7 | 0.770 | 0.587 | **−0.183** |

**핵심**: hier 가 가장 유리할 것으로 가정한 **standards(법령 제N조)조차 flat** — 개선 아님. 나머지 전부 회귀, 특히 **exam −0.183**.

### 왜 hier 가 지는가 (per-query losers)
- exam_005(도시가스 매설 이격거리)/exam_006(LPG 안전거리)/exam_001(레이놀즈수 공식) — exam 질문은 **사실이 맥락 속에 있어야** 매칭. 짧은 절 leaf 가 답을 조각냄.
- cl_007(KGS LPG standard)/en_008(ISH Management) — 넓은 개념 query 는 절 leaf 보다 **주변 맥락 보유한 고정윈도우 청크가 더 잘 매칭**.
- winners(소수): cl_004(ASME 설계 실무 +0.18)/kw_008(고압가스법 전문 +0.16) — 특정 절이 정확히 맞는 케이스. 절-단위가 도움되는 query 타입 존재하나 net 부정.

## 판정 (B1~B4)
- **B2 결정權 = AFFECTED subset −0.074** → 명확한 회귀.
- **B3 exact 마진**: hier 가 exact 에서 이미 prehier 에 뒤짐 → production ivfflat(hier leaf 미색인, REINDEX 필요, 짧은 leaf 多 → 근사 품질 악화 경향)에서 뒤집힐 여지 없음. exact 우위 마진이 음수.
- **B4 dedup**: clean/raw 모두 0/51, inflation 0 → 회귀는 실제.
- **B1 과적합**: held-out 튜닝 + raw≈clean → 결과는 builder 튜닝 산물 아님.

## 결정: 🔴 NO-GO

**검색 코퍼스를 hier leaf 로 교체하지 않는다.** 절 단위 청크는 doc-level 검색에서 고정윈도우 대비 개선이 없고(법령 flat) 대체로 회귀(exam/korean/english). `replace_doc_corpus` 대량 적용 + ivfflat REINDEX(`PR-DocSrv-Hier-Replace-Apply-1`)는 **진입 안 함**.

### hier leaf 의 잔존 가치 (폐기 아님)
- **section-outline UI** (`PR-DocSrv-Hier-Section-UI-1`, 배포됨) — 문서 상세의 절 목차/요약. retrieval 과 무관, 그대로 유지.
- 12,697 leaf + 절 분석은 **in_corpus=false 로 잔존** (검색 무영향). 향후 clause-level 답변(Ask/RAG 정밀 passage) 또는 deep-link 기능의 재료.
- **본 측정은 doc-level NDCG 한정.** 절 단위가 도움될 다른 granularity(짧은 passage 반환형 RAG)는 별도 평가 영역 — 본 NO-GO 는 "doc 검색 코퍼스 교체" 한정.

## Out-of-scope / 잔여
- Phase A 가 추가한 47 doc 의 hier leaf 는 in_corpus=false 로 둠 (UI 절 목차에는 노출 — additive).
- 측정 뷰 3종(`corpus_chunks_prehier/hier_sim_raw/hier_sim_clean`)은 reference 로 보존 또는 DROP(사용자 결정). 운영 검색 무영향.
- 47 신규 분해 doc 의 per-leaf 절 분석(Mac mini) = 미실행(retrieval 무관, defer).
- builder 의 법령 childless-tiny 제외(clean predicate)는 hier UI 품질엔 유효 — 향후 UI 트랙에서 builder.py 정식 반영 검토 가능(별 PR).
