Skip to content

Konfiguration der Labeling-Engine

Jeder Schlüssel im Block labeling_engine: Quellen und Konfidenzmethoden, die menschlichen Pools, Crowd-Ausgaben, Budgets, Laufzeitgrenzen, Features und was die Validierung ablehnt.

Alles, was die Labeling-Engine tut, wird in einem einzigen labeling_engine-Block festgelegt. Ein ungültiger Block hält den Server beim Start an und listet alle Probleme auf einmal auf. Damit Annotierende die Anfragen der Engine erhalten, setzen Sie außerdem assignment_strategy: engine. Diese Strategie ohne aktivierte Engine zu setzen, ist ein Validierungsfehler.

Der Block hat diese Abschnitte, die unten jeweils beschrieben sind:

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  schemas: [sentiment]            # default: every scheme a source can label
  sources: []
  cascade: [laya, gemma]          # default: the first source alone
  contracts: []
  humans: {}
  crowd: {}
  budgets: {}
  runtime: {}
  features: {}
  redaction: {}
  distill: {}

Schlüssel der obersten Ebene

Fünf Schlüssel stehen direkt unter labeling_engine:

SchlüsselStandardBedeutung
enabledfalseSchaltet die Engine ein. Eine aktivierte Engine braucht mindestens eine Quelle.
schemasalleDie Annotationsschemata, die die Engine labelt. Unter assignment_strategy: engine wird ein ausgelassenes Schema nur auf den Items beantwortet, die die Engine für ihre eigenen Schemata an Menschen schickt, nicht auf jedem Item, und die Validierung warnt davor. Ein Schema, das keine Quelle labeln kann (etwa Freitext), kann nicht Teil der Engine sein und wird unter dieser Strategie daher nie auf jedem Item beantwortet. Verwenden Sie eine andere Zuweisungsstrategie, wenn das nötig ist.
sources[]Die Modelle. Siehe Quellen.
cascadeerste QuelleQuell-IDs in der Reihenfolge, in der sie versucht werden. Menschen kommen nach der letzten.
contracts[]Was die Labels erfüllen müssen. Siehe Verträge.

Quellen

Eine Quelle ist ein Modell oder ein vorhandener Satz von Labels, der für jedes Item ein Label und eine Konfidenz vorschlägt. Jede Quelle hat eine eindeutige id und eine kind, und ein unbekannter Schlüssel an einer Quelle ist ein Fehler:

SchlüsselStandardBedeutung
idPflichtName, der in cascade, im Aufrufprotokoll und im Zertifikat verwendet wird.
kindPflichtEines von llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator.
endpoint_typePflicht für llm, vlm, decision, judgeDer KI-Endpunkt, etwa vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya oder systemone. Bei detector ist der Standard yolo.
modelStandard des EndpunktsModellname.
base_urlkeinerServer-URL für selbst gehostete oder OpenAI-kompatible Endpunkte.
api_keykeinerGeht nie in den Hash einer Version ein und wird nie exportiert. ${ENV_VAR} wird ersetzt.
temperature0.00 bis 2.
max_tokens256Grenze für Ausgabetokens pro Aufruf.
timeoutStandard des EndpunktsSekunden pro Aufruf.
promptaus dem Schema erzeugtPrompt-Vorlage. Eine Änderung erzeugt eine neue Quellversion.
confidence{method: auto}Wie die Quelle ihre Konfidenz angibt. Siehe Konfidenzmethoden.
concurrencyruntime.concurrencyParallele Aufrufe an diese Quelle.
schemasalle Schemata der EngineBeschränkt die Quelle auf diese Schemata.
options{}Optionen je nach Art, unten aufgeführt.
judge{}Nur judge. Dieselben Optionen wie options, unter einem eigenen Schlüssel, und options hat Vorrang, wo beide eine Option setzen.
memberskeinerNur jury. Mindestens zwei andere Quell-IDs.
aggregationpluralityNur jury. Die relative Mehrheit ist die einzige Regel.
field / predictions_filekeinerNur static. Wo die vorhandenen Labels liegen. Das Feld enthält {scheme: label} oder ein bloßes Label, wenn die Quelle ein einziges Schema labelt. Ein Feld mit falscher Form auf jedem Item lässt den Lauf mit einer Meldung scheitern, die es nennt.
error_rate, seedkeinerNur fixture. Eine synthetische Quelle mit bekannter Fehlerrate, für Tests.
revisionkeinerEine Modellrevision, die in der Version festgehalten wird, zum Beispiel ein Checkpoint-Hash.

