docs: 실이미지 20장 첫 실측 기록 — 20/20 포화, 축 예산 합이 상한을 넘는다
sample/ 20장을 별도 DB 로 시드해 이 프로젝트 최초의 실이미지 측정을 했다. 증거 1,615행(Vision 809 + 네이버 692)이 붙었고 결과는 20장 전부 100점/high 다. 탐지는 정상이다 — 15장은 웹에서 완전일치(similarity 1.00) 사본이 발견됐고 4장은 근사일치다. 문제는 밴드가 아니라 순서가 없다는 것이다. 큐 기본 정렬이 riskScore 내림차순인데 전부 100 이라 정렬이 no-op 이고, 운영자는 구별되지 않는 20건을 받는다. 근본 원인은 축별 예산의 합이다. 인물 35 웹 게시 60 (캡 있음) 웹 엔티티 20 (캡 있음) 검색결과 유사도 캡 없음 — 장당 평균 216 네이버 승격 캡 없음 — 장당 평균 70 앞의 세 축만 더해도 115 로 이미 상한 100 을 넘는다. v2~v4 가 축을 하나씩 캡했지만 합을 한 번도 보지 않았다 — 어제 만든 432조합 격자가 high 92% / 포화 80% 를 보고했는데 실이미지에서는 100% 다. 캡 없는 두 축에 캡을 씌우는 것으로는 안 된다. 지문 80/네이버 50 과 60/40 을 실제 코퍼스 데이터로 시뮬레이션했으나 20/20 이 그대로 100 이었다. 축 예산을 총합 기준으로 재배분해야 하고 그것은 제품 결정이라 임의로 하지 않았다. 검색결과 유사도가 +80/건 무제한인 것은 v2 가 고친 것과 같은 논리 오류다. 같은 이미지가 웹에 있다는 하나의 사실을 발견된 URL 수만큼 세고 있다. 코퍼스 한계: 20장 전부 웹 유통 인물 사진이라 low 기대군이 0건이다. 이 코퍼스로는 medium/low 임계를 검증할 수 없다(lowBandRejectionRate 분모 0). 첫 시도는 내 스크립트가 .env 로딩(__main__.py:70)을 빠뜨려 프로바이더가 전부 비활성이었다. 외부 호출 0콜이라 쿼터 손실은 없었고, 그 무효 런이 부수적으로 두 가지를 알려줬다 — 웹 증거가 0건이어도 인물만으로 35/medium 이 되고, external_skipped 는 점수에도 사유에도 뜨지 않아 키 만료나 쿼터 고갈이 조용히 지나간다. sample/ 과 corpus/ 를 gitignore 에 넣었다. 저작권 실이미지가 납품 저장소를 따라가면 안 된다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BStHFrjQj2VypecSG9ex1V
This commit is contained in:
parent
c740c2e6ba
commit
352031cf45
2 changed files with 10 additions and 0 deletions
8
.gitignore
vendored
8
.gitignore
vendored
|
|
@ -52,3 +52,11 @@ Microsoft/
|
|||
# 은 개발 머신의 절대 경로와 크롬 설치 경로를 평문으로 담는다 - 폐쇄망 납품 저장소가
|
||||
# removable media 로 건너가는 구조라 이력에 한 번 들어가면 제거가 어렵다.
|
||||
docs/diagrams/*.visual-check.*
|
||||
|
||||
# 캘리브레이션 코퍼스 이미지 (저작권 있는 실이미지)
|
||||
#
|
||||
# 판정 임계를 검증하려면 실제 유통 이미지가 필요한데, 그것을 저장소에 넣으면
|
||||
# 납품 저장소가 removable media 로 건너가는 구조에서 그대로 따라간다.
|
||||
# 이미지는 로컬에만 두고 코퍼스 DB(data/)도 이미 제외되어 있다.
|
||||
sample/
|
||||
corpus/
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
# Project INDEX
|
||||
|
||||
- 2026-09-22 · **실이미지 20장 첫 실측 — 20/20 이 100점/high, 포화율 100%.** 이 프로젝트 최초의 실이미지 코퍼스(`sample/` 20장 → `data/corpus.sqlite3`, 증거 1,615행, Vision 809 + 네이버 692). 8/8 평가는 합성 격자에서 high 77.7%·포화 56.2%였는데 **실이미지에서는 전부 상한**이다. 탐지 자체는 정상 — 15/20 은 웹에서 **완전일치(similarity 1.00) 사본**이 발견됐고 4장은 근사일치다. 문제는 밴드가 아니라 **순서가 없다는 것**이다(큐 정렬이 riskScore 내림차순인데 전부 100이라 no-op). 근본 원인은 축별 예산의 합이다 — 인물 35 + 웹게시 60 + 엔티티 20 = **115 로 이미 상한 초과**이고, 여기에 캡이 없는 두 축(검색결과 이미지 유사도 장당 평균 216점, 네이버 승격 평균 70점)이 더해진다. 최대 245점 대 상한 100. **캡 없는 두 축에 캡을 씌워도(지문 80/네이버 50, 60/40 모두 시뮬레이션) 20/20 이 그대로 100** — v2~v4 가 축을 하나씩 캡했지만 **합을 한 번도 보지 않았다.** 검색결과 유사도가 +80/건 무제한인 것은 v2 가 고친 것과 같은 오류다(같은 이미지가 웹에 있다는 **하나의 사실**을 URL 수만큼 셈). 코퍼스 한계도 명시: 20장 전부 웹 유통 인물 사진이라 **low 기대군이 0건** — 이 코퍼스로는 medium/low 임계를 영원히 검증할 수 없다(`lowBandRejectionRate` 분모 0). 첫 시도는 `.env` 로딩 누락으로 프로바이더가 전부 비활성이었고(외부 호출 0콜) 그 무효 런이 부수적으로 알려준 것 — **웹 증거 0건이어도 인물만으로 35/medium** 이고 `external_skipped` 는 점수·사유 어디에도 안 뜬다(키 만료·쿼터 고갈이 조용히 지나간다). `sample/`·`corpus/` 를 gitignore 에 추가(저작권 이미지 커밋 방지)
|
||||
|
||||
- 2026-09-22 · **캘리브레이션 측정 도구 신설 + 구조적 거동 첫 실측.** `SCORER_VERSION` 이 v1→v4 로 갔는데 v3(제공자별 풀링)·v4(신뢰 출처)는 분포를 한 번도 측정하지 않고 나갔다 — 8/8 평가의 224조합 하네스가 저장소에 없고(그 문서의 두 수치 174/224=77.7% 와 82.6% 가 서로 안 맞아 격자가 달랐음을 시사) 과거와 비교 가능한 재현이 불가능해, 격자를 명시적으로 고정한 `scripts/score_distribution.py`(432조합)를 새 기준선으로 만들었다. **실측 결과(v4)**: 신뢰 출처 미등록 시 high 92% · 100점 포화 80% · **웹 신호만으로 high 13/24**, 신뢰 출처 등록 시 high 63% · 포화 38% · 웹 전용 high 0/24. 드러난 것 — v2 가 세운 "웹 존재만으로 high 불가" 원칙이 깨져 있다(presence 풀 60 + entity 풀 20 = 80, 두 풀의 **합**은 캡되지 않음), 그리고 **v3 의 제공자별 풀링이 이를 키웠다**(웹 전용 high 4/12 → 9/12, 전체 high 88% → 97%). 대응 후보(웹 유래 총합 상한)는 미적용 — 적용하면 또 한 번의 미측정 변경이 되므로 결정 후 진행한다. 함께 `scripts/sweep_thresholds.py`(판정 시점 `decisionSnapshot.riskScore` 기준 임계 스윕, 가짜 판정 6건으로 동작 검증)와 `docs/operations/calibration-corpus.md`(이미지 구성·쿼터 준비·투입·판정·측정 절차) 신설. **실이미지 코퍼스와 판정은 사람이 해야 한다** — 판정을 내가 만들면 측정이 성립하지 않는다. **ruff clean · pytest 645 passed**
|
||||
|
||||
- 2026-09-21 · **반려 키보드 완결** — 승인·보류는 1타인데 반려만 메모 필수라 손이 마우스로 갔다(8/8 평가 P2-10). `R` 이 메모 필드에 포커스만 주고, 입력 중에는 전역 단축키가 막혀서 거기서부터는 **마우스로만 제출**할 수 있는 구조였다 — 법적으로 가장 중요한 경로가 가장 느렸다. `R` → 사유 선택 모드(프리셋 1~9 번호 표시) → 숫자 1타로 반려 완료, 자유 서술은 메모 안에서 `Ctrl+Enter`. 화면의 번호가 곧 단축키가 되도록 프리셋 칩에 키 배지를 붙였다(외울 필요 없음). **숫자는 사유 선택 모드 안에서만 의미를 갖는다** — 모드 밖에서 잘못 누른 키 하나로 반려가 나가면 안 되고, 그 가드 순서를 테스트로 고정했다. 실렌더(Playwright): `R`→`2` 로 `{"decision":"rejected","memo":"라이선스 확인 불가로 반려"}`, 메모+`Ctrl+Enter` 로 `{"decision":"rejected","memo":"자유 서술 사유"}`, 콘솔 에러 0. 반려 후 승인·보류와 같이 다음 미심사 케이스로 이동한다. **ruff clean · pytest 645 passed**(정적 3건)
|
||||
|
|
|
|||
Loading…
Reference in a new issue