Solo-Modus
Ganze Datensätze mit einem einzelnen Annotator beschriften, der mit einem LLM durch einen 12-phasigen intelligenten Workflow zusammenarbeitet.
Solo-Modus
Neu in v2.3.0
Traditionelle Annotationsprojekte erfordern mehrere Annotatoren, die Berechnung von Inter-Annotator-Übereinstimmungen, Adjudikationsrunden und erheblichen Koordinierungsaufwand. Für viele Forschungsteams ist dies der primäre Engpass: nicht die Annotationsoberfläche, sondern die Logistik des Anwerbens, Trainierens und Verwaltens eines Teams.
Der Solo-Modus ersetzt das Multi-Annotator-Paradigma durch einen einzelnen menschlichen Experten, der mit einem LLM zusammenarbeitet. Der Mensch liefert hochwertige Labels für eine kleine, strategisch ausgewählte Teilmenge. Das LLM lernt von diesen Labels, schlägt Labels für den Rest vor, und der Mensch überprüft nur die Fälle, bei denen das LLM unsicher oder wahrscheinlich falsch liegt. Ein 12-phasiger Workflow orchestriert diesen Prozess automatisch.
In internen Benchmarks erzielte der Solo-Modus eine Übereinstimmung von 95 %+ mit vollständigen Multi-Annotator-Pipelines, benötigte dabei aber nur 10–15 % der gesamten menschlichen Labels.
Der 12-phasige Workflow
Der Solo-Modus durchläuft 12 Phasen. Das System wechselt automatisch basierend auf konfigurierbaren Schwellenwerten, obwohl Übergänge auch manuell über das Admin-Dashboard ausgelöst werden können.
Phase 1: Seed-Annotation
Der menschliche Annotator beschriftet einen initialen Seed-Satz. Potato wählt diverse, repräsentative Instanzen mithilfe von Embedding-basiertem Clustering aus, um die Datumverteilung maximal abzudecken.
Standardgröße des Seed-Satzes: 50 Instanzen (konfigurierbar über seed_count)
Phase 2: Initiale LLM-Kalibrierung
Das LLM erhält die Seed-Annotationen als Few-Shot-Beispiele und beschriftet einen Kalibrierungsbatch. Potato vergleicht LLM-Vorhersagen mit zurückgehaltenen Seed-Labels, um eine Basislinie zu etablieren.
Phase 3: Konfusionsanalyse
Potato identifiziert systematische Meinungsverschiedenheitsmuster zwischen Mensch und LLM. Es erstellt eine Konfusionsmatrix und stellt die häufigsten Fehlertypen dar (z. B. "LLM beschriftet Neutral in 40 % der Fälle als Positiv").
Phase 4: Richtlinienverfeinerung
Basierend auf der Konfusionsanalyse generiert Potato verfeinerte Annotationsrichtlinien für das LLM. Der Mensch überprüft und bearbeitet diese Richtlinien, bevor sie angewendet werden. Dies ist ein interaktiver Schritt, bei dem der Annotator Beispiele hinzufügen, Grenzfälle klären und Label-Definitionen anpassen kann.
Phase 5: Generierung von Beschriftungsfunktionen
Inspiriert vom ALCHEmist-Framework generiert Potato programmatische Beschriftungsfunktionen aus den vorhandenen Annotationen. Dies sind einfache musterbasierte Regeln (z. B. "wenn der Text 'ausgezeichnet' und keine Verneinung enthält, als Positiv beschriften"), die einfache Instanzen mit hoher Präzision beschriften und menschliche und LLM-Ressourcen für schwierigere Fälle freihalten können.
Phase 6: Aktives Beschriften
Der Mensch beschriftet zusätzliche Instanzen, die durch Active Learning ausgewählt wurden. Potato priorisiert Instanzen, bei denen das LLM am unsichersten ist, bei denen Beschriftungsfunktionen nicht übereinstimmen, oder bei denen die Instanz im Embedding-Raum weit von vorhandenen Trainingsbeispielen entfernt ist.
Phase 7: Automatisierter Verfeinerungsloop
Das LLM beschriftet den gesamten Datensatz erneut mit aktualisierten Richtlinien und Few-Shot-Beispielen. Potato vergleicht mit allen menschlichen Labels und löst einen weiteren Zyklus der Konfusionsanalyse und Richtlinienverfeinerung aus, wenn die Genauigkeit unter dem Schwellenwert liegt.
Phase 8: Uneinigkeitserkundung
Der Mensch überprüft alle Instanzen, bei denen LLM und Beschriftungsfunktionen nicht übereinstimmen. Dies sind typischerweise die informativsten und schwierigsten Beispiele. Die Labels des Menschen für diese Fälle bieten den höchsten Grenznutzen.
Phase 9: Edge-Case-Synthese
Potato verwendet das LLM, um synthetische Grenzfälle basierend auf den identifizierten Konfusionsmustern zu generieren. Der Mensch beschriftet diese synthetischen Beispiele, die dann dem Trainingskontext des LLM hinzugefügt werden, um die Leistung bei den schwierigsten Fällen zu verbessern.
Phase 10: Kaskadierte Konfidenz-Eskalation
Das LLM weist jeder verbleibenden unbeschrifteten Instanz Konfidenzwerte zu. Instanzen werden in absteigender Schwierigkeit (aufsteigender Konfidenz) an den Menschen eskaliert. Der Mensch beschriftet, bis sich die Qualitätsmetriken stabilisieren.
Phase 11: Prompt-Optimierung
Inspiriert von DSPy führt Potato automatisierte Prompt-Optimierung durch und verwendet die akkumulierten menschlichen Labels als Validierungsset. Es probiert mehrere Prompt-Varianten (Anweisungsformulierung, Beispielreihenfolge, Chain-of-Thought vs. direkt) und wählt den am besten funktionierenden Prompt aus.
Phase 12: Abschlussvalidierung
Der Mensch führt eine abschließende Überprüfung einer Zufallsstichprobe aus den LLM-beschrifteten Instanzen durch. Wenn die Genauigkeit den Schwellenwert erfüllt, ist der Datensatz vollständig. Wenn nicht, geht das System zurück zu Phase 6.
Konfiguration
Schnellstart
Eine minimale Solo-Modus-Konfiguration:
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"Vollständige Konfigurationsreferenz
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"Schlüsselfähigkeiten
Konfusionsanalyse
Nach jedem Beschriftungsdurchgang erstellt Potato eine Konfusionsmatrix zwischen menschlichen und LLM-Labels. Das Admin-Dashboard zeigt:
- Präzision, Recall und F1 pro Klasse aus der Perspektive des LLM
- Häufigste Verwechslungspaare (z. B. "Neutral als Positiv fehlklassifiziert: 23 Instanzen")
- Beispielinstanzen für jedes Verwechslungspaar
- Trenddiagramme, die die Verbesserung über Verfeinerungsrunden hinweg zeigen
Zugriff auf Konfusionsanalyse programmatisch:
python -m potato.solo confusion --config config.yamlAusgabe:
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
Automatisierter Verfeinerungsloop
Der Verfeinerungsloop iteriert zwischen LLM-Beschriftung, Konfusionsanalyse und Richtlinienaktualisierungen. Jede Iteration:
- LLM beschriftet den gesamten Datensatz mit aktuellen Richtlinien
- Potato vergleicht mit allen verfügbaren menschlichen Labels
- Wenn die Genauigkeit unter dem Schwellenwert liegt, wird Konfusionsanalyse durchgeführt
- LLM schlägt Richtlinienänderungen basierend auf Fehlermustern vor
- Mensch überprüft und genehmigt Änderungen
- Zyklus wiederholt sich (bis
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%Beschriftungsfunktionen (ALCHEmist-inspiriert)
Potato generiert leichtgewichtige Beschriftungsfunktionen aus in menschlichen Annotationen beobachteten Mustern. Dies sind keine LLM-Aufrufe; es sind schnelle, deterministische Regeln.
Beispiele generierter Beschriftungsfunktionen:
# 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 NoneVerhalten der Beschriftungsfunktionen konfigurieren:
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_clusterUneinigkeits-Explorer
Der Uneinigkeits-Explorer präsentiert Instanzen, bei denen verschiedene Signale konfliktieren. Für jede Instanz sieht der Annotator:
- Das vorhergesagte Label des LLM und seine Konfidenz
- Stimmen der Beschriftungsfunktionen (falls vorhanden)
- Nächste beschriftete Nachbarn im Embedding-Raum
- Den Rohtext/-inhalt
Dies ist die wertvollste Annotationsaktivität: Jedes Label löst eine echte Mehrdeutigkeit auf.
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 examplesKaskadierte Konfidenz-Eskalation
Nachdem der Großteil des Datensatzes vom LLM beschriftet wurde, ordnet Potato alle LLM-beschrifteten Instanzen nach Konfidenz und eskaliert die am wenigsten konfidenten an den Menschen. Dies setzt sich in Batches fort, bis sich die Qualität stabilisiert.
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 correctMulti-Signal-Instanzpriorisierung
In allen Phasen, die menschliche Beschriftung beinhalten, verwendet Potato ein gewichtetes Pool-System, um die informativsten Instanzen auszuwählen. Sechs Pools speisen in eine einheitliche Prioritätswarteschlange:
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: Instanzen, bei denen die LLM-Konfidenz unter
confidence_thresholdliegt - disagreement: Instanzen, bei denen LLM und Beschriftungsfunktionen unterschiedliche Labels erzeugen
- boundary: Instanzen nahe der Entscheidungsgrenze im Embedding-Raum
- novel: Instanzen weit von einem vorhandenen beschrifteten Beispiel entfernt
- error_pattern: Instanzen, die bekannten Konfusionsmustern aus früheren Runden entsprechen
- random: Eine kleine Zufallsstichprobe zur Aufrechterhaltung der Kalibrierung und Erkennung blinder Flecken
Edge-Case-Synthese
Potato verwendet das LLM, um synthetische Beispiele zu generieren, die bekannte Schwächen gezielt adressieren:
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"]Das LLM generiert Beispiele, die zwischen den angegebenen Label-Paaren mehrdeutig sind. Der Mensch beschriftet sie, und diese Labels werden dem Few-Shot-Kontext für nachfolgende LLM-Beschriftungsrunden hinzugefügt.
Prompt-Optimierung (DSPy-inspiriert)
In Phase 11 führt Potato automatisierte Prompt-Optimierung durch, um das beste Anweisungsformat für das LLM zu finden:
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 examplesFortschritt überwachen
Das Admin-Dashboard zeigt den Solo-Modus-Fortschritt in Echtzeit:
- Aktuelle Phase und Fortschritt innerhalb jeder Phase
- Abgeschlossene menschliche Labels vs. Gesamtbudget
- LLM-Genauigkeit über Zeit (pro Runde)
- Abdeckung und Präzision der Beschriftungsfunktionen
- Konfidenz-Verteilungshistogramm
- Geschätzte Zeit bis zum Abschluss
Zugriff über die Befehlszeile:
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
Wann Solo-Modus vs. traditionelle Multi-Annotator-Methode
Solo-Modus verwenden, wenn:
- Sie einen Domänenexperten haben, der hochwertige Labels liefern kann
- Budget oder Logistik das Anwerben mehrerer Annotatoren verhindert
- Die Aufgabe klare, gut definierte Kategorien hat
- Sie einen großen Datensatz beschriften müssen (1.000+ Instanzen)
- Geschwindigkeit wichtiger ist als die Messung der Inter-Annotator-Übereinstimmung
Traditionelle Multi-Annotator-Methode verwenden, wenn:
- Sie Inter-Annotator-Übereinstimmungsstatistiken für Publikationen benötigen
- Die Aufgabe hochgradig subjektiv ist (z. B. Anstößigkeit, Humor)
- Sie Muster bei Annotationsmeinungsverschiedenheiten untersuchen müssen
- Regulatorische Anforderungen mehrere unabhängige Annotatoren vorschreiben
- Der Label-Raum komplex oder sich entwickelnd ist (Annotationsrichtlinien werden noch entwickelt)
Hybridansatz: Solo-Modus für die initiale Massenbeschriftung verwenden, dann einem zweiten Annotator eine zufällige 10–20 %-Stichprobe zuweisen, um Übereinstimmungsstatistiken zu berechnen. Dies bietet die Effizienz des Solo-Modus mit der Qualitätssicherung der Multi-Annotator-Verifizierung.
solo_mode:
enabled: true
# ... solo mode config ...
# Hybrid: assign verification sample to second annotator
verification:
enabled: true
sample_fraction: 0.15
annotator: "reviewer_1"Weiterführende Informationen
- Solo-Modus-Tutorial: 10.000 Beispiele beschriften – Schritt-für-Schritt-Walkthrough
- Active Learning – Das zugrundeliegende Active-Learning-System
- AI-Unterstützung – LLM-Integrationskonfiguration
- Qualitätskontrolle – Qualitätssicherung für Annotationen
- MACE – Kompetenzschätzung (nützlich für die Verifizierung im Hybridmodus)
Implementierungsdetails finden Sie in der Quelldokumentation.