Problemi di analisi del sentiment con Discourse AI: formato del modello Hugging Face e fallimento dell’endpoint Azure
Ciao Community e sviluppatori di Discourse,
Sto riscontrando problemi significativi nel tentativo di configurare e utilizzare la funzionalità di analisi del sentiment all’interno del plugin Discourse AI sul mio forum. Sembra che ci siano due problemi distinti che impediscono il suo corretto funzionamento.
Problema 1: Discrepanza nel formato della risposta del modello Hugging Face
Ho configurato il modello cardiffnlp/twitter-roberta-base-sentiment di Hugging Face per l’analisi del sentiment. Sebbene la mia chiave API sia valida e io possa chiamare con successo l’API dalla mia istanza Discourse utilizzando curl, il plugin Discourse AI sembra analizzare la risposta in modo errato a causa di una modifica nel formato di output del modello Hugging Face.
Il mio comando curl (che conferma la chiave API valida e il nuovo 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!\"}"
Output da curl (che mostra il nuovo formato di array nidificato):
[[{\"label\":\"LABEL_2\",\"score\":0.9891520738601685},{\"label\":\"LABEL_1\",\"score\":0.009014752693474293},{\"label\":\"LABEL_0\",\"score\":0.0018332178005948663}]]
Problema: Il modello twitter-roberta-base-sentiment restituiva un singolo array di hash label-score: [{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]. Ora restituisce un array nidificato: [[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]].
La logica di analisi hardcoded del plugin Discourse AI (in particolare, classification[\"label\"][/\\d+/].to_i come indicato dal backtrace) non tiene conto di questo livello di array esterno. Ciò causa un TypeError quando tenta di accedere a un Simbolo come Intero.
Messaggio di errore (dall’eccezione del job):
nessuna conversione implicita di Simbolo in Intero (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 per il 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'
nessuna conversione implicita di Simbolo in Intero (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 configurazione del modello Microsoft Azure porta a un errore Hugging Face
Quando ho tentato di passare al modello Microsoft Text Analytics nelle impostazioni di Discourse AI, ho riscontrato un errore 404 Resource not found e, sorprendentemente, il backtrace punta ancora a hugging_face_text_embeddings.rb.
Messaggio di errore (dall’eccezione del job):
Job exception: 416 errors
{"error":{"code":"404","message": "Resource not found"}} (Net::HTTPBadResponse)
Frammento di backtrace pertinente (che punta a Hugging Face nonostante il modello Microsoft selezionato):
/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'
Osservazione: Questo indica che anche quando seleziono e configuro l’endpoint e la chiave API del modello Microsoft, il plugin Discourse AI sembra essere hardcoded o instradare in modo errato le richieste di analisi del sentiment attraverso la logica o gli endpoint specifici di Hugging Face. Ciò impedisce l’utilizzo del modello Microsoft.
Screenshot della configurazione:
Ho allegato uno screenshot delle mie impostazioni di Discourse AI per mostrare la configurazione:
- Configurazione dettagliata per i modelli AI di sentiment (che mostra sia i modelli Hugging Face che Microsoft) - Ho testato solo con la configurazione del modello Hugging Face o solo con quella del modello Microsoft con lo stesso risultato
Questi problemi rendono la funzionalità di analisi del sentiment di fatto inutilizzabile. Sembra che il plugin richieda un aggiornamento per gestire il nuovo formato di risposta di Hugging Face e per instradare correttamente le richieste quando vengono configurati diversi provider di sentiment.
Qualsiasi assistenza o guida su questi problemi sarebbe molto apprezzata.
Grazie!