Human-in-the-Loop Labeling
Fast Model → Judge Model → SME Review → Ingest → Iterate
핵심 개념
LLM 모델도, 프롬프트 품질도, 비용도 시간이 지나면 변한다. 그래서 지속되는 자산은 특정 프롬프트나 모델이 아니라 반복 가능한 프로세스다.
핵심 전환은 SME(주제 전문가)의 일을 바꾸는 것이다.
기존: SME가 전부 처음부터 라벨링
전환: SME가 검토 · 수정 · 큐레이션
fast model이 breadth를 주고, judge model이 SME 주의를 어디에 쏟을지 결정하고, SME 수정이 버저닝된 golden dataset으로 돌아온다.
루프
1. 프롬프트를 건드리기 전에 입력을 표준화하라
일관된 문서 “snippet” 개념(doc_id, title, 본문/URL, language, 선택적 메타데이터)으로 모든 워크플로가 같은 방식으로 시작하게 한다.
- 프롬프트가 단순하고 안정적이 된다
- 배치 사이징이 예측 가능해진다
- 프로젝트마다 “문서를 모델에 어떻게 먹이지?”를 다시 쓰지 않게 된다
2. Fast-model 대량 패스 (breadth first)
값싸고 빠르게 후보 라벨을 대규모로 생성한다. 요구할 것은 label + 짧은 rationale.
rationale을 요구하는 이유가 셋이다.
- SME 리뷰가 빨라진다
- judge 평가가 더 신뢰할 만해진다
- 프롬프트 실패 디버깅이 극적으로 쉬워진다
3. 배치 추론 — 지루하게 유지하라
대규모에서는 비동기 배치 추론이 속도를 여는 “지루한” 선택이다. JSONL 요청 파일을 제출하고, 돌려두고, 나중에 결과를 받는다.
- 일반적으로 실시간 추론보다 50% 저렴
- 움직이는 부품이 적고 타임아웃·재시도 두통이 적다
- 실행 재현이 쉽고 배치 레벨 병렬화·모니터링이 쉽다
- 배치 요청을 idempotent하게 유지하고 실패한 배치만 재시도, 배치별 중간 결과 저장 → Idempotency
4. 버저닝과 함께 전부 저장
raw와 파싱된 출력을 실행 메타데이터(프롬프트 버전, 모델명/버전, 실행 타임스탬프, doc_id, label, rationale)와 함께 저장한다.
이것이 반복을 “vibes 기반” 연습이 아니라 측정하고 회귀 테스트할 수 있는 것으로 만든다.
5. Judge model 패스
더 높은 성능의 모델이 샘플을 검토해 fast model에 동의하는지 결정한다. 명시적으로 동의/비동의 + 짧은 rationale + 비동의 시 수정된 라벨을 낸다.
judge는 SME의 대체가 아니다. 하는 일은:
- SME 주의를 가장 가치 높은 케이스에 집중시킨다
- 실패 패턴을 더 빨리 표면화한다
- 반복을 위한 측정 가능한 비동의 신호를 만든다
6. SME 루프
judge 비동의(고우선순위)와 동의 건의 소규모 랜덤 샘플(spot check)을 검토용 시트로 export한다. 여기가 human-in-the-loop이 확장되는 지점 — SME에게 전부 라벨링하라고 하는 게 아니라 작고 가치 높은 슬라이스를 검증하라고 한다.
수정을 다시 데이터 플랫폼으로 ingest하고 golden dataset을 버저닝한다.
권장 리뷰 컬럼: doc_id, snippet, fast_label, fast_rationale, judge_agree, judge_label, judge_rationale, sme_label, sme_notes, reviewer, review_ts
샘플링 — 작은 golden set만으로는 왜 안 되나
작은 golden dataset은 구조적으로 편향되어 있다.
- 실제 코퍼스보다 깨끗하다
- 롱테일 엣지 케이스가 빠져 있다
- 이미 이해하는 예시 쪽으로 편향되어 있다
그래서 두 층을 더한다.
| 슬라이스 | 비율 | 목적 |
|---|---|---|
| 검증 슬라이스 | 코퍼스의 1% | 일반화 sanity check |
| judge 샘플 | 0.1% 랜덤 (+ 필요 시 타겟 슬라이스) | 품질 신호 |
이 층이 잡는 것: 희귀 콘텐츠 패턴, golden 데이터에 과소 대표된 언어·포맷, 큐레이션된 예시에서 안 드러나는 프롬프트 모호성, drift로 인한 예상치 못한 “UNKNOWN” 급증.
랜덤 샘플링으로 부족하면 rationale과 비동의에서 보이는 패턴으로 층화한다 — 문서 타입/포맷, 길이, 언어.
반복을 취약하지 않고 측정 가능하게
비동의를 프롬프트 개선의 “학습 데이터”로 사용한다. 정의 명확화, 타겟 예시 추가(조심스럽게), 출력 포맷 규칙 강화, 모호성·엣지 케이스 혼동 축소.
시간이 지나며 보여야 할 것:
- 비동의율 하락 (fast vs judge)
- SME 수정률 하락 (judge 비동의 건에 대해)
- 1% 검증 슬라이스의 예상 못한 실패 감소
처리량(잡/일당 문서 수)도 함께 추적한다. “완벽한 지표”가 목적이 아니라 반복을 측정 가능하게 만드는 것이 목적이라 복잡한 평가 harness 없이 시작해도 된다. → LLM Evaluation
흔한 실패 모드
| 실패 | 대응 |
|---|---|
| 자신만만하게 틀린 답 | 컨텍스트를 포착하고 큰 비동의를 SME 리뷰에 우선 배치 |
| 리뷰 시트가 병목 | 시트 스키마를 엄격히 유지, 배치를 작게 export, 여러 시트로 리뷰 병렬화 |
| 배치 재시도 / 부분 실패 | 요청을 idempotent하게, 실패한 배치만 재시도, 배치별 중간 결과 저장 |
왜 프로세스가 자산인가
이 접근이 가능하게 한 규모: 엔지니어 1명 + SME 1명 + 데이터 사이언티스트 1명의 소규모 교차기능 팀이 약 2개월 만에 2,500만 개 슬라이드쇼와 3억 5천만 개 문서를 분류했다.
라벨과 임계값은 프로젝트·정책마다 다르다. 두 프로젝트 사이에서 이식된 것은 프로세스였고, 모델 가격과 능력이 계속 바뀌는 환경에서 재사용 가능한 것도 그것이다.
연관 개념
- LLM-as-Judge
- LLM Evaluation
- Data Quality and Validation
- Data Governance
- Idempotency
- Data Engineering FinOps
- Replay Testing