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:
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üssel | Standard | Bedeutung |
|---|---|---|
enabled | false | Schaltet die Engine ein. Eine aktivierte Engine braucht mindestens eine Quelle. |
schemas | alle | Die 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. |
cascade | erste Quelle | Quell-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üssel | Standard | Bedeutung |
|---|---|---|
id | Pflicht | Name, der in cascade, im Aufrufprotokoll und im Zertifikat verwendet wird. |
kind | Pflicht | Eines von llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator. |
endpoint_type | Pflicht für llm, vlm, decision, judge | Der KI-Endpunkt, etwa vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya oder systemone. Bei detector ist der Standard yolo. |
model | Standard des Endpunkts | Modellname. |
base_url | keiner | Server-URL für selbst gehostete oder OpenAI-kompatible Endpunkte. |
api_key | keiner | Geht nie in den Hash einer Version ein und wird nie exportiert. ${ENV_VAR} wird ersetzt. |
temperature | 0.0 | 0 bis 2. |
max_tokens | 256 | Grenze für Ausgabetokens pro Aufruf. |
timeout | Standard des Endpunkts | Sekunden pro Aufruf. |
prompt | aus dem Schema erzeugt | Prompt-Vorlage. Eine Änderung erzeugt eine neue Quellversion. |
confidence | {method: auto} | Wie die Quelle ihre Konfidenz angibt. Siehe Konfidenzmethoden. |
concurrency | runtime.concurrency | Parallele Aufrufe an diese Quelle. |
schemas | alle Schemata der Engine | Beschrä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. |
members | keiner | Nur jury. Mindestens zwei andere Quell-IDs. |
aggregation | plurality | Nur jury. Die relative Mehrheit ist die einzige Regel. |
field / predictions_file | keiner | Nur 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, seed | keiner | Nur fixture. Eine synthetische Quelle mit bekannter Fehlerrate, für Tests. |
revision | keiner | Eine 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.method | Gilt für | Was es tut |
|---|---|---|
verbalized | llm, vlm, judge | Das Modell nennt in seiner Antwort einen Wert von 0 bis 100. Ein Aufruf, und die unzuverlässigste Methode. |
k_sample | llm | samples 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. |
logprob | llm | Die 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. |
native | decision, detector, trained | Die eigenen Wahrscheinlichkeiten des Modells. Bei einer llm-Quelle ist das ein Validierungsfehler. |
auto | alle | native, wo die Quelle das hat, sonst verbalized. |
Optionen je nach Art
Fünf Quellarten lesen eigene Optionen:
decisionumfasst 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 mitradio-,select-,likert- undslider-Schemata.endpoint_typemusslayaodersystemonesein, undsystemonebrauchtbase_url, die Wurzel des Servers (eine URL, die auf/v1/systemoneendet, wird ebenfalls akzeptiert). Der Zustand wird in beiden Fällen als{"text": ...}gesendet, sodass ein Checkpoint im Prozess und hinterlaya-servedieselben Antworten gibt, undoptions: {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 Endpunktlayaim Prozess benötigtpip install 'potato-annotation[decision]'.detectorliest Begrenzungsrahmen eines Objektdetektors aufimage_annotation-Schemata.keep_threshold(0,35) legt den Score fest, ab dem ein Rahmen zur Vorhersage gehört. Rahmen zwischencandidate_threshold(0,05) undkeep_thresholdsenken die Konfidenz des Bildes.label_mapordnet Detektorklassen den Labels des Schemas zu, und nicht zugeordnete Klassen werden ignoriert.image_fieldnennt das Item-Feld mit dem Bildpfad oder der URL. Pfade werden so aufgelöst, wie die Annotationsseite sie auflöst, mit/media/x.jpgunter demmedia_directoryder Aufgabe und einem relativen Pfad untertask_dir.judgenimmtrubric(standardmäßig die Beschreibung des Schemas),fields(die Item-Felder, die dem Judge gezeigt werden, in Reihenfolge) undswap_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.vlmverwendet einen Vision-Endpunkt (openai_vision,anthropic_vision,ollama_vision). Für ein selbst gehostetes Modell hinter einem OpenAI-kompatiblen Server verwenden Sieopenai_visionmitbase_url.trainednimmtartifact_dir,trainer(standardmäßigsklearn-text) undrun_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üssel | Standard | Bedeutung |
|---|---|---|
pools | [team] | Wer labelt: team, crowd, solo. |
calibration_rate | auto | Anteil 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_fraction | 0.5 | Anteil der Kalibrierungslabels, mit dem Schwellenwerte gewählt werden. Der Rest testet sie. |
min_calibration_per_class | 10 | Untergrenze pro Klasse, bevor Verträge pro Klasse getestet werden. |
audit_rate | 0.02 | Anteil neu akzeptierter Maschinenlabels, der verblindet an Menschen zurückgeht, um Drift zu beobachten. |
overlap | 0.0 | Anteil der Kalibrierungsitems, die von mehreren Menschen gelabelt werden. |
overlap_k | 3 | Menschen pro mehrfach gelabeltem Item. Der Vertrag no_worse_than_human braucht 3. |
distribution_k | 5 | Menschen pro Item für distributional-Verträge. |
truth | majority | Wie die Labels mehrerer Menschen auf einem Item zu dem Label werden, an dem Verträge testen, majority oder dawid_skene. |
verify_visibility | shown | Ob 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üssel | Standard | Bedeutung |
|---|---|---|
provider | prolific | Die Crowd-Plattform. |
study_id | keiner | Die Prolific-Studie, deren Größe angepasst wird. |
reward_usd | keiner | Vergütung pro Platz, für Kostenhochrechnungen. |
per_worker_quota | 20 | Anfragen 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üssel | Bedeutung |
|---|---|
model_usd | Keine 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_usd | Obergrenze für Crowd-Ausgaben. Pflicht für echte Crowd-Ausgaben. |
human_labels | Hö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üssel | Standard | Bedeutung |
|---|---|---|
batch_size | 32 | Items pro festgeschriebenem Abschnitt. Ein abgebrochener Lauf setzt beim nächsten Abschnitt fort, ohne Aufrufe zu wiederholen. |
concurrency | 4 | Parallele Aufrufe pro Quelle, überschrieben durch das eigene concurrency einer Quelle. |
cache | true | Antworten auf identische Anfragen derselben Quellversion wiederverwenden. |
retries | 2 | Zusätzliche Versuche nach einem Timeout, Verbindungsfehler, 429 oder 5xx. Jeder Versuch wird protokolliert. |
planner_interval | 30 | Sekunden zwischen den Durchläufen des Planers im Server. |
hold_minutes | 60 | Minuten, 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üssel | Was es einschaltet |
|---|---|
drift | Standardmäß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“. |
distill | Ein Modell auf den Labels der Studie trainieren und an die erste Stelle der Kaskade setzen (siehe distill). |
optimize | Jeder 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_recruit | Den Planer die Größe der Prolific-Studie festlegen lassen, als Probelauf, solange crowd_live_spend nicht an ist. |
crowd_live_spend | Die Prolific-Studie tatsächlich ändern. Braucht den Pool crowd und budgets.human_usd. |
pii_redaction | E-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_capture | Vollstä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üssel | Standard | Bedeutung |
|---|---|---|
trainer | sklearn-text | Ein Trainer aus potato/training. |
min_labels | 200 | Erst trainieren, wenn so viele Labels vorliegen. |
include_silver | true | Auch auf Maschinenlabels trainieren, die ein Vertrag zertifiziert hat, markiert als Silber. |
every | 2.0 | Neu 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, derenendpoint_typekein Entscheidungsmodell ist, und einellm-,vlm- oderjudge-Quelle, derenendpoint_typeeines ist; und no_worse_than_humanmithumans.overlap_kunter 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
- Die Labeling-Engine
- Verträge der Labeling-Engine
- Kommandozeile, REST API, MCP-Tools und SDK
- AI-Unterstützung, zu den Endpunkttypen, die Quellen mit dem Rest von Potato teilen
Implementierungsdetails stehen in der Quelldokumentation.