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!