솔로 모드
전체 주석 팀 없이 Potato에서 주석 파이프라인 전체를 혼자 실행합니다 — 시딩, 라벨링, 조정, 정제를 아우르는 12단계 LLM-인간 워크플로입니다.
v2.3.0의 새로운 기능
전통적인 주석 프로젝트는 여러 명의 주석자, 주석자 간 일치도 계산, 조정 라운드, 그리고 상당한 조정 부담을 필요로 합니다. 많은 연구 팀에게 이것이 주요 병목입니다. 주석 인터페이스가 아니라 팀을 고용하고 훈련하고 관리하는 운영 부담이 문제입니다.
솔로 모드는 여러 주석자 패러다임을 LLM과 협력하는 단일 인간 전문가로 대체합니다. 인간은 전략적으로 선별된 작은 부분집합에 고품질 라벨을 제공합니다. LLM은 그 라벨로부터 학습하고 나머지에 대한 라벨을 제안하며, 인간은 LLM이 불확실하거나 틀릴 가능성이 높은 경우만 검토합니다. 12단계 워크플로가 이 과정을 자동으로 조율합니다.
내부 벤치마크에서 솔로 모드는 전체 인간 라벨의 10~15%만 사용하면서 여러 주석자 파이프라인 전체와 95% 이상의 일치도를 달성했습니다.
12단계 워크플로
솔로 모드는 12개의 단계를 거쳐 진행됩니다. 시스템은 구성 가능한 임계값을 기준으로 자동으로 진행하지만, 관리자 대시보드에서 전환을 수동으로 트리거할 수도 있습니다.
1단계: 시드 주석
인간 주석자가 초기 시드 세트에 라벨을 붙입니다. Potato는 임베딩 기반 군집화를 사용해 데이터 분포의 커버리지를 극대화하도록 다양하고 대표적인 인스턴스를 선택합니다.
기본 시드 크기: 50개 인스턴스(seed_count로 구성 가능)
2단계: 초기 LLM 보정
LLM은 시드 주석을 few-shot 예시로 받아 보정 배치에 라벨을 붙입니다. Potato는 LLM 예측을 따로 떼어 둔 시드 라벨과 비교해 기준 정확도를 설정합니다.
3단계: 혼동 분석
Potato는 인간과 LLM 사이의 체계적인 불일치 패턴을 식별합니다. 혼동 행렬을 구축하고 가장 흔한 오류 유형을 부각합니다(예: "LLM이 중립을 긍정으로 라벨링하는 비율이 40%").
4단계: 지침 정제
혼동 분석을 바탕으로 Potato는 LLM을 위한 정제된 주석 지침을 생성합니다. 인간은 이 지침이 적용되기 전에 검토하고 편집합니다. 이는 주석자가 예시를 추가하고 경계 사례를 명확히 하며 라벨 정의를 조정할 수 있는 대화형 단계입니다.
5단계: 라벨링 함수 생성
ALCHEmist 프레임워크에서 영감을 받아, Potato는 기존 주석으로부터 프로그래밍 방식의 라벨링 함수를 생성합니다. 이것들은 간단한 패턴 기반 규칙(예: "텍스트에 'excellent'가 포함되고 부정이 없으면 긍정으로 라벨링")으로, 쉬운 인스턴스를 높은 정밀도로 라벨링하여 인간과 LLM의 노력을 더 어려운 사례에 남겨 둡니다.
6단계: 능동 라벨링
인간은 능동 학습으로 선택된 추가 인스턴스에 라벨을 붙입니다. Potato는 LLM이 가장 불확실하거나, 라벨링 함수들이 서로 불일치하거나, 인스턴스가 임베딩 공간에서 기존 훈련 예시로부터 멀리 떨어진 인스턴스를 우선합니다.
7단계: 자동화된 정제 루프
LLM은 업데이트된 지침과 few-shot 예시로 전체 데이터셋에 다시 라벨을 붙입니다. Potato는 모든 인간 라벨과 비교하고, 정확도가 임계값 미만이면 또 한 번의 혼동 분석과 지침 정제 주기를 트리거합니다.
8단계: 불일치 탐색
인간은 LLM과 라벨링 함수가 불일치하는 모든 인스턴스를 검토합니다. 이것들은 일반적으로 가장 유익하고 어려운 예시입니다. 이러한 사례에 대한 인간의 라벨은 가장 높은 한계 가치를 제공합니다.
9단계: 경계 사례 합성
Potato는 LLM을 사용해 식별된 혼동 패턴을 바탕으로 합성 경계 사례를 생성합니다. 인간은 이 합성 예시에 라벨을 붙이며, 이는 가장 어려운 사례에 대한 성능을 향상하기 위해 LLM의 훈련 컨텍스트에 추가됩니다.
10단계: 단계적 신뢰도 에스컬레이션
LLM은 남은 모든 미라벨 인스턴스에 신뢰도 점수를 부여합니다. 인스턴스는 난이도 내림차순(신뢰도 오름차순)으로 인간에게 에스컬레이션됩니다. 인간은 품질 지표가 안정화될 때까지 라벨을 붙입니다.
11단계: 프롬프트 최적화
DSPy에서 영감을 받아, Potato는 누적된 인간 라벨을 검증 세트로 사용해 자동화된 프롬프트 최적화를 실행합니다. 여러 프롬프트 변형(지시 문구, 예시 순서, 사고 연쇄 vs. 직접)을 시도하고 가장 성능이 좋은 프롬프트를 선택합니다.
12단계: 최종 검증
인간은 LLM이 라벨링한 인스턴스에서 무작위 표본을 최종 검토합니다. 정확도가 임계값을 충족하면 데이터셋이 완성됩니다. 그렇지 않으면 시스템은 6단계로 돌아갑니다.
구성
빠른 시작
최소한의 솔로 모드 구성:
task_name: "Sentiment Classification"
task_dir: "."
data_files:
- "data/reviews.jsonl"
item_properties:
id_key: id
text_key: text
solo_mode:
enabled: true
# LLM provider
llm:
endpoint_type: openai
model: "gpt-4o"
api_key: ${OPENAI_API_KEY}
# Basic thresholds
seed_count: 50
accuracy_threshold: 0.92
confidence_threshold: 0.85
annotation_schemes:
- annotation_type: radio
name: sentiment
labels:
- Positive
- Neutral
- Negative
output_annotation_dir: "output/"
output_annotation_format: "jsonl"전체 구성 레퍼런스
solo_mode:
enabled: true
# LLM configuration
llm:
endpoint_type: openai # openai, anthropic, ollama, vllm
model: "gpt-4o"
api_key: ${OPENAI_API_KEY}
temperature: 0.1 # low temperature for consistency
max_tokens: 256
# Phase control
phases:
seed:
count: 50 # number of seed instances
selection: diversity # diversity, random, or stratified
embedding_model: "all-MiniLM-L6-v2"
calibration:
batch_size: 100
holdout_fraction: 0.2 # fraction of seed used for validation
confusion_analysis:
min_samples: 30
significance_threshold: 0.05
guideline_refinement:
auto_suggest: true # LLM suggests guideline edits
require_approval: true # human must approve changes
labeling_functions:
enabled: true
max_functions: 20
min_precision: 0.90 # only keep high-precision rules
min_coverage: 0.01 # must cover at least 1% of data
active_labeling:
batch_size: 25
strategy: uncertainty # uncertainty, diversity, or hybrid
max_batches: 10
refinement_loop:
max_iterations: 3
improvement_threshold: 0.02
disagreement_exploration:
max_instances: 200
sort_by: confidence_gap
edge_case_synthesis:
enabled: true
count: 50
diversity_weight: 0.3
confidence_escalation:
escalation_budget: 200 # max instances to escalate
batch_size: 25
stop_when_stable: true # stop if last batch accuracy is 100%
prompt_optimization:
enabled: true
candidates: 10 # number of prompt variants to try
metric: f1_macro
search_strategy: bayesian # bayesian, grid, or random
final_validation:
sample_size: 100
min_accuracy: 0.92
fallback_phase: 6 # go back to Phase 6 if validation fails
# Instance prioritization across phases
prioritization:
pools:
- name: uncertain
weight: 0.30
description: "LLM confidence below threshold"
- name: disagreement
weight: 0.25
description: "LLM and labeling functions disagree"
- name: boundary
weight: 0.20
description: "Near decision boundary in embedding space"
- name: novel
weight: 0.10
description: "Far from all existing labeled examples"
- name: error_pattern
weight: 0.10
description: "Matches known confusion patterns"
- name: random
weight: 0.05
description: "Random sample for calibration"주요 기능
혼동 분석
각 라벨링 라운드가 끝나면 Potato는 인간 라벨과 LLM 라벨 사이의 혼동 행렬을 구축합니다. 관리자 대시보드는 다음을 보여 줍니다:
- LLM 관점에서의 클래스별 정밀도, 재현율, F1
- 가장 흔한 혼동 쌍(예: "중립을 긍정으로 오분류: 23개 인스턴스")
- 각 혼동 쌍에 대한 예시 인스턴스
- 정제 라운드에 걸친 개선을 보여 주는 추세 차트
혼동 분석에 프로그래밍 방식으로 접근:
python -m potato.solo confusion --config config.yaml출력:
Confusion Analysis (Round 2)
============================
Overall Accuracy: 0.87 (target: 0.92)
Top Confusion Pairs:
neutral -> positive: 23 instances (15.3%)
negative -> neutral: 11 instances (7.3%)
positive -> neutral: 5 instances (3.3%)
Per-Class Performance:
Positive: P=0.91 R=0.94 F1=0.92
Neutral: P=0.78 R=0.71 F1=0.74
Negative: P=0.93 R=0.88 F1=0.90
자동화된 정제 루프
정제 루프는 LLM 라벨링, 혼동 분석, 지침 업데이트 사이를 반복합니다. 각 반복은:
- LLM이 현재 지침으로 전체 데이터셋에 라벨을 붙입니다
- Potato가 사용 가능한 모든 인간 라벨과 비교합니다
- 정확도가 임계값 미만이면 혼동 분석이 실행됩니다
- LLM이 오류 패턴을 바탕으로 지침 편집을 제안합니다
- 인간이 편집을 검토하고 승인합니다
- 주기가 반복됩니다(
max_iterations까지)
solo_mode:
llm:
endpoint_type: anthropic
model: "claude-sonnet-4-20250514"
api_key: ${ANTHROPIC_API_KEY}
phases:
refinement_loop:
max_iterations: 3
improvement_threshold: 0.02 # stop if improvement is less than 2%라벨링 함수(ALCHEmist에서 영감)
Potato는 인간 주석에서 관찰된 패턴으로부터 가벼운 라벨링 함수를 생성합니다. 이것들은 LLM 호출이 아니라 빠르고 결정론적인 규칙입니다.
생성된 라벨링 함수 예시:
# Auto-generated labeling function 1
# Precision: 0.96, Coverage: 0.08
def lf_strong_positive_words(text):
positive = {"excellent", "amazing", "fantastic", "outstanding", "perfect"}
if any(w in text.lower() for w in positive):
if not any(neg in text.lower() for neg in {"not", "never", "no"}):
return "Positive"
return None # abstain
# Auto-generated labeling function 2
# Precision: 0.93, Coverage: 0.05
def lf_explicit_negative(text):
negative = {"terrible", "awful", "horrible", "worst", "disgusting"}
if any(w in text.lower() for w in negative):
return "Negative"
return None라벨링 함수 동작 구성:
solo_mode:
phases:
labeling_functions:
enabled: true
max_functions: 20
min_precision: 0.90
min_coverage: 0.01
types:
- keyword_match
- regex_pattern
- length_threshold
- embedding_cluster불일치 탐색기
불일치 탐색기는 서로 다른 신호가 충돌하는 인스턴스를 제시합니다. 각 인스턴스에 대해 주석자는 다음을 봅니다:
- LLM이 예측한 라벨과 신뢰도
- 라벨링 함수의 투표(있는 경우)
- 임베딩 공간에서 가장 가까운 라벨링된 이웃
- 원본 텍스트/콘텐츠
이것은 가장 가치 있는 주석 활동입니다. 각 라벨이 진짜 모호성을 해소합니다.
solo_mode:
phases:
disagreement_exploration:
max_instances: 200
sort_by: confidence_gap # or "lf_disagreement" or "random"
show_llm_reasoning: true # display LLM's chain-of-thought
show_nearest_neighbors: 3 # show 3 nearest labeled examples단계적 신뢰도 에스컬레이션
데이터셋의 대부분이 LLM에 의해 라벨링된 후, Potato는 LLM이 라벨링한 모든 인스턴스를 신뢰도로 정렬하고 가장 신뢰도가 낮은 것을 인간에게 에스컬레이션합니다. 품질이 안정화될 때까지 배치 단위로 계속됩니다.
solo_mode:
phases:
confidence_escalation:
escalation_budget: 200
batch_size: 25
stop_when_stable: true
stability_window: 3 # stop if last 3 batches are all correct다중 신호 인스턴스 우선순위 지정
인간 라벨링이 포함된 모든 단계에서 Potato는 가장 유익한 인스턴스를 선택하기 위해 가중치가 적용된 풀 시스템을 사용합니다. 여섯 개의 풀이 통합된 우선순위 큐로 들어갑니다:
solo_mode:
prioritization:
pools:
- name: uncertain
weight: 0.30
- name: disagreement
weight: 0.25
- name: boundary
weight: 0.20
- name: novel
weight: 0.10
- name: error_pattern
weight: 0.10
- name: random
weight: 0.05- uncertain: LLM의 신뢰도가
confidence_threshold미만인 인스턴스 - disagreement: LLM과 라벨링 함수가 서로 다른 라벨을 산출하는 인스턴스
- boundary: 임베딩 공간에서 결정 경계 근처에 있는 인스턴스
- novel: 기존 라벨링된 예시로부터 멀리 떨어진 인스턴스
- error_pattern: 이전 라운드의 알려진 혼동 패턴과 일치하는 인스턴스
- random: 보정을 유지하고 사각지대를 포착하기 위한 작은 무작위 표본
경계 사례 합성
Potato는 LLM을 사용해 알려진 약점을 겨냥하는 합성 예시를 생성합니다:
solo_mode:
phases:
edge_case_synthesis:
enabled: true
count: 50
diversity_weight: 0.3
confusion_pairs: # focus on these error types
- ["neutral", "positive"]
- ["negative", "neutral"]LLM은 지정된 라벨 쌍 사이에서 모호한 예시를 생성합니다. 인간이 이를 라벨링하고, 이 라벨은 이후 LLM 라벨링 라운드의 few-shot 컨텍스트에 추가됩니다.
프롬프트 최적화(DSPy에서 영감)
11단계에서 Potato는 LLM에 가장 적합한 지시 형식을 찾기 위해 자동화된 프롬프트 최적화를 실행합니다:
solo_mode:
phases:
prompt_optimization:
enabled: true
candidates: 10
metric: f1_macro
search_strategy: bayesian
variations:
- instruction_style # formal vs. conversational
- example_ordering # random, by-class, by-difficulty
- reasoning_mode # direct, chain-of-thought, self-consistency
- example_count # 3, 5, 10, 15 few-shot examples진행 상황 모니터링
관리자 대시보드는 솔로 모드 진행 상황을 실시간으로 보여 줍니다:
- 현재 단계와 각 단계 내의 진행 상황
- 완료된 인간 라벨 vs. 총 예산
- 시간 경과에 따른 LLM 정확도(라운드별)
- 라벨링 함수의 커버리지와 정밀도
- 신뢰도 분포 히스토그램
- 완료까지의 예상 시간
명령줄에서 접근:
python -m potato.solo status --config config.yamlSolo Mode Status
================
Current Phase: 6 (Active Labeling) - Batch 3/10
Human Labels: 142 / ~300 estimated total
LLM Accuracy: 0.89 (target: 0.92)
LF Coverage: 0.23 (labeling functions cover 23% of data)
Dataset Size: 10,000 instances
- Human labeled: 142
- LF labeled: 2,300
- LLM labeled: 7,558
- Unlabeled: 0
솔로 모드 vs. 전통적인 여러 주석자, 언제 사용할까
다음과 같을 때 솔로 모드를 사용하세요:
- 고품질 라벨을 제공할 수 있는 도메인 전문가가 있습니다
- 예산이나 운영 사정으로 여러 주석자를 고용할 수 없습니다
- 작업의 범주가 명확하고 잘 정의되어 있습니다
- 큰 데이터셋(1,000개 이상의 인스턴스)에 라벨을 붙여야 합니다
- 주석자 간 일치도를 측정하는 것보다 속도가 더 중요합니다
다음과 같을 때 전통적인 여러 주석자를 사용하세요:
- 출판을 위해 주석자 간 일치도 통계가 필요합니다
- 작업이 매우 주관적입니다(예: 불쾌감, 유머)
- 주석자 불일치 패턴을 연구해야 합니다
- 규제 요건이 여러 명의 독립적인 주석자를 의무화합니다
- 라벨 공간이 복잡하거나 진화 중입니다(주석 지침이 아직 개발 중입니다)
하이브리드 접근: 초기 대량 라벨링에는 솔로 모드를 사용하고, 그다음 무작위 10~20% 표본에 두 번째 주석자를 배정해 일치도 통계를 계산하세요. 이렇게 하면 솔로 모드의 효율성과 여러 주석자 검증의 품질 보증을 함께 얻을 수 있습니다.
solo_mode:
enabled: true
# ... solo mode config ...
# Hybrid: assign verification sample to second annotator
verification:
enabled: true
sample_fraction: 0.15
annotator: "reviewer_1"더 읽어보기
- 솔로 모드 튜토리얼: 10,000개 예시 라벨링하기 -- 단계별 안내
- 능동 학습 -- 기반이 되는 능동 학습 시스템
- AI 지원 -- LLM 통합 구성
- 품질 관리 -- 주석에 대한 품질 보증
- MACE -- 역량 추정(하이브리드 모드 검증에 유용)
구현 세부 사항은 원본 문서를 참조하세요.