Files
hyungi_document_server/evals/markdown
Hyungi Ahn e4fe18b7a8 docs(eval): 1D pilot 약식 평가 결과 기록
사용자 quality 평가:
  "애플펜슬로 필기한건 내 글씨체 이슈에 더해서 좋은 자료를 뽑아내지
   못하네 그 외에는 잘되는거 같은데"

분류:
  overall_pass=true   24건 — 일반 PDF (born-digital + scan-like 中
                              5127 같이 정상 변환되는 케이스)
  overall_pass=false   4건 — 애플펜슬 필기 4건 (4798/4813/4815
                              controlled_backfill + 4809 anchor)
  overall_pass=empty   2건 — page_count > MAX_PAGES=200 의도 skip
                              (5178 ASME 272p, 5180 ASME Sec I 453p)

정식 rubric 5축 (text_accuracy/structure/noise_rate/multi_script/
completeness) 점수는 비워둠 — 사용자 약식 판정으로도 의사결정 매트릭스
분기 (필기만 fail → SKIP rule 확장) 가 명확해 정식 채점 over-investment.

후속 라운드 (Marker 튜닝/대안 OCR 도입 시) 같은 30건 재평가에는 정식
rubric 채울 가치 있음.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 08:15:33 +09:00
..

Phase 1D — Markdown Conversion Pilot 평가

Plan: ~/.claude/plans/stratified-mingling-otter.md Script: scripts/phase1d_pilot.py (subcommands: select / enqueue / report / eval_template)

목적

30건 stratified sample 로 marker-pdf 의 failure mode 종류 발견. 통계적 대표성이 아니라 진단 도구. 결과로 다음 분기점 판정:

  • Phase 2 풀 backfill 진입 가능?
  • SKIP rule 확장 필요?
  • Marker 튜닝 / 대안 (kordoc / OCR 전처리 hybrid) 우선?

Sample 구성

pilot_1d_sample.csv — 30 rows × 15 columns. 시드 20260502 고정.

sample_source 분리

sample_source n 의미
existing_success 5 기존에 변환 성공한 PDFs. forced anchor (doc 4809 Note_240805_용접교육 필기) + calibration 4. pilot 후 같은 문서 재변환 결과와 비교해 개선 여부 판정 anchor.
controlled_backfill 25 pending 262건 中 4축 stratified 로 신규 변환. 분포: handwritten 3 / scan_likely 2~3 / mixed 5 / born_digital 12 / large 2

4 축 stratification

Axis Buckets
doc_type study_note / Academic_Paper / Reference / Note / Manual / Standard / Specification / NULL
file_size_band S (<1MB) / M (1~10MB) / L (>10MB)
text_density_band scan-likely (<5 chars/KB) / mixed (5~50) / born-digital (>50)
handwritten_hint hi (title/path 매칭: 필기/노트/handwritten/scan/스캔) / lo

보조 컬럼: script_mix (Hangul/CJK/Latin 비율 라벨), page_count_estimate (existing_success 만 채워짐), forced_include_reason.

Rubric (사용자 평가, 1~5 점)

각 sample 1건 당 MarkdownDoc viewer + PDF 원본 토글 비교하면서 5축 점수 + boolean + notes:

정의 1점 5점
text_accuracy OCR/추출 정확도 알아보기 어려움, ghost text 다발 원본과 거의 동일, OCR 오타 1~2건
structure heading/list/table 구조 보존 구조 완전 유실, 한 덩어리 텍스트 원본의 heading 계층 + table row 그대로
noise_rate 의미 없는 반복/garbage 토큰 본문 30%+ 가 noise noise 거의 없음
multi_script 한중일/특수문자 혼합 정확도 잘못된 스크립트로 mojibake 원본 스크립트 그대로 보존
completeness 본문 누락 페이지 절반 이상 빠짐 누락 없음

overall_pass (true/false) — "이 markdown 으로 검색/참고에 쓸 만한가" 직관 판단. rubric 점수 합계와 별도로 보존.

