CLI, REST API, strumenti MCP e SDK del motore di etichettatura
Pilota il motore di etichettatura da potato label, dalle route REST /api/engine/v1, da cinque strumenti MCP del motore o dalla classe Python Study, tutti sullo stesso file engine.sqlite.
Il server di annotazione, la riga di comando, la REST API, gli strumenti MCP e il Python SDK pilotano tutti lo stesso motore di etichettatura sullo stesso file engine.sqlite nella directory del task. Puoi avviare uno studio dalla riga di comando, servire le richieste umane con il server e certificare da un notebook.
Un solo processo alla volta pilota uno studio. Il planner di un server in esecuzione detiene il lock di scrittura dello studio e, finché lo detiene, potato label run, potato label certify e Study.run() si rifiutano di procedere e lo dicono. In quel caso certifica tramite il server, con POST /api/engine/v1/certify o dalla pagina di amministrazione. Il lock esiste perché due processi estrarrebbero due campioni di calibrazione e certificherebbero ciascuno sulle etichette dell'altro. Il lock viene rilasciato quando il processo che lo detiene termina. Se quel processo viene ucciso sulla stessa macchina, il lock viene ripreso subito; se viene ucciso su un'altra macchina, dopo due minuti senza heartbeat. I comandi di sola lettura (status, certificate, calls, export) funzionano in qualsiasi momento.
Riga di comando
Ogni comando del motore accetta il file di configurazione dello studio:
potato label <command> <config.yaml> [options]I nove comandi coprono uno studio dalla prima chiamata a un modello fino al dataset esportato:
| Comando | Che cosa fa |
|---|---|
run | Etichetta ogni item con la cascata, estrae il campione di calibrazione in cieco, certifica, risolve. --until predicted (il default) si ferma dopo un passaggio, e --until met continua finché ogni contratto è soddisfatto o il motore è in attesa delle persone. Accetta anche --max-items N, --budget-usd X (sostituisce budgets.model_usd per questa esecuzione), --max-ticks N (20 per default) e --json. Un'esecuzione interrotta riprende da dove si era fermata senza ripetere chiamate ai modelli. Termina con stato 1, nominando la fonte, quando l'ultima esecuzione di una fonte è fallita o tutte le sue risposte erano errori, o quando nessuna fonte può etichettare uno schema nominato da un contratto. |
status | Item, predizioni, richieste per scopo, contratti, spesa, item ancora senza etichetta e una riga per ogni fonte con errori o con un'esecuzione fallita o in pausa. --json. |
certify | Testa ogni contratto sulle nuove etichette cert e sulle nuove predizioni. Quando sono cambiate solo le etichette dev, restituisce il risultato memorizzato con una nota, e --retest testa la regola che dev ora sceglie, all'analisi successiva (vedi Analisi successive). --json. |
certificate | Il certificato di qualità. --format md (il default), html o json, e --out FILE. |
export | Etichette con provenienza, il certificato (JSON, Markdown, HTML), una dataset card e il log delle chiamate, in --out DIR (<output_annotation_dir>/labeling_engine per default). |
calls | Il log di audit delle chiamate ai modelli come righe JSON. --out FILE. |
distill | Addestra un modello sulle etichette raccolte finora e lo mette per primo nella cascata. |
optimize | Valuta ogni sottoinsieme della cascata sulle etichette dev e riporta il più economico che mantiene la copertura. Quando nessun sottoinsieme mantiene alcuna copertura, non ne raccomanda nessuno. --prompts N chiede anche a un livello LLM N parafrasi del suo prompt e valuta ciascuna sugli item dev. Sono chiamate ai modelli, registrate nel log e conteggiate nel budget, e salvate sotto versioni proprie della fonte, mentre il prompt attuale viene valutato dalle sue predizioni memorizzate. La cascata e il certificato non vengono modificati. |
migrate-config | Scrive una copia della configurazione con un blocco labeling_engine equivalente alle sue chiavi IA più vecchie. --out FILE. Vedi Migrare al motore di etichettatura. |
Controllare l'avanzamento non consuma nulla, perché status, certificate e la pagina di amministrazione leggono risultati memorizzati. Ogni nuovo test, che venga da certify su nuove etichette o da certify --retest, consuma una parte del budget di errore di un contratto.
File scritti dall'export
potato label export scrive quattro tipi di file nella directory di output:
| File | Contenuto |
|---|---|
labels.jsonl, labels.csv | Una riga per item e schema, etichettato o no, con id, schema, label, label_origin (auto, human, adjudicated, ...), status (accepted, accepted_uncertified con threshold_legacy, pending, pending_recert), source, model, source_version, confidence, contract_version e request_ids. Un'etichetta automatica la cui fonte è cambiata da quando è stata accettata risulta pending_recert finché il passaggio successivo non la ricertifica. |
certificate.json, .md, .html | Il certificato. |
README.md | Una dataset card con front matter di Hugging Face, costruita dal certificato. |
model_calls.jsonl | Ogni chiamata a un modello, con il modello, gli hash di prompt e risposta, token, latenza, costo, hit della cache e categorie di mascheramento. |
Gli exporter normali (python -m potato.export e l'export dell'amministrazione) esportano le annotazioni delle persone, e la pagina dei formati di export li elenca. Tra questi, il formato labeling_engine scrive gli stessi file di potato label export, e si rifiuta di funzionare quando il motore non è attivo. Quando il motore è attivo, gli export CSV, Parquet e Hugging Face aggiungono due colonne che indicano a quale richiesta del motore ha risposto ogni annotazione. engine_purpose contiene lo scopo, per esempio calibration, e engine_request contiene un JSON con scopo, probabilità di inclusione, visibilità, partizione e id della richiesta. Usa queste colonne per separare il campione casuale in cieco dalle risposte di verifica.
REST API
Tutte le route del motore stanno sotto /api/engine/v1 e restituiscono JSON. Autenticati con la chiave di amministrazione nell'header X-API-Key o con una sessione di amministrazione. Le letture richiedono il permesso per la dashboard di amministrazione, certify e plan richiedono la gestione delle assegnazioni, e il certificato richiede il permesso di export.
| Metodo e percorso | Restituisce |
|---|---|
GET /status | Item, predizioni, richieste, totali delle chiamate, budget e, per ogni schema, cascata, contratti e conteggi delle etichette risolte |
GET /schemes/<name>/contracts | L'ultimo risultato di ogni contratto sullo schema, segnato stale se la cascata è cambiata |
GET /schemes/<name>/risk_coverage | Per ogni soglia dell'ultimo livello, la quota accettata, l'errore osservato e il limite superiore garantito, sulle etichette cert |
GET /schemes/<name>/reliability | Bin di affidabilità, ECE e Brier score per livello, sulle etichette di calibrazione |
GET /schemes/<name>/drift | Il monitor degli audit per ogni contratto di rischio selettivo |
GET /schemes/<name>/optimize | Il report sulla cascata più economica, valutato sulle etichette dev |
GET /requests | Conteggi delle richieste per scopo e stato, e le richieste stesse. I filtri sono purpose, status (ripeti il parametro o separa i valori con virgole), schema e limit (max 1000) |
GET /calls | Il log delle chiamate, dalle più recenti, e i totali per fonte. limit (max 500), offset |
GET /certificate | Il certificato. format=json (il default), md o html, e save=1 lo salva anche |
GET /crowd | L'ultimo piano di crowdsourcing del planner, una simulazione a meno che la spesa reale non sia attiva |
POST /certify | Testa ogni contratto subito. ?retest=1 (o {"retest": true}) testa anche una regola cambiata solo per effetto delle etichette dev |
POST /plan | Esegue subito un passaggio del planner |
Le route rispondono 404 quando il motore è disattivato per lo studio. Rispondono 400 con un errore JSON per un parametro non valido, come un limit che non è un numero, un purpose o uno status sconosciuto, o un format diverso da json, md o html.
Per esempio, questa richiesta recupera il certificato attuale in Markdown da un server sulla porta 8000:
curl -H "X-API-Key: $ADMIN_API_KEY" \
"http://localhost:8000/api/engine/v1/certificate?format=md"Strumenti MCP
Il server MCP espone cinque strumenti del motore, con gli stessi permessi delle route REST:
engine_statusengine_requestsengine_run, che esegue un passaggio del plannerengine_certify, che accettaretestengine_certificate, injson,mdohtml
Concedere questi strumenti mentre il motore è disattivato produce un avviso di validazione. Tramite potato mcp connect, una chiamata rifiutata (un permesso mancante, un parametro errato) torna come errore dello strumento con il messaggio del server. La documentazione del server MCP spiega come concedere gli strumenti e collegare un client.
Python SDK
La classe Study pilota il motore da Python, per esempio in un notebook:
from potato.labeling_engine.sdk import Study
study = Study("examples/labeling-engine/text-certified-sentiment/config.yaml")
study.run() # label, sample, certify, resolve
for req in study.requests(status="open")[:5]:
study.label(req.item_id, req.schema, "positive", user="me")
study.certify()
print(study.certificate(fmt="md"))
study.export("out/")Ogni metodo corrisponde a un comando o a una route:
| Metodo | Che cosa fa |
|---|---|
Study(config_path) | Carica la configurazione e gli item |
run(until="predicted", max_ticks=20) | Come potato label run, e prende il lock di scrittura |
label(item_id, scheme, value, user, request_id=None) | Registra l'etichetta di una persona. Chiude request_id, oppure una richiesta che questa persona ha in carico sull'item, e altrimenti viene conservata come etichetta organica, che non certifica mai. Una seconda etichetta della stessa persona sullo stesso item aggiorna la prima |
status() | Come GET /status |
requests(status=None, purpose=None, ...) | Il registro delle richieste |
certify(retest=False) | Come potato label certify |
certificate(fmt="json") | json, md o html |
export(out_dir) | Come potato label export |
L'esempio etichetta ogni richiesta aperta come "positive" solo per mostrare le chiamate. Un'etichetta registrata con Study.label che non risponde a nessuna richiesta viene conservata come etichetta organica, e le etichette organiche non certificano mai, quindi uno script che etichetta item che il motore non ha richiesto aggiunge etichette che nessun contratto legge.
Approfondimenti
- Il motore di etichettatura
- Configurazione del motore di etichettatura
- Contratti del motore di etichettatura
- Dashboard di amministrazione, che ha un link alla pagina di amministrazione del motore
Per i dettagli di implementazione, consulta la documentazione sorgente.