Skip to content
यह पृष्ठ अभी आपकी भाषा में उपलब्ध नहीं है। अंग्रेज़ी संस्करण दिखाया जा रहा है।

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:

yaml
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

yaml
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:

bash
python -m potato.solo confusion --config config.yaml

Ausgabe:

text
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:

  1. LLM beschriftet den gesamten Datensatz mit aktuellen Richtlinien
  2. Potato vergleicht mit allen verfügbaren menschlichen Labels
  3. Wenn die Genauigkeit unter dem Schwellenwert liegt, wird Konfusionsanalyse durchgeführt
  4. LLM schlägt Richtlinienänderungen basierend auf Fehlermustern vor
  5. Mensch überprüft und genehmigt Änderungen
  6. Zyklus wiederholt sich (bis max_iterations)
yaml
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:

python
# 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

Verhalten der Beschriftungsfunktionen konfigurieren:

yaml
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

Uneinigkeits-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.

yaml
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

Kaskadierte 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.

yaml
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

Multi-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:

yaml
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_threshold liegt
  • 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:

yaml
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:

yaml
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

Fortschritt ü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:

bash
python -m potato.solo status --config config.yaml
text
Solo 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.

yaml
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

Implementierungsdetails finden Sie in der Quelldokumentation.