Distúrbio de Discurso

:warning: Este recurso agora faz parte do Discourse AI. Este plugin está obsoleto.

|||-
:discourse2: | Resumo | Disorder ajuda moderadores sinalizando automaticamente conteúdo potencialmente tóxico em seu fórum Discourse.
:hammer_and_wrench: | Link do Repositório | https://github.com/xfalcox/disorder
:open_book: | Guia de Instalação | Como instalar plugins no Discourse

Se você estiver usando nosso serviço oficial de hospedagem, entre em contato com nosso suporte para registrar seu interesse neste plugin.

Toxicidade

Como @hawk disse em Dealing with Toxicity in Online Communities, gerenciar a toxicidade em sua comunidade é fundamental.

Embora o Discourse venha pronto para uso com muitas ferramentas diferentes para ajudar a gerenciar a toxicidade em sua comunidade, estamos sempre pesquisando maneiras de melhorá-la ainda mais. Em particular, tenho pesquisado sobre possíveis aplicações de Machine Learning e IA em fóruns online. Que agora é um plugin experimental, disponível para todas as comunidades.

O plugin

O Disorder utiliza Inteligência Artificial e Machine Learning para ajudá-lo a moderar sua comunidade, tornando mais fácil para sua equipe de moderação ficar por dentro de conteúdo potencialmente problemático e até mesmo, opcionalmente, incentivar seus usuários a revisar postagens tóxicas antes de publicá-las.

Este é um primeiro passo no uso de modelos de ML auto-hospedados no Discourse e, embora seja um modelo simples, estabelece um padrão que pode ser reutilizado para aplicar modelos mais complexos no futuro.

Funcionalidades

Sinalização em Segundo Plano

Este é o principal modo de operação do Disorder, pois é completamente transparente para seus usuários, que não estarão cientes de quaisquer alterações.

Sempre que uma nova postagem (ou mensagem de chat usando Discourse Chat) é criada, ela será colocada em uma fila de classificação de forma assíncrona. Caso a classificação retorne acima de um limite configurável, a postagem/mensagem de chat será sinalizada para que sua equipe de moderação seja alertada e possa tomar a decisão final sobre a sinalização.

Intervenção em Nova Postagem

Se você acha que a prevenção é o melhor remédio, pode se interessar por esta opção mais ativa.

Você pode habilitar uma classificação síncrona de qualquer nova postagem que, se acima de um limite configurável de toxicidade, acionará uma intervenção no fluxo de novas postagens, pedindo ao usuário para revisar e fazer emendas na mensagem que possa estar fora dos limites estabelecidos pelas regras de sua comunidade.

Isso acontecerá apenas uma vez e, após fechar o modal, o usuário poderá postar normalmente.

Como funciona?

Este plugin integra os modelos de código aberto do Detoxify, usando um modelo de chamada de API remota para permitir que os administradores dimensionem adequadamente a taxa de inferência às necessidades de cada comunidade.

Fornecemos uma imagem simples que fornece uma API HTTP fina que o Discourse chamará para realizar a classificação de conteúdo, que pode ser executada tanto no mesmo servidor onde você executa o Discourse, quanto em um servidor diferente.

O plugin Discourse escuta os eventos de novas postagens / novas mensagens de chat e enfileira um trabalho de classificação na fila de segundo plano. Os resultados são armazenados no banco de dados para que você possa extrair relatórios, e sinalizamos o conteúdo usando um usuário bot separado para que possamos rastrear a precisão de sua sinalização ao longo do tempo.

Opções

Primeiro, o plugin funciona pronto para uso, portanto, não é necessário alterar nenhuma configuração imediatamente. No entanto, se você quiser alterar o comportamento do plugin, existem alguns botões que você pode usar.

Fornecemos 3 modelos de classificação diferentes que você pode escolher nas opções do plugin:

  • unbiased (padrão): Um modelo que tenta reduzir o viés não intencional do modelo na classificação de toxicidade.

  • multilingual: Um modelo que pode classificar italiano, francês, russo, português, espanhol e turco.

  • original: Modelo mais simples.

Você também pode ajustar se o plugin irá:

  • sinalizar automaticamente
  • habilitar intervenção síncrona em postagens tóxicas com aviso (experimental)
  • habilitar intervenção síncrona em postagens tóxicas (não recomendado)

Tudo o que o acima mencionado acontece apenas quando o comentário é classificado como acima dos limites para cada tipo de classificação:

  • toxicidade
  • toxicidade_severa
  • ataque_identidade
  • insulto
  • ameaça
  • sexual_explícito

Você pode ajustar cada um dos limites de classificação para ações automáticas.

Serviço de Classificação

O plugin vem pré-configurado funcionando pronto para uso. Para isso, ele está contatando um serviço executado pelo Discourse (CDCK) para classificar o conteúdo do usuário. Esse serviço de API de classificador é de código aberto e você pode executar sua própria cópia do serviço, se necessário.

