레이블링 엔진 계약
레이블링 엔진이 사람 레이블에 대해 검정하는 여섯 가지 계약 종류(선택적 위험과 PPI 구간부터 대체 주석자 검정까지)와 각 계약이 실패하는 방식을 설명합니다.
계약은 완성된 레이블에 관한 주장으로, 레이블링 엔진은 이를 무작위 표본의 사람 레이블에 대해 검정합니다. 각 계약은 주석 스키마 하나(schema)를 지정하며, 주장이 성립할 확률인 confidence(기본값 0.9)를 가집니다. 따라서 confidence가 0.9이면 충족된 계약이 틀렸을 가능성이 10% 남습니다.
여섯 가지 종류는 서로 다른 주장을 하며 서로 다른 연구에 맞습니다.
| 종류 | 주장 | 용도 |
|---|---|---|
selective_risk | 수락된 기계 레이블 중 틀린 것은 최대 error | 각 레이블을 그대로 쓸 수 있어야 하는 데이터셋과 학습 세트 |
ppi | 기계의 품질과 관계없이 유효한, 각 레이블의 출현율(또는 평균 점수)에 대한 구간 | "게시물의 12%가 유해함 [10.5, 13.6]"처럼 비율을 보고할 때 |
no_worse_than_human | 기계가 사람과 일치하는 정도가 적어도 한 사람이 일치하는 정도만큼 됨 | 주석자나 LLM 판정자를 대체할 때 |
budget_first | 사람 레이블 예산으로 얻을 수 있는 것 | 비용을 쓰기 전에 계획할 때 |
distributional | 기계의 레이블 분포가 사람들의 판단이 갈리는 양상에 가까움 | 불일치 자체가 데이터인 주관적 작업 |
threshold_legacy | 없음. 고정된 신뢰도 이상이면 수락함 | 변환된 설정 전용 |
이 계약 중 어느 것도 레이블에 오류가 없다고 말하지 않습니다. selective_risk는 수락된 레이블 사이의 오류율을 제한하며, 기계를 검정하는 계약은 모두 표본에 레이블을 단 사람들을 기준으로 기계를 측정합니다.
계약 상태
모든 계약은 다섯 가지 상태 중 하나를 가지며, 상태는 관리자 페이지, potato label status, 인증서에 표시됩니다.
| 상태 | 의미 |
|---|---|
met | 현재 캐스케이드에서 검정을 통과했습니다. |
insufficient | 아직 사람 레이블이 부족하며, 몇 개가 더 필요한지 추정치를 함께 제공합니다. 그 추정치가 코퍼스에 남아 있는 표본 수보다 많으면, 이 코퍼스로는 목표에 도달할 수 없다고 상태에 표시됩니다. |
infeasible | 레이블은 충분하지만 통과하는 수락 규칙이 없습니다. 예를 들어 기계의 신뢰도가 맞는 답과 틀린 답을 구분하지 못하는 경우입니다. |
violated | 수락된 레이블을 감사한 결과 오류율이 목표보다 높습니다(features.drift 사용 시, 기본으로 켜져 있음). |
stale | 마지막 검정 이후 소스, 프롬프트 또는 스키마가 바뀌었습니다. 수락된 레이블은 pending_recert에서 대기합니다. |
기계 레이블은 해당 스키마의 모든 selective_risk 및 threshold_legacy 계약이 충족되고 그 레이블을 수락할 때만 수락됩니다. 계약은 레이블이 충족해야 할 조건을 진술하므로, 충족되지 않은 계약은 건너뛰어지는 것이 아니라 수락을 막습니다. 상태, 관리자 페이지, 인증서에는 충족되지 않은 계약이 표시됩니다. 효력을 가질 수 있는 규칙이 없고 더 이상 표본도 뽑지 않을 때(계약이 infeasible이거나, 보정 표본이 끝났거나, 아무것도 추정할 수 없을 때), 아직 레이블이 없는 항목은 budgets.human_labels 한도 안에서 사람에게 갑니다.
dev 분할과 cert 분할
엔진은 규칙을 고르는 레이블과 규칙을 검정하는 레이블을 따로 둡니다. 보정 요청은 포함 확률을 기록한 채 무작위로 뽑히고, 항상 블라인드이며, 각각 무작위로 두 분할 중 하나에 들어갑니다.
- dev(
humans.dev_fraction, 기본값 절반)는 보정기를 적합하고 임계값을 고릅니다. - cert는 고른 규칙을 검정하며, 다른 어떤 것도 이 분할을 읽지 않습니다.
검정 회차
계약을 새로 검정할 때마다 더 엄격한 수준에서 실행되므로, 레이블이 들어오는 대로 다시 검정해도 신뢰도가 부풀려지지 않습니다. k번째 회차는 오류 예산의 (1 - confidence) * 6 / (pi^2 k^2)를 받습니다. 가능한 모든 회차에 걸쳐 합하면 전체 예산이 되며, 첫 회차가 그중 61%를 받습니다.
- 회차는 계약별로 셉니다. 그 계약이 검정된 모든 캐스케이드에 걸쳐 세며, 이름을 바꾼 계약은 이전 id의 회차를 이어받습니다. 통과할 때까지 프롬프트나 모델을 바꿔 시도하면 매번 회차가 하나씩 소모됩니다. 이전 캐스케이드로 돌아가는 것도 새 회차이며, 이전 결과가 복원되지는 않습니다.
- 같은 데이터를 다시 검정하는 것은 새 회차가 아닙니다. 같은 cert 레이블, 같은 예측, dev에서 고른 같은 규칙이면 저장된 결과를 돌려줍니다. 예를 들어 한 클래스에 cert 레이블이 없어 실행할 수 없었던 검정은 아무것도 소모하지 않습니다.
potato label certify는 새 cert 레이블과 새 예측을 한꺼번에 검정합니다. REST, MCP, SDK의 대응 기능도 마찬가지입니다. dev 레이블만 바뀐 경우에는 저장된 결과와 함께 이제 dev가 다른 규칙을 고른다는 메모를 돌려주며,--retest를 쓰면 그 규칙을 다음 회차에서 검정합니다.- 플래너는 레이블이 들어오는 대로 스스로 인증합니다. 충족된
selective_risk계약은 그 캐스케이드에서 계속 충족 상태로 남고, 감사가 이를 지켜봅니다. 충족되지 않은 계약은 레이블이 4분의 1 늘어나고 최소 10개 늘어나면 다시 검정됩니다.ppi,distributional,no_worse_than_human의 결과는 통과/실패 검정이 아니라 추정치이므로, 플래너는 같은 시점과 보정 표본이 완료되었을 때 한 번 더 이를 다시 추정합니다. - 수정된 cert 레이블은 새 데이터입니다. 주석자가 답을 바꾸면 그 수정에 드는 비용은 새 레이블 하나를 넘지 않습니다. 이미 검정한 상태로 되돌리면 그 검정 결과가 다시 쓰입니다. 수정 후에도 저장된 결과의 검정 중 오류를 더 많이 보는 것이 없으면 그 결과와 회차가 그대로 유지됩니다. 그렇지 않으면 플래너는 첫 수정 시점부터 레이블이 4분의 1 늘어날 때까지 기다리므로, 연이은 수정이 검정 한 번으로 묶입니다. 그동안 수락된 레이블은 계약에 메모가 붙은 채 수락 상태로 남습니다. 더 이상 들어올 레이블이 없으면 즉시 검정하고, 명시적으로 인증하면 다음 회차에서 검정합니다.
기계의 답을 본 뒤에 사람이 단 레이블(검증 요청)과 엔진의 요청 밖에서 단 레이블은 어떤 것도 인증하거나 추정하지 않습니다. 이 레이블은 증류 모델을 학습시키는 데 쓸 수 있습니다.
selective_risk
selective_risk는 수락된 기계 레이블 중 틀린 것의 비율을 제한합니다. error 키는 수락된 레이블 사이에서 허용하는 최대 오류율이며 필수입니다.
- id: accuracy
kind: selective_risk
schema: sentiment
error: 0.05 # required: largest tolerated error among accepted labels
confidence: 0.9
per_class: true # test each predicted class separately
tolerance: 0.5 # graded families only: loss at or below this counts as correct규칙은 캐스케이드 단계마다, 그리고 per_class를 쓰면 예측된 클래스마다 정하는 신뢰도 임계값입니다. 마지막을 제외한 모든 단계에서는 임계값을 dev에서 고르고 cert에서 한 번 검정합니다. 마지막 단계에서는 dev에서 고른 임계값부터 더 관대한 쪽으로 임계값을 차례로 검정하다가, 처음 실패하는 지점에서 멈춥니다. 이 절차는 고정 순서 Learn-then-Test(Angelopoulos et al., 2025)입니다. 각 검정은 수락된 레이블 사이의 오류가 error보다 크다는 단측 이항 검정이며, 유의 수준은 단계와 클래스에 나누어 배분됩니다. 실패한 단계는 아무것도 수락하지 않으며, 그 항목은 사람에게 갑니다.
무엇을 "맞음"으로 볼지는 스키마 계열에 따라 다릅니다. 계열별 손실은 표에 있으며, 손실이 tolerance 이하이면 레이블이 맞은 것으로 칩니다.
| 스키마 계열 | 손실 | 기본 tolerance |
|---|---|---|
N개 중 하나 선택(radio, select) | 같은 레이블이면 0 | 0 |
순서형(likert) | 척도상의 거리 / (점 개수 - 1) | 0 |
연속형(slider, number) | 거리 / (최댓값 - 최솟값) | 0.05 |
다중 레이블(multiselect) | 1 - Jaccard 중첩 | 0 |
이미지 영역(image_annotation) | 1 - 짝지어진 도형의 평균 IoU | 0.5 |
오디오/비디오 세그먼트, temporal_grounding, tiered_annotation | 1 - 평균 시간 IoU | 0.5 |
3D 객체(spatial_annotation) | 1 - 평균 3D IoU | 0.5 |
에이전트 트레이스(process_reward, trajectory_eval, ...) | 양쪽이 모두 레이블을 단 단계 중 레이블이 다른 단계의 비율 | 0 |
영역, 세그먼트, 3D 객체, 트레이스의 손실은 /admin/iaa의 일치도 보고서가 쓰는 것과 같으므로, 기계는 두 사람을 서로 비교할 때와 같은 방식으로 사람과 비교해 채점됩니다. 자유 텍스트와 쌍대 비교 스키마는 아직 계열이 없으며, 인증서에는 지원되지 않는 것으로 표시됩니다.
검정하려면 검정 대상인 cert 항목 그룹이 각각 균일 표본이어야 합니다. 항목이 서로 다른 확률로 뽑힌 그룹은 검정되지 않으며, 결과에 그 그룹이 표시됩니다.
마지막 단계에서는 dev의 오류가 목표의 절반 이하이고, 첫 검정을 통과할 만큼 cert 레이블이 충분하리라 예상되는 경우에만 dev에서 임계값을 고릅니다. 레이블이 몇 개 더 필요한지에 대한 추정은 그렇게 고를 수 있는 임계값만 셉니다. cert에 추정이 요구한 레이블이 이미 있는데도 검정이 계속 실패하면, 다음 추정은 dev만의 오류율이 아니라 dev와 cert를 합쳐 본 오류율을 씁니다. dev의 최저 오류가 목표보다 낮지만 목표의 절반보다 높으면 아무것도 검정하지 않고 아무것도 추정하지 않습니다. 결과에는 그 사실과 해당 오류가 표시되는데, 레이블을 더 모아도 오류가 더 낮게 나올 때만 도움이 되기 때문입니다.
metrics.accepted_by_tier는 보정 항목을 포함한 전체 모집단에 대한 규칙의 커버리지이며, 실제로 전달된 기계 레이블의 수가 아닙니다. 그 수는 인증서의 "Machine labels accepted, by source" 줄이 셉니다.
트레이스 손실은 양쪽이 모두 레이블을 단 단계만 비교하므로, 일부 단계만 표시한 사람은 그 단계에서만 비교됩니다. 아무도 레이블을 달지 않은 단계는 확인되지 않으며, 단계 0에만 레이블을 달고 거기서 판정자와 일치한 사람은 트레이스 레이블 전체에 일치한 것으로 칩니다. 모든 단계를 확인해야 한다면 사람들에게 모든 단계에 레이블을 달도록 요청하세요.
ppi
ppi는 각 레이블의 출현율 또는 평균 점수에 대해, 기계의 오류를 보정한 구간을 보고합니다.
- id: prevalence
kind: ppi
schema: sentiment
estimand: prevalence # or mean, for numeric scores
by: language # optional: an interval per value of this item field
confidence: 0.95
max_width: 0.05 # optional: met once every interval is at most this wide예측 기반 추론(Prediction-powered inference)(Angelopoulos et al., 2023)은 사람이 레이블을 단 표본에서의 기계의 오류로 기계의 추정치를 보정합니다. 구간은 기계의 품질과 관계없이 유효합니다. 좋은 기계는 사람만으로 얻을 수 있는 것보다 구간을 좁히고, 나쁜 기계는 구간을 넓히지 않습니다. 포함 확률이 같으면 엔진은 가중치를 조정한 PPI++를 쓰고, 포함 확률이 다르면(층화 표집 또는 불확실성 기반 표집) Horvitz-Thompson 차분 추정량을 씁니다. 이때 쓰는 기계 레이블은 캐스케이드가 전달할 레이블입니다. by 필드는 항목이 등록될 때 항목에서 복사됩니다. max_width가 없으면 보고할 만큼 레이블이 모이는 즉시 계약이 충족됩니다.
no_worse_than_human
no_worse_than_human은 기계가 사람과 일치하는 빈도가 적어도 한 사람이 일치하는 빈도만큼 되는지 묻습니다.
- id: replaces-a-person
kind: no_worse_than_human
schema: verdict
epsilon: 0.1이 계약은 대체 주석자 검정(alternative annotator test)(Calderon et al., 2025)을 실행합니다. 한 번에 한 사람씩 빼 가며, 기계가 나머지 사람들과 일치하는 빈도가 뺀 사람이 일치하는 빈도보다 epsilon 범위 안에서 적어도 같은지 검정합니다. 사람들 전체에 걸쳐 거짓 발견률을 통제한 상태에서, 기계가 적어도 절반의 사람에게 이기면 통과합니다.
이 검정에는 여러 사람이 레이블을 단 항목이 필요합니다. humans.overlap(표본 중 두 번 이상 레이블을 다는 비율)과 humans.overlap_k(항목당 사람 수, 최소 3)를 설정하세요. 검정에는 각각 30개 항목을 맡은 주석자가 최소 3명 필요합니다. 이를 갖출 때까지 계약은 insufficient로 남습니다. 고정된 정확도 목표가 주로 주석자 노이즈를 측정하게 될 때 이 계약을 쓰세요. 신중한 두 사람이 85%만 일치한다면, 어떤 레이블러도 95% "옳다"고 보일 수 없습니다.
budget_first
budget_first는 사람 레이블 예산을 쓰기 전에 그 예산으로 무엇을 얻을 수 있는지 추정합니다.
- id: plan
kind: budget_first
schema: sentiment
human_labels: 500 # or human_usd, priced at the crowd reward추정은 지금까지 모은 dev 레이블로 합니다. 격자의 각 오류 목표마다, 이 예산으로 기계가 레이블을 달도록 인증될 수 있는 코퍼스의 비율과 각 출현율 구간의 폭을 제시합니다. 추정에 필요한 dev 레이블이 충분히 모이면 계약은 met이 됩니다. 이 계약은 레이블에 대해 아무것도 약속하지 않으며, 레이블이 모인 뒤에는 selective_risk와 ppi가 그 역할을 합니다.
distributional
distributional은 데이터에 담겨야 할 이유로 사람들의 판단이 갈리는 주관적 작업에서, 기계의 레이블 분포를 사람들의 판단이 갈리는 양상과 비교합니다.
- id: disagreement
kind: distributional
schema: offensiveness
max_distance: 0.15 # optional
groups_by: age_band # optional: a prestudy question whose answer groups the annotators여러 사람(humans.distribution_k, 기본 5명)이 레이블을 단 항목은 각각 사람 레이블 분포를 가집니다. 계약은 기계의 분포와 사람들의 분포 사이의 평균 Jensen-Shannon 거리를 부트스트랩 구간과 함께 보고합니다. 또한 노이즈 상한, 즉 각 항목에서 사람들을 무작위로 둘로 나눈 두 절반 사이의 같은 거리도 보고합니다. 사람들끼리의 거리보다 사람들에게 더 가까운 기계는 데이터가 허용하는 만큼 가까운 것입니다.
기계의 분포는 소스가 확률을 제공하는 경우(의사결정 모델, k_sample, logprob) 그 확률이고, 그렇지 않으면 레이블을 원-핫 벡터로 나타낸 것입니다. 구간의 상한이 max_distance 이하이면 계약이 충족되며, max_distance가 없으면 3명 이상이 레이블을 단 항목이 20개가 되면 충족됩니다. 구간의 하한이 max_distance보다 크면 infeasible이 되는데, 항목을 더 모아도 너무 큰 거리 주변으로 구간이 좁아질 뿐이기 때문입니다.
groups_by를 쓰면 같은 수치를 주석자 그룹별로 보고합니다. 항목에 대한 각 그룹의 분포는 지정한 사전 연구 질문에 대한 답으로 구분한 그 그룹의 사람들로만 만들며, 아무도 그 질문에 답하지 않았으면 계약이 그 사실을 알려 줍니다.
threshold_legacy
threshold_legacy는 고정된 신뢰도 이상인 기계 레이블을 수락하며, 통계 검정은 하지 않습니다.
- id: old-rule
kind: threshold_legacy
schema: sentiment
threshold: 0.8potato label migrate-config는 icl_labeling에 대해 이전 confidence_threshold 값으로 이 계약을 작성하므로, 변환된 설정은 이전과 똑같이 동작합니다. 직접 작성할 수도 있습니다. 인증서는 이 레이블을 인증되지 않은 것으로 표시하고, 보정 레이블에서 측정한 오류를 보고하며, 내보내기는 이 레이블에 accepted_uncertified 상태를 부여합니다.
예제 연구의 결과
examples/labeling-engine/ 아래의 예제 연구 세 개는, 커밋된 설정이 쓰는 Ollama 모델 대신 LLM, 판정자, 비전 소스를 vLLM 서버의 Gemma 12B로 지정해 실행했습니다. 각 예제의 README에 바꾼 소스 블록이 나와 있으며, Ollama 기본값을 쓰면 수치가 달라집니다.
- 텍스트 감성(리뷰 481개, 마지막 단계는 logprob 신뢰도를 쓰는 Gemma 12B). 10%, 0.9의
selective_risk가 사람 레이블 165개로 충족되었고, 기계 레이블 316개가 수락되었습니다. 실제 레이블 대비 측정한 오류는 7.6%였으며, PPI 구간은 세 레이블 모두의 실제 출현율을 포함했습니다. - 이미지(COCO 이미지 128개, YOLOv8n과 비전 모델로 Gemma 12B). 사람 포함 여부 레이블이 10%로 인증되었습니다. 상자 계약은
insufficient로 남았는데, YOLOv8n의 상자가 IoU 0.5에서 dev 이미지의 32%에서 틀렸기 때문입니다. - 에이전트 트레이스(트레이스 288개, 판정자로 Gemma 12B). 판정자는 트레이스의 80%에서 맞았지만 신뢰도가 내내 1.0이었으므로
selective_risk는 infeasible이었습니다. 대체 주석자 검정은 기계가 0.82, 사람들이 0.93으로 insufficient였습니다. PPI는 작업 성공률을 0.66 [0.57, 0.76]으로 추정했는데, 실제 값은 0.60이었고 판정자만으로는 16포인트 높은 0.76이었습니다.
더 읽어보기
- 레이블링 엔진
- 이 계약들이 읽는
humans키를 포함한 레이블링 엔진 설정 - 주석자 간 일치도와, 영역, 세그먼트, 3D 객체에 같은 손실을 쓰는 기하 구조에 대한 일치도
구현에 관한 자세한 내용은 소스 문서를 참고하세요.
참고 문헌
- Angelopoulos, A. N., Bates, S., Candès, E. J., et al. (2025). Learn then test: Calibrating predictive algorithms to achieve risk control. The Annals of Applied Statistics. https://doi.org/10.1214/24-AOAS1998
- Angelopoulos, A. N., Bates, S., Fannjiang, C., et al. (2023). Prediction-powered inference. Science, 382(6671). https://doi.org/10.1126/science.adi6000
- Angelopoulos, A. N., Duchi, J. C., and Zrnic, T. (2023). PPI++: Efficient prediction-powered inference. arXiv. https://arxiv.org/abs/2311.01453
- Calderon, N., Reichart, R., and Dror, R. (2025). The alternative annotator test for LLM-as-a-judge: How to statistically justify replacing human annotators with LLMs. Proceedings of ACL 2025. https://aclanthology.org/2025.acl-long.782/