Discourse AI - Sentimiento

:bookmark: Este tema cubre la configuración de la función de Sentimiento del plugin Discourse AI.

:person_raising_hand: Nivel de usuario requerido: Moderador

Sentiment supervisa tu comunidad analizando las publicaciones y proporcionando puntuaciones de sentimiento y emocionales para darte una idea general de tu comunidad durante cualquier período de tiempo. Estas perspectivas pueden ser útiles para determinar el tipo de usuarios que publican en tu comunidad y que interactúan entre sí.

Características

  • Sentimiento general: compara el número de publicaciones clasificadas como positivas o negativas.
  • Gráfico de barras que muestra el valor numérico conmutable para puntuaciones positivas, negativas y generales.
  • Emoción: número de temas y publicaciones clasificados por múltiples emociones, agrupados por período de tiempo.
  • Hoy
  • Ayer
  • Últimos 7 días
  • Últimos 30 días
  • Informes para cualquier período de tiempo a los que se puede acceder a través de la configuración.
  • Anual
  • Trimestral
  • Mensual
  • Semanal
  • Rango personalizado
  • Aplicable solo para usuarios administradores.

Habilitar Sentimiento

Configuración

El sentimiento está habilitado por defecto para los clientes alojados. Para pasos manuales, ver abajo.

  1. Ve a la configuración de AdminPlugins → busca o encuentra discourse-ai y asegúrate de que esté habilitado.
  2. Habilita ai_sentiment_enabled para Análisis de Sentimiento.
  3. Dirígete a /admin/dashboard/sentiment para ver sus respectivos informes.

:information_source: Una vez habilitado, Sentiment clasificará todas las publicaciones de ahora en adelante y de los últimos 60 días. Para clasificar todas las publicaciones históricas de tu sitio, se debe ejecutar una tarea de relleno desde la consola.

:discourse2: ¿Alojado por nosotros?

Contáctanos en team@discourse.org y lo haremos por ti.

:mechanic: ¿Autoalojado?

./launcher enter app

rake ai:sentiment:backfill

Preguntas Frecuentes Técnicas

¿Cómo se procesan los datos de temas/publicaciones? ¿Cómo se asignan las puntuaciones?

  • Sentiment tiene una fidelidad “por publicación”. Para cada publicación, podemos determinar el sentimiento y luego segmentar esos datos de muchas maneras (por etiqueta / categoría / tiempo, etc.). Compara el número de publicaciones clasificadas como positivas o negativas. Estos se calculan cuando las puntuaciones positivas o negativas son mayores que la puntuación umbral establecida.

¿Hay planes para agregar soporte para otros idiomas?

  • ¡Sí, en el futuro! Tanto agregando modelos simples de aprendizaje automático (ML) multilingües como utilizando modelos de lenguaje grandes (LLM) multilingües para clasificar los datos, en lugar de modelos dedicados.

¿Qué modelos se utilizan para potenciar Sentiment?

Advertencias

  • Las publicaciones clasificadas como neutrales (ni positivas ni negativas) no se muestran.
  • Los mensajes privados (PM) están excluidos de los cálculos.
10 Me gusta

Una publicación se fusionó en un tema existente: Problemas con el relleno de sentimiento

Se fusionó una publicación en un tema existente: Problemas con el relleno de sentimiento

Se ha actualizado la publicación principal con un nuevo vídeo que muestra las características actualizadas de Sentiment, que incluyen muchas más emociones y la comprensión de qué temas/publicaciones están asociados con cada emoción.

Configuré el modelo de sentimiento con un model_name, endpoint y api_key copiados de la configuración de LLM, donde pasa la prueba, pero obtengo el siguiente error en /logs.

