Autoalojamiento de Sentiment y Emotion para DiscourseAI

El plugin Discourse AI admite la solicitud de clasificación de emociones/sentimientos de nuevas publicaciones, la cual se almacena en la base de datos y puede utilizarse en informes y paneles de administración.

Discourse AI admite dos tipos de clasificación, cada uno de los cuales requiere su propio modelo:

  • Sentimiento — clasifica las publicaciones como positivas, negativas o neutrales (usando cardiffnlp/twitter-roberta-base-sentiment-latest)
  • Emoción — clasifica las publicaciones entre 28 etiquetas emocionales como alegría, ira, sorpresa, etc. (usando SamLowe/roberta-base-go_emotions)

Para obtener datos de sentimiento y emoción en tus paneles, necesitas ejecutar ambos modelos.

Ejecución con HuggingFace TEI

HuggingFace ofrece una imagen de contenedor increíble que te permitirá empezar rápidamente.

Modelo de sentimiento

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

Esto debería ponerte en funcionamiento con una instancia local de cardiffnlp/twitter-roberta-base-sentiment-latest, un modelo abierto que puede clasificar las publicaciones en positivas/negativas/neutrales.

Puedes verificar si funciona con:

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

Lo que debería devolver un array de confianza para cada etiqueta en condiciones normales de operación.

Modelo de emoción

Para obtener también la clasificación de emociones, ejecuta un segundo contenedor con el modelo de emociones:

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 admitidos

Ponerlo a disposición de tu instancia de Discourse

La mayoría de las veces, ejecutarás esto en un servidor dedicado debido a la aceleración por GPU. Al hacerlo, recomiendo ejecutar un proxy inverso, realizar la terminación TLS y asegurar el punto final para que solo pueda ser conectado por tu instancia de Discourse.

Configuración de Discourse AI

Discourse AI incluye configuraciones del sitio para configurar el servidor de inferencia para modelos de código abierto. Debes apuntarlo a tu servidor utilizando la configuración ai_sentiment_model_configs.

Esta configuración acepta un array JSON de configuraciones de modelo. Cada entrada requiere:

