//Caso de uso

Moderação de conteúdo com incerteza declarada

O problema da moderação automática não é o caso óbvio. É o caso de fronteira, em que dois revisores humanos também discordariam.

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.

Quer dominar decisões com IA em português? O curso da comunidade está em pré-venda.

Garantir pré-venda por R$ 499,00

Pré-venda: R$ 499,00 · Após o lançamento: R$ 799,00