Potato 2.3: Anotação Agêntica, Solo Mode e o Futuro da Avaliação Humana
O Potato 2.3.0 introduz anotação agêntica com 12 conversores de formato de trace, Solo Mode para rotulagem colaborativa entre humanos e LLMs, Best-Worst Scaling, SSO/OAuth, exportação para Parquet e 15 projetos de demonstração.
Note: This post describes Potato 2.3 as it was at release. Some configuration keys and features have been updated in later versions. See the current documentation for up-to-date configuration syntax.
O Potato 2.3.0 é nosso maior lançamento até agora. Ele traz dois novos sistemas, anotação agêntica e Solo Mode, além de Best-Worst Scaling, autenticação SSO/OAuth, exportação para Parquet e 15 novos projetos de demonstração.
A razão para a maior parte disso é que aquilo que as pessoas anotam mudou. Muitos pesquisadores já não estão apenas rotulando sentimento e entidades nomeadas. Eles estão dissecando traces de agentes de múltiplos passos, comparando saídas de LLMs em grande volume e construindo datasets para tarefas que não existiam há alguns anos. O Potato 2.3 mira exatamente esse trabalho.
Anotação agêntica
O recurso de destaque na 2.3 é um sistema completo para avaliar agentes de IA por meio de anotação humana.
Agentes, ou seja, sistemas que executam vários passos para concluir algo, estão por toda parte agora, e são genuinamente difíceis de avaliar. Uma única execução pode acumular dezenas de chamadas de ferramentas, passos de raciocínio, navegações de página e saídas intermediárias. A maioria das ferramentas de anotação achata tudo isso em texto puro, o que descarta exatamente a estrutura que um avaliador precisa ver.
O sistema de anotação agêntica do Potato tem três partes.
12 conversores de formato de trace
Os traces de agentes têm aparência diferente dependendo do framework que os produziu. O Potato os normaliza em uma única representação:
| Conversor | Origem |
|---|---|
openai | OpenAI Assistants API / function calling |
anthropic | Anthropic Claude tool_use / Messages API |
swebench | Traces de tarefas do SWE-bench |
opentelemetry | Exportações de spans do OpenTelemetry |
mcp | Sessões do Model Context Protocol |
multi_agent | CrewAI / AutoGen / LangGraph |
langchain | Traces de callback do LangChain |
langfuse | Exportações de observação do LangFuse |
react | ReAct Thought/Action/Observation |
webarena | WebArena / VisualWebArena |
atif | Agent Trace Interchange Format |
raw_web | Gravações brutas de navegador (HAR + capturas de tela) |
A configuração é curta:
agentic:
enabled: true
trace_converter: react
trace_file: "data/agent_traces.jsonl"Se você estiver puxando traces de várias fontes ao mesmo tempo, deixe que ele detecte automaticamente:
agentic:
enabled: true
trace_converter: autoTrês tipos de exibição
Diferentes tipos de agentes exigem diferentes visualizações.
O Agent Trace Display renderiza traces de agentes que usam ferramentas como cartões de passos codificados por cor, com observações recolhíveis, JSON formatado de forma legível e uma barra lateral de linha do tempo:
agentic:
display_type: agent_trace
agent_trace_display:
colors:
thought: "#6E56CF"
action: "#3b82f6"
observation: "#22c55e"
error: "#ef4444"
collapse_observations: true
show_step_numbers: trueO Web Agent Trace Display lida com agentes de navegação: capturas de tela completas, sobreposições SVG marcando alvos de clique e campos de entrada, e um filmstrip para se mover rapidamente:
agentic:
display_type: web_agent
web_agent_display:
screenshot_max_width: 900
overlay:
enabled: true
click_marker: "circle"
click_color: "#ef4444"
filmstrip:
enabled: trueO Interactive Chat Display cobre dois casos: revisão de trace, em que você avalia uma conversa gravada, e chat ao vivo, em que os anotadores conversam com um agente em tempo real e depois avaliam a conversa:
agentic:
display_type: interactive_chat
interactive_chat_display:
mode: trace_review
trace_review:
show_token_counts: true
show_latency: trueAvaliações por turno
Com qualquer tipo de exibição, os anotadores podem avaliar passos individuais, bem como o trace como um todo:
annotation_schemes:
- annotation_type: likert
name: overall_quality
min: 1
max: 5
- annotation_type: per_turn_rating
name: step_correctness
target: agentic_steps
rating_type: radio
labels:
- "Correct"
- "Partially Correct"
- "Incorrect"Esquemas pré-construídos
Nove esquemas prontos cobrem as dimensões usuais de avaliação de agentes de imediato:
annotation_schemes:
- preset: agent_task_success
- preset: agent_step_correctness
- preset: agent_error_taxonomy
- preset: agent_safetyOs presets são agent_task_success, agent_step_correctness, agent_error_taxonomy, agent_safety, agent_efficiency, agent_instruction_following, agent_explanation_quality, agent_web_action_correctness e agent_conversation_quality.
Leia a documentação de anotação agêntica →
Solo Mode
O segundo grande recurso na 2.3 é o Solo Mode, um fluxo de trabalho de 12 fases que troca a habitual multidão de anotadores por um único especialista humano trabalhando ao lado de um LLM.
O problema
Normalmente você precisa de vários anotadores para obter rótulos confiáveis. Contratar, treinar e coordenar essa equipe é lento e caro. Em muitos projetos de pesquisa, o gargalo não é a interface de anotação, e sim a logística de gerir uma equipe.
Como o Solo Mode resolve isso
Um especialista de domínio rotula uma fatia cuidadosamente escolhida dos dados. Um LLM aprende com esses rótulos, propõe rótulos para todo o resto, e o humano só intervém de novo onde o LLM está incerto. Um fluxo de trabalho de 12 fases executa todo o ciclo.
Em nossos benchmarks internos, o Solo Mode igualou pipelines completos de múltiplos anotadores com 95% de concordância ou mais, usando apenas 10 a 15% dos rótulos humanos.
As 12 fases
- Anotação semente: o humano rotula 50 instâncias diversas.
- Calibração inicial do LLM: o LLM rotula um lote de calibração usando esses exemplos semente.
- Análise de confusão: encontrar os padrões em que humano e LLM discordam sistematicamente.
- Refinamento de diretrizes: o LLM propõe diretrizes melhores e o humano as aprova.
- Geração de funções de rotulagem: regras programáticas inspiradas no ALCHEmist para as instâncias fáceis.
- Rotulagem ativa: o humano rotula as instâncias mais informativas que restam.
- Loop de refinamento automatizado: rerrotular de forma iterativa à medida que as diretrizes melhoram.
- Exploração de divergências: o humano resolve casos em que o LLM e as funções de rotulagem se chocam.
- Síntese de casos extremos: o LLM inventa exemplos ambíguos para o humano rotular.
- Escalonamento em cascata por confiança: o humano revisa os rótulos de menor confiança do LLM.
- Otimização de prompt: uma busca automatizada de prompts inspirada no DSPy.
- Validação final: revisar uma amostra aleatória e, então, aprovar ou voltar ao ciclo.
Início rápido
solo_mode:
enabled: true
llm:
endpoint_type: openai
model: "gpt-4o"
api_key: ${OPENAI_API_KEY}
seed_count: 50
accuracy_threshold: 0.92
confidence_threshold: 0.85
annotation_schemes:
- annotation_type: radio
name: sentiment
labels: [Positive, Neutral, Negative]Priorização de instâncias com múltiplos sinais
O Solo Mode extrai de seis pools ponderados para decidir quais instâncias valem o tempo de um humano:
solo_mode:
prioritization:
pools:
- name: uncertain
weight: 0.30
- name: disagreement
weight: 0.25
- name: boundary
weight: 0.20
- name: novel
weight: 0.10
- name: error_pattern
weight: 0.10
- name: random
weight: 0.05Leia a documentação do Solo Mode →
Best-Worst Scaling
O Potato 2.3 adiciona o Best-Worst Scaling (BWS), às vezes chamado de Maximum Difference Scaling. Os anotadores veem uma tupla de itens, geralmente quatro, e escolhem o melhor e o pior segundo algum critério. A partir desses simples julgamentos binários, o BWS calcula escores escalares confiáveis e chega lá com muito menos anotações do que uma escala Likert exigiria para o mesmo poder estatístico.
annotation_schemes:
- annotation_type: best_worst_scaling
name: fluency
description: "Select the BEST and WORST translation"
items_key: "translations"
tuple_size: 4
best_label: "Most Fluent"
worst_label: "Least Fluent"
randomize_order: true
tuple_generation:
method: balanced_incomplete
tuples_per_item: 5
scoring:
method: bradley_terry
auto_compute: true
include_confidence: trueHá três métodos de escore. A contagem é o mais simples: (best_count - worst_count) / aparições. O Bradley-Terry é um modelo de comparação par a par e o padrão recomendado. O Plackett-Luce é um modelo de ranqueamento completo para quando você quer extrair o máximo de seus dados.
Calcule o escore pela CLI:
python -m potato.bws score --config config.yaml --method bradley_terry --output scores.csvO painel de administração tem uma aba de BWS mostrando distribuições de escore, gráficos de convergência e confiabilidade por divisão pela metade.
Leia a documentação do Best-Worst Scaling →
Autenticação SSO e OAuth
Uma implantação de anotação em produção precisa de autenticação real. O Potato 2.3 oferece suporte a três métodos OAuth.
Google OAuth
authentication:
method: google_oauth
google_oauth:
client_id: ${GOOGLE_CLIENT_ID}
client_secret: ${GOOGLE_CLIENT_SECRET}
redirect_uri: "https://annotation.example.com/auth/google/callback"
allowed_domains:
- "umich.edu"
auto_register: trueGitHub OAuth com Restrição de Organização
authentication:
method: github_oauth
github_oauth:
client_id: ${GITHUB_CLIENT_ID}
client_secret: ${GITHUB_CLIENT_SECRET}
redirect_uri: "https://annotation.example.com/auth/github/callback"
allowed_organizations:
- "my-research-lab"
scopes:
- "read:user"
- "read:org"OIDC Genérico
Conecte-se ao Okta, Azure AD, Auth0, Keycloak ou qualquer outra coisa que fale OIDC:
authentication:
method: oidc
oidc:
discovery_url: "https://accounts.example.com/.well-known/openid-configuration"
client_id: ${OIDC_CLIENT_ID}
client_secret: ${OIDC_CLIENT_SECRET}
redirect_uri: "https://annotation.example.com/auth/oidc/callback"Todos os três oferecem suporte a restrição de domínio, registro automático e modo misto, em que vários métodos de autenticação compartilham uma única página de login.
Leia a documentação de SSO e OAuth →
Exportação para Parquet
Cada vez mais, os dados de anotação vão parar em ferramentas de ciência de dados que querem formatos colunares. O Potato 2.3 pode exportar diretamente para o Apache Parquet como três arquivos:
annotations.parquet, uma linha por (instância, anotador, esquema) com valores, timestamps e duraçõesspans.parquet, uma linha por span anotado com offsets, rótulos e linksitems.parquet, metadados de instância com contagens de anotação e status
parquet_export:
enabled: true
output_dir: "output/parquet/"
compression: zstd
auto_export: trueCarregue diretamente no pandas, DuckDB, PyArrow, Polars ou Hugging Face Datasets:
import pandas as pd
annotations = pd.read_parquet("output/parquet/annotations.parquet")
# Or with DuckDB for SQL queries
import duckdb
duckdb.sql("""
SELECT instance_id, value, COUNT(*) as n
FROM 'output/parquet/annotations.parquet'
WHERE schema_name = 'sentiment'
GROUP BY instance_id, value
""")Ele lida com compressão snappy, gzip, zstd, lz4 e brotli, exportação incremental particionada por data ou anotador, e codificação de dicionário para colunas de string.
Leia a documentação de exportação para Parquet →
15 novos projetos de demonstração
O Potato 2.3 vem com 15 novas demonstrações no diretório project-hub/, uma ou mais para cada novo recurso.
Para anotação agêntica:
react-agent-eval, avaliação de traces de agentes ReAct com avaliações em nível de passoweb-agent-eval, avaliação de traces do WebArena com sobreposições em capturas de telachatbot-eval, avaliação de chat interativo com um proxy de agente ao vivomulti-agent-eval, avaliação de sistemas multiagente do CrewAIswebench-eval, avaliação de traces do SWE-bench para agentes de programação
Para o Solo Mode:
6. solo-sentiment, classificação de sentimento em avaliações de produtos
7. solo-ner, reconhecimento de entidades nomeadas
8. solo-toxicity, detecção de toxicidade com síntese de casos extremos
Para o Best-Worst Scaling:
9. bws-translation, ranqueamento de qualidade de tradução automática
10. bws-summarization, comparação de qualidade de resumos
11. bws-image-quality, ranqueamento de qualidade de geração de imagens
Para autenticação:
12. google-oauth-demo, um exemplo de configuração do Google OAuth
13. github-oauth-demo, GitHub OAuth com restrição de organização
Para exportação:
14. parquet-export-demo, exportação para Parquet com um script de análise em DuckDB
15. huggingface-upload, exportação para Parquet e envio ao Hugging Face Hub
Cada demonstração vem com um config.yaml completo, dados de exemplo e um README. Inicie qualquer uma delas com:
cd project-hub/react-agent-eval
potato start config.yamlReforço de segurança
Uma série de melhorias de segurança chegou na 2.3:
- Os tokens de sessão agora usam geração aleatória criptograficamente segura com expiração configurável
- A proteção contra CSRF fica ativada por padrão para todo envio de formulário
- Limitação de taxa nos endpoints de autenticação (configurável, 10 tentativas por minuto por padrão)
- Sanitização de entrada para qualquer conteúdo fornecido pelo usuário exibido na interface de anotação
- Uma auditoria de dependências que trouxe todas as dependências Python e JavaScript para versões seguras atuais
- Cabeçalhos de Content Security Policy para conter XSS
security:
csrf_protection: true
rate_limiting:
auth_attempts: 10 # per minute
api_requests: 100 # per minute
session:
token_length: 64
lifetime_hours: 24
content_security_policy: trueAtualização
A partir do Potato 2.2.x
pip install --upgrade potato-annotationSuas configurações da v2.2 são totalmente retrocompatíveis, então nada precisa mudar.
Novas dependências
A exportação para Parquet precisa do PyArrow:
pip install potato-annotation[parquet]O Solo Mode requer um SDK de provedor de LLM:
pip install potato-annotation[solo] # installs openai + anthropic SDKsOu instale tudo:
pip install potato-annotation[all]O que vem a seguir
Algumas coisas em que já estamos trabalhando para o próximo lançamento:
- Diff de anotações, para comparar anotações entre rodadas e anotadores com diffs visuais
- Anotação federada, para coordenar o trabalho entre múltiplas instâncias do Potato
- Fontes de dados em streaming, para anotar a partir de Kafka, Pub/Sub e sistemas semelhantes
- Uma interface amigável para dispositivos móveis, para anotar em tablets e celulares
Gostaríamos genuinamente de saber o que você acha. Abra issues no GitHub, inicie um tópico no GitHub Discussions, ou simplesmente entre em contato com a equipe.
Para o changelog completo, incluindo quaisquer chaves de configuração que mudaram, consulte as notas de versão da v2.3.0 no repositório.