Como escrever uma boa pergunta para o Laya: da decisão vaga à decisão tipada

Uma boa pergunta para o Laya tem tipo certo (choice para escolher uma opção, score para nível numa escala ordinal, noul para probabilidade de sim/não), um enunciado em instructions sem ambiguidade e criteria com rótulos mutuamente exclusivos e descrições curtas. Antes do JSON, escreva uma rubrica que dois humanos consigam aplicar do mesmo jeito. Descreva todo nível de score (nível sem descrição dá erro 422), mantenha choice abaixo de cerca de 20 opções e separe decisões diferentes em perguntas diferentes na mesma chamada. A confidence baixa na resposta aponta qual pergunta reescrever
Fala aí, beleza? Se o Laya tá te devolvendo decisão diferente pra ticket quase igual, antes de culpar o modelo, olha pra pergunta 😀
Resultado inconsistente no Laya quase sempre nasce do enunciado, não da rede
Tu já sabe como ele funciona: manda um estado (texto, e-mail, ticket ou JSON) mais perguntas tipadas e recebe respostas tipadas com probabilidade calibrada, tudo numa única passada pela rede
Ele não gera texto, então não existe "conversa" pra consertar a resposta depois
O que ele decide depende MUITO de como tu escreveu o enunciado e os rótulos
Neste post eu pego a mesma pergunta em versão ruim e versão boa, passo a passo, pra tu ver onde a decisão vaga vira decisão tipada
Bora ver na prática?
Antes de reescrever suas perguntas: o que você precisa ter
O Laya é uma família de modelos de decisão open source da Convai Innovations, sob licença Apache 2.0, e a referência de formato é o model card no Hugging Face
Pra seguir o post tu precisa de quatro coisas:
- Laya instalado:
pip install laya, com Python 3.10 ou mais novo - O formato da pergunta na cabeça:
type,instructionscom o enunciado ecriteriacom cada rótulo e a descrição dele - Uma amostra de estados reais: tickets, e-mails ou JSON do seu sistema, não exemplo inventado
- A ação que cada resposta dispara: se a resposta não muda nada no seu fluxo, a pergunta nem precisa existir
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 48min
O formato base de uma pergunta choice fica assim:
{
"type": "choice",
"instructions": "Is this review positive?",
"criteria": {
"A": "yes, the review is positive",
"B": "no, the review is negative"
}
}
E se liga no idioma do estado, porque ele pesa na escolha do checkpoint:
| Checkpoint | Base | Parâmetros | Contexto | Idiomas |
|---|---|---|---|---|
| Inglês | ModernBERT-large | 421M | 512 | inglês |
| Multilíngue | mmBERT-base | 322M | 1024 | 100+ |
| typed-decisions | fine-tuned no split de treino do benchmark | não se aplica | não se aplica | não se aplica |
Ticket em português rodando no checkpoint em inglês já é um jeito fácil de colher inconsistência, antes mesmo de mexer na pergunta
Passo a passo: como transformar uma decisão vaga em decisão tipada
São sete passos, e em cada um tu vê a versão ruim, a versão boa e o erro que mais aparece
1. Escreva a rubrica humana antes do código:
Parece burocracia, mas é o passo que mais economiza tempo
Se duas pessoas não concordam na resposta, o modelo também não vai ser consistente, simples assim
Versão ruim (a "rubrica" que mora só na sua cabeça):
Decidir o que fazer com o ticket
Versão boa, com entrada, respostas permitidas, definição de cada rótulo e ação:
Entrada: texto do ticket enviado pelo cliente
Respostas permitidas: billing, support, sales
billing: cobrança, fatura, reembolso ou forma de pagamento
support: algo quebrado ou que não funciona como deveria
sales: interesse em comprar, fazer upgrade ou trocar de plano
Ação: billing -> fila financeira, support -> fila técnica, sales -> time comercial
Aí tu pega uma amostra de estados reais, entrega pra dois rotuladores e compara
Onde eles discordam, o critério tá mal escrito, e é ali que tu corrige antes de virar JSON
O erro comum deste passo: pular direto pro criteria e descobrir a ambiguidade só quando a produção começa a rotear errado
2. Escolha o tipo certo: choice, score ou noul?
O Laya conhece três tipos de pergunta, e cada um responde uma coisa diferente:
| Tipo | Quando usar | O que volta |
|---|---|---|
| choice | escolher uma opção de um conjunto | distribuição completa de probabilidade |
| score | nível numa escala ordinal | legenda (número -> significado) e probabilidade por nível |
| noul | sim ou não | probabilidade bruta de sim |
Versão ruim: urgência como choice, como se "baixa" e "crítica" fossem categorias sem ordem
{
"type": "choice",
"instructions": "How urgent is this ticket?",
"criteria": {
"low": "not urgent",
"medium": "somewhat urgent",
"high": "urgent",
"critical": "very urgent"
}
}
Versão boa: urgência vira score, porque é escala (cada nível descrito, como tu vê no passo 5)
E risco de cancelamento vira noul, com um enunciado de sim/não direto: Is the customer likely to cancel or dispute?
Choice com "sim" e "não" funciona (o próprio model card usa isso pra sentimento de review), mas quando o que tu quer é a probabilidade de sim pra cortar num limite, noul entrega isso direto
O erro comum deste passo: usar choice sim/não onde noul basta, ou usar choice pra algo que tem ordem natural e deveria ser score
3. Escreva instructions sem ambiguidade:
Aqui não é prompt de modelo generativo, então esquece o textão
Se tu vem de escrever prompt para modelo de raciocínio, a lógica é outra: o enunciado precisa fechar a pergunta, não abrir espaço pra interpretação

