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:
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:
| Chiave | Default | Significato |
|---|---|---|
enabled | false | Attiva il motore. Un motore attivo richiede almeno una fonte. |
schemas | tutti | Gli 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. |
cascade | prima fonte | Id 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:
| Chiave | Default | Significato |
|---|---|---|
id | obbligatoria | Nome usato in cascade, nel log delle chiamate e nel certificato. |
kind | obbligatoria | Uno tra llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator. |
endpoint_type | obbligatoria per llm, vlm, decision, judge | L'endpoint IA, come vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya o systemone. Per detector il default è yolo. |
model | default dell'endpoint | Nome del modello. |
base_url | nessuno | URL del server per endpoint self-hosted o compatibili con OpenAI. |
api_key | nessuno | Non entra mai nell'hash di una versione e non viene mai esportata. ${ENV_VAR} viene sostituita. |
temperature | 0.0 | Da 0 a 2. |
max_tokens | 256 | Limite di token in uscita per chiamata. |
timeout | default dell'endpoint | Secondi per chiamata. |
prompt | costruito dallo schema | Template del prompt. Cambiarlo crea una nuova versione della fonte. |
confidence | {method: auto} | Come la fonte dichiara la confidenza. Vedi Metodi di confidenza. |
concurrency | runtime.concurrency | Chiamate parallele a questa fonte. |
schemas | tutti gli schemi del motore | Limita 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. |
members | nessuno | Solo jury. Almeno due id di altre fonti. |
aggregation | plurality | Solo jury. La maggioranza relativa è l'unica regola. |
field / predictions_file | nessuno | Solo 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, seed | nessuno | Solo fixture. Una fonte sintetica con un tasso di errore noto, per i test. |
revision | nessuno | Una 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.method | Si applica a | Che cosa fa |
|---|---|---|
verbalized | llm, vlm, judge | Il modello indica un valore da 0 a 100 nella risposta. Una chiamata, ed è il metodo meno affidabile. |
k_sample | llm | samples 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. |
logprob | llm | Le 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. |
native | decision, detector, trained | Le probabilità del modello stesso. Su una fonte llm è un errore di validazione. |
auto | tutti | native dove la fonte lo ha, altrimenti verbalized. |
Opzioni specifiche del tipo
Cinque tipi di fonte leggono opzioni proprie:
decisioncopre Laya in-process, o qualsiasi server/v1/systemonecome Jev o OpenJev in hosting. Un solo forward pass restituisce una probabilità per ogni opzione, e funziona su schemiradio,select,likerteslider.endpoint_typedeve esserelayaosystemone, esystemonerichiedebase_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 dietrolaya-serve, eoptions: {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'endpointlayain-process richiedepip install 'potato-annotation[decision]'.detectorlegge i box da un object detector su schemiimage_annotation.keep_threshold(0.35) imposta il punteggio a partire dal quale un box fa parte della predizione. I box tracandidate_threshold(0.05) ekeep_thresholdabbassano la confidenza dell'immagine.label_mapassocia le classi del detector alle etichette dello schema, e le classi non associate vengono ignorate.image_fieldnomina 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.jpgsotto lamedia_directorydel task e un percorso relativo sottotask_dir.judgeaccettarubric(per default la descrizione dello schema),fields(i campi dell'item mostrati al giudice, in ordine) eswap_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.vlmusa un endpoint di visione (openai_vision,anthropic_vision,ollama_vision). Per un modello self-hosted dietro un server compatibile con OpenAI, usaopenai_visionconbase_url.trainedaccettaartifact_dir,trainer(sklearn-textper default) erun_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:
| Chiave | Default | Significato |
|---|---|---|
pools | [team] | Chi etichetta: team, crowd, solo. |
calibration_rate | auto | Quota 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_fraction | 0.5 | Quota delle etichette di calibrazione usate per scegliere le soglie. Le altre le testano. |
min_calibration_per_class | 10 | Minimo per classe prima che i contratti per classe vengano testati. |
audit_rate | 0.02 | Quota delle etichette automatiche appena accettate rimandate alle persone, in cieco, per sorvegliare la deriva. |
overlap | 0.0 | Quota degli item di calibrazione etichettati da più persone. |
overlap_k | 3 | Persone per item in sovrapposizione. Il contratto no_worse_than_human ne richiede 3. |
distribution_k | 5 | Persone per item per i contratti distributional. |
truth | majority | Come le etichette di più persone su un item diventano l'etichetta su cui i contratti vengono testati, majority o dawid_skene. |
verify_visibility | shown | Se 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:
| Chiave | Default | Significato |
|---|---|---|
provider | prolific | La piattaforma di crowdsourcing. |
study_id | nessuno | Lo studio Prolific da ridimensionare. |
reward_usd | nessuno | Compenso per posto, per le proiezioni dei costi. |
per_worker_quota | 20 | Richieste 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:
| Chiave | Significato |
|---|---|
model_usd | Smette 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_usd | Tetto alla spesa per il crowdsourcing. Obbligatorio per la spesa reale sul crowd. |
human_labels | Numero 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:
| Chiave | Default | Significato |
|---|---|---|
batch_size | 32 | Item per blocco salvato. Un'esecuzione interrotta riprende dal blocco successivo senza ripetere chiamate. |
concurrency | 4 | Chiamate parallele per fonte, sostituito dal concurrency della fonte stessa. |
cache | true | Riusa le risposte a richieste identiche dalla stessa versione della fonte. |
retries | 2 | Tentativi aggiuntivi dopo un timeout, un errore di connessione, un 429 o un 5xx. Ogni tentativo viene registrato nel log. |
planner_interval | 30 | Secondi tra due passaggi del planner nel server. |
hold_minutes | 60 | Minuti 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:
| Chiave | Che cosa attiva |
|---|---|
drift | Attiva 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". |
distill | Addestra un modello sulle etichette dello studio e lo mette per primo nella cascata (vedi distill). |
optimize | Fa 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_recruit | Lascia che il planner dimensioni lo studio Prolific, come simulazione a meno che crowd_live_spend non sia attivo. |
crowd_live_spend | Modifica davvero lo studio Prolific. Richiede il pool crowd e budgets.human_usd. |
pii_redaction | Maschera 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_capture | Conserva 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:
| Chiave | Default | Significato |
|---|---|---|
trainer | sklearn-text | Un trainer da potato/training. |
min_labels | 200 | Addestra solo quando esistono almeno queste etichette. |
include_silver | true | Addestra anche sulle etichette automatiche certificate da un contratto, marcate come silver. |
every | 2.0 | Riaddestra 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
decisionil cuiendpoint_typenon è un modello decisionale, e una fontellm,vlmojudgeil cuiendpoint_typelo è; e no_worse_than_humanconhumans.overlap_kinferiore 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
- Il motore di etichettatura
- Contratti del motore di etichettatura
- Riga di comando, REST API, strumenti MCP e SDK
- Supporto IA, per i tipi di endpoint che le fonti condividono con il resto di Potato
Per i dettagli di implementazione, consulta la documentazione sorgente.