Skip to content

Configuração do motor de rotulagem

Todas as chaves do bloco labeling_engine: fontes e métodos de confiança, os grupos de pessoas, o gasto com crowdsourcing, orçamentos, limites de execução, recursos e o que a validação recusa.

Tudo o que o motor de rotulagem faz é definido em um único bloco labeling_engine. Um bloco inválido impede o servidor de iniciar e lista todos os problemas de uma vez. Para que os anotadores recebam as solicitações do motor, defina também assignment_strategy: engine. Definir essa estratégia sem um motor habilitado é um erro de validação.

O bloco tem as seções abaixo, cada uma explicada mais adiante:

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

Chaves de nível superior

Cinco chaves ficam diretamente sob labeling_engine:

ChavePadrãoSignificado
enabledfalseLiga o motor. Um motor habilitado precisa de pelo menos uma fonte.
schemastodosOs esquemas de anotação que o motor rotula. Com assignment_strategy: engine, um esquema deixado de fora só é respondido nos itens que o motor envia a pessoas por causa dos seus próprios esquemas, não em todos os itens, e a validação avisa sobre isso. Um esquema que nenhuma fonte consegue rotular (texto livre, por exemplo) não pode estar no motor, então sob essa estratégia ele nunca é respondido em todos os itens. Use outra estratégia de atribuição se ele precisar ser.
sources[]Os modelos. Veja Fontes.
cascadeprimeira fonteIds das fontes na ordem em que são tentadas. As pessoas vêm depois da última.
contracts[]O que os rótulos precisam satisfazer. Veja Contratos.

Fontes

Uma fonte é um modelo, ou um conjunto de rótulos já existente, que propõe um rótulo e uma confiança para cada item. Toda fonte tem um id único e um kind, e uma chave desconhecida em uma fonte é um erro:

ChavePadrãoSignificado
idobrigatórioNome usado em cascade, no registro de chamadas e no certificado.
kindobrigatórioUm entre llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator.
endpoint_typeobrigatório para llm, vlm, decision, judgeO endpoint de IA, como vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya ou systemone. detector usa yolo por padrão.
modelpadrão do endpointNome do modelo.
base_urlnenhumURL do servidor para endpoints auto-hospedados ou compatíveis com OpenAI.
api_keynenhumNunca entra no hash de uma versão e nunca é exportada. ${ENV_VAR} é substituído.
temperature0.0De 0 a 2.
max_tokens256Limite de tokens de saída por chamada.
timeoutpadrão do endpointSegundos por chamada.
promptgerado a partir do esquemaModelo de prompt. Alterá-lo cria uma nova versão da fonte.
confidence{method: auto}Como a fonte informa a confiança. Veja Métodos de confiança.
concurrencyruntime.concurrencyChamadas paralelas a esta fonte.
schemastodos os esquemas do motorRestringe a fonte a estes esquemas.
options{}Opções específicas do tipo, listadas abaixo.
judge{}Só para judge. As mesmas opções de options, sob uma chave própria, e options prevalece quando as duas definem a mesma.
membersnenhumSó para jury. Pelo menos dois ids de outras fontes.
aggregationpluralitySó para jury. Pluralidade é a única regra.
field / predictions_filenenhumSó para static. Onde estão os rótulos existentes. O campo contém {scheme: label}, ou um rótulo simples quando a fonte rotula um só esquema. Um campo com o formato errado em todos os itens faz a execução falhar com uma mensagem que o nomeia.
error_rate, seednenhumSó para fixture. Uma fonte sintética com taxa de erro conhecida, para testes.
revisionnenhumUma revisão do modelo a registrar na versão, por exemplo o hash de um checkpoint.

Tudo o que pode mudar uma resposta (modelo, prompt, temperatura, opções) entra no hash de versão da fonte. Uma nova versão torna stale todos os contratos que dependem da fonte.

Uma resposta que não é um valor que o esquema aceita, como um rótulo fora da sua lista, um campo numérico que não é número ou uma lista em um esquema de uma escolha entre N, é registrada como erro e nunca como rótulo, e a mensagem da execução conta esses erros. Um item cujas chamadas falham é solicitado de novo em execuções posteriores, no máximo três vezes por versão da fonte, e depois disso aguarda uma fonte alterada (uma chave ou um prompt corrigido é uma nova versão). Uma execução em que uma fonte falha não interrompe os outros níveis. O nível seguinte rotula todos os itens, e potato label run sai com status 1 e nomeia a fonte que falhou.

Métodos de confiança

As regras de aceitação do motor aplicam limiares à confiança de cada predição, então a forma como uma fonte informa a confiança decide quanto o motor consegue aceitar. confidence.method aceita um de cinco valores:

