Hospedagem própria de Sentiment e Emotion para DiscourseAI

O plugin Discourse AI oferece suporte para solicitar 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

A HuggingFace oferece uma imagem de contêiner incrível que permite que você comece 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 \
  --revision refs/pr/30

Isso deve colocar você em execução com uma instância local de cardiffnlp/twitter-roberta-base-sentiment-latest, um modelo aberto que pode classificar postagens em positivas/negativas/neutras.

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 também obter 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

Tornando disponível para sua instância do Discourse

Na maioria das vezes, você executará isso em um servidor dedicado devido à aceleração por GPU. Ao fazer isso, recomendo executar um proxy reverso, fazer a terminação TLS e proteger o ponto de extremidade para que ele só possa ser conectado pela sua instância do 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 seu servidor usando a configuração ai_sentiment_model_configs.

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

Campo Descrição
model_name O ID do modelo do HuggingFace (por exemplo, cardiffnlp/twitter-roberta-base-sentiment-latest)
endpoint A URL da sua instância TEI (por exemplo, https://your-server:8081)
api_key Chave de API para o ponto de extremidade (pode ser deixada em branco se não for necessária)

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://your-server:8081
  • Entrada 2: model_name SamLowe/roberta-base-go_emotions, endpoint https://your-server:8082

Depois disso, habilite 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…

Estou tentando configurar o modelo de análise de sentimentos auto-hospedado, mas ao tentar executar a imagem Docker, estou recebendo erros:

0: erro de solicitação: erro de cliente de status HTTP (404 Não Encontrado) para a URL (https://huggingface.co/cardiffnlp/twitter-roberta-base-sentiment-latest/resolve/main/tokenizer.json)
1: erro de cliente de status HTTP (404 Não Encontrado) para a URL (https://huggingface.co/cardiffnlp/twitter-roberta-base-sentiment-latest/resolve/main/tokenizer.json)

Estou usando: docker run --rm --shm-size 1g -p 8083:80 -v /opt/tei-sentiment-cache:/data ghcr.io/huggingface/text-embeddings-inference:cpu-1.9 --model-id cardiffnlp/twitter-roberta-base-sentiment-latest

Isso não é suportado sem suporte a GPU ou algo mudou na configuração?

Oh, parece que eles ainda não mesclaram meu PR ao modelo, então você precisa apontar diretamente para o meu branch. Atualizei o comando Docker para o modelo de sentimento acima; tente com a linha extra para apontar para o branch.

2 curtidas

Obrigado, parece que funcionou!

1 curtida