الذكاء الاصطناعي يتجاوز عتبات رموز LLM بشكل عشوائي وغير متوقع

لقد قمت بضبط نموذج اللغة الكبير (LLM) على حد أقصى 8000 رمز للإخراج، لكن ذكاء Discourse الاصطناعي يرسل بانتظام طلبات تتجاوز هذا الحد.

مع مرور الوقت، وبعد تجارب متعددة ومراجعة السجلات (وهو أمر يمثل مشكلة بحد ذاته نظرًا لعدم وجود أي مؤشر في لوحة التحكم)، قمت بتخفيض الأرقام إلى 7800، ثم 7500، ثم 7200، وأخيرًا 7000 بعد أيام من التجربة والخطأ.

فجأة، وبعد أشهر من العمل السليم، توقف النظام عن العمل. وبعد عملية تصحيح الأخطاء، أدركت أنه في بعض الحالات القصوى، يقوم Discourse مرة أخرى بطلب أكثر من 8000 رمز للإخراج، حتى مع ضبط نموذج اللغة الكبير (LLM) على حد أقصى 7000 رمز.

رسالة (تم الإبلاغ عن 3 نسخ)

DiscourseAi::Completions::Endpoints::OpenAi: الحالة: 413 - الجسم: {"error":{"message":"الطلب كبير جدًا بالنسبة للنموذج `openai/gpt-oss-120b` في المنظمة `org_01kccx1be8fffaz5sbe174je1r` مستوى الخدمة `on_demand` من حيث الرموز في الدقيقة (TPM): الحد 8000، المطلوب 8102، يرجى تقليل حجم رسالتك والمحاولة مرة أخرى. هل تحتاج إلى المزيد من الرموز؟ قم بالترقية إلى مستوى المطور اليوم عبر https://console.groq.com/settings/billing","type":"tokens","code":"rate_limit_exceeded"}}


تتبع المكدس

