Skip to content
Announcements6 min read

Potato 2.11: 레이블링 엔진과 인증된 기계 레이블

Potato 2.11은 모델로 데이터셋에 레이블을 달고, 블라인드 사람 표본으로 기계 레이블을 검정한 뒤 인증서를 작성합니다. 유휴 세션은 이제 8시간 뒤 로그아웃됩니다.

Potato Team

Potato 2.11에는 레이블링 엔진이 추가되었습니다. 레이블링 엔진은 모델로 데이터셋에 레이블을 달고, 블라인드로 받은 무작위 사람 레이블 표본으로 모델이 얼마나 자주 틀리는지 측정합니다. 완성된 레이블이 충족해야 할 조건은 사용자가 정합니다. 예를 들어 수락된 기계 레이블 중 틀린 것이 최대 10%, 신뢰도 90%라는 조건입니다. 엔진은 통계 검정이 뒷받침하는 기계 레이블을 수락하고, 나머지 항목은 사람에게 보내며, 무엇을 몇 개의 사람 레이블로 검정했는지 기록한 인증서를 작성합니다. 이번 릴리스는 또한 일치도 보고서의 범위를 3D 객체, 시간 그라운딩, 계층형 주석, 에이전트 트레이스로 넓혔고, 손대지 않은 항목을 답한 것으로 셀 수 있던 이미지 버그를 고쳤습니다.

bash
pip install --upgrade potato-annotation

업그레이드 참고 사항

유휴 세션은 이제 기본 8시간 뒤 로그아웃됩니다. 2.11 이전에는 session_timeout_minutes가 실제로 서비스되는 앱에서 아무 효과가 없었습니다. 확인 로직이 potato start가 버리는 앱 객체에 등록되어 있었기 때문입니다. 이제 설정값보다 오래 유휴 상태인 세션은 지워지고, 그 세션의 다음 요청은 로그인 페이지로 갑니다. 밤새 로그인 상태로 두는 키오스크와 공용 실험실 컴퓨터에서는 로그아웃이 일어나기 시작하므로, 로그인 상태 유지가 필요한 연구에서는 session_timeout_minutes를 늘리세요. 이미 저장된 주석에는 영향이 없습니다.

이전 키 세 개는 시작할 때 안내를 출력합니다. icl_labeling, judge_calibration, pre_annotation은 이전과 똑같이 작동하며, 각각 엔진에서 대응하는 기능을 알려 주는 NOTE:로 시작하는 줄을 stderr에 출력합니다. 이 안내는 정보 제공용이므로 potato validate --strict가 이 때문에 실패하지는 않습니다. 이 키들은 3.0에서 제거될 예정이며, potato label migrate-config가 대응하는 labeling_engine 블록을 대신 작성해 줍니다.

레이블링 엔진

엔진은 사람이 레이블을 달 수 있는 것보다 항목이 많고, 대부분 맞히는 모델이 있는 연구를 위한 것입니다. 엔진은 모델을 소스로 다루며, 소스는 나열한 순서대로 캐스케이드로 시도되고, 마지막 소스 다음에는 항목이 사람에게 갑니다. 소스는 LLM, 비전-언어 모델, Laya 같은 의사결정 모델, YOLO 탐지기, LLM 판정자, 배심(jury), 해당 연구의 레이블로 학습한 모델, 또는 이미 가지고 있는 레이블일 수 있습니다.

계약은 엔진이 검정하는 대상입니다. 주요 계약인 selective_risk는 수락된 기계 레이블 중 틀린 것의 비율에 상한을 둡니다. 엔진은 블라인드 표본의 절반으로 신뢰도 임계값을 고르고, 나머지 절반으로 그 임계값을 단측 이항 검정으로 검정하며, 이때 고정 순서 Learn-then-Test를 씁니다. 새 검정은 매번 더 엄격한 수준에서 실행되므로, 검정을 통과할 때까지 인증을 반복해도 신뢰도가 부풀려지지 않습니다. ppi 계약은 예측 기반 추론(prediction-powered inference)으로 만든 구간과 함께 각 레이블의 출현율을 보고하며, 이 구간은 모델의 품질과 상관없이 유효합니다. no_worse_than_human은 사람이나 판정자를 대체할 때 쓰는 대안 주석자 검정(alternative annotator test)을 실행하고, distributional은 주관적인 항목에서 모델의 레이블 분포를 사람들의 의견 분포와 비교합니다.

