مشاكل تحليل المشاعر في Discourse AI: تنسيق نموذج Hugging Face وفشل نقطة نهاية Azure
مرحباً بمجتمع ومطوري Discourse،
أواجه مشاكل كبيرة عند محاولة تكوين واستخدام ميزة تحليل المشاعر ضمن إضافة Discourse AI على منتدى الخاص بي. يبدو أن هناك مشكلتين منفصلتين تمنعانها من العمل بشكل صحيح.
المشكلة 1: عدم تطابق تنسيق استجابة نموذج Hugging Face
لقد قمت بتكوين نموذج cardiffnlp/twitter-roberta-base-sentiment من Hugging Face لتحليل المشاعر. بينما مفتاح API الخاص بي صالح ويمكنني استدعاء API بنجاح من مثيل Discourse الخاص بي باستخدام curl، يبدو أن إضافة Discourse AI تقوم بتحليل الاستجابة بشكل غير صحيح بسبب تغيير في تنسيق إخراج نموذج Hugging Face.
أمر curl الخاص بي (يؤكد صحة مفتاح API والتنسيق الجديد):
Bashcurl -X POST https://api-inference.huggingface.co/models/cardiffnlp/twitter-roberta-base-sentiment \\\n-H \"Authorization: Bearer hf_xxxxxxxxxxx\" \\\n-H \"Content-Type: application/json\" \\\n-d \"{\\\"inputs\\\": \\\"I love Discourse!\\\"}\"
الإخراج من curl (يظهر التنسيق الجديد للمصفوفة المتداخلة):
[[{\"label\":\"LABEL_2\",\"score\":0.9891520738601685},{\"label\":\"LABEL_1\",\"score\":0.009014752693474293},{\"label\":\"LABEL_0\",\"score\":0.0018332178005948663}]]
المشكلة: نموذج twitter-roberta-base-sentiment كان يعود بمصفوفة واحدة من جداول التجزئة للتسمية-النتيجة: [{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]. ولكنه الآن يعود بمصفوفة متداخلة: [[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]].
منطق التحليل المضمن في إضافة Discourse AI (على وجه التحديد، classification[\"label\"][/\\d+/].to_i كما هو موضح في تتبع المكدس) لا يأخذ في الاعتبار طبقة المصفوفة الخارجية هذه. يؤدي هذا إلى TypeError عندما يحاول الوصول إلى رمز كعدد صحيح.
رسالة الخطأ (من استثناء المهمة):
لا يوجد تحويل ضمني لرمز إلى عدد صحيح (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…`
تتبع المكدس الكامل لمشكلة 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'
لا يوجد تحويل ضمني لرمز إلى عدد صحيح (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...
المشكلة 2: تكوين نموذج Microsoft Azure يؤدي إلى خطأ Hugging Face
عندما حاولت التبديل إلى نموذج Microsoft Text Analytics ضمن إعدادات Discourse AI، واجهت خطأ 404 Resource not found، والمفاجئ أن تتبع المكدس لا يزال يشير إلى hugging_face_text_embeddings.rb.
رسالة الخطأ (من استثناء المهمة):
Job exception: 416 errors
{"error":{"code":"404","message": "Resource not found"}} (Net::HTTPBadResponse)
مقتطف تتبع المكدس ذي الصلة (يشير إلى Hugging Face على الرغم من تحديد نموذج 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'
ملاحظة: يشير هذا إلى أنه حتى عندما أقوم بتحديد وتكوين نقطة نهاية نموذج Microsoft ومفتاح API الخاص بها، يبدو أن إضافة Discourse AI تقوم بتوجيه طلبات تحليل المشاعر بشكل ثابت أو خاطئ عبر منطق أو نقاط نهاية خاصة بـ Hugging Face. هذا يمنع استخدام نموذج Microsoft على الإطلاق.
لقطات شاشة التكوين:
لقد أرفقت لقطات شاشة لإعدادات Discourse AI الخاصة بي لإظهار التكوين:
- تكوين مفصل لنماذج الذكاء الاصطناعي للمشاعر (يظهر كلاً من نماذج Hugging Face و Microsoft) - لقد اختبرت باستخدام نموذج Hugging Face فقط أو نموذج Microsoft فقط مع نفس النتيجة
هذه المشاكل تجعل ميزة تحليل المشاعر غير قابلة للاستخدام فعليًا. يبدو أن الإضافة تتطلب تحديثًا للتعامل مع تنسيق استجابة Hugging Face الجديد وتوجيه الطلبات بشكل صحيح عند تكوين مزودي مشاعر مختلفين.
أي مساعدة أو توجيه بشأن هذه المشاكل سيكون موضع تقدير كبير.
شكراً!