Hyungi Ahn
d28ef2fca0
feat(search): Phase 2.1 QueryAnalyzer + LRU cache + confidence 3-tier
QueryAnalyzer 스켈레톤 구현. 자연어 쿼리를 구조화된 분석 결과로 변환.
Phase 2.1은 debug 노출 + tier 판정까지만 — retrieval 경로는 변경 X (회귀 0 목표).
multilingual/filter 실제 분기는 2.2/2.3에서 이 분석 결과를 활용.
app/prompts/query_analyze.txt
- gemma-4 JSON-only 응답 규약
- intent/query_type/domain_hint/language_scope/normalized_queries/
hard_filters/soft_filters/expanded_terms/analyzer_confidence
- 4가지 예시 (자연어 법령, 정확 조항, 뉴스 다국어, 의미 불명)
- classify.txt 구조 참고
app/services/search/query_analyzer.py
- LLM_TIMEOUT_MS=800 (MLX 멈춤 시 검색 전체 멈춤 방지, 절대 늘리지 말 것)
- MAX_NORMALIZED_QUERIES=3 (multilingual explosion 방지)
- in-memory FIFO LRU (maxsize=1000, TTL=86400)
- cache key = sha256(query + PROMPT_VERSION + primary.model)
→ 모델/프롬프트 변경 시 자동 invalidate
- 저신뢰(<0.5) / 실패 결과 캐시 금지
- weight 합=1.0 정규화 (fusion 왜곡 방지)
- 실패 시 analyzer_confidence=float 0.0 (None 금지, TypeError 방지)
app/api/search.py
- ?analyze=true|false 파라미터 (default False — 회귀 영향 0)
- query_analyzer.analyze() 호출 + timing["analyze_ms"] 기록
- _analyzer_tier(conf) → "ignore" | "original_fallback" | "merge" | "analyzed"
(tier 게이트: 0.5 / 0.7 / 0.85)
- debug.query_analysis 필드 채움 + notes에 tier/fallback_reason
- logger 라인에 analyzer conf/tier 병기
app/services/search_telemetry.py
- record_search_event(analyzer_confidence=None) 추가
- base_ctx에 analyzer_confidence 기록 (다층 confidence 시드)
- result confidence와 분리된 축 — Phase 2.2+에서 failure 분류에 활용
검증:
- python3 -m py_compile 통과
- 런타임 검증은 GPU 재배포 후 수행 (fixed 7 query + 평가셋)
참조: ~/.claude/plans/zesty-painting-kahan.md (Phase 2.1 섹션)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 14:21:37 +09:00
..
2026-04-07 13:46:04 +09:00
2026-04-07 13:46:04 +09:00
2026-04-07 13:46:04 +09:00
2026-04-08 14:21:37 +09:00
2026-04-08 12:41:47 +09:00
2026-04-08 13:02:23 +09:00
2026-04-07 13:46:04 +09:00