Alles, was eine Antwort verändern kann (Modell, Prompt, Temperatur, Optionen), fließt in den Versions-Hash der Quelle ein. Eine neue Version macht jeden Vertrag, der von der Quelle abhängt, stale.

Eine Antwort, die kein Wert ist, den das Schema aufnehmen kann, etwa ein Label, das nicht in seiner Liste steht, ein Zahlenfeld, das keine Zahl ist, oder eine Liste bei einem Eine-aus-N-Schema, wird als Fehler gespeichert und nie als Label, und die Meldung des Laufs zählt diese Fehler. Ein Item, dessen Aufrufe scheitern, wird in späteren Läufen erneut angefragt, höchstens dreimal pro Quellversion, und danach wartet es auf eine geänderte Quelle (ein korrigierter Schlüssel oder Prompt ist eine neue Version). Ein Lauf, in dem eine Quelle scheitert, hält die anderen Stufen nicht an. Die nächste Stufe labelt jedes Item, und potato label run endet mit Status 1 und nennt die gescheiterte Quelle.

Konfidenzmethoden

Die Akzeptanzregeln der Engine setzen Schwellenwerte auf die Konfidenz jeder Vorhersage. Wie eine Quelle ihre Konfidenz angibt, entscheidet daher, wie viel die Engine akzeptieren kann. confidence.method nimmt einen von fünf Werten an:

confidence.methodGilt fürWas es tut
verbalizedllm, vlm, judgeDas Modell nennt in seiner Antwort einen Wert von 0 bis 100. Ein Aufruf, und die unzuverlässigste Methode.
k_samplellmsamples Antworten (standardmäßig 5) bei sample_temperature (standardmäßig 0,7). Das Label ist die häufigste Antwort, und die Konfidenz ist ihr Anteil. Kostet k Aufrufe.
logprobllmDie Labels werden mit Buchstaben versehen, das Modell antwortet mit einem Buchstaben, und die Konfidenz wird aus den Wahrscheinlichkeiten des ersten Tokens abgelesen. Ein Aufruf, meist am besten kalibriert. Braucht ein Backend, das Logprobs zurückgibt (vLLM, OpenAI-kompatibel), und höchstens 20 Labels. Ein Schema mit mehr Labels ist ein Validierungsfehler.
nativedecision, detector, trainedDie eigenen Wahrscheinlichkeiten des Modells. Bei einer llm-Quelle ist das ein Validierungsfehler.
autoallenative, wo die Quelle das hat, sonst verbalized.

Optionen je nach Art

Fünf Quellarten lesen eigene Optionen:

  • decision umfasst Laya im Prozess oder jeden /v1/systemone-Server, etwa gehostetes Jev oder OpenJev. Ein einziger Forward Pass liefert eine Wahrscheinlichkeit für jede Option, und es funktioniert mit radio-, select-, likert- und slider-Schemata. endpoint_type muss laya oder systemone sein, und systemone braucht base_url, die Wurzel des Servers (eine URL, die auf /v1/systemone endet, wird ebenfalls akzeptiert). Der Zustand wird in beiden Fällen als {"text": ...} gesendet, sodass ein Checkpoint im Prozess und hinter laya-serve dieselben Antworten gibt, und options: {state_key: ""} sendet stattdessen den bloßen String. Auf Bewertungsskalen (likert, slider) folgen die Werte von Laya der Skala kaum, prüfen Sie deshalb einige Items, bevor Sie sich darauf verlassen. Der Endpunkt laya im Prozess benötigt pip install 'potato-annotation[decision]'.
  • detector liest Begrenzungsrahmen eines Objektdetektors auf image_annotation-Schemata. keep_threshold (0,35) legt den Score fest, ab dem ein Rahmen zur Vorhersage gehört. Rahmen zwischen candidate_threshold (0,05) und keep_threshold senken die Konfidenz des Bildes. label_map ordnet Detektorklassen den Labels des Schemas zu, und nicht zugeordnete Klassen werden ignoriert. image_field nennt das Item-Feld mit dem Bildpfad oder der URL. Pfade werden so aufgelöst, wie die Annotationsseite sie auflöst, mit /media/x.jpg unter dem media_directory der Aufgabe und einem relativen Pfad unter task_dir.
  • judge nimmt rubric (standardmäßig die Beschreibung des Schemas), fields (die Item-Felder, die dem Judge gezeigt werden, in Reihenfolge) und swap_order, das zweimal mit umgekehrter Label-Reihenfolge fragt und ein Urteil, das dabei kippt, in eine Enthaltung verwandelt. Auf Agenten-Trace-Schemata (process_reward, trajectory_eval, ...) labelt der Judge jeden Schritt.
  • vlm verwendet einen Vision-Endpunkt (openai_vision, anthropic_vision, ollama_vision). Für ein selbst gehostetes Modell hinter einem OpenAI-kompatiblen Server verwenden Sie openai_vision mit base_url.
  • trained nimmt artifact_dir, trainer (standardmäßig sklearn-text) und run_id. Diese Quelle entsteht meist durch Destillation und nicht durch eine von Hand geschriebene Konfiguration.

