Skip to content

Configurazione del motore di etichettatura

Ogni chiave del blocco labeling_engine: fonti e metodi di confidenza, pool di persone, spesa per il crowdsourcing, budget, limiti di runtime, funzionalità e che cosa rifiuta la validazione.

Tutto ciò che fa il motore di etichettatura si imposta in un unico blocco labeling_engine. Un blocco non valido blocca il server all'avvio ed elenca tutti i problemi in una volta. Perché agli annotatori vengano servite le richieste del motore, imposta anche assignment_strategy: engine. Impostare questa strategia senza un motore attivo è un errore di validazione.

Il blocco ha queste sezioni, ciascuna descritta più sotto:

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: {}

Chiavi di primo livello

Cinque chiavi stanno direttamente sotto labeling_engine:

ChiaveDefaultSignificato
enabledfalseAttiva il motore. Un motore attivo richiede almeno una fonte.
schemastuttiGli schemi di annotazione che il motore etichetta. Con assignment_strategy: engine, uno schema escluso riceve risposta solo sugli item che il motore manda alle persone per i propri schemi, non su ogni item, e la validazione lo segnala con un avviso. Uno schema che nessuna fonte può etichettare (il testo libero, per esempio) non può far parte del motore, quindi con questa strategia non riceve mai risposta su ogni item. Se deve riceverla, usa un'altra strategia di assegnazione.
sources[]I modelli. Vedi Fonti.
cascadeprima fonteId delle fonti nell'ordine in cui vengono provate. Le persone vengono dopo l'ultima.
contracts[]Che cosa devono soddisfare le etichette. Vedi Contratti.

Fonti

Una fonte è un modello, o un insieme di etichette esistenti, che propone un'etichetta e una confidenza per ogni item. Ogni fonte ha un id univoco e un kind, e una chiave sconosciuta su una fonte è un errore:

ChiaveDefaultSignificato
idobbligatoriaNome usato in cascade, nel log delle chiamate e nel certificato.
kindobbligatoriaUno tra llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator.
endpoint_typeobbligatoria per llm, vlm, decision, judgeL'endpoint IA, come vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya o systemone. Per detector il default è yolo.
modeldefault dell'endpointNome del modello.
base_urlnessunoURL del server per endpoint self-hosted o compatibili con OpenAI.
api_keynessunoNon entra mai nell'hash di una versione e non viene mai esportata. ${ENV_VAR} viene sostituita.
temperature0.0Da 0 a 2.
max_tokens256Limite di token in uscita per chiamata.
timeoutdefault dell'endpointSecondi per chiamata.
promptcostruito dallo schemaTemplate del prompt. Cambiarlo crea una nuova versione della fonte.
confidence{method: auto}Come la fonte dichiara la confidenza. Vedi Metodi di confidenza.
concurrencyruntime.concurrencyChiamate parallele a questa fonte.
schemastutti gli schemi del motoreLimita la fonte a questi schemi.
options{}Opzioni specifiche del tipo, elencate più sotto.
judge{}Solo judge. Le stesse opzioni di options, sotto una chiave propria, e dove entrambe ne impostano una prevale options.
membersnessunoSolo jury. Almeno due id di altre fonti.
aggregationpluralitySolo jury. La maggioranza relativa è l'unica regola.
field / predictions_filenessunoSolo static. Dove si trovano le etichette esistenti. Il campo contiene {scheme: label}, oppure un'etichetta semplice quando la fonte etichetta un solo schema. Un campo con la forma sbagliata su ogni item fa fallire l'esecuzione con un messaggio che lo nomina.
error_rate, seednessunoSolo fixture. Una fonte sintetica con un tasso di errore noto, per i test.
revisionnessunoUna revisione del modello da registrare nella versione, per esempio l'hash di un checkpoint.

Tutto ciò che può cambiare una risposta (modello, prompt, temperatura, opzioni) entra nell'hash di versione della fonte. Una nuova versione rende stale ogni contratto che dipende dalla fonte.

Una risposta che non è un valore ammesso dallo schema, come un'etichetta assente dalla sua lista, un campo numerico che non è un numero o una lista su uno schema a scelta singola tra N, viene registrata come errore e mai come etichetta, e il messaggio dell'esecuzione conta questi errori. Un item le cui chiamate falliscono viene richiesto di nuovo nelle esecuzioni successive, al massimo tre volte per versione della fonte, e dopo aspetta una fonte modificata (una chiave o un prompt corretti sono una nuova versione). Un'esecuzione in cui una fonte fallisce non ferma gli altri livelli. Il livello successivo etichetta ogni item, e potato label run termina con stato 1 e nomina la fonte fallita.

Metodi di confidenza

Le regole di accettazione del motore applicano una soglia alla confidenza di ogni predizione, quindi il modo in cui una fonte dichiara la confidenza decide quanto il motore può accettare. confidence.method accetta uno di cinque valori:

