Discourse AI - Sentimento

:bookmark: Este tópico abrange a configuração do recurso de Sentimento do plugin Discourse AI.

:person_raising_hand: Nível de usuário necessário: Moderador

O Sentimento acompanha sua comunidade analisando postagens e fornecendo pontuações de sentimento e emoção para dar uma visão geral de sua comunidade em qualquer período de tempo. Essas informações podem ser úteis para determinar o tipo de usuários que postam em sua comunidade e interagem uns com os outros.

Funcionalidades

  • Sentimento geral: compara o número de postagens classificadas como positivas ou negativas
  • Gráfico de barras exibindo valor numérico alternável para pontuações positivas, negativas e gerais
  • Emoção: número de tópicos e postagens classificados por múltiplas emoções, agrupados por período de tempo
    • Hoje
    • Ontem
    • Últimos 7 dias
    • Últimos 30 dias
  • Relatórios para qualquer período de tempo que podem ser acessados ​​nas configurações
    • Anual
    • Trimestral
    • Mensal
    • Semanal
    • Intervalo personalizado
  • Aplicável apenas para usuários administradores

Habilitando o Sentimento

Configuração

O Sentimento está habilitado por padrão para clientes hospedados. Para etapas manuais, veja abaixo.

  1. Vá para as configurações AdminPlugins → procure ou encontre discourse-ai e certifique-se de que esteja habilitado.
  2. Habilite ai_sentiment_enabled para Análise de Sentimento.
  3. Acesse /admin/dashboard/sentiment para ver seus respectivos relatórios.

:information_source: Uma vez habilitado, o Sentimento classificará todas as postagens futuras e dos últimos 60 dias. Para classificar todas as postagens históricas do seu site, uma tarefa de backfill deve ser executada a partir do console.

:discourse2: Hospedado por nós?

Entre em contato conosco em team@discourse.org e faremos isso por você.

:mechanic: Auto-hospedado?

./launcher enter app
rake ai:sentiment:backfill

FAQ Técnico

Como os dados de tópicos/postagens são processados? Como as pontuações são atribuídas?

  • O Sentimento tem uma fidelidade “por postagem”. Para cada postagem, podemos determinar o sentimento e, em seguida, segmentar esses dados de várias maneiras (por tag / categoria / tempo etc.). Ele compara o número de postagens classificadas como positivas ou negativas. Estes são calculados quando as pontuações positivas ou negativas são maiores que a pontuação limite definida.

Existem planos para adicionar suporte a outros idiomas?

  • Sim, no futuro! Tanto adicionando modelos simples de Machine Learning (ML) multilíngues quanto usando modelos de Linguagem Grande (LLMs) multilíngues para classificar os dados, em vez de modelos dedicados.

Quais modelos são usados para potencializar o Sentimento?

Ressalvas

  • Postagens classificadas como neutras (nem positivas nem negativas) não são exibidas.
  • Mensagens privadas (PMs) são excluídas dos cálculos.
10 curtidas

Uma postagem foi mesclada em um tópico existente: Problemas com o preenchimento de sentimento

Uma postagem foi mesclada em um tópico existente: Problemas com o preenchimento de sentimento

O OP foi atualizado com um novo vídeo mostrando os recursos atualizados do Sentiment, incluindo muito mais emoções e a compreensão de quais tópicos/postagens estão associados a cada emoção.

Configurei a configuração do modelo de sentimento com um model_name, endpoint e api_key copiados das configurações do LLM, onde passa no teste, mas recebo o erro abaixo em /logs.

(Mas talvez eu não entenda corretamente, pois por que o sentimento não usa um dos LLMs configurados?)

Usando claude-3-5-sonnet.


{"type":"error","error":{"type":"invalid_request_error","message":"anthropic-version: header is required"}} (Net::HTTPBadResponse)
/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:71:in `classify'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:142:in `request_with'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:78:in `block (4 levels) in bulk_classify!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1593:in `evaluate_to'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1776:in `block in on_resolvable'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:359:in `run_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:350:in `block (3 levels) in create_worker'

<internal:kernel>:187:in `loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341:in `block (2 levels) in create_worker'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `catch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `block in create_worker'
Status: 400

{"type":"error","error":{"type":"invalid_request_error","message":"anthropic-version: header is required"}} (Net::HTTPBadResponse)
/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:71:in `classify'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:142:in `request_wit...

