feat(ask): Phase 3.5a guardrails (classifier + refusal gate + grounding + partial)
신규 파일: - classifier_service.py: exaone binary classifier (sufficient/insufficient) parallel with evidence, circuit breaker, timeout 5s - refusal_gate.py: multi-signal fusion (score + classifier) AND 조건, conservative fallback 3-tier (classifier 부재 시) - grounding_check.py: strong/weak flag 분리 strong: fabricated_number + intent_misalignment(important keywords) weak: uncited_claim + low_overlap + intent_misalignment(generic) re-gate: 2+ strong → refuse, 1 strong → partial - sentence_splitter.py: regex 기반 (Phase 3.5b KSS 업그레이드) - classifier.txt: exaone Y+ prompt (calibration examples 포함) - search_synthesis_partial.txt: partial answer 전용 프롬프트 - 102_ask_events.sql: /ask 관측 테이블 (completeness 3-분리 지표) - queries.yaml: Phase 3.5 smoke test 평가셋 10개 수정 파일: - search.py /ask: classifier parallel + refusal gate + grounding re-gate + defense_layers 로깅 + AskResponse completeness/aspects/confirmed_items - config.yaml: classifier model 섹션 (exaone3.5:7.8b GPU Ollama) - config.py: classifier optional 파싱 - AskAnswer.svelte: 4분기 렌더 (full/partial/insufficient/loading) - ask.ts: Completeness + ConfirmedItem 타입 P1 실측: exaone ternary 불안정 → binary gate 축소. partial은 grounding이 담당. 토론 9라운드 확정. plan: quiet-meandering-nova.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
58
tests/phase3_5_eval/queries.yaml
Normal file
58
tests/phase3_5_eval/queries.yaml
Normal file
@@ -0,0 +1,58 @@
|
||||
# Phase 3.5a Smoke Test Evaluation Set (10 queries)
|
||||
# 목적: 구조 검증 (smoke test), 정밀 튜닝 아님
|
||||
# Phase 3.5b 에서 30+ 쿼리로 확장 예정
|
||||
|
||||
queries:
|
||||
# 정상 (4) — full answer expected
|
||||
- q: "산업안전보건법 제6장 주요 내용"
|
||||
expected_completeness: full
|
||||
expected_refuse: false
|
||||
notes: "prewarm #1. evidence 충분."
|
||||
|
||||
- q: "기계 사고 관련 법령"
|
||||
expected_completeness: full
|
||||
expected_refuse: false
|
||||
notes: "prewarm #2. 법령 도메인."
|
||||
|
||||
- q: "유해화학물질을 다루는 회사가 지켜야 할 안전 의무"
|
||||
expected_completeness: full
|
||||
expected_refuse: false
|
||||
notes: "prewarm #5. 긴 자연어 쿼리."
|
||||
|
||||
- q: "위험성평가 절차"
|
||||
expected_completeness: full
|
||||
expected_refuse: false
|
||||
notes: "prewarm #12. 짧은 키워드 쿼리."
|
||||
|
||||
# no-result (2) — insufficient expected
|
||||
- q: "xyzzy_nonexistent_query_12345"
|
||||
expected_completeness: insufficient
|
||||
expected_refuse: true
|
||||
notes: "Phase 3 에서 이미 검증됨."
|
||||
|
||||
- q: "제주도 감귤 출하량 통계"
|
||||
expected_completeness: insufficient
|
||||
expected_refuse: true
|
||||
notes: "corpus 에 확실히 없는 도메인."
|
||||
|
||||
# tricky mismatch (2) — classifier/grounding 핵심 케이스
|
||||
- q: "산업안전보건법 제6장 처벌 조항"
|
||||
expected_completeness: partial
|
||||
expected_refuse: false
|
||||
notes: "제6장 내용은 있지만 처벌(제10장 벌칙)은 없음. intent_misalignment 이 잡아야 함."
|
||||
|
||||
- q: "화학물질관리법과 산업안전보건법의 차이"
|
||||
expected_completeness: partial
|
||||
expected_refuse: false
|
||||
notes: "복합 쿼리. 하나만 있을 수 있음."
|
||||
|
||||
# cross-domain (2)
|
||||
- q: "Python async best practice"
|
||||
expected_completeness: insufficient
|
||||
expected_refuse: true
|
||||
notes: "corpus 에 영어 프로그래밍 문서 적음."
|
||||
|
||||
- q: "EU AI Act"
|
||||
expected_completeness: full
|
||||
expected_refuse: false
|
||||
notes: "news 도메인. prewarm #11."
|
||||
Reference in New Issue
Block a user