دعم ملفات PDF في Discourse AI

:bookmark: يشرح هذا الدليل كيفية تنفيذ واستخدام إمكانيات معالجة PDF داخل discourse-ai، بما في ذلك استخراج النص الأساسي والمعالجة المحسنة بمساعدة LLM.
:person_raising_hand: مستوى المستخدم المطلوب: مسؤول

ملخص

تدعم إضافة discourse-ai معالجة PDF لـ RAG (توليد معزز بالاسترجاع) في وضعين مميزين:

  1. استخراج النص الأساسي
  2. المعالجة المحسنة بتحليل LLM

استخراج النص الأساسي

يوفر هذا الوضع إمكانيات أساسية لمعالجة PDF:

  • يستخرج محتوى النص باستخدام gem pdf-reader
  • يدعم الملفات حتى 100 ميجابايت
  • يعمل فورًا بعد تثبيت الإضافة
  • يعالج المحتوى النصي فقط (يتجاهل العناصر المرئية)

المعالجة المحسنة بتحسينات LLM

:information_source: يتطلب هذا الوضع تكوينًا محددًا ويوفر إمكانيات أكثر تقدمًا.

المتطلبات:

  • اشتراك في خطة Enterprise أو استضافة ذاتية لـ Discourse
  • تثبيت ImageMagick مع دعم Ghostscript في الحاوية
  • تمكين إعداد الموقع ai_rag_images_enabled

القدرات:

  • يفسر الصور والرسوم البيانية والمخططات
  • يوفر سياقًا من العناصر المرئية
  • يعالج ملفات PDF صفحة بصفحة
  • يحافظ على حد حجم الملف 100 ميجابايت

تفاصيل التنفيذ

مواصفات المعالجة

  • دقة معالجة الصفحة: 300 DPI
  • الحد الأقصى لوقت المعالجة: 600 ثانية (10 دقائق)
  • التنظيف التلقائي للملفات المؤقتة
  • تكامل كامل مع تضمينات مستندات RAG

سير عمل المعالجة

  1. تحميل PDF والتحقق من صحته
  2. استخراج المحتوى (وضع أساسي أو محسّن)
  3. تقسيم النص مع تداخل قابل للتكوين
  4. تضمين وتخزين الأجزاء
  5. تتبع التقدم عبر MessageBus

القيود

:warning: كن على علم بهذه القيود عند تنفيذ معالجة PDF:

  • قيود حجم الملف:
    • 100 ميجابايت لمعالجة PDF الحالية
    • 20 ميجابايت لتحميلات واجهة المسؤول الجديدة
  • يتطلب الوضع المحسن موارد نظام إضافية
  • قد لا يتم تفسير تخطيطات PDF المعقدة بشكل مثالي
  • تزيد المعالجة المحسنة من وقت المعالجة بشكل كبير
11 إعجابًا

هذه أخبار رائعة حقًا. شكرًا للفريق! لا أستطيع الانتظار حتى يتم الانتهاء من المعالجة المُحسنة. سيكون ذلك حاسمًا في تغذية أوراق بحث LLMs.

[اقتباس=“سام سافّرون، المنشور: 22، الموضوع: 335804، اسم المستخدم: سام”]
الانتظارين للمعالجة المُحسنة، أعطونا بضعة أسابيع
[/اقتباس]

أيضًا، هل هناك أي خطة للسماح بإجراء RAG “الدردشة مع ملفات PDF الخاصة بك” عن طريق تحميل ملفات PDF في رسالة خاصة روبوت ذكاء اصطناعي أو في موضوع/منشور وذكر الروبوت؟

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

@sam هل يمكنك تقديم فيديو بسيط لشرح هذا الخيار الرائع، لأن ما ذكرته غير واضح بما فيه الكفاية للتنفيذ

قيمة إعداد الموقع ai_rag_images_enabled
[/quote]
أين يمكنني العثور على هذا الإعداد

إنه إعداد مخفي، تحتاج إلى استخدام وحدة التحكم، ولكنك تحتاج أيضًا إلى تكوين الحاوية، نوصي بالانتظار بضعة أسابيع أخرى

3 إعجابات

شكرًا لك، أقدر عملك الرائع

In my website (Arabic Forum) I did a test in Arabic by adding legislation in the first post “topic” and then I asked questions using AI, but the answers not accurate and I think this is because it is not Context Ragging

عذرًا، لكن هذا ليس ما يحدث، تحتاج إلى تحديد شخصية أو أداة ثم إضافة التحميل هناك.

كان هناك بعض النقاش حول دعم “التحميل والسؤال” هنا: Upload and discuss pdfs in composer ولكن لم يتم دعمه بعد.

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

