لماذا توقفت عن الاعتماد على مزود ذكاء اصطناعي واحد
لقد قمت ببناء روبوت دردشة (chatbot) يعمل في الوقت الفعلي لمنتدى مجتمعي. استخدمت واجهة برمجة تطبيقات OpenAI فقط. بدا الأمر بسيطاً.
بعد ثلاثة أسابيع، واجهت خطأ 5xx خلال ساعات الذروة. توقف روبوت الدردشة الخاص بي عن العمل تماماً. غضب المستخدمون. أدركت أنه لا يمكنني الوثوق بمزود واحد لتطبيقات الإنتاج (production apps).
واجهت عدة مشكلات مع المزود الواحد:
- حدود معدل الاستخدام (Rate limits)
- انتهاء المهلة (Timeouts)
- انقطاع الخدمة بالكامل
جربت مزودين آخرين، لكن جميعهم كانت لديهم تنسيقات وطرق مصادقة مختلفة. أصبح الكود الخاص بي عبارة عن فوضى من جمل switch-case.
كنت بحاجة إلى نظام من أجل:
- توحيد معايير المزودين المختلفين
- إعادة المحاولة تلقائياً عند فشل أحدهم
- تخزين الاستجابات مؤقتاً (Caching)
- تجنب الارتباط الحصري بمزود واحد (vendor lock-in)
تجنبت المكتبات الخارجية لأنها كانت جامدة للغاية. بدلاً من ذلك، قمت ببناء نظام تراجع (fallback system) مخصص باستخدام تصميم بسيط.
أولاً، أنشأت واجهة مشتركة (common interface) لجميع المزودين. يتيح ذلك لأي نموذج ذكاء اصطناعي العمل مع نفس الكود.
بعد ذلك، قمت ببناء فئة موجه (router class). تحاول هذه الفئة المزودين بالترتيب. وهي تستخدم أسلوب التراجع الأسي (exponential backoff) والتخزين المؤقت البسيط لإدارة الإخفاقات.
إليك المنطق المتبع:
- تعريف فئة أساسية مجردة (abstract base class) لمزودي الذكاء الاصطناعي.
- تنفيذ فئات محددة لـ OpenAI ومزودين آخرين.
- استخدام موجه (router) للمرور عبر قائمة المزودين الخاصة بك.
- إذا فشل أحد المزودين، ينتظر الموجه ويجرب المزود التالي.
أنقذ هذا النظام مشروعي خلال ثلاثة انقطاعات حدثت مؤخراً. إنه يظل شفافاً وبسيطاً.
إذا كنت تبني باستخدام الذكاء الاصطناعي، تذكر هذه النقاط:
- استخدم Redis للتخزين المؤقت في بيئة الإنتاج بدلاً من القواميس المحلية (local dictionary).
- أضف تتبعاً للتكاليف لمراقبة إنفاقك.
- قم بتنفيذ دعم العمليات غير المتزامنة (asynchronous support) للحصول على استجابات أسرع.
- قم بتحليل رؤوس "Retry-After" للتعامل مع حدود معدل الاستخدام بشكل أفضل.
لا تبالغ في هندسة النظام (over-engineer) إذا كان مشروعك صغيراً. ولكن إذا كانت خدمتك تعتمد على وقت التشغيل (uptime)، فقم ببناء نظام تراجع.
كيف تتعامل مع موثوقية المزود في مشاريعك؟ هل تستخدم طبقة تراجع أم تعتمد على مورد واحد؟