Skip to content
Guide9 min di lettura

Controllo qualità per l'annotazione in crowdsourcing

Combina verifiche di attenzione, gold standard, sovrapposizione tra annotatori e dati sui tempi per individuare le annotazioni di bassa qualità, con le chiavi di configurazione di Potato per ciascuno e ciò che riportano.

Potato Team

Nessuna verifica da sola intercetta ogni tipo di annotazione scadente, quindi conviene sovrapporne quattro: verifiche di attenzione per gli annotatori che non leggono, gold standard per quelli che leggono e sbagliano comunque, sovrapposizione per gli elementi ambigui e tempi per il lavoro consegnato troppo in fretta per essere stato fatto davvero. Ognuna ha la propria chiave di configurazione in Potato, e ognuna riporta separatamente nella dashboard di amministrazione.

Il controllo qualità costa meno prima della raccolta e più dopo. Una verifica di attenzione che blocca un annotatore al quinto errore non costa nulla da configurare e risparmia gli elementi che avrebbe compilato; lo stesso problema trovato con uno script a posteriori ti costa una nuova raccolta. I controlli che seguono sono ordinati in base a quando intervengono.

Il controllo qualità lungo la durata del progetto: verifiche prima, durante e dopo l'annotazioneIl controllo qualità lungo la durata del progetto

Cosa intercetta ciascun controllo

I quattro controlli falliscono in direzioni diverse, ed è per questo che conviene usarne più di uno.

ControlloIntercettaNon intercetta
Verifiche di attenzioneAnnotatori che non leggono l'elementoUn annotatore attento che fraintende le linee guida
Gold standardAnnotatori che leggono e rispondono maleElementi senza un'unica risposta corretta
Sovrapposizione e accordoElementi ed etichette ambiguiAnnotatori che concordano perché attingono alla stessa fonte
Tempi e telemetriaLavoro consegnato troppo in fretta per essere stato fattoLavoro veloce su un corpus davvero facile

L'accordo, in particolare, non intercetta tutto. Quando gli annotatori rivedono le pre-etichette di un modello, accettare un suggerimento senza leggerlo alza l'accordo invece di abbassarlo, per cui l'annotatore che approva senza guardare sembra il migliore secondo quella misura. L'accordo non può intercettare l'approvazione a occhi chiusi spiega cosa registrare al suo posto.

Verifiche di attenzione

Le verifiche di attenzione sono elementi con una risposta nota, inseriti nel flusso di annotazione a intervalli prestabiliti, che controllano che l'annotatore legga prima di rispondere. Potato le inserisce, le valuta, avvisa l'annotatore e lo blocca alla soglia che imposti, così l'intero ciclo gira sul server invece che in uno script a posteriori.

Imposta la frequenza in base a quanto tempo richiedono i tuoi elementi. Una verifica ogni 10 elementi basta per accorgersi di un annotatore che si distrae nel corso di una sessione senza spendere molto budget in elementi che non sono dati. La soglia minima min_response_time è ciò che intercetta chi clicca invece di leggere, e una risposta più veloce di quella soglia fallisce qualunque cosa dica:

yaml
attention_checks:
  enabled: true
  items_file: "data/attention_checks.json"
  frequency: 10              # one check every 10 items
  min_response_time: 3.0     # seconds; faster than this fails the check
 
  failure_handling:
    warn_threshold: 2
    warn_message: "Please read items carefully before answering."
    block_threshold: 5
    block_message: "You have been blocked due to too many incorrect responses."

Il file degli elementi assegna a ogni verifica un id, il testo che vede l'annotatore e la risposta attesa per ciascuno schema:

json
[
  {
    "id": "attn_001",
    "text": "Please select 'Positive' for this item to verify you are reading carefully.",
    "expected_answer": {
      "sentiment": "positive"
    }
  }
]

I risultati sopravvivono a un riavvio. Potato li scrive in quality_control_results.json nella directory di output man mano che vengono registrati e li rilegge all'avvio, quindi un deploy non cancella lo storico degli errori di un annotatore né sblocca chi era stato bloccato.

Gold standard

I gold standard sono elementi etichettati da esperti, mescolati nel flusso per misurare l'accuratezza invece dell'attenzione. Di default sono silenziosi, cioè i risultati vanno alla dashboard di amministrazione e l'annotatore non riceve alcun feedback, e in questo modo si misura la qualità senza modificare il comportamento che si sta misurando. Attiva il feedback quando stai formando gli annotatori invece di selezionarli.

Gli elementi gold vengono inseriti ogni frequency elementi, quindi questa impostazione bilancia la precisione della misura con la quota di budget che va a elementi di cui hai già le etichette. Uno ogni 20 dà circa 25 elementi valutati su un turno di 500 elementi:

yaml
gold_standards:
  enabled: true
  items_file: "data/gold_standards.json"
  mode: mixed                # mixed injects into the stream; this is the implemented mode
  frequency: 20
 
  accuracy:
    min_threshold: 0.7       # annotators below this are named in the dashboard
    evaluation_count: 10     # evaluate once an annotator has seen 10 gold items
 
  feedback:
    show_correct_answer: false
    show_explanation: false

Il file degli elementi contiene l'annotazione corretta per ciascuno schema, più una spiegazione facoltativa per il caso con feedback:

json
[
  {
    "id": "gold_001",
    "text": "The service was absolutely terrible and I will never return.",
    "gold_label": {
      "sentiment": "negative"
    },
    "explanation": "Strong negative language indicates negative sentiment.",
    "difficulty": "easy"
  }
]