notes — 자유서술. 특히 알려진 failure pattern (예: TO STAND 12/4 반복, 한중일 mojibake) 재현 시 명시.

평가 워크플로우

0. Pre-eval

evals/markdown/pilot_1d_eval.csv 가 비어 있다면 (또는 새 라운드면) 스켈레톤 생성:

ssh hyungi@100.111.160.84 \
  "docker compose -f ~/Documents/code/hyungi_Document_Server/docker-compose.yml \
   exec fastapi python /app/scripts/phase1d_pilot.py eval_template \
   --in /tmp/phase1d_pilot.json \
   --csv /app/evals/markdown/pilot_1d_eval.csv"

1. 한 건씩 평가

브라우저에서 https://document.hyungi.net/documents/<doc_id> 열기:

  1. 기본 표시 (Markdown 또는 PDF iframe — canShowMarkdown 따라) 확인
  2. PDF 원본 토글 클릭해서 PDF 와 비교
  3. 5축 점수 매기기 (1~5)
  4. overall_pass true/false 결정
  5. notes 에 발견된 failure pattern 기록 (있으면)
  6. 결과를 evals/markdown/pilot_1d_eval.csv 에 입력

10건씩 3 세션 분할 권장 (총 ~2.5h 사람 시간).

2. 의사결정 매트릭스

평가 끝난 30건의 분포로:

결과 패턴 다음 액션
overall_pass ≥ 25/30 (83%+) 전 영역 Phase 2 풀 backfill 본 plan 작성. SKIP rule 확장 불필요.
overall_pass 20~24 + 특정 영역 (예: 필기) 만 fail SKIP_DOC_TYPES / source_kind heuristic 으로 약점 영역 제외 → 나머지 풀 backfill
overall_pass < 20 또는 systemic 결함 (multi_script 전반 fail 등) Marker 설정 튜닝 또는 대안 (kordoc vs marker 비교, OCR 전처리 추가) — Phase 1B 재설계
backfill 자체 실패율 > 10% (failed/timeout) marker-service 안정화 우선. 1D 평가 보류.

3. anchor 비교

existing_anchor (doc 4809) 의 평가 결과는 다음 라운드 (Marker 튜닝 또는 대안 도입 후) 같은 문서 재변환 결과와 1:1 비교. 점수 개선 여부가 튜닝 효과의 가장 깨끗한 신호.

4. Marker 자가 metrics 와 cross-check

md_extraction_quality.metrics (markdown_heading_count / markdown_table_row_count / text_length_ratio 등) 는 Marker 자가 진단. 사람 평가와 비교:

  • Marker 가 "tables=237" 인데 사람 평가 structure=1 → 자가 진단 false positive
  • text_length_ratio < 1 인데 사람 평가 completeness=5 → ratio 가 좋은 proxy 아닐 수 있음

이런 mismatch 가 md_extraction_quality.score 정의의 출발점 (현재 score 항상 null).

파일

파일 역할 갱신 시점
pilot_1d_sample.csv 30건 sample 정의 (선정 결과). 시드 20260502 재현 가능. select 결과 commit (1회)
pilot_1d_eval.csv 사용자 평가 결과 (rubric 점수 + overall_pass + notes) 사용자 평가 종료 시 commit
README.md 본 가이드 초기 commit

실행 환경

GPU 서버 fastapi 컨테이너 안에서 실행 — DB / NAS NFS / md_extraction_quality JSONB 접근 필요:

ssh hyungi@100.111.160.84
cd ~/Documents/code/hyungi_Document_Server
docker compose exec fastapi python /app/scripts/phase1d_pilot.py select \
  --csv /app/evals/markdown/pilot_1d_sample.csv

enqueue 의 --yes 또는 --no-dry-run 류 실행은 별도 사용자 승인 + 야간 단발 sweep 윈도우 (23:00~03:00 KST) 안에서만. 30건 backfill = marker-service BATCH_SIZE=1 × 평균 5분/건 ≈ 2.5h.