humans

Der Block humans legt fest, wer labelt und wie die Engine Stichproben zieht:

SchlüsselStandardBedeutung
pools[team]Wer labelt: team, crowd, solo.
calibration_rateautoAnteil der Items, die für die verblindete Kalibrierung gezogen werden. auto wählt eine Rate aus den Hochrechnungen der Verträge, genug Labels pro Klasse, um testbar zu sein, höchstens die Hälfte einer kleinen Studie und ein Fünftel einer Studie mit über 1.000 Items.
dev_fraction0.5Anteil der Kalibrierungslabels, mit dem Schwellenwerte gewählt werden. Der Rest testet sie.
min_calibration_per_class10Untergrenze pro Klasse, bevor Verträge pro Klasse getestet werden.
audit_rate0.02Anteil neu akzeptierter Maschinenlabels, der verblindet an Menschen zurückgeht, um Drift zu beobachten.
overlap0.0Anteil der Kalibrierungsitems, die von mehreren Menschen gelabelt werden.
overlap_k3Menschen pro mehrfach gelabeltem Item. Der Vertrag no_worse_than_human braucht 3.
distribution_k5Menschen pro Item für distributional-Verträge.
truthmajorityWie die Labels mehrerer Menschen auf einem Item zu dem Label werden, an dem Verträge testen, majority oder dawid_skene.
verify_visibilityshownOb eine Prüfanfrage die Antwort der Maschine zeigt (shown) oder nicht (blind).

crowd

Der Block crowd gilt, wenn crowd in humans.pools steht, und Prolific ist die einzige Crowd-Plattform, die die Engine steuern kann:

SchlüsselStandardBedeutung
providerprolificDie Crowd-Plattform.
study_idkeinerDie Prolific-Studie, deren Größe angepasst wird.
reward_usdkeinerVergütung pro Platz, für Kostenhochrechnungen.
per_worker_quota20Anfragen pro Worker. Die Zahl der Plätze ist ceil(open requests / quota).

Die Rekrutierung über die Crowd ist standardmäßig ein Probelauf, und der Planer berichtet, was er tun würde. Um Geld auszugeben, braucht es features.crowd_live_spend: true und eine Obergrenze budgets.human_usd, und eine Konfiguration, die echte Ausgaben ohne diese Obergrenze einschaltet, wird abgelehnt. Wie Sie die Prolific-Studie selbst einrichten, beschreibt Crowdsourcing.

budgets

Der Block budgets stoppt Ausgaben, bevor eine Grenze überschritten wird:

SchlüsselBedeutung
model_usdKeine Aufrufe kostenpflichtiger Modelle mehr, sobald so viel ausgegeben ist. Jeder Aufruf reserviert vorher seine hochgerechneten Kosten. Modelle ohne Preis und selbst gehostete Modelle auf localhost werden dadurch nicht begrenzt.
human_usdObergrenze für Crowd-Ausgaben. Pflicht für echte Crowd-Ausgaben.
human_labelsHöchstzahl der Anfragen an Menschen, die die Engine öffnen darf, gezählt beim Öffnen jeder Anfrage.

runtime

Der Block runtime steuert Batching, Parallelität und wie lange eine Person eine Anfrage halten darf:

SchlüsselStandardBedeutung
batch_size32Items pro festgeschriebenem Abschnitt. Ein abgebrochener Lauf setzt beim nächsten Abschnitt fort, ohne Aufrufe zu wiederholen.
concurrency4Parallele Aufrufe pro Quelle, überschrieben durch das eigene concurrency einer Quelle.
cachetrueAntworten auf identische Anfragen derselben Quellversion wiederverwenden.
retries2Zusätzliche Versuche nach einem Timeout, Verbindungsfehler, 429 oder 5xx. Jeder Versuch wird protokolliert.
planner_interval30Sekunden zwischen den Durchläufen des Planers im Server.
hold_minutes60Minuten, die eine Person eine Anfrage halten darf, ohne zu antworten, bevor sie in den Pool zurückgeht. Das Item verschwindet dann auch von ihrer Seite, sodass ein offen gelassener Tab es später nicht beantworten kann.

