Skip to content
Announcements9 min read

Potato 2.11: o motor de rotulagem e rótulos de máquina certificados

O Potato 2.11 rotula dados com modelos, testa os rótulos de máquina numa amostra humana cega e emite um certificado. Sessões ociosas expiram após 8 horas.

Potato Team

O Potato 2.11 traz o motor de rotulagem, que rotula um conjunto de dados com modelos e usa uma amostra aleatória e cega de rótulos humanos para medir com que frequência os modelos erram. Você declara o que os rótulos finais precisam satisfazer, por exemplo que no máximo 10% dos rótulos de máquina aceitos estejam errados, com 90% de confiança. O motor aceita os rótulos de máquina que um teste estatístico sustenta, envia os itens restantes para pessoas e emite um certificado que registra o que foi testado e com quantos rótulos humanos. A versão também estende o relatório de concordância a objetos 3D, ancoragem temporal, anotação em camadas e traces de agentes, e corrige um bug de imagem que podia contar itens intocados como respondidos.

bash
pip install --upgrade potato-annotation

Notas de atualização

Sessões ociosas agora são encerradas, por padrão depois de 8 horas. Antes da 2.11, session_timeout_minutes não tinha efeito em um app servido, porque a verificação era registrada em um objeto de app que potato start descarta. Uma sessão ociosa por mais tempo que o configurado agora é apagada, e a próxima requisição dela vai para a página de login. Quiosques e máquinas compartilhadas de laboratório que ficam logados durante a noite vão começar a ver logouts, então aumente session_timeout_minutes onde um estudo depende de continuar logado. As anotações já salvas não são afetadas.

Três chaves antigas imprimem um aviso na inicialização. icl_labeling, judge_calibration e pre_annotation continuam funcionando exatamente como antes, e cada uma imprime em stderr uma linha que começa com NOTE: e nomeia seu equivalente no motor. Os avisos são informativos, então potato validate --strict não falha por causa deles. A remoção dessas chaves está prevista para a 3.0, e potato label migrate-config escreve o bloco labeling_engine equivalente para você.

O motor de rotulagem

O motor é para estudos com mais itens do que as pessoas conseguem rotular e um modelo que acerta na maioria das vezes. Ele trata os modelos como fontes, testadas em cascata na ordem em que você as lista, e envia o item para uma pessoa depois da última fonte. As fontes podem ser LLMs, modelos de visão e linguagem, modelos de decisão como o Laya, detectores YOLO, juízes LLM, júris, modelos treinados com os próprios rótulos do estudo ou rótulos que você já tem.

Um contrato é o que o motor testa. O principal, selective_risk, limita a fração de rótulos de máquina aceitos que estão errados. O motor escolhe um limiar de confiança em metade da amostra cega e o testa na outra metade com um teste binomial unilateral, usando Learn-then-Test de sequência fixa. Cada novo teste é feito em um nível mais rigoroso, então certificar de novo até um teste passar não infla a confiança. O contrato ppi relata a prevalência de cada rótulo com um intervalo construído por inferência potencializada por predição (prediction-powered inference), que continua válido seja qual for a qualidade do modelo. no_worse_than_human executa o teste do anotador alternativo para substituir uma pessoa ou um juiz, e distributional compara a distribuição de rótulos do modelo com a forma como as pessoas se dividem em itens subjetivos.

Uma configuração que certifica um LLM em um esquema de sentimento acrescenta duas chaves a um estudo comum:

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  sources:
    - id: gemma
      kind: llm
      endpoint_type: vllm
      model: google/gemma-4-12B-it-qat-w4a16-ct
      base_url: http://localhost:8001/v1
      confidence: {method: logprob}
  contracts:
    - id: accuracy
      kind: selective_risk
      schema: sentiment
      error: 0.1
      confidence: 0.9
  budgets:
    human_labels: 400

confidence: {method: logprob} lê a confiança do modelo a partir das probabilidades dos tokens, o que custa uma chamada por item e costuma ser o mais bem calibrado dos métodos de confiança do motor. O contrato permite que no máximo 10% dos rótulos aceitos estejam errados, e sua confiança de 90% é o padrão do Potato. budgets.human_labels limita quantas solicitações a pessoas o motor pode abrir, e 400 é o limite que o exemplo de texto incluído usa.

O exemplo de texto que vem com o Potato passa 481 resenhas por uma cascata com o Laya à frente do Gemma 12B. Nessa execução, o contrato de 10% foi cumprido com 165 rótulos humanos, e o motor aceitou 316 rótulos de máquina, todos do Gemma, porque o limiar do Laya nunca foi fixado. O erro medido deles em relação aos rótulos de referência foi de 7,6%. O exemplo de traces de agentes tem 288 traces sintéticos com resultados de referência. O juiz acertou 80% deles, mas deu confiança 1,0 a todos os veredictos, então selective_risk não tinha sobre o que definir um limiar e continuou inviável. O intervalo PPI para o sucesso da tarefa, obtido com os mesmos dados, [0,57; 0,76], cobriu a taxa de referência de 0,60, enquanto o juiz sozinho dizia 0,76.

Limites de um contrato cumprido