O módulo de sentimento não usa LLMs gerais, mas modelos especificamente ajustados para classificação de sentimento. Se você quiser executar esses modelos por conta própria, isso está documentado em Auto-hospedagem de Sentimento e Emoção para DiscourseAI

3 curtidas

@Falco Acabei de perceber que o sentiment parou de funcionar a partir de jan de 2025. Meu palpite é que exista essa nova configuração ai_sentiment_model, que, como o link acima explica, serve para rodar seu próprio modelo de sentiment/image dedicado. Notei que, após atualizar o discourse, agora ai_sentiment_model_configs está completamente em branco (deve estar em branco?).

Quando tento executar um rake de backfill, ele me dá um erro:

rake ai:sentiment:backfill
rake abortado!
ActiveRecord::StatementInvalid: PG::SyntaxError: ERRO: erro de sintaxe próximo de ")" (ActiveRecord::StatementInvalid)
LINHA 1: ...e_upload_id", "posts"."outbound_message_id" FROM () as posts..

O plugin usava por padrão um servidor localizado na DigitalOcean que montei para facilitar os testes.

Desde então, alterei os padrões do plugin para uma configuração limpa e as pessoas que desejam classificação de IA precisam executar servidores seguindo a documentação aqui no Meta.

De fato, mas estávamos pagando esse custo para fins de teste. Não é sustentável oferecer isso para todos os auto-hospedeiros.

Vale mencionar que oferecemos este serviço de classificação em servidores acelerados por GPU como parte do nosso serviço de hospedagem.

2 curtidas

Problemas de Análise de Sentimento com Discourse AI: Formato do Modelo Hugging Face e Falha no Endpoint do Azure


Olá Comunidade Discourse e Desenvolvedores,

Estou encontrando problemas significativos ao tentar configurar e usar o recurso de Análise de Sentimento no plugin Discourse AI no meu fórum. Parece haver dois problemas distintos impedindo que ele funcione corretamente.


Problema 1: Incompatibilidade no Formato da Resposta do Modelo Hugging Face

Configurei o modelo cardiffnlp/twitter-roberta-base-sentiment do Hugging Face para análise de sentimento. Embora minha chave de API seja válida e eu consiga chamar a API com sucesso da minha instância Discourse usando curl, o plugin Discourse AI parece estar analisando a resposta incorretamente devido a uma mudança no formato de saída do modelo Hugging Face.

Meu comando curl (confirmando chave de API válida e novo formato):

Bashcurl -X POST https://api-inference.huggingface.co/models/cardiffnlp/twitter-roberta-base-sentiment \ -H "Authorization: Bearer hf_xxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d "{\"inputs\": \"I love Discourse!\"}"

Saída do curl (mostrando o novo formato de array aninhado):

[[{"label":"LABEL_2","score":0.9891520738601685},{"label":"LABEL_1","score":0.009014752693474293},{"label":"LABEL_0","score":0.0018332178005948663}]]

Problema: O modelo twitter-roberta-base-sentiment costumava retornar um único array de hashes de rótulo-pontuação: [{"label": "LABEL_2", "score": 0.98}, ...]. No entanto, agora ele retorna um array aninhado: [[{"label": "LABEL_2", "score": 0.98}, ...]].
A lógica de análise codificada do plugin Discourse AI (especificamente, classification["label"][/\d+/].to_i conforme indicado pelo backtrace) não leva em consideração essa camada externa de array. Isso leva a um TypeError quando ele tenta acessar um Símbolo como um Inteiro.

Mensagem de Erro (da Exceção do Job):

nenhuma conversão implícita de Símbolo em Inteiro (TypeError)
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in block in transform_result' /var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in each’
/var/www/discourse/plugin…`

Backtrace Completo para o Problema Hugging Face:

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1268:in `raise'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1268:in `wait_until_resolved!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:998:in `value!'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:93:in `bulk_classify!'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/sentiment_backfill.rb:27:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'
/var/www/discourse/app/jobs/base.rb:299:in `each'
/var/www/discourse/app/jobs/base.rb:299:in `perform'
/var/www/discourse/app/jobs/base.rb:379:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:137:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:77:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads'
internal:kernel:187:in `loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341:in `block (2 levels) in create_worker'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `catch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `block in create_worker'
nenhuma conversão implícita de Símbolo em Inteiro (TypeError)
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in `block in transform_result'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in `each'
/var/www/discourse/plugin...