Scegli elementi gold che per un esperto non siano ambigui. Un elemento su cui discute il tuo stesso team misura le linee guida invece dell'annotatore, e spingerà annotatori competenti sotto la soglia. Potato può anche promuovere elementi a gold quando gli annotatori concordano all'unanimità, tramite gold_standards.auto_promote, il che amplia il gruppo senza ulteriore etichettatura da parte di esperti.

L'accuratezza per annotatore compare in /admin/api/quality_control, che riporta configured_correct e configured_total accanto ai totali. Usa i numeri configurati quando confronti gli annotatori, perché il gruppo configurato è lo stesso per tutti, mentre quello promosso automaticamente dipende da quando è arrivato ciascun annotatore.

Sovrapposizione e accordo

Più annotatori per elemento è il controllo che trova gli elementi ambigui invece degli annotatori scadenti. Tre per elemento è il valore abituale, perché tre danno una maggioranza per l'aggregazione e abbastanza sovrapposizione per un coefficiente. Imposta l'obiettivo e attiva il monitoraggio:

yaml
num_annotators_per_item: 3
 
agreement_metrics:
  enabled: true
  min_overlap: 2
  refresh_interval: 60

L'alfa di Krippendorff compare poi nella dashboard di amministrazione man mano che arrivano le annotazioni, per ciascuno schema. Misurare l'accordo tra annotatori spiega quale coefficiente riportare e cosa significano le soglie.

Tempi e telemetria

Potato registra quanto tempo ha richiesto ogni elemento, non solo la risposta data. Ogni istanza porta un oggetto behavioral_data il cui total_time_ms è il tempo speso su quell'elemento, insieme agli eventi di interazione, alla cronologia delle modifiche all'annotazione e al ciclo di vita dei suggerimenti dell'IA. È questo campo che permette di distinguere un annotatore veloce perché il corpus è facile da uno veloce perché non sta guardando:

python
def flag_fast_annotations(export, min_seconds=2.0):
    """Instances submitted faster than a floor, from an exported annotation file."""
    flagged = []
    for instance in export:
        bd = instance.get("behavioral_data") or {}
        seconds = bd.get("total_time_ms", 0) / 1000
        if seconds < min_seconds:
            flagged.append((instance["id"], seconds))
    return flagged

Leggi i tempi come una distribuzione all'interno del tuo progetto invece che rispetto a un numero fisso di secondi, perché la stessa soglia che intercetta l'approvazione a occhi chiusi su un corpus difficile intercetta la competenza su uno facile. Per le annotazioni disegnate, annotation_telemetry registra la stessa idea a un livello di dettaglio più fine. Il suo segnale più forte è la latenza tra la comparsa di un suggerimento dell'IA e la sua accettazione da parte dell'annotatore. Tracciamento comportamentale e telemetria del disegno descrivono i campi e le segnalazioni che alimentano.

Una configurazione con tutti e quattro i controlli

Le quattro chiavi sono indipendenti, quindi un progetto può adottarle una alla volta. Insieme appaiono così:

yaml
annotation_task_name: "Sentiment Annotation with Quality Control"
task_description: "Classify the sentiment of short texts."
 
data_files:
  - data/items.json
 
item_properties:
  id_key: id
  text_key: text
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment of this text?"
    labels:
      - Positive
      - Negative
      - Neutral
 
num_annotators_per_item: 3
 
attention_checks:
  enabled: true
  items_file: data/attention_checks.json
  frequency: 15
  min_response_time: 3.0
  failure_handling:
    warn_threshold: 2
    block_threshold: 5
 
gold_standards:
  enabled: true
  items_file: data/gold_standards.json
  mode: mixed
  frequency: 25
  accuracy:
    min_threshold: 0.7
    evaluation_count: 10
 
agreement_metrics:
  enabled: true
  min_overlap: 2
  refresh_interval: 60
 
output_annotation_dir: annotation_output

Parti con soglie permissive. Una soglia di blocco di 5 e un minimo di accuratezza di 0.7 ti permettono di vedere la distribuzione reale del tuo gruppo di annotatori prima di decidere cosa conta come errore, e restringerle in seguito non costa nulla. Fissarle rigide dal primo giorno espelle annotatori in base a linee guida che non sono ancora state provate in un pilota.

Controlli a livello di piattaforma

Le piattaforme di crowdsourcing filtrano il bacino prima che qualcuno arrivi al tuo task. È un compito diverso da quello delle verifiche precedenti, e vale la pena svolgerlo in aggiunta a esse.

  • Preselezione. Prolific filtra in base al tasso di approvazione e al lavoro completato in precedenza, oltre che su dati demografici e lingua.
  • Test di qualificazione. Un breve test nella fase di formazione di Potato regola l'accesso al task principale su qualsiasi piattaforma.
  • Revisione prima del pagamento. Approva rapidamente quando il lavoro va bene, perché la lentezza nell'approvazione è la lamentela più frequente degli annotatori, e usa il rifiuto con parsimonia perché danneggia la reputazione del lavoratore sulla piattaforma.

La preselezione della piattaforma e le verifiche di Potato sono complementari. La preselezione decide chi arriva al task; le verifiche di attenzione e i gold standard misurano cosa ha fatto una volta arrivato.

Prima di raccogliere qualsiasi cosa

Due decisioni sono difficili da cambiare una volta avviata la raccolta, quindi prendile per prime. Decidi quali campi ti servono nell'esportazione, perché un'analisi dei tempi pianificata a posteriori richiede che behavioral_data sia stato registrato durante l'esecuzione. E fai un pilota di qualche decina di elementi con tutti i controlli attivi, perché è nel pilota che scopri che le tue verifiche di attenzione sono ambigue o che i tuoi elementi gold sono contestati, e costa un pomeriggio invece di un dataset.

Letture consigliate