Discourse AI - تحليل المشاعر

:bookmark: يغطي هذا الموضوع تكوين ميزة المشاعر لمكون Discourse AI الإضافي.
:person_raising_hand: مستوى المستخدم المطلوب: مشرف

تحتفظ المشاعر بعلامات تبويب في مجتمعك عن طريق تحليل المنشورات وتقديم درجات المشاعر والعواطف لمنحك إحساسًا عامًا بمجتمعك لأي فترة زمنية. يمكن أن تكون هذه الرؤى مفيدة في تحديد نوع المستخدمين الذين ينشرون داخل مجتمعك ويتفاعلون مع بعضهم البعض.

الميزات

  • المشاعر العامة: تقارن عدد المنشورات المصنفة على أنها إيجابية أو سلبية
  • رسم بياني شريطي يعرض قيمة رقمية قابلة للتبديل للدرجات الإيجابية والسلبية والعامة
  • العواطف: عدد الموضوعات والمنشورات المصنفة حسب عواطف متعددة، مجمعة حسب الإطار الزمني
    • اليوم
    • الأمس
    • آخر 7 أيام
    • آخر 30 يومًا
  • تقارير لأي فترة زمنية يمكن الوصول إليها عبر الإعدادات
    • سنوي
    • ربع سنوي
    • شهري
    • أسبوعي
    • نطاق مخصص
  • ينطبق فقط على المستخدمين الإداريين

تمكين المشاعر

التكوين

Sentiment is enabled by default for hosted customers. For manual steps see below

  1. انتقل إلى إعدادات AdminPlugins → ابحث عن discourse-ai وتأكد من تمكينه
  2. قم بتمكين ai_sentiment_enabled لتحليل المشاعر
  3. توجه إلى /admin/dashboard/sentiment لرؤية تقاريرهم الخاصة

:information_source: بمجرد تمكينها، ستقوم المشاعر بتصنيف جميع المنشورات المستقبلية ومن آخر 60 يومًا. لتصنيف جميع المنشورات التاريخية لموقعك، يجب تشغيل مهمة إعادة تعبئة من وحدة التحكم.

:discourse2: مستضاف من قبلنا؟
اتصل بنا على team@discourse.org وسنقوم بذلك نيابة عنك.

:mechanic: مستضاف ذاتيًا؟
./launcher enter app
rake ai:sentiment:backfill

الأسئلة الشائعة التقنية

كيف تتم معالجة بيانات الموضوع/المنشور؟ كيف يتم تعيين الدرجات؟

  • تتمتع المشاعر بدقة “لكل منشور”. لكل منشور، يمكننا تحديد المشاعر ثم تقسيم هذه البيانات بأشكال عديدة (لكل علامة / فئة / وقت إلخ…). إنها تقارن عدد المنشورات المصنفة على أنها إيجابية أو سلبية. يتم حساب هذه عندما تكون الدرجات الإيجابية أو السلبية > درجة العتبة المحددة.

هل هناك أي خطط لإضافة دعم للغات أخرى؟

  • في المستقبل نعم! سواء عن طريق إضافة نماذج تعلم آلي بسيطة متعددة اللغات (ML) أو عن طريق استخدام نماذج لغوية كبيرة متعددة اللغات (LLMs) لتصنيف البيانات، بدلاً من النماذج المخصصة.

ما هي النماذج المستخدمة لتشغيل المشاعر؟

محاذير

  • لا يتم عرض المنشورات المصنفة على أنها محايدة (ليست إيجابية ولا سلبية)
  • يتم استبعاد الرسائل الخاصة (PMs) من الحسابات
10 إعجابات

تم دمج منشور في موضوع موجود: مشاكل مع الملء الخلفي للمشاعر

تم دمج منشور في موضوع موجود: مشاكل مع الملء الخلفي للمشاعر

تم تحديث المنشور الأصلي بمقطع فيديو جديد يعرض الميزات المحدثة لـ Sentiment بما في ذلك المزيد من المشاعر وفهم المواضيع/المنشورات المرتبطة بكل شعور

لقد قمت بتكوين إعدادات نموذج المشاعر باستخدام اسم نموذج ونقطة نهاية ومفتاح API تم نسخهما من إعدادات LLM، حيث يجتاز الاختبار، ولكني أتلقى الخطأ أدناه في /logs.

(ولكن ربما لا أفهم بشكل صحيح، لماذا لا يستخدم نموذج المشاعر أحد نماذج LLM المكونة؟)

باستخدام 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'
الحالة: 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...

لا تستخدم وحدة المشاعر نماذج لغوية كبيرة عامة، بل نماذج تم ضبطها بدقة لتصنيف المشاعر. إذا كنت ترغب في تشغيل هذه النماذج بنفسك، فسيتم توثيق ذلك في استضافة المشاعر والعواطف لـ DiscourseAI بنفسك

3 إعجابات

