Neste post
  1. Como funciona
  2. O detalhe que muda tudo: o texto está dentro da imagem
  3. O que custou mais caro que o esperado
  4. Latência no caminho crítico
  5. Falso positivo
  6. A decisão sobre falha
  7. O que a inversão resolve de verdade
  8. O que ela não resolve
  9. O que ficou
  10. Resumo

O padrão da indústria para moderar conteúdo de usuário é reativo: publica primeiro, denuncia depois, remove se alguém reclamar.

Funciona em escala, e falha exatamente nas primeiras horas — que são as horas em que o conteúdo circula. Quando a remoção acontece, o dano do caso grave já foi feito, e a vítima é quem teve o trabalho de denunciar.

No EuRi, uma rede social de memes, invertemos isso. Este post é sobre o que a inversão custou.

Como funciona

usuario cria post
   -> Cloud Function
   -> Gemini analisa
   -> passou?  sim -> vai ao ar
               nao -> nao vai

Não existe janela entre publicar e moderar, porque não existe publicação antes da moderação.

A escolha por Cloud Function em vez de fazer isso no aplicativo é o ponto que mais importa e o menos discutido: moderação no cliente é moderação opcional. Um aplicativo modificado ignora a checagem e escreve direto no banco.

E aqui vale ser preciso, porque é onde muita gente acha que resolveu e não resolveu: não é a Cloud Function que garante isso. A Function é só um caminho; se o banco aceitar escrita direta do aplicativo, o caminho é contornável. Quem garante é a regra de segurança do banco, que precisa negar escrita do cliente na coleção do feed e permitir apenas a partir do back-end.

Onde mora a garantiaO que acontece com app modificado
Só na Functionescreve direto no banco e pula a moderação
Na regra de segurança do bancoa escrita é recusada, e não há o que contornar

Escrever a Function é o trabalho visível. Fechar a porta lateral é o trabalho que faz a Function valer alguma coisa.

O detalhe que muda tudo: o texto está dentro da imagem

Meme não é texto com uma imagem junto. Na maioria das vezes é uma imagem com o texto desenhado dentro dela — e é justamente no texto que mora quase todo o conteúdo problemático.

Isso invalida a solução intuitiva. Um classificador que lê a legenda do post analisa exatamente a parte que não importa: o autor escreve "kkkk olha isso" na legenda e a ofensa está renderizada em branco no topo da imagem, onde nenhum filtro de texto enxerga.

A análise precisa ser da imagem inteira, com o modelo lendo o que está escrito nela e julgando texto e imagem em conjunto — porque as duas coisas separadas costumam ser inofensivas, e o sentido nasce da combinação. É esse detalhe que torna o problema mais caro do que "chamar uma API de moderação".

O que custou mais caro que o esperado

Latência no caminho crítico

Chamar um modelo antes de publicar adiciona espera, e a espera é variável.

O problema real não é o tempo: é a percepção. Um botão que fica dois segundos sem responder parece travamento. E a resposta óbvia — mostrar um indicador de carregamento — resolve mal, porque não explica.

O que funcionou foi tratar como estado, não como espera:

AbordagemPercepção
Botão travado sem retornoapp quebrado
Indicador genérico girandolentidão
"Analisando seu post" com estado explícitoprocesso, com fim previsível

A terceira também cria a oportunidade de explicar a recusa quando ela acontece — o que é a diferença entre um usuário que entende a regra e um que acha que o app é aleatório.

Falso positivo

Aqui foi onde mais se perdeu tempo, e o motivo é da natureza do conteúdo: meme é ambíguo por construção.

Ironia, sarcasmo, autodepreciação e humor de grupo se parecem com agressão para um classificador ingênuo. Um filtro que reage a palavras bloqueia metade do material legítimo, e um app de humor com filtro assim não é um app de humor seguro — é um app de humor quebrado.

As primeiras versões do prompt erravam para o lado restritivo com frequência inaceitável. O que corrigiu não foi ajustar severidade: foi trocar descrição por exemplo.

Prompt que descreve o que é ofensivo em abstrato produz um classificador ansioso. Prompt com casos concretos — inclusive de coisas que devem passar — se comporta muito melhor. A lista de casos que passam é tão importante quanto a de casos que não passam.

Moderação por IA não é um interruptor. É um parâmetro que se calibra contra o seu conteúdo — e errar para o lado restritivo custa o produto.

A decisão sobre falha