confidence.methodSi applica aChe cosa fa
verbalizedllm, vlm, judgeIl modello indica un valore da 0 a 100 nella risposta. Una chiamata, ed è il metodo meno affidabile.
k_samplellmsamples risposte (5 per default) a sample_temperature (0.7 per default). L'etichetta è la risposta più frequente e la confidenza è la sua quota. Costa k chiamate.
logprobllmLe etichette sono contrassegnate da lettere e il modello risponde con una lettera, e la confidenza si legge dalle probabilità del primo token. Una chiamata, di solito la meglio calibrata. Richiede un backend che restituisca le logprob (vLLM, compatibile con OpenAI) e al massimo 20 etichette, e uno schema con più etichette è un errore di validazione.
nativedecision, detector, trainedLe probabilità del modello stesso. Su una fonte llm è un errore di validazione.
autotuttinative dove la fonte lo ha, altrimenti verbalized.

Opzioni specifiche del tipo

Cinque tipi di fonte leggono opzioni proprie:

  • decision copre Laya in-process, o qualsiasi server /v1/systemone come Jev o OpenJev in hosting. Un solo forward pass restituisce una probabilità per ogni opzione, e funziona su schemi radio, select, likert e slider. endpoint_type deve essere laya o systemone, e systemone richiede base_url, la radice del server (è accettato anche un URL che termina con /v1/systemone). In entrambi i casi lo stato viene inviato come {"text": ...}, quindi un checkpoint dà le stesse risposte in-process e dietro laya-serve, e options: {state_key: ""} invia invece la stringa semplice. Sulle scale di valutazione (likert, slider) i punteggi di Laya seguono a fatica la scala, quindi controlla qualche item prima di farci affidamento. L'endpoint laya in-process richiede pip install 'potato-annotation[decision]'.
  • detector legge i box da un object detector su schemi image_annotation. keep_threshold (0.35) imposta il punteggio a partire dal quale un box fa parte della predizione. I box tra candidate_threshold (0.05) e keep_threshold abbassano la confidenza dell'immagine. label_map associa le classi del detector alle etichette dello schema, e le classi non associate vengono ignorate. image_field nomina il campo dell'item con il percorso o l'URL dell'immagine. I percorsi vengono risolti come li risolve la pagina di annotazione, con /media/x.jpg sotto la media_directory del task e un percorso relativo sotto task_dir.
  • judge accetta rubric (per default la descrizione dello schema), fields (i campi dell'item mostrati al giudice, in ordine) e swap_order, che chiede due volte con l'ordine delle etichette invertito e trasforma un verdetto che cambia in un'astensione. Sugli schemi per le tracce degli agenti (process_reward, trajectory_eval, ...) il giudice etichetta ogni passo.
  • vlm usa un endpoint di visione (openai_vision, anthropic_vision, ollama_vision). Per un modello self-hosted dietro un server compatibile con OpenAI, usa openai_vision con base_url.
  • trained accetta artifact_dir, trainer (sklearn-text per default) e run_id. Di solito questa fonte la crea la distillazione, non una configurazione scritta a mano.

humans

Il blocco humans stabilisce chi etichetta e come il motore campiona le persone:

ChiaveDefaultSignificato
pools[team]Chi etichetta: team, crowd, solo.
calibration_rateautoQuota di item campionati per la calibrazione in cieco. auto sceglie un tasso dalle proiezioni dei contratti, con abbastanza etichette per classe da poter essere testato, al massimo metà di uno studio piccolo e un quinto di uno con più di 1.000 item.
dev_fraction0.5Quota delle etichette di calibrazione usate per scegliere le soglie. Le altre le testano.
min_calibration_per_class10Minimo per classe prima che i contratti per classe vengano testati.
audit_rate0.02Quota delle etichette automatiche appena accettate rimandate alle persone, in cieco, per sorvegliare la deriva.
overlap0.0Quota degli item di calibrazione etichettati da più persone.
overlap_k3Persone per item in sovrapposizione. Il contratto no_worse_than_human ne richiede 3.
distribution_k5Persone per item per i contratti distributional.
truthmajorityCome le etichette di più persone su un item diventano l'etichetta su cui i contratti vengono testati, majority o dawid_skene.
verify_visibilityshownSe una richiesta di verifica mostra la risposta della macchina (shown) o no (blind).

crowd

Il blocco crowd si applica quando crowd è in humans.pools, e Prolific è l'unica piattaforma di crowdsourcing che il motore può pilotare:

ChiaveDefaultSignificato
providerprolificLa piattaforma di crowdsourcing.
study_idnessunoLo studio Prolific da ridimensionare.
reward_usdnessunoCompenso per posto, per le proiezioni dei costi.
per_worker_quota20Richieste per worker. I posti sono ceil(open requests / quota).

Il reclutamento tramite crowdsourcing è per default una simulazione, e il planner riporta che cosa farebbe. Spendere denaro richiede features.crowd_live_spend: true e un limite budgets.human_usd, e una configurazione che attiva la spesa reale senza il limite viene rifiutata. Crowdsourcing spiega come configurare lo studio Prolific stesso.

budgets

Il blocco budgets ferma la spesa prima che un limite venga superato:

ChiaveSignificato
model_usdSmette di chiamare i modelli a pagamento quando è stata spesa questa cifra. Ogni chiamata riserva prima il suo costo previsto. I modelli senza prezzo e i modelli self-hosted su localhost non sono limitati da questa chiave.
human_usdTetto alla spesa per il crowdsourcing. Obbligatorio per la spesa reale sul crowd.
human_labelsNumero massimo di richieste umane che il motore può aprire, contate all'apertura di ciascuna richiesta.

runtime

Il blocco runtime controlla il batching, la concorrenza e per quanto tempo una persona può tenere in carico una richiesta:

ChiaveDefaultSignificato
batch_size32Item per blocco salvato. Un'esecuzione interrotta riprende dal blocco successivo senza ripetere chiamate.
concurrency4Chiamate parallele per fonte, sostituito dal concurrency della fonte stessa.
cachetrueRiusa le risposte a richieste identiche dalla stessa versione della fonte.
retries2Tentativi aggiuntivi dopo un timeout, un errore di connessione, un 429 o un 5xx. Ogni tentativo viene registrato nel log.
planner_interval30Secondi tra due passaggi del planner nel server.
hold_minutes60Minuti per cui una persona può tenere in carico una richiesta senza rispondere prima che torni nel pool. L'item sparisce anche dalla sua pagina, quindi una scheda lasciata aperta non può rispondere più tardi.

features

Ogni funzionalità è disattivata per default tranne drift:

ChiaveChe cosa attiva
driftAttiva per default. Agisce sui risultati degli audit. Quando gli audit mostrano che il tasso di errore delle etichette accettate è superiore all'obiettivo, il contratto risulta violated, le etichette automatiche su quello schema non vengono più accettate e vengono estratte nuove etichette di calibrazione. Ogni certificazione avvia una nuova sequenza di audit, quindi certificare di nuovo dopo una correzione ripristina l'accettazione. Impostala a false per limitarti a segnalare la violazione, e il contratto risulta allora "met, audits breached".
distillAddestra un modello sulle etichette dello studio e lo mette per primo nella cascata (vedi distill).
optimizeFa sì che ogni passaggio del planner valuti ogni sottoinsieme della cascata sulle etichette dev e riporti il più economico che mantiene la copertura dei contratti, in GET /api/engine/v1/schemes/<name>/optimize. Non viene applicato nulla, perché adottare una cascata è una modifica della configurazione e una nuova certificazione.
crowd_recruitLascia che il planner dimensioni lo studio Prolific, come simulazione a meno che crowd_live_spend non sia attivo.
crowd_live_spendModifica davvero lo studio Prolific. Richiede il pool crowd e budgets.human_usd.
pii_redactionMaschera email, URL, indirizzi IP, numeri di carta, SSN, numeri di telefono e @handle prima che il testo vada a un'API di terze parti. Il log delle chiamate registra ciò che è stato mascherato come categorie e hash, mai il testo.
payload_captureConserva prompt e risposte completi in <task_dir>/engine_payloads/. Disattivata per default, e il log delle chiamate conserva solo gli hash.

redaction

redaction.categories elenca quali tra email, url, ip, card, ssn, phone e handle mascherare, e per default li include tutti. Il mascheramento si applica solo con features.pii_redaction, e solo alle API di terze parti. I tipi di endpoint self-hosted (vllm, ollama, laya, yolo, ...) non vengono mascherati ovunque siano in esecuzione, e nemmeno un endpoint il cui base_url è sulla stessa macchina.

distill

Con features.distill attiva, il motore addestra un modello economico sulle etichette dello studio e lo mette per primo nella cascata:

ChiaveDefaultSignificato
trainersklearn-textUn trainer da potato/training.
min_labels200Addestra solo quando esistono almeno queste etichette.
include_silvertrueAddestra anche sulle etichette automatiche certificate da un contratto, marcate come silver.
every2.0Riaddestra quando il numero di etichette è cresciuto di questo fattore.

Gli item delle partizioni cert e audit non entrano mai nel training set, quindi il modello distillato non viene mai testato su etichette su cui è stato addestrato.

Validazione

potato validate config.yaml controlla il blocco labeling_engine insieme al resto della configurazione, e ogni errore nomina la sua chiave, per esempio labeling_engine.sources[1].kind must be one of ... o labeling_engine.contracts[0].error is required for selective_risk. La validazione rifiuta anche:

  • una chiave di contratto che il tipo di contratto non legge, come un refuso di error;
  • un contratto su uno schema che nessuna fonte della cascata può etichettare, con il motivo per ogni fonte;
  • un contratto su uno schema che il motore non può valutare (testo libero, pairwise);
  • una fonte decision il cui endpoint_type non è un modello decisionale, e una fonte llm, vlm o judge il cui endpoint_type lo è; e
  • no_worse_than_human con humans.overlap_k inferiore a 3.

La validazione avvisa anche quando budgets.human_labels è troppo piccolo per certificare un contratto selective_risk anche se ogni risposta della macchina fosse giusta. Aumenta il budget, o allenta error, finché l'avviso non scompare.

Approfondimenti

Per i dettagli di implementazione, consulta la documentazione sorgente.