Um contrato cumprido é uma afirmação sobre a concordância com as pessoas que rotularam a amostra. O motor não verifica se essas pessoas estão certas, então um contrato testado contra anotadores descuidados certifica concordância com anotadores descuidados. Três regras fazem essa afirmação valer. As solicitações de calibração são cegas, então a página não mostra pré-anotação, veredicto de juiz nem ajuda de IA enquanto uma pessoa tem uma em mãos. Os limiares são escolhidos em uma metade da amostra e testados na outra. Só rótulos humanos certificam, e qualquer mudança em uma fonte, um prompt ou um esquema marca os contratos afetados como stale até que sejam testados de novo.

Interfaces do motor

O mesmo arquivo engine.sqlite está por trás de todas as interfaces, então você pode começar um estudo em uma e certificar em outra:

  • potato label run|status|certify|certificate|export|calls|distill|optimize|migrate-config na linha de comando;
  • uma REST API em /api/engine/v1;
  • cinco ferramentas engine_* no servidor MCP;
  • potato.labeling_engine.sdk.Study em Python; e
  • uma página de administração em /admin/labeling-engine com o status dos contratos, a curva de erro contra cobertura, um diagrama de confiabilidade por fonte e o registro de chamadas a modelos.

potato label export grava os rótulos com sua procedência, o certificado em JSON, Markdown e HTML, um dataset card e o registro de chamadas. O motor de rotulagem acompanha um primeiro estudo passo a passo, e Contratos do motor de rotulagem explica o que cada contrato testa e como ele falha.

Modo Solo

O Modo Solo agora pode esconder sua sugestão. solo_mode.suggestions retém o rótulo do LLM em todos os itens ou em uma amostra aleatória. Uma sugestão na tela puxa a resposta para ela, então a passagem dos itens ao LLM lê a concordância nos itens cegos. Modelos de decisão (laya e qualquer servidor /v1/systemone) podem servir como um primeiro nível rápido, e o Modo Solo verifica o ai_budget.cap_usd do projeto antes de a rotulagem começar e antes de cada lote. Um conjunto ouro, um júri de rotulagem e ordenação por currículo também são novidades. Quando o motor está ligado, o Modo Solo grava suas predições no armazenamento do motor, para que o motor possa calibrá-las e certificá-las. Modo Solo traz as configurações.

Concordância

/admin/iaa agora relata a concordância em spatial_annotation, temporal_grounding, tiered_annotation e nos cinco esquemas de traces de agentes, que antes pulava por não serem suportados. Objetos 3D e segmentos de tempo recebem uma concordância média de conjuntos pareados, que não é corrigida pelo acaso, e os passos de traces de agentes recebem o alfa de Krippendorff e o kappa de Cohen, com cada passo de cada trace como unidade. /admin/api/agreement não relata mais esquemas estruturados e aponta para /admin/iaa, porque, reduzidos a nomes de rótulos, esses esquemas mostravam concordância perfeita entre todos os pares de anotadores. Dois segmentos idênticos de duração zero agora contam como concordantes. A publicação e o modo artigo deixam os avaliadores de máquina fora dos rótulos ouro e dos números de concordância.

Correções que afetam estudos da 2.10

Três correções podem mudar números que você já coletou ou relatou:

  • Uma página de imagem salvava sozinha uma resposta pré-preenchida. Em um esquema image_annotation com pre_annotation, o canvas salvava as formas pré-preenchidas como resposta do anotador ao refazer o próprio layout depois de carregar, então um item intocado contava como respondido. Em um estudo de imagem da 2.10 com pré-anotações, um item cujas formas salvas coincidem exatamente com a pré-anotação pode nunca ter sido tocado, então trate esses itens como não revisados, a menos que seus dados de tempo mostrem o contrário.
  • O modo artigo calculava o kappa com código próprio. O modo artigo e o módulo de concordância agora calculam o kappa de Cohen pela mesma função que /admin/iaa, então um kappa relatado pelo modo artigo antes da 2.11 pode diferir do que /admin/iaa mostra para os mesmos dados.
  • A adjudicação e o escalonamento automático do Prolific contavam avaliadores de máquina. Anotadores de máquina podiam mandar um item para adjudicação, min_human_annotations era ignorado e o escalonamento automático do Prolific contava anotações de máquina contra os limites por item.

As demais correções mudam o que um estudo consegue fazer. Imagens em hosts que não enviam cabeçalhos CORS, como cocodataset.org, agora carregam. Em uma imagem assim, o preenchimento por inundação, o SAM e a segmentação por prompt de texto agora dizem por que não conseguem lê-la. Uma forma pré-anotada sem color assume a cor do seu rótulo em vez de ser descartada. O "Generate prompt" do Modo Solo agora pede ao modelo de revisão que escreva o primeiro prompt. Recusas por potato mcp connect voltam como erros de ferramenta em vez de sucessos. A descoberta de casos extremos agora funciona no vLLM, que não devolvia os campos de casos extremos até eles serem adicionados ao esquema de resposta.

Como instalar a 2.11

Atualize com pip install --upgrade potato-annotation ou baixe ghcr.io/davidjurgens/potato:2.11.0. O modelo de decisão Laya, executado no mesmo processo, precisa do novo extra decision, pip install 'potato-annotation[decision]', que fica fora de all porque traz o torch junto. As notas de versão listam todas as mudanças, e Novidades tem o resumo de cada versão 2.x.