ADR 0024 — V2 사무실 기억 검색 품질 Phase 2
- Status: Implemented (PR-1 ~ PR-4 머지 완료, 2026-04-26)
- Date: 2026-04-26
- Decision Drivers: V2 사무실 기억 검색 (ADR 0017 머지 후) 의 품질이 측정되지 않고 있었음. 클릭 텔레메트리는 있었지만 정합 지표 (precision/NDCG/MRR) 산출 인프라 부재. 또한 임베딩 + 메타 매칭만으로는 표층 의미 한계 — recall@10 향상 여지 명백.
- Anti-Goal Compliance: 4개 모두 미위반. 변호사 본인 사무실 기억의 retrieval 품질 향상이며 외부 매칭·법률 조언·B2C 와 무관.
결정
V2 사무실 기억 검색 품질을 4단계로 개선:
- PR-1: 텔레메트리 스키마 4 필드 추가 (
reranked·rerankModel·queryExpanded·expandedQueriesCount) + clicked 이벤트dwellMs - PR-2: implicit feedback (클릭) 기반 precision@K · NDCG · MRR 계산 인프라 + 대시보드 카드
- PR-3: LLM rerank 모듈 (Gemini Flash) — DI 기반 fail-soft, top-N 재정렬,
searchRerank메타 플래그 (기본 OFF) - PR-4: multi-query 확장 (deterministic rule-based) — 1 → N 쿼리, MAX 점수 + appearanceBoost 병합,
queryExpansion메타 플래그 (기본 OFF)
배경
ADR 0017 (V2 사무실 기억 검색 파이프라인 완성, 2026-04-23) 머지 후:
- 있는 것: tenantId 격리 임베딩 + findNearest + 메타 매칭 결합 랭킹 (cosine 0.7 + meta 0.3)
- 없는 것:
- 검색 품질 측정 인프라 (precision@5, NDCG@5, MRR — 명시적 평가 좋아요/싫어요 V2 경로엔 미적용)
- LLM rerank — 임베딩 표층 매칭 한계 보완
- multi-query expansion — broader/narrower facet 으로 recall 향상
대시보드 카드 (DashboardSearchQualityCard) 가 rerank A/B Δpp 와 expanded vs baseline 슬롯을 미리 노출하므로 PR-3·PR-4 적용 후 효과 즉시 가시화.
대안 검토
| 대안 | 평가 |
|---|---|
| (1) 명시적 평가 (좋아요/싫어요) UI 추가 | 변호사 추가 클릭 부담 — 채택 안 함 |
| (2) implicit feedback (클릭) 기반 측정 (선택) | 추가 UI 부담 0, 기존 related_memory_clicked 텔레메트리 재활용 |
| (3) Gemini Flash rerank, server-side | CLAUDE.md 규약 위반 (Gemini 클라이언트 전용) — 클라 wiring follow-up |
| (4) Gemini Flash rerank, DI + fail-soft (선택) | 순수 모듈 + DI · production wiring 은 client-side PR-3.5 follow-up |
| (5) LLM 으로 query expansion | 비용 부담 + 응답 시간 — server-side rule 기반이 더 빠름 |
| (6) deterministic rule-based query expansion (선택) | 도메인 키워드 매핑 명시적 + 100% 재현 가능 |
측정 정의
precision@K (binary relevance)
precision@K = (top-K 안 클릭 수) / min(K, cardCount)
NDCG@K (binary relevance)
DCG@K = Σ_{i=0..K-1} rel(i) / log2(i+2)
IDCG@K = 클릭 수 만큼 상위에 모은 이상적 DCG
NDCG@K = DCG@K / IDCG@K (IDCG=0 시 0)
MRR (단일 세션)
MRR = 1 / (firstClickRank + 1) [클릭 없음 → 0]
세션 매칭
(caseId, docKind, actorUid)키로 shown → click 5분 window (SESSION_WINDOW_MS = 300_000)- 새 shown 등장 시 이전 세션 종료
- 동일 rankIndex 중복 클릭 1회만
LLM Rerank 알고리즘 (PR-3)
input: query + ranked top-N + snippets (redactedText, ≤240 char)
output: reranked top-N + applied + modelUsed
1. 빈/단일 후보 → 즉시 fail-soft (applied=false)
2. LLM 호출 (Gemini Flash, JSON 점수 0~100)
3. LLM throw → fail-soft, 원래 ranking 유지
4. LLM 빈 점수 → fail-soft
5. 점수 내림차순 정렬, 동점은 원래 finalScore 내림차순 (안정 정렬)
Multi-Query Expansion 알고리즘 (PR-4)
4 variants 생성 (dedupe 후 최대 4):
V1: [recoveryType] [docType] (+ 상사) (+ bucket) — 가장 정밀
V2: [recoveryType] [docType] (+ 상사) — bucket 제거 (broader)
V3: [recoveryType] [핵심 법령 키워드] — 도메인 적합성
V4: [recoveryType] [docType] — broadest fallback
각 variant: embed → findNearest(pool=15) → rankMemories → top-N
병합:
- 각 docId 점수: variant 결과 중 MAX
- appearanceBoost: 등장 1회 추가당 +0.05 (cap 0.15)
- finalScore + bonus 내림차순 정렬
도메인 법령 키워드:
- debt → 민법 제162조 소멸시효
- divorce → 민법 제840조 이혼사유
- real-estate-eviction → 부동산 인도청구 강제집행
- 등 10 도메인 모두 매핑
Anti-Goal 검증
- ✅ 1번 "민사 외 형사·행정·IP" 미위반 — 사무실 기억 retrieval.
- ✅ 2번 "법률 조언 AI" 미위반 — 검색 품질 측정·재랭크. 변호사 판단 대체 아님.
- ✅ 3번 "의뢰인 B2C 매칭" 미위반.
- ✅ 4번 "변호사 매칭·광고" 미위반.
한계 / 측정 정의의 함정
- 클릭 = 관련 가정의 노출 편향: 상단 클릭 우세 — precision/NDCG 가 항상 정직하지 않음. 그래도 trend (전 주 대비 ↑·↓) 추적은 유효.
- 변호사 직접 입력 시 신호 0: 카드 보지 않고 직접 작성 시 데이터 없음. 사용자 적은 tenant 에선 표본 부족.
- 5분 window 는 임의값: 너무 짧으면 누락, 너무 길면 다른 세션과 혼동. 운영하면서 조정 가능 (
SESSION_WINDOW_MS상수). - rerank top-N 안 재정렬: 풀 확장 (top-2N → 재랭크 → top-N) 은 후속 최적화. 현재는 메타 ranking 으로 결정된 top-N 안에서만 LLM 이 흔듦.
- query expansion 보너스 cap 0.15: 4 variant 모두 등장한 docId 가 너무 우세하지 않도록 보호. 값은 실측으로 조정 가능.
Production 활성화 순서
플래그 모두 기본 OFF. 점진 활성:
- PR-1, PR-2 머지 직후 → 클릭 텔레메트리 자동 기록 시작 → 1주 baseline 측정
features.ai.queryExpansion = trueflip → recall 변화 측정features.ai.searchRerank = trueflip + client-side reranker wiring (PR-3.5) → precision 변화 측정- baseline vs reranked Δpp · expanded vs baseline P@5 카드로 효과 가시화
Minority Report
- P5 (개발자) 우려: rerank 가 client-side wiring 미완 (PR-3.5 follow-up). 메타 플래그·DI·텔레메트리 스키마는 완비. UI 패널이 server action 결과 받은 후 client
firebase/ai로 rerank 하는 흐름은 별도 PR. 이 PR-3 만으론 production 효과 0 (=무위험 ship). - P4 (디자이너) 우려: 대시보드 카드의 "검색 품질" 지표는 변호사가 의미 못 알아들 가능성. precision@5·NDCG·MRR 한국어 라벨/툴팁 보강 후속 필요 (PR-5 외).
- P3 (PM) 우려: 측정 지표는 측정 자체가 목적이 아니라 행동 지표여야 함. trend 가 ↓ 면 무엇을 손볼지 (rerank ON / expansion ON / pool 확장) 명확한 운영 매뉴얼 필요.
- P1 (변호사) 양보 불가: 사무실 기억은 변호사 본인 자산 — V1 결과보다 V2+rerank+expansion 결과가 덜 적합하면 즉시 rollback 가능해야 함. fail-soft + 메타 플래그 단일 OFF 가능 구조 (충족).
후속 과제
- PR-3.5: client-side rerank wiring (CLAUDE.md 규약 — Gemini 클라 전용)
- 풀 확장 rerank: top-2N → LLM rerank → top-N (현재는 top-N 안 재정렬)
- 운영 매뉴얼: precision/NDCG ↓ 시 대처 가이드 (
apps/docs/content/operations/v2-search-quality-runbook.md) - Phase 3: 의뢰인 포털 메시징·알림 (Pack 3 + Phase 2 후 — 사용자 명시 우선순위)