39 curtidas

Só por curiosidade, quais são as diferenças entre a implementação do Google Perspective API pelo “Disorder” e pelo Discourse?

7 curtidas

Em termos de código, são plugins completamente diferentes.

De uma visão geral, eles atendem à mesma necessidade, mas são projetados de forma diferente:

  • O Disorder funciona com chats e posts, o Perspective apenas com posts.

  • O Perspective depende de uma API proprietária e de terceiros, com todas as implicações de privacidade, confiabilidade e transparência disso.

  • O Disorder estabelece um padrão que permite a adição de novos modelos facilmente, para que possamos evoluir o serviço ou até mesmo adicionar recursos totalmente novos.

  • A API auto-hospedável do Disorder oferece flexibilidade e liberdade de cobrança por chamada de API e limites de taxa.

  • A interface do usuário do Disorder é bem menor, portanto, deve ser mais resiliente a atualizações do Discourse.

16 curtidas

Legal. Onde e como fazemos isso?

5 curtidas

Envie um email para team@discourse.org :slight_smile:

6 curtidas

Não é necessário responder aqui, mas se você estiver procurando por sugestões sobre os próximos passos, um sugeridor de tags de IA baseado no texto de um tópico poderia ser útil. Imagino algo semelhante a como o Soundcloud sugere tags de gênero musical após analisar um upload. É útil para organizar o conteúdo gerado pelo usuário em um site movimentado.

9 curtidas

Entendi corretamente que a instância da API de desordem deve ser iniciada para acompanhar o plugin? Há uma configuração pré-preenchida disorder inference service api endpoint com https://disorder-testing.demo-by-discourse.com pré-definida. No entanto, há disorder inference service api key que está vazia por padrão.

Estamos interessados em testar este plugin, pois enfrentamos muito comportamento tóxico entre os usuários, que eventualmente é resolvido por meio de sinalização e ajuda dos Líderes, mas gostaríamos de prevenir proativamente que os usuários espalhem posts negativos, se possível, e este plugin parece se encaixar nesse papel.

Podemos usar algum endpoint pronto para tentar? Aviso justo, temos ~150 mil visualizações de página diariamente e isso pode sobrecarregar alguns servidores despreparados.

Somos independentes.

4 curtidas

Embora você possa executar seu próprio servidor de API, o plugin vem pré-configurado apontando para https://disorder-testing.demo-by-discourse.com/, então ele funciona imediatamente.

Por favor, use este endpoint para sua instância, pois ele é fornecido exatamente para o seu caso de uso de instâncias auto-hospedadas que desejam experimentar este plugin. Na configuração padrão, todas as chamadas de API acontecem em segundo plano, então a API estar inativa não afetará seu site de forma alguma, então é seguro usá-la.

A configuração api key é opcional e só é necessária se o seu servidor de API a tiver habilitada. A instância pública em https://disorder-testing.demo-by-discourse.com/ não a tem habilitada.

6 curtidas

Obrigado! Parece perfeito e vou tentar nos próximos dias :heart:

4 curtidas

Existem outras aplicações de ML planejadas para o futuro?

2 curtidas

Eu tentei isso por uma semana, e foi absurdamente agressivo ao sinalizar posts. Recomendo usar isso apenas se você tiver um site enorme sem moderadores suficientes. Espero que a IA melhore, mas ainda não está lá.

6 curtidas

Este é um ótimo feedback! Você estaria disposto a compartilhar algumas estatísticas de depuração para me ajudar a entender exatamente o que aconteceu?

Algo como o resultado de

SELECT
  pcf.value,
  p.raw
FROM
  post_custom_fields AS pcf
INNER JOIN
  posts AS p ON p.id = pcf.post_id
WHERE
  pcf.name = 'disorder'

aqui ou em uma mensagem privada seria imensamente útil.

5 curtidas

Ahh sim, eu tinha me esquecido completamente disso! Aqui está. Na verdade, não eram muitos, mas eram desnecessários e membros e moderadores os acharam irritantes. Também não tenho certeza sobre a verificação de DMs, sei que poderia haver valor nisso se alguém estivesse assediando outra pessoa via DM, mas na maioria das vezes isso apenas incomodaria as pessoas ao saberem que estamos olhando para suas DMs.

1 curtida

Você usa chat? Todas as bandeiras irritantes estavam em posts / PMs?

Nós usamos chat, mas tenho certeza de que todas as sinalizações estavam em postagens e mensagens privadas.

1 curtida

Primeiramente, sou muito grato tanto pelo feedback quanto pelos dados que você compartilhou, que me permitiram depurar isso ainda mais.

Agora, às minhas descobertas!

Durante esta semana, você teve 1942 novos posts de usuários não-staff. Uma comunidade bastante ativa! No entanto, eu não diria que a IA é “absurdamente agressiva ao sinalizar posts”, já que apenas 7 posts foram sinalizados.