(¿Pero tal vez no entiendo correctamente, porque por qué el sentimiento no usa uno de los LLM 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'
Estado: 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...

El módulo de sentimiento no utiliza LLM generales, sino modelos específicamente ajustados para la clasificación de sentimientos. Si desea ejecutar esos modelos por su cuenta, se documenta en Autoalojamiento de Sentimiento y Emoción para DiscourseAI

3 Me gusta

@Falco Acabo de notar que el análisis de sentimientos dejó de funcionar a partir de enero de 2025. Mi suposición es que existe esta nueva configuración ai_sentiment_model que, como se explica en el enlace anterior, es para ejecutar tu propio modelo de sentimientos/imagen dedicado. Noté que después de actualizar discourse, ahora ai_sentiment_model_configs está en blanco (¿debería estar en blanco?).Cuando intento ejecutar un rake de backfill, me da un error:

rake ai:sentiment:backfill
rake aborted!
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  error de sintaxis cerca de ")" (ActiveRecord::StatementInvalid)
LINE 1: ...e_upload_id", "posts"."outbound_message_id" FROM () as posts..

El plugin utilizaba por defecto un servidor ubicado en DigitalOcean que monté para facilitar las pruebas.

Desde entonces, he cambiado los valores predeterminados del plugin a un estado limpio y las personas que deseen la clasificación de IA deben ejecutar servidores siguiendo la documentación aquí en Meta.

De hecho, pero estábamos pagando ese costo para fines de prueba. No es sostenible ofrecer eso a todos los autoalojadores.

Vale la pena mencionar que ofrecemos este servicio de clasificación en servidores acelerados por GPU como parte de nuestro servicio de alojamiento.

2 Me gusta

Problemas de Análisis de Sentimiento con Discourse AI: Formato de Modelo Hugging Face y Fallo del Endpoint de Azure


Hola Comunidad y Desarrolladores de Discourse,

Estoy experimentando problemas significativos al intentar configurar y utilizar la función de Análisis de Sentimiento dentro del plugin Discourse AI en mi foro. Parece que hay dos problemas distintos que impiden que funcione correctamente.


Problema 1: Desajuste en el Formato de Respuesta del Modelo Hugging Face

He configurado el modelo cardiffnlp/twitter-roberta-base-sentiment de Hugging Face para el análisis de sentimiento. Si bien mi clave API es válida y puedo llamar a la API con éxito desde mi instancia de Discourse usando curl, el plugin Discourse AI parece estar procesando la respuesta incorrectamente debido a un cambio en el formato de salida del modelo de Hugging Face.

Mi comando curl (confirmando clave API válida y nuevo 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!\"}"

Salida de curl (mostrando el nuevo formato de array anidado):

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

Problema: El modelo twitter-roberta-base-sentiment solía devolver un único array de hashes de etiqueta-puntuación: [{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]. Sin embargo, ahora devuelve un array anidado: [[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]].
La lógica de procesamiento codificada del plugin Discourse AI (específicamente, classification["label"][/\d+/].to_i como indica el backtrace) no tiene en cuenta esta capa de array externa. Esto provoca un TypeError cuando intenta acceder a un Símbolo como si fuera un Entero.

Mensaje de Error (de la Excepción del Job):

no implicit conversion of Symbol into Integer (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 el Problema de 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'
no implicit conversion of Symbol into Integer (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: La Configuración del Modelo de Microsoft Azure Conduce a un Error de Hugging Face

Cuando intenté cambiar al modelo de Microsoft Text Analytics dentro de la configuración de Discourse AI, encontré un error de 404 Resource not found, y sorprendentemente, el backtrace todavía apunta a hugging_face_text_embeddings.rb.

Mensaje de Error (de la Excepción del Job):

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

Fragmento de Backtrace Relevante (apuntando a Hugging Face a pesar de que se selecciona el modelo de Microsoft):

/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'

Observación: Esto indica que incluso cuando selecciono y configuro el endpoint y la clave API del modelo de Microsoft, el plugin Discourse AI parece estar codificado o enrutando incorrectamente las solicitudes de análisis de sentimiento a través de la lógica o endpoints específicos de Hugging Face. Esto impide que el modelo de Microsoft se utilice en absoluto.


Capturas de Pantalla de la Configuración:

He adjuntado capturas de pantalla de mi configuración de Discourse AI para mostrar la configuración:

  • Configuración detallada para modelos de IA de sentimiento (mostrando modelos Hugging Face y Microsoft) - Probé solo con la configuración del modelo Hugging Face o solo con el modelo de Microsoft con el mismo resultado

Estos problemas hacen que la función de análisis de sentimiento sea efectivamente inutilizable. Parece que el plugin requiere una actualización para manejar el nuevo formato de respuesta de Hugging Face y para enrutar correctamente las solicitudes cuando se configuran diferentes proveedores de sentimiento.

Agradecería cualquier ayuda o guía sobre estos problemas.

¡Gracias!

2 Me gusta

Tengo curiosidad por saber si el informe de sentimiento está funcionando para otros, o si he configurado algo mal. Me gustaría saber qué más necesito comprobar o configurar para habilitar el informe de sentimiento, ya que sigo experimentando el mismo problema.

1 me gusta

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

…pero no estamos recibiendo datos en el panel de análisis de sentimientos 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 de la pila muestra que Discourse podría estar intentando usar HuggingFace. ¿Son estos los únicos modelos compatibles en este momento?

Gracias,

N

1 me gusta

Entonces, ¿la única forma de usar esta función es configurar tus propias instancias de los modelos (que necesitan instancias de GPU con muchos recursos que serían costosas)? Esta función parece muy útil, pero parece que me costaría más configurarla que mi alojamiento real de Discourse.

Sí, los modelos compatibles son los que se enumeran en el OP.

Eventualmente agregaremos soporte para clasificar usando LLMs para personas cuyo costo no sea un problema.

Bueno, toda la función se basa en clasificar publicaciones usando modelos de ML, así que sí, necesitas un lugar para ejecutarlos.

Y dado que Discourse puede ejecutarse en el VPS más barato que existe, ejecutar modelos de ML es, de hecho, más caro. Si quieres tener la función de la manera más económica posible, es factible ejecutarla en un servidor con solo un puñado de núcleos de CPU, siempre que tengas suficiente RAM para cargar los modelos.

1 me gusta

Disculpe si esta pregunta ya se ha hecho antes, pero no pude encontrar una referencia a dónde se puede configurar exactamente la puntuación umbral :sweat_smile:

1 me gusta

Desafortunadamente, la puntuación umbral no es algo que los usuarios o administradores puedan configurar. Es un valor específico establecido en la base de código.

1 me gusta