activesupport-8.0.5/lib/active_support/broadcast_logger.rb:218:in 'block in ActiveSupport::BroadcastLogger#dispatch'
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in 'Array#map'
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in 'ActiveSupport::BroadcastLogger#dispatch'
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:129:in 'ActiveSupport::BroadcastLogger#error'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:202:in 'block (2 levels) in DiscourseAi::Completions::Endpoints::Base#perform_completion!'
net-http-0.9.1/lib/net/http.rb:2461:in 'block in Net::HTTP#transport_request'
net-http-0.9.1/lib/net/http/response.rb:321:in 'Net::HTTPResponse#reading_body'
net-http-0.9.1/lib/net/http.rb:2458:in 'Net::HTTP#transport_request'
net-http-0.9.1/lib/net/http.rb:2410:in 'Net::HTTP#request'
rack-mini-profiler-4.0.1/lib/patches/net_patches.rb:19:in 'block in Net::HTTP#request_with_mini_profiler'
rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:51:in 'Rack::MiniProfiler::ProfilingMethods#step'
rack-mini-profiler-4.0.1/lib/patches/net_patches.rb:18:in 'Net::HTTP#request_with_mini_profiler'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:198:in 'block in DiscourseAi::Completions::Endpoints::Base#perform_completion!'
net-http-0.9.1/lib/net/http.rb:1630:in 'Net::HTTP#start'
net-http-0.9.1/lib/net/http.rb:1064:in 'Net::HTTP.start'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:146:in 'DiscourseAi::Completions::Endpoints::Base#perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai_shared.rb:28:in 'DiscourseAi::Completions::Endpoints::OpenAiShared#perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/llm.rb:214:in 'DiscourseAi::Completions::Llm#generate'
/var/www/discourse/plugins/discourse-ai/lib/agents/bot.rb:144:in 'DiscourseAi::Agents::Bot#reply'
/var/www/discourse/plugins/discourse-ai/lib/translation/base_translator.rb:55:in 'DiscourseAi::Translation::BaseTranslator#get_translation'
/var/www/discourse/plugins/discourse-ai/lib/translation/base_translator.rb:31:in 'block in DiscourseAi::Translation::BaseTranslator#translate'
/var/www/discourse/plugins/discourse-ai/lib/translation/base_translator.rb:31:in 'Array#map'
/var/www/discourse/plugins/discourse-ai/lib/translation/base_translator.rb:31:in 'DiscourseAi::Translation::BaseTranslator#translate'
/var/www/discourse/plugins/discourse-ai/lib/translation/post_localizer.rb:17:in 'DiscourseAi::Translation::PostLocalizer.localize'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/localize_posts.rb:39:in 'block in Jobs::LocalizePosts#execute'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/localize_posts.rb:29:in 'Array#each'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/localize_posts.rb:29:in 'Jobs::LocalizePosts#execute'
/var/www/discourse/app/jobs/base.rb:318:in 'block (2 levels) in Jobs::Base#perform'
rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in 'RailsMultisite::ConnectionManagement::NullInstance#with_connection'
rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in 'RailsMultisite::ConnectionManagement.with_connection'
/var/www/discourse/app/jobs/base.rb:305:in 'block in Jobs::Base#perform'
/var/www/discourse/app/jobs/base.rb:301:in 'Array#each'
/var/www/discourse/app/jobs/base.rb:301:in 'Jobs::Base#perform'
sidekiq-7.3.10/lib/sidekiq/processor.rb:220:in 'Sidekiq::Processor#execute_job'
sidekiq-7.3.10/lib/sidekiq/processor.rb:185:in 'block (4 levels) in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:180:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/suppress_user_email_errors.rb:6:in 'Sidekiq::SuppressUserEmailErrors#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in 'Sidekiq::DiscourseEvent#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:131:in 'Sidekiq::Pausable#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/job/interrupt_handler.rb:9:in 'Sidekiq::Job::InterruptHandler#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:26:in 'Sidekiq::Metrics::ExecutionTracker#track'
sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:134:in 'Sidekiq::Metrics::Middleware#call'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:173:in 'Sidekiq::Middleware::Chain#invoke'
sidekiq-7.3.10/lib/sidekiq/processor.rb:184:in 'block (3 levels) in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:145:in 'block (6 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_retry.rb:118:in 'Sidekiq::JobRetry#local'
sidekiq-7.3.10/lib/sidekiq/processor.rb:144:in 'block (5 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/config.rb:39:in 'block in <class:Config>'
sidekiq-7.3.10/lib/sidekiq/processor.rb:139:in 'block (4 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/processor.rb:281:in 'Sidekiq::Processor#stats'
sidekiq-7.3.10/lib/sidekiq/processor.rb:134:in 'block (3 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_logger.rb:15:in 'Sidekiq::JobLogger#call'
sidekiq-7.3.10/lib/sidekiq/processor.rb:133:in 'block (2 levels) in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_retry.rb:85:in 'Sidekiq::JobRetry#global'
sidekiq-7.3.10/lib/sidekiq/processor.rb:132:in 'block in Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/job_logger.rb:40:in 'Sidekiq::JobLogger#prepare'
sidekiq-7.3.10/lib/sidekiq/processor.rb:131:in 'Sidekiq::Processor#dispatch'
sidekiq-7.3.10/lib/sidekiq/processor.rb:183:in 'block (2 levels) in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'Thread.handle_interrupt'
sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'block in Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Thread.handle_interrupt'
sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Sidekiq::Processor#process'
sidekiq-7.3.10/lib/sidekiq/processor.rb:86:in 'Sidekiq::Processor#process_one'
sidekiq-7.3.10/lib/sidekiq/processor.rb:76:in 'Sidekiq::Processor#run'
sidekiq-7.3.10/lib/sidekiq/component.rb:10:in 'Sidekiq::Component#watchdog'
sidekiq-7.3.10/lib/sidekiq/component.rb:19:in 'block in Sidekiq::Component#safe_thread'

هذا الأمر يمثل مشكلة كبيرة ويجعل تجربة استخدام الذكاء الاصطناعي مع Discourse سيئة. فمشاكل إعداد نموذج اللغة الكبير (LLM) لا تظهر في لوحة التحكم، وعندما يتجاهل Discourse إعدادات نموذج اللغة الكبير (LLM)، فإن ذلك يؤدي إلى مشاكل غير متوقعة وإحباط.

يجب على Discourse إيجاد طريقة للالتزام بمعايير إعداد نموذج اللغة الكبير (LLM) وعرض المشاكل على لوحة تحكم المسؤول.

هل تخلط بين رموز الطلب ورموز الاستجابة؟

الخطأ 413 يعني أن طلبك كان كبيرًا جدًا، وليس الاستجابة المطلوبة.

لمعالجة ذلك، تحتاج إلى ضبط إعدادات نافذة السياق الخاصة بنموذج اللغة الكبير (LLM)، لكنني أحذّر من أن 8 آلاف رمز أصبحت صغيرة جدًا في الوقت الحالي. قد يعمل ذلك لبعض الميزات، لكنه ليس شيئًا نستخدمه كثيرًا في عصر نماذج اللغة الكبيرة التي تتعامل مع نوافذ سياق طويلة تصل إلى مليون رمز. يمكنني تشغيل نافذة سياق بـ 256 ألف رمز على حاسوب مكتبي باستخدام نموذج أفضل بكثير من النموذج الذي تستخدمه.

تم تعيين نافذة السياق على 130 ألف

لكن هذا يعيدني إلى نفس المشكلة. حد النموذج في Groq هو 131,072؛ وقد قمت بالفعل بتعيينه على 130,000. لا ينبغي أن أضطر إلى تجربة الحدود لمعرفة مقدار ما يرسله Discourse. يجب أن يتمكن Discourse من العمل ضمن الحدود التي توفرها إعدادات نموذج اللغة الكبير (LLM).

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

مجرد معلومة: بدأت المشكلة أولاً عندما علقت خدمة الترجمة ونفدت الرموز (tokens):

DiscourseAi::Completions::Endpoints::OpenAi: status: 429 - body: {“error”:{“message”:“تم الوصول إلى حد المعدل للنموذج openai/gpt-oss-120b في المنظمة org_01kccx1be8fffaz5sbe17 ضمن مستوى الخدمة on_demand من حيث الرموز في اليوم (TPD): الحد 200000، تم استخدام 193487، المطلوب 7464. يرجى المحاولة مرة أخرى خلال 6 دقائق و50.832 ثانية. تحتاج إلى المزيد من الرموز؟ قم بالترقية إلى مستوى المطور اليوم عبر https://console.groq.com/settings/billing",“type”:“tokens”,“code”:"rate_limit_exceeded”}}

ثم قمت بإيقاف الخدمة لمدة 24 ساعة لإعادة تعيين حدود المعدل اليومية. بعد إعادة تشغيلها، لاحظت هذا الخطأ:

DiscourseAi::Completions::Endpoints::OpenAi: status: 413 - body: {“error”:{“message”:“الطلب كبير جدًا بالنسبة للنموذج openai/gpt-oss-120b في المنظمة org_01kccx1be8fffaz5sbe17 ضمن مستوى الخدمة on_demand من حيث الرموز في الدقيقة (TPM): الحد 8000، المطلوب 8102، يرجى تقليل حجم الرسالة والمحاولة مرة أخرى. تحتاج إلى المزيد من الرموز؟ قم بالترقية إلى مستوى المطور اليوم عبر https://console.groq.com/settings/billing",“type”:“tokens”,“code”:"rate_limit_exceeded”}}

ثم قمت بتقليل الحد الأقصى للرموز المخرجة من 7000 إلى 6800 في إعدادات نموذج اللغة الكبير (LLM)، وعادت الخدمة للعمل مرة أخرى.

ما الذي أفتقده هنا؟ هل تقترح أن المشكلة تتعلق بنافذة السياق ولا علاقة لها بالحد الأقصى للرموز المخرجة؟ أنا أحاول فقط فهم كيفية مطابقة أرقام الإعدادات من Groq وحدود النموذج مع إعدادات نموذج اللغة الكبير في Discourse.