Neste post
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 garantia | O que acontece com app modificado |
|---|---|
| Só na Function | escreve direto no banco e pula a moderação |
| Na regra de segurança do banco | a 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:
| Abordagem | Percepção |
|---|---|
| Botão travado sem retorno | app quebrado |
| Indicador genérico girando | lentidão |
| "Analisando seu post" com estado explícito | processo, 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.