Skip to content
Guides9 min read

Controle de qualidade para anotação por crowdsourcing

Combine verificações de atenção, itens padrão-ouro, sobreposição entre anotadores e dados de tempo para detectar anotações de baixa qualidade, com as chaves de configuração do Potato para cada um e o que elas reportam.

Potato Team

Nenhuma verificação sozinha pega todo tipo de anotação ruim, então combine quatro: verificações de atenção para anotadores que não estão lendo, itens padrão-ouro para anotadores que leem e mesmo assim erram, sobreposição para itens ambíguos e tempo para trabalhos enviados rápido demais para terem sido feitos. Cada uma tem sua própria chave de configuração no Potato, e cada uma reporta separadamente no painel de administração.

O controle de qualidade é mais barato antes da coleta e mais caro depois dela. Uma verificação de atenção que bloqueia um anotador na quinta falha não custa nada para configurar e poupa os itens que ele teria preenchido; o mesmo problema encontrado por um script depois do fato custa uma nova coleta. Os controles abaixo estão ordenados pelo momento em que atuam.

Controle de qualidade ao longo do projeto: verificações antes, durante e depois da anotaçãoControle de qualidade ao longo do projeto

O que cada controle detecta

Os quatro controles falham em direções diferentes, e é por isso que vale a pena usar mais de um.

ControleDetectaNão detecta
Verificações de atençãoAnotadores que não leem o itemUm anotador cuidadoso que entende mal as diretrizes
Itens padrão-ouroAnotadores que leem e respondem erradoItens sem uma única resposta correta
Sobreposição e concordânciaItens e rótulos ambíguosAnotadores que concordam porque usam a mesma fonte
Tempo e telemetriaTrabalho enviado rápido demais para ter sido feitoTrabalho rápido em um corpus realmente fácil

A concordância, em especial, não pega tudo. Quando os anotadores revisam pré-rótulos gerados por um modelo, aceitar uma sugestão sem lê-la aumenta a concordância em vez de diminuí-la, de modo que o anotador que aprova sem olhar parece o melhor nessa medida. A concordância não detecta a aprovação automática explica o que registrar no lugar.

Verificações de atenção

Verificações de atenção são itens com resposta conhecida, inseridos no fluxo de anotação em intervalos definidos, que confirmam que o anotador está lendo antes de responder. O Potato os insere, corrige, avisa o anotador e o bloqueia ao atingir o limite que você define, então todo o ciclo roda no servidor em vez de em um script posterior.

Defina a frequência de acordo com o tempo que seus itens levam. Uma verificação a cada 10 itens é frequente o bastante para pegar um anotador que perde o foco dentro de uma sessão sem gastar muito do orçamento em itens que não são dados. O piso min_response_time é o que detecta quem clica em vez de ler, e uma resposta mais rápida que ele falha, seja qual for o conteúdo:

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."

O arquivo de itens dá a cada verificação um id, o texto que o anotador vê e a resposta esperada para cada esquema:

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

Os resultados sobrevivem a uma reinicialização. O Potato os grava em quality_control_results.json no diretório de saída à medida que são registrados e os lê de volta na inicialização, então um deploy não apaga o histórico de falhas de um anotador nem desbloqueia alguém que estava bloqueado.

Itens padrão-ouro

Itens padrão-ouro (gold standards) são itens rotulados por especialistas e misturados ao fluxo para medir acurácia, não atenção. Por padrão eles são silenciosos, ou seja, os resultados vão para o painel de administração e o anotador não recebe nenhum retorno, o que mede a qualidade sem alterar o comportamento que está sendo medido. Ative o retorno quando estiver treinando, e não selecionando, anotadores.

Os itens padrão-ouro são inseridos a cada frequency itens, então essa configuração equilibra a precisão da medição com a parte do orçamento que vai para itens cujos rótulos você já tem. Um a cada 20 dá cerca de 25 itens corrigidos em um turno de 500 itens:

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

O arquivo de itens traz a anotação correta para cada esquema, mais uma explicação opcional para o caso com retorno:

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"
  }
]