Dito isso, desses 7, metade são claramente falsos positivos acionados por limites padrão muito baixos, a outra metade é mais complicada para a IA entender o contexto (chamar seu interlocutor de idiota vs. contar uma história sobre como alguém foi idiota com você hoje enquanto você estava fazendo compras) e um é, na minha opinião, um acerto correto.

Se você estiver disposto a tentar novamente, mover todos os limites para 85 e mudar para o modelo original pode resolver quase todos os problemas de sinalização excessiva que você teve até agora. Adicionarei uma configuração de site para permitir pular MPs (mensagens privadas), pois posso ver como isso pode ser irritante para algumas comunidades também.

8 curtidas

Obrigado Falco, peço desculpas por dizer que era absurdamente agressivo. Eu já tinha muito drama acontecendo no site e a sinalização apenas adicionou a isso e eu estava bastante irritado na época.

Agradeço as sugestões e tentarei novamente. Pergunta, o que acontece quando você desabilita sinalizar desordem automaticamente? Ainda serei notificado de alguma forma se uma postagem for considerada desordenada? Seria bom testar e descobrir quais configurações funcionam sem que as postagens sejam sinalizadas.

4 curtidas

Sem essa configuração, ele executará as postagens contra a IA, mas não tomará nenhuma ação. Você pode deixá-la assim e, em seguida, executar essa consulta do Data Explorer para fazer uma análise das taxas de falsos positivos/falsos negativos.

Há também outra configuração que permite adicionar grupos a uma lista de exclusão, onde você pode, por exemplo, pular a classificação de postagens do TL4/3. Isso também pode ajudar.

Prezado(a) @Falco,

Começamos a testar o Disorder. O feedback geral é positivo - ele realmente detecta coisas inapropriadas, ao mesmo tempo em que sinaliza muitas coisas que nossa comunidade aceita. Devido à natureza do fórum onde testamos este plugin (Adulto), a comunicação envolve vários aspectos que fazem o Disorder sinalizar muitos, muitos posts. Sua Consulta SQL realmente ajuda a verificar quais limites ajustar, mas posso sugerir adicioná-los à tabela de Pontuação Revisável para cada post sinalizado?

Este aqui

Não sei se é possível para um plugin introduzir seus próprios dados nesta visualização, mas ajudaria muito a equipe a entender quais critérios ajustar para reduzir os resultados de falsos positivos para nós. A forma como vejo é adicionar um menu suspenso com uma discriminação por critério acionado dentro desta visualização. Não há necessidade de incluir critérios iguais a 0. Aqueles que são acima de 0 devem estar presentes lá, mas apenas aqueles que excedem os limites de configuração atuais devem ser marcados em negrito/vermelho.

Exemplo de Pontuação do Disorder
  • Toxicidade 65% [1]
  • Insulto 73% [2]
  • Ameaça 12% [3]
  • Explícito sexual 2% [4]

Se necessário, posso fornecer os resultados da Consulta SQL. Estamos longe de terminar de revisar a Fila de Sinalização…
Estamos usando um modelo multilíngue e não experimentamos outros. Decidimos que seria bom começar, considerando que temos alguns usuários que preferem postar em seu idioma original.


  1. excedendo, fonte vermelha ↩︎

  2. excedendo, fonte vermelha ↩︎

  3. normal, fonte normal ↩︎

  4. normal, fonte normal ↩︎

1 curtida

Olá novamente,

Queria informar que estamos recebendo erros nos logs relacionados ao Disorder usando o modelo “original”. Acabei de mudar de volta para multilíngue para ver se isso faria alguma diferença.

Job exception: undefined method `>=’ for nil:NilClass @classification[label] >= SiteSetting.send(“disorder_flag_threshold_#{label}”) ^^

Detalhes

/var/www/discourse/plugins/disorder/lib/classifier.rb:39:in `block in consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `filter’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:25:in `classify!’

/var/www/discourse/app/jobs/regular/classify_post.rb:14:in `execute’

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform’

rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in with_connection' /var/www/discourse/app/jobs/base.rb:236:in block in perform’

/var/www/discourse/app/jobs/base.rb:232:in `each’

/var/www/discourse/app/jobs/base.rb:232:in `perform’

sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job’

sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke’

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke’

sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local’

sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in module:Sidekiq

sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats’

sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call’

sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global’

sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare’

sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one’

sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run’

sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog’

sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread’

Detalhes 2
hostname
process_id 65460
application_version 2f8ad17aed81bbfa2fd20b6cc9210be92779bd74
current_db default
current_hostname
job Jobs::ClassifyPost
problem_db default
time 1:52 pm
opts
post_id 604063
current_site_id default

P.S. Sim, o modo multilíngue não produz esses erros. O modelo não enviesado também não produz erros.

1 curtida