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:
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:
| Chave | Padrão | Significado |
|---|---|---|
enabled | false | Liga o motor. Um motor habilitado precisa de pelo menos uma fonte. |
schemas | todos | Os 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. |
cascade | primeira fonte | Ids 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:
| Chave | Padrão | Significado |
|---|---|---|
id | obrigatório | Nome usado em cascade, no registro de chamadas e no certificado. |
kind | obrigatório | Um entre llm, vlm, decision, detector, judge, jury, trained, static, fixture, asr, lf, simulator. |
endpoint_type | obrigatório para llm, vlm, decision, judge | O endpoint de IA, como vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya ou systemone. detector usa yolo por padrão. |
model | padrão do endpoint | Nome do modelo. |
base_url | nenhum | URL do servidor para endpoints auto-hospedados ou compatíveis com OpenAI. |
api_key | nenhum | Nunca entra no hash de uma versão e nunca é exportada. ${ENV_VAR} é substituído. |
temperature | 0.0 | De 0 a 2. |
max_tokens | 256 | Limite de tokens de saída por chamada. |
timeout | padrão do endpoint | Segundos por chamada. |
prompt | gerado a partir do esquema | Modelo 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. |
concurrency | runtime.concurrency | Chamadas paralelas a esta fonte. |
schemas | todos os esquemas do motor | Restringe 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. |
members | nenhum | Só para jury. Pelo menos dois ids de outras fontes. |
aggregation | plurality | Só para jury. Pluralidade é a única regra. |
field / predictions_file | nenhum | Só 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, seed | nenhum | Só para fixture. Uma fonte sintética com taxa de erro conhecida, para testes. |
revision | nenhum | Uma 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.method | Aplica-se a | O que faz |
|---|---|---|
verbalized | llm, vlm, judge | O modelo declara um valor de 0 a 100 na resposta. Uma chamada, e o método menos confiável. |
k_sample | llm | samples 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. |
logprob | llm | Os 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. |
native | decision, detector, trained | As probabilidades do próprio modelo. Em uma fonte llm, é um erro de validação. |
auto | todos | native onde a fonte o tem, senão verbalized. |
Opções específicas do tipo
Cinco tipos de fonte leem opções próprias:
decisioncobre 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 esquemasradio,select,likerteslider.endpoint_typeprecisa serlayaousystemone, esystemoneprecisa debase_url, a raiz do servidor (uma URL terminada em/v1/systemonetambé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 dolaya-serve, eoptions: {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 endpointlayano mesmo processo precisa depip install 'potato-annotation[decision]'.detectorlê caixas de um detector de objetos em esquemasimage_annotation.keep_threshold(0.35) define o escore a partir do qual uma caixa faz parte da predição. Caixas entrecandidate_threshold(0.05) ekeep_thresholdreduzem a confiança da imagem.label_mapmapeia as classes do detector para os rótulos do esquema, e classes não mapeadas são ignoradas.image_fieldnomeia 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.jpgsob omedia_directoryda tarefa e um caminho relativo sobtask_dir.judgeaceitarubric(por padrão, a descrição do esquema),fields(os campos do item mostrados ao juiz, em ordem) eswap_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.vlmusa 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, useopenai_visioncombase_url.trainedaceitaartifact_dir,trainer(sklearn-textpor padrão) erun_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:
| Chave | Padrão | Significado |
|---|---|---|
pools | [team] | Quem rotula: team, crowd, solo. |
calibration_rate | auto | Fraçã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_fraction | 0.5 | Fração dos rótulos de calibração usada para escolher os limiares. O restante os testa. |
min_calibration_per_class | 10 | Mínimo por classe antes de os contratos por classe serem testados. |
audit_rate | 0.02 | Fração dos rótulos de máquina recém-aceitos enviada de volta a pessoas, às cegas, para detectar deriva. |
overlap | 0.0 | Fração dos itens de calibração rotulados por várias pessoas. |
overlap_k | 3 | Pessoas por item com sobreposição. O contrato no_worse_than_human precisa de 3. |
distribution_k | 5 | Pessoas por item para contratos distributional. |
truth | majority | Como 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_visibility | shown | Se 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:
| Chave | Padrão | Significado |
|---|---|---|
provider | prolific | A plataforma de crowdsourcing. |
study_id | nenhum | O estudo do Prolific a redimensionar. |
reward_usd | nenhum | Recompensa por vaga, para as projeções de custo. |
per_worker_quota | 20 | Solicitaçõ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:
| Chave | Significado |
|---|---|
model_usd | Para 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_usd | Teto do gasto com crowdsourcing. Obrigatório para o gasto real com crowdsourcing. |
human_labels | Má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:
| Chave | Padrão | Significado |
|---|---|---|
batch_size | 32 | Itens por bloco gravado. Uma execução interrompida retoma no bloco seguinte sem repetir chamadas. |
concurrency | 4 | Chamadas paralelas por fonte, substituído pelo concurrency da própria fonte. |
cache | true | Reutiliza respostas a requisições idênticas da mesma versão da fonte. |
retries | 2 | Tentativas extras após timeout, erro de conexão, 429 ou 5xx. Todas as tentativas são registradas. |
planner_interval | 30 | Segundos entre passagens do planejador no servidor. |
hold_minutes | 60 | Minutos 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:
| Chave | O que liga |
|---|---|
drift | Ligado 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". |
distill | Treina um modelo com os rótulos do estudo e o coloca em primeiro na cascata (veja distill). |
optimize | Faz 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_recruit | Deixa o planejador dimensionar o estudo do Prolific, como simulação a menos que crowd_live_spend esteja ligado. |
crowd_live_spend | Altera de fato o estudo do Prolific. Precisa do grupo crowd e de budgets.human_usd. |
pii_redaction | Mascara 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_capture | Guarda 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:
| Chave | Padrão | Significado |
|---|---|---|
trainer | sklearn-text | Um treinador de potato/training. |
min_labels | 200 | Só treina quando existem estes rótulos. |
include_silver | true | Também treina com rótulos de máquina que um contrato certificou, marcados como prata. |
every | 2.0 | Treina 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
decisioncujoendpoint_typenão é um modelo de decisão, e uma fontellm,vlmoujudgecujoendpoint_typeé um; e no_worse_than_humancomhumans.overlap_kabaixo 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
- O motor de rotulagem
- Contratos do motor de rotulagem
- Linha de comando, REST API, ferramentas MCP e SDK
- Suporte de IA, para os tipos de endpoint que as fontes compartilham com o resto do Potato
Para detalhes de implementação, consulte a documentação de origem.