VPS Hostinger para seu sistema
10% OFF extraVPS com SSD NVMe e backups semanais. O cupom MATHEUSHORADECODAR é aplicado automaticamente pelo link.
Ver planos com 10% OFF →Versão ruim:
{
"type": "choice",
"instructions": "What about this ticket?",
"criteria": {
"billing": "billing",
"support": "support",
"sales": "sales"
}
}
"What about this ticket?" pode ser tema, sentimento, prioridade, dono… o modelo não tem como saber
Versão boa, com o enunciado do exemplo do model card:
{
"type": "choice",
"instructions": "Which team should handle this ticket?",
"criteria": {
"billing": "invoices, charges, refunds, payment methods",
"support": "something broken or not working",
"sales": "buying, upgrading or changing plans"
}
}
O erro comum deste passo: enunciado que serve pra qualquer pergunta, e aí a mesma pergunta responde coisas diferentes em estados diferentes
4. Defina criteria com rótulos mutuamente exclusivos:
Cada estado deveria caber em UM rótulo só
Se duas descrições cobrem o mesmo caso, a probabilidade se divide entre elas e a decisão fica instável
Versão ruim, com "account" aparecendo em dois rótulos:
{
"type": "choice",
"instructions": "Which team should handle this ticket?",
"criteria": {
"billing": "account and payment issues",
"support": "technical problems or account issues",
"sales": "anything else"
}
}
Problema de login cai em billing ou support? E "anything else" vira lixeira de tudo que não encaixou
Versão boa: a mesma do passo 3, com descrições curtas (poucas palavras) e sem sobreposição
E tome cuidado com rótulo nulo ou duplicado: o Laya recusa a pergunta com uma mensagem que aponta o problema (o mesmo vale pra estado None e pergunta que não é dict)
O erro comum deste passo: descrição longa tentando cobrir todo caso de borda, que acaba invadindo o rótulo do lado
5. Descreva todo nível de uma pergunta score:
Em score, todo nível precisa de descrição
Nível sem descrição é rejeitado com erro 422, na hora, antes de qualquer decisão sair
O formato exato do campo de níveis tu confere no model card, aqui o que importa é o conteúdo:
| Nível | Descrição ruim | Descrição boa |
|---|---|---|
| 0 | baixa | dúvida geral, nada parado |
| 1 | média | algo funciona com contorno |
| 2 | alta | algo parado para um usuário |
| 3 | (vazio) | serviço parado para vários clientes |
"Baixa", "média" e "alta" não dizem nada sobre o ticket, só repetem a escala
A versão boa amarra cada nível a uma situação observável no texto
O erro comum deste passo: deixar o nível do topo sem descrição achando que "crítico" é óbvio (não é, e ainda dá 422)
6. Controle o número de opções:
Todas as opções de uma choice são renderizadas num orçamento fixo head_max_len de 192 tokens
Com 77 opções sobram cerca de 4 tokens por rótulo, e o texto deixa de ser distinguível
Por isso a recomendação é manter choice abaixo de cerca de 20 opções
O README mostra o impacto: com 58 rótulos do MASSIVE-INTENT numa única pergunta, o checkpoint em inglês vai de 24/58 acertos no orçamento padrão para 34/58 com --head-max-len 384
Melhora, mas a saída mais limpa é dividir numa pergunta grossa e outra fina
Versão ruim: uma choice com dezenas de intenções
Versão boa, primeiro a pergunta grossa:
{
"type": "choice",
"instructions": "What area is the user asking about?",
"criteria": {
"calendar": "meetings, events, reminders",
"music": "playing songs or playlists",
"weather": "forecast or current weather"
}
}
E depois a fina, só dentro da área escolhida:
{
"type": "choice",
"instructions": "What does the user want to do with the calendar?",
"criteria": {
"create": "add a new event",
"query": "ask about existing events",
"remove": "delete an event"
}
}
O erro comum deste passo: resolver tudo aumentando o orçamento de tokens e continuar com rótulos que brigam entre si
7. Combine várias perguntas no mesmo estado:
Todas as perguntas de uma chamada são respondidas na mesma passada pela rede
Então não tem motivo pra espremer três decisões numa pergunta só
Versão ruim, misturando time, urgência e risco num rótulo:
{
"type": "choice",
"instructions": "Classify this ticket",
"criteria": {
"billing_urgent_churn": "billing, urgent, may cancel",
"billing_normal": "billing, not urgent",
"support_urgent": "support, urgent"
}
}