confidence.methodAplica-se aO que faz
verbalizedllm, vlm, judgeO modelo declara um valor de 0 a 100 na resposta. Uma chamada, e o método menos confiável.
k_samplellmsamples respostas (5 por padrão) com sample_temperature (0.7 por padrão). O rótulo é a resposta mais comum e a confiança é a fração dela. Custa k chamadas.
logprobllmOs rótulos recebem letras e o modelo responde com uma letra, e a confiança é lida das probabilidades do primeiro token. Uma chamada, e em geral o mais bem calibrado. Precisa de um backend que devolva logprobs (vLLM, compatível com OpenAI) e de no máximo 20 rótulos, e um esquema com mais é um erro de validação.
nativedecision, detector, trainedAs probabilidades do próprio modelo. Em uma fonte llm, é um erro de validação.
autotodosnative onde a fonte o tem, senão verbalized.

Opções específicas do tipo

Cinco tipos de fonte leem opções próprias:

  • decision cobre o Laya no mesmo processo, ou qualquer servidor /v1/systemone, como o Jev hospedado ou o OpenJev. Uma passagem direta devolve uma probabilidade para cada opção, e funciona em esquemas radio, select, likert e slider. endpoint_type precisa ser laya ou systemone, e systemone precisa de base_url, a raiz do servidor (uma URL terminada em /v1/systemone também é aceita). O estado é enviado como {"text": ...} nos dois casos, então um checkpoint dá as mesmas respostas no mesmo processo e por trás do laya-serve, e options: {state_key: ""} envia a string pura. Em escalas de avaliação (likert, slider), os escores do Laya mal conseguem acompanhar a escala, então confira alguns itens antes de confiar nele. O endpoint laya no mesmo processo precisa de pip install 'potato-annotation[decision]'.
  • detector lê caixas de um detector de objetos em esquemas image_annotation. keep_threshold (0.35) define o escore a partir do qual uma caixa faz parte da predição. Caixas entre candidate_threshold (0.05) e keep_threshold reduzem a confiança da imagem. label_map mapeia as classes do detector para os rótulos do esquema, e classes não mapeadas são ignoradas. image_field nomeia o campo do item com o caminho ou a URL da imagem. Os caminhos são resolvidos como a página de anotação os resolve, com /media/x.jpg sob o media_directory da tarefa e um caminho relativo sob task_dir.
  • judge aceita rubric (por padrão, a descrição do esquema), fields (os campos do item mostrados ao juiz, em ordem) e swap_order, que pergunta duas vezes com a ordem dos rótulos invertida e transforma um veredito que muda em abstenção. Em esquemas de traces de agentes (process_reward, trajectory_eval, ...), o juiz rotula cada passo.
  • vlm usa um endpoint de visão (openai_vision, anthropic_vision, ollama_vision). Para um modelo auto-hospedado atrás de um servidor compatível com OpenAI, use openai_vision com base_url.
  • trained aceita artifact_dir, trainer (sklearn-text por padrão) e run_id. Normalmente é a destilação que cria esta fonte, e não uma configuração escrita à mão.

humans

O bloco humans define quem rotula e como o motor faz a amostragem:

ChavePadrãoSignificado
pools[team]Quem rotula: team, crowd, solo.
calibration_rateautoFração de itens sorteados para a calibração cega. auto escolhe uma taxa a partir das projeções dos contratos: rótulos suficientes por classe para que seja testável, no máximo metade de um estudo pequeno e um quinto de um estudo com mais de 1.000 itens.
dev_fraction0.5Fração dos rótulos de calibração usada para escolher os limiares. O restante os testa.
min_calibration_per_class10Mínimo por classe antes de os contratos por classe serem testados.
audit_rate0.02Fração dos rótulos de máquina recém-aceitos enviada de volta a pessoas, às cegas, para detectar deriva.
overlap0.0Fração dos itens de calibração rotulados por várias pessoas.
overlap_k3Pessoas por item com sobreposição. O contrato no_worse_than_human precisa de 3.
distribution_k5Pessoas por item para contratos distributional.
truthmajorityComo os rótulos de várias pessoas em um item viram o rótulo contra o qual os contratos testam, majority ou dawid_skene.
verify_visibilityshownSe uma solicitação de verificação mostra a resposta da máquina (shown) ou não (blind).

crowd

O bloco crowd vale quando crowd está em humans.pools, e o Prolific é a única plataforma de crowdsourcing que o motor consegue controlar:

ChavePadrãoSignificado
providerprolificA plataforma de crowdsourcing.
study_idnenhumO estudo do Prolific a redimensionar.
reward_usdnenhumRecompensa por vaga, para as projeções de custo.
per_worker_quota20Solicitações por trabalhador. As vagas são ceil(open requests / quota).

O recrutamento no crowdsourcing é uma simulação por padrão, e o planejador relata o que faria. Gastar dinheiro exige features.crowd_live_spend: true e um teto budgets.human_usd, e uma configuração que liga o gasto real sem o teto é rejeitada. Crowdsourcing explica como configurar o próprio estudo no Prolific.

budgets

O bloco budgets interrompe o gasto antes que um limite seja ultrapassado:

ChaveSignificado
model_usdPara de chamar modelos pagos quando este valor é gasto. Cada chamada reserva antes o seu custo projetado. Modelos sem preço e modelos auto-hospedados em localhost não são limitados por ela.
human_usdTeto do gasto com crowdsourcing. Obrigatório para o gasto real com crowdsourcing.
human_labelsMáximo de solicitações a pessoas que o motor pode abrir, contadas quando cada solicitação é aberta.

runtime

O bloco runtime controla lotes, concorrência e por quanto tempo uma pessoa pode manter uma solicitação:

ChavePadrãoSignificado
batch_size32Itens por bloco gravado. Uma execução interrompida retoma no bloco seguinte sem repetir chamadas.
concurrency4Chamadas paralelas por fonte, substituído pelo concurrency da própria fonte.
cachetrueReutiliza respostas a requisições idênticas da mesma versão da fonte.
retries2Tentativas extras após timeout, erro de conexão, 429 ou 5xx. Todas as tentativas são registradas.
planner_interval30Segundos entre passagens do planejador no servidor.
hold_minutes60Minutos que uma pessoa pode manter uma solicitação sem responder antes que ela volte para o conjunto disponível. O item também sai da página dela, então uma aba deixada aberta não pode respondê-lo depois.

features

Todos os recursos vêm desligados por padrão, exceto drift:

ChaveO que liga
driftLigado por padrão. Age sobre os resultados das auditorias. Quando as auditorias mostram que a taxa de erro dos rótulos aceitos está acima da meta, o contrato passa a violated, os rótulos de máquina daquele esquema deixam de ser aceitos e novos rótulos de calibração são sorteados. Cada certificação inicia uma nova sequência de auditorias, então certificar de novo depois de uma correção restaura a aceitação. Defina como false para apenas relatar a violação, e o contrato então mostra "met, audits breached".
distillTreina um modelo com os rótulos do estudo e o coloca em primeiro na cascata (veja distill).
optimizeFaz cada passagem do planejador pontuar todos os subconjuntos da cascata nos rótulos dev e relatar o mais barato que mantém a cobertura dos contratos, em GET /api/engine/v1/schemes/<name>/optimize. Nada é aplicado, porque adotar uma cascata é uma mudança de configuração e uma nova certificação.
crowd_recruitDeixa o planejador dimensionar o estudo do Prolific, como simulação a menos que crowd_live_spend esteja ligado.
crowd_live_spendAltera de fato o estudo do Prolific. Precisa do grupo crowd e de budgets.human_usd.
pii_redactionMascara e-mails, URLs, endereços IP, números de cartão, SSNs, números de telefone e @handles antes de o texto ir para uma API de terceiros. O registro de chamadas guarda o que foi mascarado como categorias e hashes, nunca o texto.
payload_captureGuarda prompts e respostas completos em <task_dir>/engine_payloads/. Desligado por padrão, e o registro de chamadas guarda só hashes.

redaction

redaction.categories lista quais entre email, url, ip, card, ssn, phone e handle mascarar, e por padrão inclui todas. O mascaramento só se aplica com features.pii_redaction, e só a APIs de terceiros. Tipos de endpoint auto-hospedados (vllm, ollama, laya, yolo, ...) não são mascarados onde quer que rodem, e nenhum endpoint cujo base_url esteja na mesma máquina é mascarado.

distill

Com features.distill ligado, o motor treina um modelo barato com os rótulos do estudo e o coloca em primeiro na cascata:

ChavePadrãoSignificado
trainersklearn-textUm treinador de potato/training.
min_labels200Só treina quando existem estes rótulos.
include_silvertrueTambém treina com rótulos de máquina que um contrato certificou, marcados como prata.
every2.0Treina de novo quando a contagem de rótulos cresce por este fator.

Itens das divisões cert e de auditoria nunca entram no conjunto de treino, então o modelo destilado nunca é testado em rótulos com que foi treinado.

Validação

potato validate config.yaml verifica o bloco labeling_engine junto com o resto da configuração, e cada erro nomeia sua chave, por exemplo labeling_engine.sources[1].kind must be one of ... ou labeling_engine.contracts[0].error is required for selective_risk. A validação também recusa:

  • uma chave de contrato que o tipo de contrato não lê, como um erro de digitação em error;
  • um contrato em um esquema que nenhuma fonte da cascata consegue rotular, com o motivo de cada fonte;
  • um contrato em um esquema que o motor não consegue pontuar (texto livre, pairwise);
  • uma fonte decision cujo endpoint_type não é um modelo de decisão, e uma fonte llm, vlm ou judge cujo endpoint_type é um; e
  • no_worse_than_human com humans.overlap_k abaixo de 3.

A validação também avisa quando budgets.human_labels é pequeno demais para certificar um contrato selective_risk mesmo que todas as respostas da máquina estivessem certas. Aumente o orçamento, ou afrouxe error, até esse aviso sumir.

Leitura adicional

Para detalhes de implementação, consulte a documentação de origem.