골든셋 정비 — B-6 「정답 없음」 케이스 · C-4 라벨 뜻 · GS-205

무엇을

판정(09-30) 전에 골든셋 쪽에 열려 있는 셋을 닫는다.

  1. B-6 「관련 문서 없음」 문턱 — 근거가 부족하면 카드를 내지 않아야 하는데 「정답 없음」 케이스가 골든셋에 없어 문턱을 잴 수 없다. 여권 조항 부재(고객은 묻는데 지식베이스에 없다)가 그 실제 사례다
  2. C-4 라벨의 뜻 — 기획서의 C-4 와 골든셋이 붙인 C-4 가 같은 것을 가리키는지 확인하고, 다르면 기획서를 고칠지 라벨을 옮길지 결정 기록으로 남긴다
  3. GS-205 — nori _analyze 로 실제 토큰을 확인하고, compare_retrievers.py 가 항목별 상위 k 를 남기게 한다(지금은 집계만 남아 왜 틀렸는지 다시 돌려야 안다). GS-204 는 decisions/123 으로 닫혔다

지켜야 할 것

수치를 올리려고 라벨을 고치지 않는다. 123 이 쌍둥이 조항 라벨을 안 고치고 출제 규약을 적은 것과 같은 원칙이다. 케이스를 더하면 골든셋 버전을 올리고, 이전 수치와 표본 수가 달라졌음을 함께 적는다.

완료 조건

2026-09-22 — ③ GS-205 원인 · 항목별 상위 k (류준)

①② 는 팀 결정 대기라 이 티켓은 in-progress 로 둔다.

GS-205 — 왜 틀리나

질의 "이건 시에서 결정해주시는 건가요"(맥락 없음), 정답 DASAN-TERM-1.2 안내 범위의 한계. 로컬 ES 9.5.1 + nori, 인덱스 callguard-kb-single 100청크, _analyze(analyzer korean) 실측:

  토큰
질의 이건·이거(NP) · ㄴ(JX) · 시(NNG) · 에서(JKB) · 결정(NNG) · 해·하(XSV) · 아(EC) · 주(VX) · 시(EP) · 는(ETM) · 건가요·것(NNB) · 이(VCP) · ᆫ가요(EC)
TERM-1.2 안내 · 범위 · 한계 · 센터 · 절차 · 기준 · 창구 · 민원 · 최종 · 처리 · 권한 · 소관 · 부서 · 결정 · 확정 · 약속 … + 조사·어미
겹침 결정 하나(내용어, text df 3) + 는(df 80)·이(84)·하(99)

BM25 상위 5(09-22): TERM-3.13 전자고지 신청·해지 · 3.15 옥내 배관 · 4.15 신혼부부 특별공급 · 4.21 각종 신고 · 3.4 수도요금 자동납부 신청·해지. 정답은 26위(매칭 89건 중). 위에 온 문서의 매칭 토큰은 해·는·시·에서·주 — 내용어가 하나도 없다.

원인 — ① 분석기에 품사 필터(nori_part_of_speech)가 없어 조사·어미·보조용언이 그대로 색인·질의된다. 특히 해지가 해/VV + 지로 오분석돼 질의의 해주시는(해/XSV)과 맞고, 질의의 시(서울시, NNG)가 문서의 발생 시(NNB)와 같은 문자열로 맞는다. ② 발화 자체에 내용어가 결정 하나뿐이고 맥락(context_utterances)도 없다 — 정답 조항은 「소관 부서의 최종 처리 권한」이라고 쓰지 「시에서 결정」이라고 쓰지 않는다. dense·리랭크도 못 맞힌다(아래) — 어휘 문제만은 아니다.

변형 GS-205 상위 1 전체 Recall@5 (96건)
bm25 miss (26위) TERM-3.13 0.823 (79/96), MRR 0.664
dense (KoE5) miss (9위) MANUAL-1.6 금액·기간을 단정하지 않는다 0.979 (94/96), MRR 0.885 — 놓친 것 GS-204·GS-205
rerank(bm25) cand=20 miss TERM-3.15 0.906 (87/96), MRR 0.868

측정: 2026-09-22 · 커밋 6d93181-dirty(이 변경을 얹은 작업 트리 — 검색 코드는 6d93181 그대로) · scripts/compare_retrievers.py --only "bm25,dense,rerank(bm25) cand=20" · 골든셋 v1-150.json module B 96건 · 로컬 CPU(Darwin arm64). 1회 실행이라 기준선이 아니다. 26위·9위는 같은 날 ES 직접 조회(size 200 / dense top_k 50)로 본 값이다.

고칠 수 있나 — 후보는 있고 채택하지 않았다. 임시 인덱스에 nori_part_of_speech(기본 stoptags)만 더해 BM25 를 다시 재 보니(같은 날 · 같은 96건 · 1회, 인덱스는 지웠다) GS-205 가 2위로 들어오고 전체 Recall@5 0.823 → 0.854(79→82/96), MRR 0.664 → 0.714 였다. 얻은 것 GS-102·205·219·225·290, 잃은 것 GS-206·241. ⚠ 분석기는 운영 인덱스·재적재·청킹 비교(w4-chunking-compare)에 전부 걸린다 — 골든셋 한 번 돌린 값으로 바꾸면 골든셋에 맞춘 것이 된다. 바꾸려면 결정 기록을 쓰고, 고르는 데 안 쓴 항목으로 다시 잰다. 라벨은 고치지 않는다(decisions/123) — 정답 조항 1.2 는 맞다.

2026-09-22 (2) — ①② 닫음 (류준)

① B-6 — 완료 조건은 「케이스 + 측정·기록」이고 둘 다 됐다. 케이스 24건(GS-701~724)과 분포 측정은 w5-b6-no-answer-threshold 가 했다. 골든셋이 v1-150.1(14건 바꿔 씀, decisions/212)로 바뀌어 같은 스크립트로 다시 쟀다 — 결론은 09-21 과 같다.

2026-09-22 11:30 · 커밋 c526989-dirty(추적 안 되는 .claude/worktrees 뿐 — 추적 파일 변경 0) · 골든셋 v1-150.1 · mps · Darwin arm64
ELASTICSEARCH_URL=http://127.0.0.1:9200 .venv/bin/python scripts/measure_no_answer_threshold.py --device mps --out jekyll/assets/no-answer-threshold-2026-09-22.json
표본  정답 있음 B 96건(상위5 적중 BM25 78 · dense 93 · rerank 93) · 정답 없음 B-6 24건
계열 정답 0건 잃는 최대 t → 걸러냄 정답 1건 잃는 t → 걸러냄 전부 거르는 t → 정답 잃음
BM25(운영) 4.718 → 3/24 5.431 → 5/24 14.578 → 32/78
dense 0.630 → 6/24 0.671 → 15/24 0.762 → 37/93
dense + rerank −9.527 → 6/24 −7.150 → 15/24 −2.965 → 26/93

② C-4 — decisions/211 채택(사용자 지시). 기획서 2.4절·사이트 docs/02·docs/domain.md·rfp-harness.md·골든셋 README·DTO·스키마 주석·칸반 배지·rules.py 갈래표를 고쳤다. 코드 동작·골든셋·채점은 한 글자도 안 바뀐다(하네스는 C 를 이진 채점). 지식베이스 MANUAL.md 표지(211 의 5번)만 ES 재적재가 따라 09-30 판정 뒤로 미뤘다.

③ GS-205 — 위 09-22 절. 품사 필터 채택 여부는 미결에서 추적한다(이 티켓 밖).