Moderação automática erra nos dois sentidos, e os dois doem. Bloquear conteúdo legítimo gera revolta e recurso; deixar passar conteúdo tóxico gera dano e, às vezes, notícia. Entre esses dois extremos existe uma faixa enorme de casos em que dois moderadores humanos experientes também discordariam entre si.
O erro de desenho mais comum é fingir que essa faixa não existe: um classificador que sempre escolhe um rótulo trata o caso de fronteira com a mesma firmeza do caso óbvio. O Jev — o modelo da TypeSafe que devolve decisões tipadas com probabilidade, em vez de texto — permite escrever a faixa de dúvida explicitamente, e o cookbook oficial de autoconsistência em Choices mostra o desenho.
O desenho das perguntas
Um post por chamada, com as regras da comunidade fora do state e dentro dos
criteria. O state é o conteúdo que muda; a política é o que define o
julgamento.
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
perguntas = {
"violacao": Choice(
instructions="Qual regra da comunidade este post viola, se alguma?",
criteria={
"nenhuma": "Não viola nenhuma regra; conteúdo comum da comunidade.",
"assedio": "Ataque dirigido a uma pessoa ou grupo, xingamento, humilhação.",
"spam": "Divulgação repetitiva, link comercial fora de contexto, golpe.",
"desinformacao_de_saude": "Afirma tratamento ou cura sem base, desencoraja cuidado médico.",
"incerto": "O texto está na fronteira e a regra aplicável não é clara.",
},
),
"gravidade": Score(
instructions="Qual o dano potencial se este post permanecer no ar?",
criteria=[
"Nenhum dano; no máximo desagrada.",
"Dano leve; incomoda a pessoa citada.",
"Dano relevante; humilha, expõe ou engana.",
"Dano grave; incita violência ou risco à saúde.",
],
),
"reincidencia_no_texto": Noul(
instructions="O próprio texto indica que o autor já foi avisado ou punido antes?"
),
"expoe_dado_pessoal": Noul(
instructions="O texto expõe dado pessoal de terceiro: telefone, endereço, CPF ou foto identificável?"
),
}
Duas escolhas merecem explicação. A opção incerto é explícita, e não implícita
num limiar: ela dá ao modelo um lugar para colocar a dúvida, o que é diferente de
inferir dúvida de uma probabilidade baixa. E expoe_dado_pessoal é um Noul, não
um nível da régua de gravidade, porque exposição de dado pessoal costuma ser
regra de remoção imediata, não algo que se pondera. A diferença entre pergunta
relativa e pergunta absoluta está em
qual primitiva usar.
O que o código faz com a resposta
Piso de confiança primeiro. Abaixo do seu piso na maior probabilidade, o post vai para revisão, mesmo que o rótulo vencedor pareça óbvio. O cookbook oficial usa 0,60 como ilustração e avisa, no próprio texto, que é uma política de aplicação ilustrativa, nem garantia calibrada nem limiar otimizado.
Regras determinísticas depois. expoe_dado_pessoal acima do corte remove e
notifica, sem passar pela régua de gravidade. reincidencia_no_texto muda o
destino, não a decisão.
Combinação por último. Gravidade e categoria escolhem a ação entre liberar, avisar o autor, esconder até revisão e bloquear.
v = r.answers["violacao"]
if v.choice == "incerto" or v.confidence < 0.60:
return fila_moderacao(post, motivo="incerteza")
if r.answers["expoe_dado_pessoal"].noul > 0.7:
return remover(post, motivo="dado pessoal de terceiro")
if v.choice == "nenhuma":
return publicar(post)
gravidade = r.answers["gravidade"].score
if gravidade >= 3:
return bloquear(post)
if gravidade >= 2:
return esconder_ate_revisao(post)
return avisar_autor(post)
Onde entra a pessoa
Na faixa de incerteza e no topo da gravidade. O experimento oficial dá uma noção
de volume: com a regra de 0,60 aplicada a 8 perguntas sobre um post de fronteira,
repetido 15 vezes, o Jev devolveu incerto em 25,8% das respostas e agiu sozinho
nos outros 74,2%, com 99,2% de concordância de decisão e zero perguntas com ações
concretas conflitantes entre as repetições. O próprio cookbook registra que isso
mede repetibilidade, não acurácia.
Um quarto da fila em revisão parece muito, e é — para um post construído para ser difícil. O que o número ensina é que a capacidade de revisão precisa ser dimensionada antes de o limiar ser escolhido, e não depois. Esse raciocínio completo está em revisão humana no lugar certo.
Custo
Assumindo um milhão de posts por mês — suposição deste artigo — com 955 tokens de entrada por chamada, o perfil das nossas medições: a US$ 0,042 por milhão de tokens de entrada, com saída gratuita, e o dólar estimado em R$ 5,40, a conta dá cerca de R$ 216,60 por mês. Por post, cerca de R$ 0,00022. A fórmula está em quanto custa uma decisão.
O que muda com esse preço não é o orçamento: é a possibilidade de moderar tudo antes da publicação em vez de reagir a denúncias.
Onde isso quebra
Conteúdo adversarial é o limite declarado mais relevante aqui. A documentação
oficial diz que o state é tratado como dado, não como hostil por padrão, e que
texto escrito para direcionar o modelo pode mover a resposta. Em moderação, o
autor do conteúdo é exatamente o adversário. Os remédios oficiais são ser
explícito nos critérios e testar casos de borda antes de expor a muitos usuários
— e, na arquitetura, nunca deixar a decisão de bloqueio depender de uma única
pergunta.
Leitura literal. O modelo responde a pergunta escrita, não a intenção. “Conteúdo ofensivo” sem definição produz resultado inconsistente; “ataque dirigido a uma pessoa, com xingamento ou humilhação” produz resultado estável.
Ironia e contexto cultural. Nos nossos cinco testes em português, de 18/09/2026, um texto irônico foi lido como negativo com 98% — mas a categoria caiu em “Outro” com confiança 0,72. Ou seja: o sentimento passou, o enquadramento ficou incerto. Em moderação, é a categoria que dispara a ação, e essa combinação é justamente um caso de fila humana.
A lista completa dos nove modos de falha está em limites do Jev, e o filtro de mensagens de entrada e saída de um aplicativo generativo tem receita própria em guardrails para LLM. O índice desta seção fica em casos de uso.
Perguntas frequentes
Por que incluir uma opção de incerteza na moderação?
Porque uma mudança pequena de probabilidade pode trocar dois rótulos próximos. O cookbook oficial de autoconsistência em Choices devolve incerto quando a maior probabilidade fica abaixo de 0,60 e manda esse caso para uma pessoa. No experimento, isso deixou o Jev com 99,2% de concordância de decisão entre 15 repetições e nenhuma pergunta com ações concretas conflitantes.
Quanto da fila vai para revisão humana nesse desenho?
No experimento oficial, com a regra de 0,60 sobre 8 perguntas de moderação num post de fronteira, o Jev devolveu incerto em 25,8% das respostas e agiu sozinho nos outros 74,2%. É um caso construído para ser difícil, e o número vale para aquela régua, não necessariamente para a sua.
O modelo é resistente a texto que tenta enganá-lo?
Não por padrão, e a documentação diz isso. Conteúdo escrito para direcionar o modelo — instrução injetada, enquadramento enganoso, texto que argumenta a própria classificação — pode mover a resposta. A recomendação oficial é ser explícito nos critérios e testar casos de borda antes de expor a muitos usuários.
Dá para usar uma régua de severidade em vez de bloquear direto?
É o desenho recomendado. Uma pergunta decide a categoria da violação, um Score mede a gravidade e o seu código combina os dois com a confiança para escolher entre liberar, avisar, revisar ou bloquear.
Quanto custa moderar um milhão de posts?
Com o perfil das nossas medições, 955 tokens de entrada por chamada, o preço oficial de US$ 0,042 por milhão de tokens de entrada e o dólar estimado em R$ 5,40, um milhão de posts sai por cerca de R$ 216,60 em chamadas.