@Falco لقد لاحظت للتو أن التحليل العاطفي توقف عن العمل اعتبارًا من يناير 2025. تخميني هو أن هناك إعدادًا جديدًا يسمى ai_sentiment_model والذي كما يوضح الرابط أعلاه مخصص لتشغيل نموذج/صورة تحليل عاطفي مخصصة خاصة بك. لاحظت أنه بعد تحديث discourse الآن، فإن ai_sentiment_model_configs فارغ بالكامل (هل يجب أن يكون كذلك؟).عندما أحاول تشغيل أمر rake للاسترجاع العكسي، يظهر لي خطأ:

rake ai:sentiment:backfill
تم إلغاء تشغيل rake!
ActiveRecord::StatementInvalid: PG::SyntaxError: خطأ في بناء الجملة في أو بالقرب من ")" (ActiveRecord::StatementInvalid)
LINE 1: ...e_upload_id", "posts"."outbound_message_id" FROM () as posts..

افتراضيًا، كان المكون الإضافي يستخدم خادمًا موجودًا في DigitalOcean قمت بإعداده لتسهيل الاختبار.

لقد قمت منذ ذلك الحين بتغيير الإعدادات الافتراضية للمكون الإضافي إلى حالة نظيفة، وعلى الأشخاص الذين يريدون تصنيف الذكاء الاصطناعي تشغيل خوادم باتباع الوثائق هنا على Meta.

بالتأكيد، لكننا كنا ندفع هذه التكلفة لأغراض الاختبار. لا يمكن الاستمرار في تقديم ذلك لكل مستضيف ذاتي.

تجدر الإشارة إلى أننا نقدم خدمة التصنيف هذه على خوادم مسرّعة بوحدة معالجة الرسومات (GPU) كجزء من خدمة الاستضافة لدينا.

إعجابَين (2)

مشاكل تحليل المشاعر في 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 الجديد وتوجيه الطلبات بشكل صحيح عند تكوين مزودي مشاعر مختلفين.

أي مساعدة أو توجيه بشأن هذه المشاكل سيكون موضع تقدير كبير.

شكراً!

إعجابَين (2)

أنا فضولي لمعرفة ما إذا كان الإبلاغ عن المشاعر يعمل لدى الآخرين، أو إذا كنت قد أخطأت في تكوين شيء ما. أود أن أعرف ما الذي أحتاج إلى التحقق منه أو تكوينه لتمكين الإبلاغ عن المشاعر، حيث ما زلت أواجه نفس المشكلة.

إعجاب واحد (1)

نحن نحاول استخدام هذه الميزة مع Azure AI Language (من مثيل Discourse المستضاف ذاتيًا) - حيث أننا نستخدم بالفعل اشتراك Azure الخاص بنا لدمج GPT-4.5 مع Discourse (لوظائف التلخيص وروبوت الدردشة):

… ولكننا لا نحصل على أي بيانات في لوحة معلومات المشاعر، ويمكننا رؤية هذه الأخطاء في السجلات:

Discourse AI: Errors during bulk classification: Failed to classify 208 posts (example ids: 2256, 909, 2270, 2260, 2797) : JSON::ParserError : An empty string is not a valid JSON string.

يظهر تتبع المكدس أن Discourse قد يحاول استخدام HuggingFace - هل هذه هي النماذج الوحيدة المدعومة في الوقت الحالي؟

شكرًا،

ن

إعجاب واحد (1)

إذًا، هل الطريقة الوحيدة لاستخدام هذه الميزة هي إعداد مثيلات خاصة بك من النماذج (والتي تحتاج إلى مثيلات GPU كثيفة الموارد والتي ستكون مكلفة)؟ تبدو هذه الميزة مفيدة جدًا، ولكن يبدو أنها ستكلفني أكثر للإعداد من استضافة Discourse الفعلية الخاصة بي.

نعم، النماذج المدعومة هي تلك المدرجة في المنشور الأول.

سنضيف في النهاية دعمًا لتصنيف المنشورات باستخدام نماذج اللغة الكبيرة (LLMs) للأشخاص الذين لا تشكل التكلفة مشكلة بالنسبة لهم.

حسنًا، الميزة بأكملها مبنية حول تصنيف المنشورات باستخدام نماذج التعلم الآلي (ML)، لذا نعم، تحتاج إلى مكان لتشغيلها.

وبما أن Discourse يمكن تشغيله على أرخص خادم افتراضي خاص (VPS) متاح، فإن تشغيل نماذج التعلم الآلي (ML) أكثر تكلفة بالفعل. إذا كنت ترغب في الحصول على الميزة بأقل تكلفة ممكنة، فمن الممكن تشغيلها على خادم به عدد قليل من نوى وحدة المعالجة المركزية (CPU) فقط، طالما لديك ذاكرة وصول عشوائي (RAM) كافية لتحميل النماذج.

إعجاب واحد (1)

عذرًا إذا تم طرح هذا السؤال من قبل، لكنني لم أتمكن من العثور على مرجع لمكان تكوين الدرجة الحدية بالضبط :sweat_smile:

إعجاب واحد (1)

للأسف، درجة العتبة ليست شيئًا يمكن للمستخدمين أو المسؤولين تكوينه. إنها قيمة محددة تم تعيينها في قاعدة التعليمات البرمجية.

إعجاب واحد (1)