features

Jedes Feature ist standardmäßig aus, außer drift:

SchlüsselWas es einschaltet
driftStandardmäßig an. Reagiert auf Audit-Ergebnisse. Zeigen die Audits, dass die Fehlerrate der akzeptierten Labels über dem Ziel liegt, lautet der Vertrag violated, Maschinenlabels auf diesem Schema werden nicht mehr akzeptiert, und es werden neue Kalibrierungslabels gezogen. Jede Zertifizierung beginnt eine neue Audit-Folge, sodass erneutes Zertifizieren nach einer Korrektur die Akzeptanz wiederherstellt. Setzen Sie es auf false, um eine Überschreitung nur zu melden. Der Vertrag lautet dann „met, audits breached“.
distillEin Modell auf den Labels der Studie trainieren und an die erste Stelle der Kaskade setzen (siehe distill).
optimizeJeder Durchlauf des Planers bewertet jede Teilmenge der Kaskade auf dev-Labels und meldet die günstigste, die die Abdeckung der Verträge hält, unter GET /api/engine/v1/schemes/<name>/optimize. Angewendet wird nichts, denn eine Kaskade zu übernehmen, ist eine Konfigurationsänderung und eine neue Zertifizierung.
crowd_recruitDen Planer die Größe der Prolific-Studie festlegen lassen, als Probelauf, solange crowd_live_spend nicht an ist.
crowd_live_spendDie Prolific-Studie tatsächlich ändern. Braucht den Pool crowd und budgets.human_usd.
pii_redactionE-Mail-Adressen, URLs, IP-Adressen, Kartennummern, SSNs, Telefonnummern und @Handles maskieren, bevor Text an die API eines Drittanbieters geht. Das Aufrufprotokoll hält fest, was maskiert wurde, als Kategorien und Hashes, nie als Text.
payload_captureVollständige Prompts und Antworten unter <task_dir>/engine_payloads/ aufbewahren. Standardmäßig aus, und das Aufrufprotokoll behält nur Hashes.

redaction

redaction.categories listet, welche von email, url, ip, card, ssn, phone und handle maskiert werden, und umfasst standardmäßig alle. Die Maskierung greift nur mit features.pii_redaction und nur bei APIs von Drittanbietern. Selbst gehostete Endpunkttypen (vllm, ollama, laya, yolo, ...) werden nicht maskiert, egal wo sie laufen, und ebenso wenig ein Endpunkt, dessen base_url auf demselben Rechner liegt.

distill

Mit features.distill trainiert die Engine ein günstiges Modell auf den Labels der Studie und setzt es an die erste Stelle der Kaskade:

SchlüsselStandardBedeutung
trainersklearn-textEin Trainer aus potato/training.
min_labels200Erst trainieren, wenn so viele Labels vorliegen.
include_silvertrueAuch auf Maschinenlabels trainieren, die ein Vertrag zertifiziert hat, markiert als Silber.
every2.0Neu trainieren, wenn die Zahl der Labels um diesen Faktor gewachsen ist.

Items aus den cert- und Audit-Splits kommen nie ins Trainingsset, sodass das destillierte Modell nie auf Labels getestet wird, mit denen es trainiert wurde.

Validierung

potato validate config.yaml prüft den Block labeling_engine zusammen mit dem Rest der Konfiguration, und jeder Fehler nennt seinen Schlüssel, zum Beispiel labeling_engine.sources[1].kind must be one of ... oder labeling_engine.contracts[0].error is required for selective_risk. Die Validierung lehnt außerdem ab:

  • einen Vertragsschlüssel, den die Vertragsart nicht liest, etwa einen Tippfehler in error;
  • einen Vertrag auf einem Schema, das keine Quelle der Kaskade labeln kann, mit dem Grund für jede Quelle;
  • einen Vertrag auf einem Schema, das die Engine nicht bewerten kann (Freitext, paarweise);
  • eine decision-Quelle, deren endpoint_type kein Entscheidungsmodell ist, und eine llm-, vlm- oder judge-Quelle, deren endpoint_type eines ist; und
  • no_worse_than_human mit humans.overlap_k unter 3.

Die Validierung warnt außerdem, wenn budgets.human_labels zu klein ist, um einen selective_risk-Vertrag zu zertifizieren, selbst wenn jede Maschinenantwort richtig wäre. Erhöhen Sie das Budget oder lockern Sie error, bis diese Warnung verschwindet.

Weiterführende Lektüre

Implementierungsdetails stehen in der Quelldokumentation.