Crie sistemas com IA para vender
Prompts, modelos e checklists para criar e publicar seu sistema com IA e preparar a oferta para o primeiro cliente.
Quero o e-book gratuito Receba o livro e os bônus no seu e-mail.Cada combinação vira um rótulo, as opções explodem e a exclusividade vai pro espaço
Versão boa, no molde do exemplo do model card:
department: choice comWhich team should handle this ticket?e billing, support, salesurgency: score com todos os níveis descritoschurn_risk: noul comIs the customer likely to cancel or dispute?
Três perguntas pequenas, cada uma com um tipo, no mesmo estado e na mesma chamada
O erro comum deste passo: criar rótulos compostos pra "economizar chamada", que não economiza nada
Resultado inconsistente no Laya: como diagnosticar pela resposta
A resposta já te conta qual pergunta tá ruim, é só ler
- choice devolve a distribuição completa de probabilidade
- score devolve a legenda (número -> significado) e a probabilidade de cada nível
- noul devolve a probabilidade bruta de sim
Em choice e score ainda tem a confidence, que é 1 menos a entropia normalizada
Que entropia? É a medida de quão espalhada tá a distribuição: confidence alta quer dizer probabilidade concentrada num rótulo, confidence baixa quer dizer que o modelo ficou dividido
Se a confidence cai sempre na mesma pergunta, desconfia do enunciado dela primeiro
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Erro repetido no mesmo tipo de estado | rótulos pouco claros | voltar à rubrica e reescrever criteria |
| Confidence baixa em quase tudo | opções demais ou rótulos sobrepostos | cortar opções, dividir em grossa + fina |
| Dois rótulos sempre trocados | descrições que cobrem o mesmo caso | tornar os rótulos mutuamente exclusivos |
| Erra só em certos textos | falta de contexto no estado | incluir no estado o que a rubrica precisa |
| Erra em outro idioma | idioma incompatível com o checkpoint | usar o multilíngue |
| Nada melhora mesmo com pergunta boa | modelo inadequado pra tarefa | validar outro checkpoint ou outra abordagem |
Pra prevenir, monta um conjunto de teste que inclua:
- mensagens curtas
- erros de digitação
- mistura de idiomas
- texto irrelevante citado (tipo e-mail encaminhado)
- evidência contraditória
E no fluxo de produção, o LayaGuardrail filtra por probabilidade tanto noul quanto score agora
O threshold precisa estar entre 0 e 1, fora disso ele solta ValueError
Assim o estado que não passou do limite vai pra revisão humana em vez de disparar ação no escuro
Exemplos de perguntas bem tipadas para cenários comuns
Resumão dos pares ruim x boa pra tu adaptar:
- Roteamento de ticket (choice): ruim é
What about this ticket?, boa éWhich team should handle this ticket?com billing, support e sales descritos sem sobreposição - Urgência (score): ruim é choice com "low/high", boa é score com cada nível amarrado a uma situação observável
- Risco de cancelamento (noul): ruim é rótulo composto tipo
billing_urgent_churn, boa éIs the customer likely to cancel or dispute?separado - Sentimento de review (choice):
"A": "yes, the review is positive"e"B": "no, the review is negative", dois rótulos que não se cruzam - Intenção com muitas classes: ruim é uma choice gigante, boa é pergunta grossa (área) seguida de pergunta fina (ação dentro da área)
Agora o balde de água fria, porque pergunta bem escrita não é mágica:
| Cenário | Acurácia |
|---|---|
| Checkpoint fine-tuned no próprio benchmark | 0,766 |
| Laya em zero-shot | 0,362 |
| Multilíngue em zero-shot | 0,352 |
| Baseline de classe majoritária | 0,461 |
| Baseline aleatório | 0,318 |
O 0,766 é do checkpoint que treinou no split do benchmark
Em zero-shot ele fica acima do aleatório, mas abaixo de chutar sempre a classe majoritária
Ou seja, clareza da pergunta ajuda, mas quem diz se funciona no seu caso é o seu conjunto de teste, não o número do anúncio
Próximo passo: reescreva uma pergunta e compare
Recapitulando: decisão tipada é rubrica clara, tipo certo, enunciado fechado, rótulos que não se cruzam, níveis todos descritos, poucas opções e uma decisão por pergunta
De todas as alavancas pra deixar o Laya consistente, a clareza da pergunta é a mais barata
Não precisa trocar de modelo nem de máquina, é só texto 😛
O próximo passo prático:
- Pega a pergunta que mais falha hoje
- Passa ela pela rubrica com dois rotuladores numa amostra
- Reescreve
instructionsecriteriaonde eles discordaram - Roda de novo no conjunto de teste e compara confidence e distribuição com a versão antiga
Se a distribuição concentrou e a confidence subiu, tu achou o problema… e ele tava na pergunta haha
Até o próximo post!
Perguntas frequentes
Quantas opções uma pergunta choice do Laya aguenta sem perder qualidade?
A recomendação é manter abaixo de cerca de 20 opções, porque todas são renderizadas num orçamento fixo de 192 tokens (head_max_len). Com 77 opções sobram uns 4 tokens por rótulo e o texto deixa de ser distinguível. No MASSIVE-INTENT, com 58 rótulos numa única pergunta, o checkpoint em inglês foi de 24/58 pra 34/58 acertos só aumentando pra –head-max-len 384.
Por que minha pergunta score no Laya retorna erro 422?
Porque todo nível de uma pergunta score precisa ter descrição. Se algum nível fica nulo, o Laya rejeita com erro 422 na hora. É o mesmo tipo de validação que barra rótulo de choice nulo ou duplicado, estado None e pergunta que não é dict.
Qual a diferença entre usar score e noul pra uma pergunta de risco?
Score serve pra nível numa escala ordinal e devolve legenda (número associado ao significado) mais probabilidade por nível. Noul serve pra sim ou não e devolve só a probabilidade bruta de sim. Se tu quer cortar num limite tipo ‘risco de cancelamento acima de X%’, noul entrega isso direto sem precisar somar níveis.
Como escolher entre o checkpoint em inglês e o multilíngue do Laya?
O checkpoint em inglês usa ModernBERT-large, 421M parâmetros e contexto 512, feito pra estado em inglês. O multilíngue usa mmBERT-base, 322M parâmetros, contexto 1024 e cobre mais de 100 idiomas. Se o ticket ou e-mail não tá em inglês, rodar no checkpoint errado já é fonte de inconsistência antes de mexer na pergunta.
Por que o Laya dá respostas diferentes pra tickets quase iguais?
Erro repetido costuma indicar rótulo pouco claro, falta de contexto na instructions, idioma incompatível com o checkpoint ou modelo inadequado pro caso. O conjunto de teste pra investigar isso deve incluir mensagens curtas, erro de digitação, mistura de idiomas, texto irrelevante citado e evidência contraditória.
Como testar se a rubrica de uma pergunta pro Laya tá boa antes de ir pra produção?
A prática é escrever a entrada, as respostas permitidas, a definição de cada rótulo e a ação disparada por cada resposta antes de virar JSON. Depois dois avaliadores rotulam a mesma amostra de estados reais de forma independente. Onde eles discordam é onde o critério precisa ser reescrito.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 30min
Blog | Mais populares

Choice, score e noul: quais são os tipos de pergunta do Laya e quando usar cada um?
Entenda os tipos de pergunta do Laya: choice, score e noul. Como cada um funciona, a acurácia de cada primitiva e quando usar em cada situação.

Como usar o laya para detectar phishing, spam e risco de churn em texto, email e ticket?
Veja como o laya detecta phishing, spam e risco de churn em texto, email e ticket com scores calibrados, rodando local via pip install.

Quando não usar o laya? Os limites de um motor de decisões que não gera texto
Quando não usar laya? Veja os limites do motor de decisões: sem texto, sem zero-shot eficaz, sem raciocínio em várias etapas. Descubra onde ele falha.