Problema 2: Configuração do Modelo Microsoft Azure Leva a Erro Hugging Face

Quando tentei mudar para o modelo Microsoft Text Analytics nas configurações do Discourse AI, encontrei um erro 404 Resource not found e, surpreendentemente, o backtrace ainda aponta para hugging_face_text_embeddings.rb.

Mensagem de Erro (da Exceção do Job):

Job exception: 416 errors
{"error":{"code":"404","message": "Resource not found"}} (Net::HTTPBadResponse)

Trecho Relevante do Backtrace (apontando para Hugging Face apesar do modelo Microsoft selecionado):

/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:76:in `do_request!'
/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:51:in `classify_by_sentiment!'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:156:in `request_with'

Observação: Isso indica que, mesmo quando seleciono e configuro o endpoint e a chave de API do modelo Microsoft, o plugin Discourse AI parece estar codificado ou roteando incorretamente as requisições de análise de sentimento através da lógica ou endpoints específicos do Hugging Face. Isso impede que o modelo Microsoft seja usado.


Capturas de Tela da Configuração:

Anexei capturas de tela das minhas configurações do Discourse AI para mostrar a configuração:

  • Configuração detalhada para modelos de IA de sentimento (mostrando modelos Hugging Face e Microsoft) - Testei apenas com configurações de modelo Hugging Face ou apenas Microsoft com o mesmo resultado

Esses problemas tornam o recurso de análise de sentimento efetivamente inutilizável. Parece que o plugin precisa de uma atualização para lidar com o novo formato de resposta do Hugging Face e para rotear corretamente as requisições quando diferentes provedores de sentimento são configurados.

Qualquer assistência ou orientação sobre esses problemas seria muito apreciada.

Obrigado!

2 curtidas

Estou curioso para saber se o relatório de sentimento está funcionando para outras pessoas, ou se eu configurei algo incorretamente. Gostaria de saber o que mais preciso verificar ou configurar para habilitar o relatório de sentimento, pois ainda estou enfrentando o mesmo problema.

1 curtida

Estamos tentando usar este recurso com o Azure AI Language (de nossa instância auto-hospedada do Discourse) - pois já estamos usando nossa assinatura do Azure para integrar o GPT-4.5 ao Discourse (para funcionalidade de resumo e chatbot):

…mas não estamos recebendo dados no painel de sentimento e podemos ver estes erros nos logs:

Discourse AI: Erros durante a classificação em massa: Falha ao classificar 208 posts (ids de exemplo: 2256, 909, 2270, 2260, 2797) : JSON::ParserError : Uma string vazia não é uma string JSON válida.

O backtrace mostra que o Discourse pode estar tentando usar o HuggingFace - estes são os únicos modelos suportados no momento?

Obrigado,

N

1 curtida

Então, a única maneira de usar este recurso é configurar suas próprias instâncias dos modelos (que precisam de instâncias de GPU com uso intensivo de recursos que seriam caras)? Este recurso parece muito útil, mas parece que custaria mais para configurar do que minha hospedagem real do Discourse.

Sim, os modelos suportados são os listados no OP.

Eventualmente, adicionaremos suporte para classificar usando LLMs para pessoas cujo custo não é um problema.

Bem, todo o recurso é construído em torno da classificação de posts usando modelos de ML, então sim, você precisa de um lugar para executá-los.

E como o Discourse pode rodar no VPS mais barato que existe, rodar modelos de ML é de fato mais caro. Se você quiser ter o recurso da maneira mais barata possível, é possível executá-lo em um servidor com apenas um punhado de núcleos de CPU, desde que você tenha RAM suficiente para carregar os modelos.

1 curtida

Desculpe se esta pergunta já foi feita antes, mas não consegui encontrar uma referência de onde exatamente a pontuação de limite pode ser configurada :sweat_smile:

1 curtida

Infelizmente, a pontuação limite não é algo configurável por usuários ou administradores. É um valor específico definido na base de código.

1 curtida