Files
hyungi_document_server/migrations/015_search_failure_logs.sql
Hyungi Ahn f005922483 feat(search): Phase 0.3 검색 실패 자동 로깅
검색 실패 케이스를 자동 수집해 gold dataset 시드로 활용.
wiggly-weaving-puppy 플랜 Phase 0.3 산출물.

자동 수집 트리거 (3가지):
- result_count == 0           → no_result
- confidence < 0.5            → low_confidence
- 60초 내 동일 사용자 재쿼리   → user_reformulated (이전 쿼리 기록)

confidence는 Phase 0.3 휴리스틱 (top score + match_reason).
Phase 2 QueryAnalyzer 도입 후 LLM 기반으로 교체 예정.

구현:
- migrations/015_search_failure_logs.sql: 테이블 + 3개 인덱스
- app/models/search_failure.py: ORM
- app/services/search_telemetry.py: confidence 계산 + recent 트래커 + INSERT
- app/api/search.py: BackgroundTasks로 dispatch (응답 latency 영향 X)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 08:29:12 +09:00

36 lines
1.8 KiB
SQL

-- Phase 0.3: 검색 실패 자동 로깅
--
-- 목적: gold dataset 시드 수집. 평가셋(tests/search_eval/queries.yaml) 확장 재료.
-- 자동 수집 트리거:
-- 1) result_count = 0 → failure_reason = 'no_result'
-- 2) confidence < 0.5 → failure_reason = 'low_confidence'
-- 3) 같은 사용자 60초 내 재쿼리 → failure_reason = 'user_reformulated' (이전 쿼리 기록)
--
-- confidence는 Phase 0.3 시점엔 휴리스틱(top score 기반).
-- Phase 2 QueryAnalyzer 도입 후 LLM 기반 confidence로 교체될 예정.
CREATE TABLE IF NOT EXISTS search_failure_logs (
id BIGSERIAL PRIMARY KEY,
query TEXT NOT NULL,
user_id BIGINT REFERENCES users(id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
result_count INTEGER NOT NULL,
confidence DOUBLE PRECISION, -- 0..1, NULL이면 미산정
failure_reason VARCHAR(30) NOT NULL, -- no_result | low_confidence | user_reformulated
context JSONB, -- top_score, mode, returned_ids[], reformulated_to 등
reviewed BOOLEAN NOT NULL DEFAULT FALSE -- 평가셋에 흡수되었는지 표시
);
-- 사용자별 시간순 조회 (recent failures, 동일 사용자 패턴 분석)
CREATE INDEX IF NOT EXISTS idx_search_failure_user_time
ON search_failure_logs (user_id, created_at DESC);
-- failure_reason별 집계 (대시보드/리포트)
CREATE INDEX IF NOT EXISTS idx_search_failure_reason
ON search_failure_logs (failure_reason, created_at DESC);
-- 미리뷰 항목 우선 노출 (gold dataset 큐레이션 작업 큐)
CREATE INDEX IF NOT EXISTS idx_search_failure_unreviewed
ON search_failure_logs (created_at DESC)
WHERE reviewed = FALSE;