← Mealplanning 페이지로
CRF 서빙 포맷 등가성 — 실제 재실행실제 재실행
출처 · ml/ingredient-ner (score_gold.py · 등가성 검증 스크립트)  |  시점 · 2026-08-31 재실행
지표 · span P/R/F1 (사람 검수 gold 50건) · 두 경로 예측 일치 건수
이 근거로 내린 판단 · 예측이 완전히 같음을 확인한 뒤에만 서빙 포맷을 바꿈

보존된 스크립트로 다시 돌린 결과

2026-08-31 재실행 · 학습 산출물(crf_ingredient.pkl·crf_ingredient.crfsuite)과 사람 검수 gold 50건이 그대로 남아 있어 그대로 다시 채점했습니다.

$ python score_gold.py
gold 레코드: 50건 (사람 검수)
  약지도(사전)      vs gold — P 0.934 · R 0.928 · F1 0.931
  CRF          vs gold — P 0.930 · R 0.918 · F1 0.924

--- CRF 오류 표본(최대 5건) ---
  새우두부계란찜
    놓침: ['새우', '두부', '계란찜']
    오탐: ['새우두부계란찜']
  김 10g, 마늘 8g, 생강 5g, 통깨 1.3g [소스소개]양념간장:물 30g
    놓침: ['소스', '양념간장']
  닭가슴살(40g), 노랑 파프리카(20g), 양파(15g), 오이(15g), 당근
    놓침: ['잣가루', '간장']

$ python equiv_check.py   # V-01 등가성 — 피클 vs .crfsuite
gold 문장: 50건

라벨 시퀀스 완전 일치 : 50/50
추출 스팬 완전 일치   : 50/50

모델 로드 시간  A(피클)      1.0 ms   B(.crfsuite)      0.2 ms
모델 파일 크기  crf_ingredient.pkl            343,657 B
모델 파일 크기  crf_ingredient.crfsuite       308,688 B

판정: PASS — 예측 완전 일치

무엇을 확인한 것인가

서빙에서 학습 라이브러리를 걷어내려면 예측이 한 건도 달라지지 않는다는 것이 먼저 증명돼야 했습니다. 그래서 채택 조건을 «크기가 줄었다»가 아니라 «출력 완전 일치»로 정하고, 두 경로의 라벨 시퀀스와 추출 스팬을 전수 비교했습니다. 50건 전부 일치했고 그 뒤에 반영했습니다.

문제를 처음 발견한 것은 제가 아닙니다. 제가 한 것은 등가성 증명을 요구하고, 검증 기준을 정하고, 결과를 확인한 뒤 채택을 결정한 것입니다.