Toda arquitetura de moderação síncrona precisa responder uma pergunta antes de ir para produção:

Se o serviço de análise estiver indisponível, o post é publicado ou é segurado?

Falhar aberto mantém o app funcionando e abre uma janela sem filtro exatamente durante uma indisponibilidade — que é quando ninguém está olhando.

Falhar fechado segura o conteúdo e frustra usuários legítimos.

Escolhemos falhar fechado, com estado visível de "em análise". A razão é específica deste produto: se o diferencial é a moderação, um período sem moderação não é degradação — é a ausência da coisa que se prometeu.

Num produto onde moderação é acessório, a escolha razoável seria a oposta. O importante é que essa decisão seja tomada de propósito, e não descoberta durante o primeiro incidente.

O que a inversão resolve de verdade

Elimina a janela de circulação. O conteúdo grave não fica no ar por vinte minutos.

Tira o peso da vítima. No modelo reativo, o sistema depende de alguém ser atingido e ter disposição para denunciar. É um desenho que terceiriza o trabalho de moderação para quem menos deveria fazê-lo.

Reduz o volume humano. O que chega para revisão manual é o caso limite, não o óbvio.

O que ela não resolve

Não elimina denúncia. Casos limítrofes, contexto e disputa continuam existindo, e continuam precisando de pessoas.

Não resolve conteúdo que só é problema no contexto. Uma imagem inofensiva dirigida a uma pessoa específica pode ser assédio, e nenhum classificador que olha o post isolado enxerga isso.

Não é imune a mudança de comportamento. Usuário aprende o que passa. Filtro que não é revisado vira filtro contornado.

Não é de graça. Cada post custa uma chamada de modelo, inclusive os recusados. Isso inverte uma intuição confortável: num app social comum, usuário que posta muito é usuário valioso; aqui, ele também é uma linha na fatura. E quem tenta inundar o app com conteúdo proibido gasta o seu dinheiro ao ser barrado, porque a recusa só existe depois da análise.

A consequência prática é que limite de postagem por conta deixa de ser um item de higiene e vira parte da arquitetura de custo. Não é proteção contra spam no feed — o filtro já faz isso. É proteção contra spam na conta de serviço.

O que ficou

Um feed em que o conteúdo que chega já passou por um filtro, e em que o problema não é resolvido pedindo à vítima que denuncie.

Isso conversa diretamente com a outra decisão do estúdio na mesma direção, contada em Moderação antes do crescimento: moderação não é recurso que se adiciona quando o app cresce, porque ela muda como a mensagem trafega — e mudar isso depois é reescrever o caminho principal.

Se você já construiu moderação pré-publicação com modelo de linguagem, o que mais interessa saber é onde a sua erra: no falso positivo, na latência ou na decisão de falha.

Resumo

  • Moderação reativa falha nas primeiras horas, que são as que importam.
  • A checagem precisa estar onde o cliente não alcança. Moderação no aplicativo é

moderação opcional.

  • Latência é inevitável; o trabalho é transformá-la em estado compreensível, não

em espera muda.

  • Falso positivo se corrige com exemplos concretos, incluindo os que devem

passar — não com adjetivos de severidade.

  • Decida antes se o sistema falha aberto ou fechado. Descobrir isso durante um

incidente é tarde.

  • Continua sendo necessário haver gente para caso limite, contexto e disputa.

Perguntas frequentes

Quanto de latência isso adiciona?

O suficiente para o usuário perceber. Chamar um modelo no caminho crítico da publicação não é de graça, e a resposta não é constante. O trabalho não foi eliminar a espera — foi torná-la compreensível na interface, para não parecer travamento.

O que acontece se o modelo estiver indisponível?

É a decisão de projeto mais importante do sistema: falhar aberto (publica) ou falhar fechado (segura). Escolhemos segurar e sinalizar 'em análise', porque num app cujo diferencial é moderação, publicar sem filtro durante uma indisponibilidade destrói justamente a promessa.

Como calibrar o filtro sem estragar o humor?

Com exemplos, não com adjetivos. Prompt que descreve o que é ofensivo em abstrato produz classificador ansioso. Prompt com casos concretos do que passa e do que não passa — inclusive ironia e autodepreciação — se comporta muito melhor.

Isso substitui moderação humana?

Não. Reduz o volume que chega ao humano e elimina a janela em que o pior conteúdo circula. Denúncia, revisão e decisão sobre caso limite continuam precisando de gente.