감성 스키마 하나에 대해 LLM 하나를 인증하는 설정은 일반 연구에 키 두 개를 추가합니다.

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  sources:
    - id: gemma
      kind: llm
      endpoint_type: vllm
      model: google/gemma-4-12B-it-qat-w4a16-ct
      base_url: http://localhost:8001/v1
      confidence: {method: logprob}
  contracts:
    - id: accuracy
      kind: selective_risk
      schema: sentiment
      error: 0.1
      confidence: 0.9
  budgets:
    human_labels: 400

confidence: {method: logprob}는 토큰 확률에서 모델의 신뢰도를 읽습니다. 이 방식은 항목당 호출이 한 번이며, 엔진의 신뢰도 방식 중 대개 보정이 가장 잘 되어 있습니다. 이 계약은 수락된 레이블 중 틀린 것을 최대 10%까지 허용하며, 신뢰도 90%는 Potato의 기본값입니다. budgets.human_labels는 엔진이 열 수 있는 사람 요청의 수를 제한하며, 400은 함께 제공되는 텍스트 예제가 쓰는 상한입니다.

Potato에 포함된 텍스트 예제는 리뷰 481개를 Laya가 Gemma 12B보다 앞에 있는 캐스케이드로 처리합니다. 그 실행에서 10% 계약은 사람 레이블 165개로 충족되었고, 엔진은 기계 레이블 316개를 수락했습니다. 316개 모두 Gemma의 레이블이었는데, Laya의 임계값이 끝내 정해지지 않았기 때문입니다. 참조 레이블 기준으로 측정한 이 레이블들의 오류율은 7.6%였습니다. 에이전트 트레이스 예제에는 참조 결과가 있는 합성 트레이스 288개가 있습니다. 판정자는 그중 80%를 맞혔지만 모든 판정에 신뢰도 1.0을 매겼기 때문에, selective_risk는 임계값을 정할 근거가 없어 infeasible 상태로 남았습니다. 같은 데이터로 구한 작업 성공률의 PPI 구간 [0.57, 0.76]은 참조 비율 0.60을 포함했지만, 판정자만으로는 0.76이 나왔습니다.

충족된 계약의 한계

충족된 계약은 표본에 레이블을 단 사람들과의 일치에 관한 진술입니다. 엔진은 그 사람들이 옳은지 확인하지 않으므로, 부주의한 주석자를 기준으로 검정한 계약은 부주의한 주석자와의 일치를 인증합니다. 세 가지 규칙이 그 진술을 성립시킵니다. 보정 요청은 블라인드이므로, 사람이 요청을 맡고 있는 동안 페이지에는 사전 주석, 판정자의 판정, AI 도움이 표시되지 않습니다. 임계값은 표본의 절반으로 고르고 나머지 절반으로 검정합니다. 인증은 사람 레이블로만 하며, 소스, 프롬프트 또는 스키마를 바꾸면 영향을 받는 계약은 다시 검정될 때까지 stale로 표시됩니다.

엔진에 접근하는 인터페이스

모든 인터페이스가 같은 engine.sqlite 파일을 쓰므로, 한 인터페이스에서 연구를 시작하고 다른 인터페이스에서 인증할 수 있습니다.

  • 명령줄의 potato label run|status|certify|certificate|export|calls|distill|optimize|migrate-config
  • /api/engine/v1 아래의 REST API
  • MCP 서버의 engine_* 도구 다섯 개
  • Python의 potato.labeling_engine.sdk.Study
  • 계약 상태, 오류 대 커버리지 곡선, 소스별 신뢰도 다이어그램, 모델 호출 로그를 보여 주는 /admin/labeling-engine의 관리자 페이지

potato label export는 출처 정보가 붙은 레이블, JSON·Markdown·HTML 형식의 인증서, 데이터셋 카드, 호출 로그를 내보냅니다. 레이블링 엔진에서 첫 연구를 단계별로 안내하고, 레이블링 엔진 계약에서 각 계약이 무엇을 검정하고 어떻게 실패하는지 설명합니다.

솔로 모드

