B-6 「관련 문서 없음」 — 정답 없음 골든셋 24건 · 1순위 점수 분포 · 문턱 제안
무엇을
미결 「B-6 「관련 문서 없음」을 실제로 낼 규칙이 없다」(09-15) — 검색이 점수 문턱 없이 항상 5건을 돌려줘 생성 측정 96문항에서 「관련 문서 없음」이 한 번도 안 나왔다. 여권 재발급처럼 지식베이스에 없는 문의에도 엉뚱한 조항 카드가 뜬다. 문턱을 재려면 골든셋에 정답 없음 케이스가 먼저 있어야 한다(0건이었다). 이 티켓은 케이스를 만들고 분포를 잰다 — 문턱 값을 정하지는 않는다.
한 것
- 정답 없음 24건(
GS-701~724,module: "B-6",expected_doc_ids: []) — 타 기관 소관 15 · 시 범위 밖 2 · 잡담 4 · 지식베이스 공백 3. 지식베이스 98조항을 grep 으로 대조해 정말 없는 것만 골랐다. 일부라도 답하는 후보 8건(청약·층간소음·항공권·휴대폰 분실·등기부등본 …)은 뺐다 — 목록은golden-set/README.md module: "B"로 넣지 않았다.hit_at_k가 정답 빈 항목을 True 로 치므로 B 로 새면 Recall@5 가 부풀려진다(6주차 판정 직전,decisions/123과 같은 이유). 하네스no_answer섹션으로 따로 센다 — 포트 없음 / 케이스 0건 /{n, abstained, top1_score_min·median·max}.abstained는 문턱이 없으니 0 이 정직한 값- B 96건 불변 확인 —
run_eval.py --no-ner --retriever bm25전·후 Recall@5 0.833 · MRR 0.666 · n 96 동일(diff 는[no_answer]절 추가뿐) - 분포 측정 스크립트
scripts/measure_no_answer_threshold.py— 판정 로직이 아니라 측정이다. 원자료jekyll/assets/no-answer-threshold-2026-09-21.json - 테스트 — 하네스 3상태(없음/0건/있음) + 전부 기권 + 「B-6 이 B 수치에 안 섞인다」 · 골든셋 로더가 B-6 을 읽는다.
ai435 passed · lint-imports 3 kept ·server1254 passed
측정 (2026-09-21)
측정일 2026-09-21 · 커밋 97f7b25-dirty ⚠ 골든셋·하네스 변경이 커밋되기 전에 쟀다
명령 ELASTICSEARCH_URL=http://localhost:9200 .venv/bin/python scripts/measure_no_answer_threshold.py --device mps
표본 정답 있음 = B 96건(상위5 적중 BM25 80 · dense 94 · rerank 94) · 정답 없음 = B-6 24건
환경 로컬 Darwin arm64 · mps · callguard-kb-single 98조항 · models/koe5 · models/bge-reranker-v2-m3
1순위 점수 분포(정답 있음은 상위 5 적중 항목만) — 눈금이 계열마다 다르다(BM25 raw · 코사인 · 리랭커 로짓):
| 계열 | 정답 있음 min / 중앙 / max | 정답 없음 min / 중앙 / max | 겹침 |
|---|---|---|---|
| BM25(운영) | 4.66 / 15.47 / 35.92 | 4.41 / 7.67 / 14.33 | 4.66~14.33 겹친다 |
| dense | 0.630 / 0.780 / 0.909 | 0.588 / 0.646 / 0.761 | 0.630~0.761 겹친다 |
| dense + rerank | −9.53 / 0.69 / 6.62 | −10.69 / −7.59 / −3.05 | −9.53~−3.05 겹친다 |
| 계열 | 정답 0건 잃는 최대 t → 걸러냄 | 정답 1건 잃는 t → 걸러냄 | 전부 거르는 t → 정답 잃음 |
|---|---|---|---|
| BM25 | 4.66 → 3/24 | 5.36 → 5/24 | 14.52 → 33/80 |
| dense | 0.630 → 6/24 | 0.671 → 15/24 | 0.762 → 37/94 |
| dense + rerank | −9.53 → 6/24 | −7.15 → 15/24 | −3.00 → 22/94 |
세 계열 모두 문턱 하나로 깨끗이 못 가른다. dense 0.671 에서 잡담 4/4 · 시 범위 밖 2/2 는 다 걸러지고, 남는 9건은 전부 「요금·신고·서류·지원금」 어휘가 겹치는
타 기관 소관 문의다 — 어휘가 가까운 오답은 점수로 못 가른다. MANUAL-2.2(소관 안내)는 상위 5 에 BM25 1/24 · dense 0 · rerank 0 이라 그 길로도 못 간다.
문턱 제안 — 팀 결정 후. 코드에 넣지 않았다
- BM25(지금 운영)에는 권하지 않는다 — 손실 1건에 걸러냄 5/24, raw 점수가 질의 길이에 따라 커져 값 하나가 의미를 갖지 않는다.
- 임베딩이 켜지면(
decisions/121) dense 0.67 안팎 — 정답 손실 1/94(GS-218, 1순위가 이미 오답인 항목)로 정답 없음 15/24. 리랭커(−7.15)는 같은 손실에 같은 15/24 라 더 낫지 않았다. - ⚠ 같은 24건으로 고르고 같은 24건에 쟀다. 채택하려면 고르는 데 안 쓴 새 케이스로 다시 잰다(
decisions/206이 k 를 골든셋에서 안 고른 이유와 같다). - 나머지는 점수 밖 신호가 필요하다 — 소관 안내 조항을 검색되게 두거나, 생성 단계 근거 대조(
decisions/207)가 서류 이름을 못 찾으면 카드를 접는 것.
남은 것
- 팀 결정 — 문턱을 둘지, 어느 계열에 어느 값으로 → 미결 B-6 항목에서 추적
- 채택되면 고르는 데 안 쓴 새 B-6 케이스로 재측정 → 그 뒤에 검색 어댑터에 문턱(규칙) → 하네스
abstained가 움직이는지 확인 - 「관련 문서 없음」 vs 「소관 안내」 중 무엇이 맞는 답인지(타 기관 소관 15건) — 프론트 카드 형식과 함께 정한다
2026-09-21 — 닫음 (측정까지가 이 티켓)
케이스 24건·하네스 no_answer 항목·점수 분포 측정·문턱 후보(dense 0.67 안팎, BM25 는 권하지 않음)까지 냈다. 문턱을 코드에 넣는 것은 팀 결정 뒤 새 티켓(새 B-6 케이스로 재측정 → 어댑터 규칙 → abstained 확인)이다 — 같은 24건으로 고르고 재는 자기충족을 피하려는 것이다.