Campo Descripción
model_name El ID del modelo de HuggingFace (por ejemplo, cardiffnlp/twitter-roberta-base-sentiment-latest)
endpoint La URL de tu instancia TEI (por ejemplo, https://tu-servidor:8081)
api_key Clave API para el punto final (puede dejarse en blanco si no es requerida)

Para obtener paneles de sentimiento y emoción, agrega una entrada por cada modelo que estés ejecutando. Por ejemplo, si estás ejecutando ambos modelos localmente:

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

Después de eso, habilita la clasificación activando ai_sentiment_enabled.

3 Me gusta

¿Hay planes para dar soporte a otros modelos en idiomas distintos del inglés?

1 me gusta

@Falco si uno decide ejecutar esto en el mismo servidor que ejecuta Discourse (por ejemplo, tenemos un despliegue muy pequeño con unos pocos miles de publicaciones), ¿podrías actualizar las instrucciones para describir

  1. ¿Cómo puede Discourse integrarse con una instancia local de la imagen del contenedor HuggingFace TEI?
  2. Sugerencias sobre cuánta RAM/disco adicional se requiere para ejecutar lo anterior (por ejemplo, si la instancia base de Discourse se ejecuta con 2 GB de RAM y 20 GB de disco).

He configurado una nueva instancia de Discourse autoalojada e intento configurar los sentimientos. Estas son mis configuraciones de modelo de sentimiento de IA:

Clave Valor
nombre del modelo cardiffnlp/twitter-roberta-base-sentiment-latest
endpoint https://my_own_instance
api_key [en blanco]

Y funciona, más o menos, obtengo el gráfico de barras de sentimiento.

Sin embargo, la tabla de emociones está vacía. Este documento parece incompleto o está mal redactado para que pueda entender lo que hay que hacer.

¿Ejecuto otro contenedor Docker, con un ID de modelo diferente (roberta-base-go_emotions?), o algo más? ¿Qué necesito hacer para que esa tabla de emociones se llene?

Preferiría autoalojar estos servicios si es posible. Gracias de antemano si alguien puede indicarme la dirección correcta.

Para las emociones, también necesitas ejecutar el

también.

3 Me gusta

Gracias. Así que ejecuto un segundo contenedor docker con algunos ajustes, de la siguiente manera:

mkdir -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

y añado una nueva entrada en ai_sentiment_model_configs y todo funciona ahora. Gracias. :slight_smile:

1 me gusta

Me estrellé de bruces contra un muro de ladrillos de no saber qué demonios estoy haciendo al intentar que esto funcione en una instancia EC2 sin GPU. Al menos, hasta donde alcanzan mis extremadamente limitadas habilidades y comprensión aquí, intentar hacer esto con una instancia solo de CPU significa mucho más trabajo de configuración de lo que puedo entender. Las versiones cpu de ghcr.io/huggingface/text-embeddings-inference se niegan a cargar ninguno de los dos modelos de escucha; Claude y GPT5 me dicen que necesito convertirlos a modelos ONNX con un montón de herramientas de Python, y ahí es donde me rendí.

(¡También es muy posible que simplemente sea tonto y me esté perdiendo un paso obvio!)

Una cosa que estamos planeando es permitir que los LLM actúen como análisis de sentimiento

De esa manera, puede conectar un modelo económico como Gemini Flash 2.5 (o incluso nano) y usarlo para análisis de sentimiento.

6 Me gusta

Estamos intentando usar esta función con Azure AI Language (desde nuestra instancia de Discourse autoalojada), ya que ya estamos utilizando nuestra suscripción de Azure para integrar GPT-4.5 con Discourse (para la funcionalidad de resumen y chatbot):

  • pero no obtenemos datos en el panel de análisis de sentimiento y podemos ver estos errores en los registros:

Discourse AI: Errores durante la clasificación masiva: No se pudieron clasificar 208 publicaciones (ids de ejemplo: 2256, 909, 2270, 2260, 2797): JSON::ParserError: Una cadena vacía no es una cadena JSON válida.

La traza inversa muestra que Discourse podría estar intentando usar HuggingFace. ¿Son estos los únicos modelos compatibles en este momento?

Gracias,

N

Sí, tenemos una implementación muy específica, estamos pensando en cómo hacerla más genérica.

Soy optimista en cuanto a que los LLM devuelvan resultados estructurados para el sentimiento, ya que abre las puertas a muchas opciones y siento que, como tendencia, las API “hiper específicas” están siendo reemplazadas por las API “hiper generales” que proporcionan los LLM.

3 Me gusta

¿Hay alguna forma sencilla de poner esto en funcionamiento en WP autoalojado sin configurar tu propia instancia para la clasificación de sentimientos?

Gracias Sam, sería genial. Mientras tanto, investigaremos la ejecución de uno de los modelos compatibles de HuggingFace en una VM de Azure…

Estoy intentando configurar el modelo de análisis de sentimientos autoalojado, pero al intentar ejecutar la imagen de Docker, obtengo errores:

0: request error: HTTP status client error (404 Not Found) for url (https://huggingface.co/cardiffnlp/twitter-roberta-base-sentiment-latest/resolve/main/tokenizer.json)
1: HTTP status client error (404 Not Found) for url (https://huggingface.co/cardiffnlp/twitter-roberta-base-sentiment-latest/resolve/main/tokenizer.json)

Estoy 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

¿Esto no es compatible sin soporte de GPU, o ha cambiado algo en la configuración?

Oh, parece que aún no han fusionado mi PR al modelo, así que necesitas apuntar directamente a mi rama. He actualizado el comando de Docker para el modelo de sentimiento arriba; pruébalo con la línea adicional para apuntar a la rama.

2 Me gusta

¡Gracias, parece que funcionó!

1 me gusta