이제 솔로 모드는 제안을 숨길 수 있습니다. solo_mode.suggestions는 모든 항목 또는 무작위 표본에서 LLM의 레이블을 보류합니다. 화면에 보이는 제안은 답을 그쪽으로 끌어당기므로, 인계 시점의 판단은 블라인드 항목의 일치도로 합니다. 의사결정 모델(laya와 모든 /v1/systemone 서버)을 빠른 첫 단계로 쓸 수 있으며, 솔로 모드는 레이블링을 시작하기 전과 각 배치 전에 프로젝트의 ai_budget.cap_usd를 확인합니다. 골드 세트, 레이블링 배심, 커리큘럼 순서 지정도 새로 추가되었습니다. 엔진이 켜져 있으면 솔로 모드는 예측을 엔진의 저장소에 기록하므로, 엔진이 그 예측을 보정하고 인증할 수 있습니다. 설정은 솔로 모드에 있습니다.

일치도

/admin/iaa는 이제 spatial_annotation, temporal_grounding, tiered_annotation과 다섯 가지 에이전트 트레이스 스키마의 일치도를 보고합니다. 예전에는 지원되지 않는다며 건너뛰던 스키마들입니다. 3D 객체와 시간 세그먼트에는 우연 보정을 하지 않은 평균 매칭 집합 일치도가 주어지고, 에이전트 트레이스의 단계에는 각 트레이스의 각 단계를 단위로 한 Krippendorff의 alpha와 Cohen의 kappa가 주어집니다. /admin/api/agreement는 더 이상 구조화된 스키마를 보고하지 않고 대신 /admin/iaa를 안내합니다. 그런 스키마를 레이블 이름으로만 줄이면 모든 주석자 쌍이 완벽하게 일치하는 것으로 나왔기 때문입니다. 길이가 0인 동일한 세그먼트 두 개는 이제 일치하는 것으로 셉니다. 게시(Publishing)와 Paper Mode는 골드 레이블과 일치도 수치에서 기계 평가자를 제외합니다.

2.10 연구에 영향을 주는 수정

다음 세 가지 수정은 이미 수집했거나 보고한 수치를 바꿀 수 있습니다.

  • 이미지 페이지가 미리 채운 답을 저절로 저장했습니다. pre_annotation이 있는 image_annotation 스키마에서, 캔버스는 불러온 뒤 레이아웃을 다시 잡을 때 미리 채운 도형을 주석자의 답으로 저장했고, 그래서 손대지 않은 항목이 답한 것으로 셌습니다. 사전 주석을 쓴 2.10 이미지 연구에서, 저장된 도형이 사전 주석과 정확히 같은 항목은 아무도 손대지 않았을 수 있으므로, 시간 데이터가 달리 보여 주지 않는 한 그런 항목은 검토되지 않은 것으로 다루세요.
  • Paper Mode가 자체 코드로 kappa를 계산했습니다. Paper Mode와 일치도 모듈은 이제 /admin/iaa와 같은 함수로 Cohen의 kappa를 계산하므로, 2.11 이전에 Paper Mode가 보고한 kappa는 같은 데이터에 대해 /admin/iaa가 보여 주는 값과 다를 수 있습니다.
  • 판정(adjudication)과 Prolific 자동 확장이 기계 평가자를 셌습니다. 기계 주석자가 항목을 판정으로 보낼 수 있었고, min_human_annotations는 무시되었으며, Prolific 자동 확장은 기계 주석을 항목별 상한에 포함해 셌습니다.

나머지 수정은 연구에서 할 수 있는 일을 바꿉니다. cocodataset.org처럼 CORS 헤더를 보내지 않는 호스트의 이미지도 이제 불러옵니다. 그런 이미지에서 플러드 필, SAM, 텍스트 프롬프트 분할은 이제 이미지를 읽을 수 없는 이유를 알려 줍니다. color가 없는 사전 주석 도형은 버려지지 않고 해당 레이블의 색을 씁니다. 솔로 모드의 "Generate prompt"는 이제 수정 모델에게 첫 프롬프트를 작성하도록 요청합니다. potato mcp connect를 통한 거부는 성공이 아니라 도구 오류로 돌아옵니다. 경계 사례 탐색은 이제 vLLM에서도 작동합니다. vLLM은 응답 스키마에 경계 사례 필드가 추가되기 전까지 그 필드를 반환하지 않았습니다.

2.11 설치하기

pip install --upgrade potato-annotation으로 업그레이드하거나 ghcr.io/davidjurgens/potato:2.11.0을 받으세요. 프로세스 안에서 실행되는 Laya 의사결정 모델에는 새 decision extra인 pip install 'potato-annotation[decision]'이 필요합니다. 이 extra는 torch를 끌어오기 때문에 all에 포함되지 않습니다. 릴리스 노트에 모든 변경 사항이 있고, 새로운 기능에는 2.x 릴리스별 요약이 있습니다.