Escolha itens padrão-ouro que não sejam ambíguos para um especialista. Um item sobre o qual sua própria equipe discute mede as diretrizes, não o anotador, e vai empurrar anotadores competentes para baixo do limite. O Potato também pode promover itens a padrão-ouro quando os anotadores concordam de forma unânime sobre eles, por meio de gold_standards.auto_promote, o que aumenta o conjunto sem mais rotulagem especializada.

A acurácia por anotador aparece em /admin/api/quality_control, que reporta configured_correct e configured_total ao lado dos totais. Use os números configurados ao comparar anotadores, porque o conjunto configurado é o mesmo para todos, enquanto o conjunto promovido automaticamente depende de quando cada anotador chegou.

Sobreposição e concordância

Vários anotadores por item é o controle que encontra itens ambíguos, e não anotadores ruins. Três por item é o padrão comum, porque três dão uma maioria para a agregação e sobreposição suficiente para um coeficiente. Defina a meta e ative o relatório:

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

O alfa de Krippendorff passa então a aparecer no painel de administração à medida que as anotações chegam, por esquema. Medindo a concordância entre anotadores explica qual coeficiente reportar e o que os limites significam.

Tempo e telemetria

O Potato registra quanto tempo cada item levou, não apenas o que foi respondido. Cada instância carrega um objeto behavioral_data cujo total_time_ms é o tempo gasto naquele item, junto com os eventos de interação, o histórico de alterações da anotação e o ciclo de vida das sugestões de IA. É esse campo que permite separar um anotador que é rápido porque o corpus é fácil de um que é rápido porque não está olhando:

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

Leia o tempo como uma distribuição dentro do seu próprio projeto, e não contra um número fixo de segundos, já que o mesmo limite que pega a aprovação automática em um corpus difícil pega a competência em um corpus fácil. Para anotações desenhadas, annotation_telemetry registra a mesma ideia em um nível mais fino. Seu sinal mais forte é a latência entre o aparecimento de uma sugestão de IA e a aceitação dela pelo anotador. Rastreamento comportamental e telemetria de desenho descrevem os campos e os alertas que eles alimentam.

Uma configuração com os quatro controles

As quatro chaves são independentes, então um projeto pode adotá-las uma de cada vez. Juntas, ficam assim:

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

Comece com limites tolerantes. Um limite de bloqueio de 5 e um piso de acurácia de 0.7 permitem ver a distribuição real do seu grupo de anotadores antes de decidir o que conta como falha, e endurecê-los depois não custa nada. Defini-los rígidos no primeiro dia expulsa anotadores com base em diretrizes que ainda não passaram por um piloto.

Controles no nível da plataforma

As plataformas de crowdsourcing filtram o grupo antes que alguém chegue à sua tarefa. É um trabalho diferente do das verificações acima, e vale a pena fazê-lo além delas.

  • Pré-seleção. Tanto o Prolific quanto o MTurk filtram por taxa de aprovação e trabalhos concluídos anteriormente, e ambos oferecem filtros de localidade. No MTurk, uma taxa de aprovação de 97% ou mais com 500 ou mais HITs aprovados é um filtro inicial comum.
  • Testes de qualificação. O MTurk aceita qualificações personalizadas, então um teste curto pode controlar o acesso à tarefa principal.
  • Revisão antes do pagamento. Aprove rápido quando o trabalho estiver bom, já que a demora na aprovação é a maior reclamação dos anotadores, e use a rejeição com moderação, porque ela prejudica a reputação do trabalhador na plataforma.

A pré-seleção da plataforma e as verificações do próprio Potato se complementam. A pré-seleção decide quem chega à tarefa; as verificações de atenção e os itens padrão-ouro medem o que essas pessoas fizeram depois de chegar.

Antes de coletar qualquer coisa

Duas decisões são difíceis de reverter depois que a coleta começa, então tome-as primeiro. Decida de quais campos você precisa na exportação, porque uma análise de tempo planejada depois do fato exige que behavioral_data tenha sido registrado durante a execução. E faça um piloto com algumas dezenas de itens e todos os controles ativados, já que é no piloto que você descobre que suas verificações de atenção são ambíguas ou que seus itens padrão-ouro são contestados, e isso custa uma tarde em vez de um conjunto de dados.

Leitura adicional