Hospedagem própria de sentimento e emoção para DiscourseAI

O plugin Discourse AI tem suporte para solicitar a classificação de emoção/sentimento de novas postagens, que é armazenada no banco de dados e pode ser usada em relatórios e painéis de administração.

O Discourse AI suporta dois tipos de classificação, cada um exigindo seu próprio modelo:

  • Sentimento — classifica as postagens como positivas, negativas ou neutras (usando cardiffnlp/twitter-roberta-base-sentiment-latest)
  • Emoção — classifica as postagens em 28 rótulos de emoção como alegria, raiva, surpresa, etc. (usando SamLowe/roberta-base-go_emotions)

Para obter dados de sentimento e emoção em seus painéis, você precisa executar ambos os modelos.

Executando com HuggingFace TEI

O HuggingFace fornece uma imagem de contêiner impressionante que pode colocá-lo em funcionamento rapidamente.

Modelo de Sentimento

mkdir -p /opt/tei-sentiment-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-sentiment-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id cardiffnlp/twitter-roberta-base-sentiment-latest

Isso deve colocá-lo em funcionamento com uma instância local de cardiffnlp/twitter-roberta-base-sentiment-latest, um modelo aberto que pode classificar postagens em positivo/negativo/neutro.

Você pode verificar se está funcionando com

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    -d "{ \"inputs\": \"I am happy\" }"

O que deve retornar um array de confiança para cada rótulo sob operação normal.

Modelo de Emoção

Para obter também a classificação de emoção, execute um segundo contêiner com o modelo de emoção:

mkdir -p /opt/tei-emotion-cache
docker run --rm --gpus all --shm-size 1g -p 8082:80 \
  -v /opt/tei-emotion-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id SamLowe/roberta-base-go_emotions

Modelos Suportados

Disponibilizando para sua instância Discourse

Na maioria das vezes, você estará executando isso em um servidor dedicado devido à aceleração da GPU. Ao fazer isso, recomendo executar um proxy reverso, fazendo terminação TLS e protegendo o endpoint para que ele só possa ser conectado pela sua instância Discourse.

Configurando o Discourse AI

O Discourse AI inclui configurações de site para configurar o servidor de inferência para modelos de código aberto. Você deve apontá-lo para o seu servidor usando a configuração ai_sentiment_model_configs.

Esta configuração aceita um array JSON de configurações de modelo. Cada entrada requer:

Campo Descrição
model_name O ID do modelo HuggingFace (exemplo: cardiffnlp/twitter-roberta-base-sentiment-latest)
endpoint O URL da sua instância TEI (exemplo: https://seu-servidor:8081)
api_key Chave de API para o endpoint (pode ser deixado em branco se não for necessário)

Para obter painéis de sentimento e emoção, adicione uma entrada para cada modelo que você está executando. Por exemplo, se você estiver executando ambos os modelos localmente:

  • Entrada 1: model_name cardiffnlp/twitter-roberta-base-sentiment-latest, endpoint https://seu-servidor:8081
  • Entrada 2: model_name SamLowe/roberta-base-go_emotions, endpoint https://seu-servidor:8082

Depois disso, ative a classificação alternando ai_sentiment_enabled.

3 curtidas

Há planos para dar suporte a outros modelos em idiomas além do inglês?

1 curtida

@Falco, se alguém decidir executar isso no mesmo servidor que executa o Discourse (por exemplo, temos uma implantação muito pequena com alguns milhares de postagens), você poderia atualizar as instruções para descrever:

  1. Como o Discourse pode se integrar a uma instância local da imagem do contêiner HuggingFace TEI?
  2. Sugestões sobre quanta RAM/disco adicional é necessário para executar o acima (por exemplo, se o Discourse base estiver sendo executado com 2 GB de RAM e 20 GB de disco)?

Configurei uma nova instância auto-hospedada do Discourse e estou tentando configurar sentimentos. Esta é a minha configuração de ai_sentiment_model_configs -

Chave Valor
nome do modelo cardiffnlp/twitter-roberta-base-sentiment-latest
endpoint https://my_own_instance
api_key [em branco]

E funciona, mais ou menos, recebo o gráfico de barras de sentimento.

No entanto, a tabela de Emoções está vazia. Este documento parece incompleto ou mal redigido para que eu entenda o que precisa ser feito.

Devo executar outro contêiner Docker, com um ID de modelo diferente (roberta-base-go_emotions?), ou outra coisa? O que preciso fazer para preencher essa tabela de emoções?

Preferiria auto-hospedar esses serviços, se possível. Agradeço antecipadamente se alguém puder me indicar a direção certa.

Para emoções, você também precisa executar o

também.

3 curtidas

Obrigado. Então eu apenas executo um segundo contêiner docker com alguns ajustes, assim:

mkdír -p /opt/tei-cache2
docker run --detach --rm --gpus all --shm-size 1g -p 8082:80 \
  -v /opt/tei-cache2:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id SamLowe/roberta-base-go_emotions

e adiciono uma nova entrada em ai_sentiment_model_configs e está tudo funcionando agora. Obrigado. :slight_smile:

1 curtida

Bati de cara numa parede de tijolos por não saber o que diabos estou fazendo ao tentar fazer isso funcionar numa instância EC2 sem GPU. Pelo menos, com as minhas habilidades e compreensão extremamente limitadas aqui, tentar fazer isso com uma instância apenas com CPU significa muito mais trabalho de configuração do que consigo entender. As versões cpu de ghcr.io/huggingface/text-embeddings-inference recusam-se a carregar qualquer um dos dois modelos de escuta; Claude e GPT5 dizem-me que preciso de os converter para modelos ONNX com um monte de ferramentas python, e foi aí que desisti.

(Também é muito possível que eu seja apenas burro e esteja a perder um passo óbvio!)

Uma coisa que estamos planejando é permitir que os LLMs atuem como análise de sentimento

Dessa forma, você pode conectar um modelo barato como o Gemini Flash 2.5 (ou até mesmo o nano) e usá-lo para análise de sentimento.

6 curtidas

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: Errors during bulk classification: Failed to classify 208 posts (example ids: 2256, 909, 2270, 2260, 2797) : JSON::ParserError : An empty string is not a valid JSON string.

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

Obrigado,

N

Sim, temos uma implementação muito específica, estamos pensando em como torná-la mais genérica.

Sou otimista em apenas deixar os LLMs retornarem saídas estruturadas para sentimento, pois isso abre portas para muitas opções e sinto que, como tendência, as APIs “hiper específicas” estão sendo substituídas pelas APIs “hiper gerais” que os LLMs fornecem.

3 curtidas

Existe alguma maneira simples de colocar isso para funcionar no WP auto-hospedado sem configurar sua própria instância para a classificação de sentimento?

Obrigado Sam - isso seria ótimo. Enquanto isso, vamos investigar a execução de um dos modelos HuggingFace suportados em uma VM do Azure…