أولاً وقبل كل شيء، شكراً جزيلاً على عملكم الرائع. أنا معجب به حقًا.

بعد التجربة مع الإعدادات وتغيير نموذج الذكاء الاصطناعي إلى Gemini-Flash-2.0، لقد عمل بشكل رائع بالنسبة لي. إليك الوضع الذي لدي:

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

3 إعجابات

أحدث صورة لـ discourse تدعم الوضع المتقدم إذا أراد أي شخص الاختبار

إعجابَين (2)

هل يجب تمكينه عبر وحدة التحكم؟ لا أرى أي خيارات للوضع المتقدم عبر واجهة المستخدم.

علاوة على ذلك، أحصل على خطأ عند محاولة تحميل ملف PDF هذا. حجمه 34 ميجابايت ولكن لدي الحد الأقصى لحجم المرفقات المحدد بـ 100 ميجابايت (في كل من إعدادات المسؤول و app.yml). الغريب هو أن لدي نسخة مضغوطة حجمها 16 ميجابايت وتقوم بالتحميل بشكل جيد. ولكن ربما يكون ملف PDF الأكبر معقدًا جدًا في الوقت الحالي؟ هناك الكثير من الصور والمعادلات وما إلى ذلك.

نعم، تحتاج إلى تعيين SiteSetting.ai_rag_images_enabled = true في وحدة تحكم Rails لتمكينها.

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

تخميني هنا هو أن بعض إعدادات nginx تحتاج إلى التغيير في الحاوية أيضًا حتى لا تقوم بالرفض

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

مرحباً @sam
أواجه حاليًا مشكلة في تحميل وفهرسة ملفات PDF بسبب هذا الخطأ: Job exception: undefined method `length’ for nil.

كنت أتساءل عما إذا كان الخطأ يتعلق بالإعدادات التي ناقشناها أعلاه.
تتجمد الواجهة عند فهرسة 0% ولا تتحرك،
وتفاصيل الاستثناء كما يلي:

/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:81:in `chunk_document'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:40:in `block in execute'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:616:in `block in within_new_transaction'
activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:613:in `within_new_transaction'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:361:in `transaction'
activerecord-7.2.2.1/lib/active_record/transactions.rb:234:in `block in transaction'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:415:in `with_connection'
activerecord-7.2.2.1/lib/active_record/connection_handling.rb:296:in `with_connection'
activerecord-7.2.2.1/lib/active_record/transactions.rb:233:in `transaction'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:39:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
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'
sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'
sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:132:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'
sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'
sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'
sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'
sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'
sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'
sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'
sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'
sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'
sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'
sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'
sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'
إعجاب واحد (1)

شكرًا على هذا التحديث الرائع، فقط لدي استفسار واحد هنا، هل الحد الأقصى 100 ميجابايت لكل روبوت Persona AI أو لجميع الشخصيات؟

أنا جديد على Discourse AI ولكني خبير في Discourse بشكل عام.

أتطلع حقًا لتجربة هذا لحالة استخدام محددة في شكل تجريبي في هذه المرحلة.

لقد قمت بتمكين إعداد الموقع المخفي.

لا يوجد شيء في SideKiq يمكنني رؤيته. كيف يمكنني معرفة ما إذا كان يعمل على الإطلاق؟

أنا على علم بأن هذه ميزة إصدار مسبق وليست جاهزة للاستخدام العام بعد، ومع ذلك، سيكون من الرائع أن أتمكن من تجربتها واختبارها.

أتطلع حقًا لأي تلميحات أو نصائح أو لقطات شاشة أو وصفات من الأشخاص الذين يجربون هذا.

أتلقى هذا الخطأ عند مطالبة الروبوت بتلخيص محتويات بعض ملفات PDF على موقعي. لم أقم بتمكين المعالجة المحسّنة، وأستخدم GPT 4.1. أي أفكار حول ما أفعله بشكل خاطئ؟

عذرًا، يبدو أن نظامنا واجه مشكلة غير متوقعة أثناء محاولة الرد.

تفاصيل الخطأ

{
“error”: {
“message”: “يجب أن يتبع رسالة المساعد التي تحتوي على ‘tool_calls’ رسائل أدوات تستجيب لكل ‘tool_call_id’. لم يكن لـ tool_call_ids التالية رسائل استجابة: call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}

هل لي أن أستفسر عن الوضع الحالي لدعم ملفات PDF؟ :face_with_peeking_eye:

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

عندما تقوم بتكوين أحجام التحميل في app.yml، فإنها تكون على مستوى الموقع بأكمله، لذا فهي تنطبق على كل شخصية.

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