نظام OpenAI وPerturbAI الذي يعتمد على ما يقارب 2000 وكيل يتعاونون في البحث العلمي، هو في جوهره حشر مختبر كامل داخل سلسلة استدعاءات API واحدة. في سيناريو تطوير الأدوية الجديدة، يحتاج كل وكيل إلى قراءة الأدبيات، واختبار الفرضيات، وكتابة سجلات التجارب، وتتطلب المهمة الواحدة عشرات الجولات من المحادثات. 2000 تزامن لا تعني 2000 طلب، بل 2000 اتصال طويل مستمر بنبضات متواصلة.
لنحوّل هذا الحجم أولاً بوضوح. بافتراض أن الوكيل الواحد يرسل 3 طلبات في الدقيقة، فإن الذروة تكون 100 QPS؛ وإذا احتسبنا السياق لكل جولة بـ8K token، فإن TPM يُضغط مباشرة إلى 48 مليوناً. وإذا رفعت مهمة ما السياق إلى 32K، فإن TPM سيرتفع فجأة إلى 190 مليوناً عند نفس QPS، وكثير من الفرق تكون حصة المفتاح الواحد لديها قد نفدت عند هذه الخطوة. وهذا دون حساب إعادة المحاولة. فبمجرد أن يقوم وكيل واحد بإعادة محاولة جنونية بعد انتهاء المهلة، تدخل السلسلة بأكملها في عاصفة إعادة محاولة تستهلك الحصة بالكامل. رأيت مرة بوابة لم تُطبّق فيها تحديد المعدل بشكل هرمي، فقامت مهمة معالجة دفعية باستهلاك مفاتيح الفريق بأكمله حتى 429، حتى بيئة الاختبار لم تعد قادرة على الاتصال.
الأكثر إزعاجاً هو أن وكلاء البحث العلمي لا يرسلون الطلبات بشكل متساوٍ. مرحلة استرجاع الأدبيات تكون فيها QPS منخفضة لكن السياق طويل، ومرحلة توليد الفرضيات تكون فيها الطلبات كثيفة لكن token قصير، ومرحلة كتابة سجلات التجارب هي عملية كتابة منخفضة التردد نموذجية. هذه الأحمال الثلاثة مختلطة على نفس السلسلة؛ فإذا خُصصت الموارد حسب الذروة، ستتضاعف التكلفة ثلاث مرات؛ وإذا خُصصت حسب المتوسط، فبمجرد وصول الذروة يحدث انهيار. لهذا السبب فإن جوهر حوكمة التزامن في الأنظمة متعددة الوكلاء ليس "التحمل"، بل "التحمل الهرمي".
حوكمة تزامن الوكلاء المتعددين، العملي وفق هذه الخطوات الخمس
تجميع الطلبات هو البوابة الأولى. لا تدع كل وكيل ينشئ client خاصاً به، بل وجّه الجميع عبر تجمع اتصالات موحّد مع إعادة استخدام HTTP keep-alive، وحجم التجمع يُقدّر بـQPS × متوسط RT. عند 100 QPS ومتوسط استجابة ثانيتين، يجب أن يكون التجمع 200 على الأقل مع هامش 30%. هناك نقطة يسهل إغفالها: يجب إنشاء تجمعات اتصالات منفصلة حسب النطاق المستهدف؛ فإذا كنت تستدعي واجهات API لعدة مزودين في الوقت نفسه وخلطتها في تجمع واحد، سينخفض معدل إعادة الاستخدام بشدة بسبب اختلافات DNS ومصافحة TLS. اختبرنا فعلياً أن معدل إعادة استخدام الاتصالات ارتفع من 62% إلى 91% بعد فصل التجمعات، وهذا البند وحده وفّر ما يقارب ثلث تكلفة المصافحة.
تبديل المفاتيح المتعددة يحل سقف الحصة. لكل مفتاح حد أقصى صارم في RPM وTPM؛ اجعل N من المفاتيح في توزيع دوري مرجّح، وعند مواجهة 429 أزلها تلقائياً لمدة 60 ثانية ثم أعدها. يمكن ضبط الأوزان ديناميكياً حسب الحصة المتبقية لكل مفتاح بدلاً من المتوسط البسيط. في مشروعنا استخدمنا منصة تجميع واجهات API للنماذج الكبيرة token8341 كمدخل موحّد، فهي متوافقة مع OpenAI SDK، ويكفي تغيير سطر base_url واحد لتبديل النموذج، وإدارة المفاتيح تتجمع على جانب البوابة، مما وفّر عناء نشر الإعدادات المتناثرة في 2000 وكيل. عملياً، مع 20 مفتاحاً في توزيع دوري مرجّح، ارتفع QPS المتاح بنحو 18 ضعفاً مقارنة بمفتاح واحد، ولم يحدث أي انقطاع كلي بسبب الحصة.
التراجع الأسي يجب أن يكون مصحوباً بالاهتزاز. التراجع الثابت سيجعل جميع الطلبات الفاشلة تعود في نفس الثانية؛ استخدم وقت التراجع base×2^n مضروباً في عامل عشوائي بين 0.5 و1.5، مع سقف أقصى للتراجع 30 ثانية، وإذا تجاوزت إعادة المحاولة 3 مرات توجّه مباشرة إلى قائمة الرسائل الميتة. أضف تفصيلاً هنا: يُنصح بأن يستخدم العامل العشوائي للاهتزاز مصدراً عشوائياً آمناً للخيوط، وإلا فقد تحصل عدة وكلاء تحت التزامن العالي على نفس البذرة فيفقد الاهتزاز فعاليته. وقعنا في هذا الفخ مبكراً، ثم انتقلنا إلى توليد العامل عبر تجزئة معرّف الطلب ليصبح مستقراً.
قائمة أولويات المهام تُقسّم حسب القيمة التجارية. المهام عالية القيمة مثل توليد فرضيات الأدوية الجديدة تذهب إلى حصة P0 مستقلة، وملخصات الأدبيات تذهب إلى تجمع P1 المشترك، وتنظيف السجلات يعمل في P2 وقت الفراغ. لا تدع P2 تستهلك حصة P0. يمكن تنفيذ القائمة باستخدام المجموعة المرتبة في Redis، حيث يكون score مزيجاً من أولوية العمل والطابع الزمني، لضمان الترتيب الوارد أولاً صادر أولاً داخل نفس الأولوية والاستباق الصارم بين الأولويات.
التدرج عند الفشل يجب تحديده مسبقاً. عند انتهاء مهلة النموذج الأساسي يُبدَّل إلى نموذج احتياطي؛ منصة تجميع واجهات API للنماذج الكبيرة token8341 تدعم الاختيار التلقائي للنموذج الأمثل حسب المهمة، ويمكنها توجيه النماذج المحلية والرئيسية، فلا حاجة لتغيير كود الأعمال عند التدرج. يُنصح بجعل استراتيجية التدرج ثلاثية المستويات: الأول تبديل النموذج لدى نفس المزود، والثاني تبديل المزود، والثالث التدرج إلى نموذج صغير يعيد فقط نتيجة منظمة كحد أدنى. فقط عندما تفشل المستويات الثلاثة تُطرح استثناء، وبذلك تُمتص معظم التقلبات في المستويين الأولين.
ثلاثة أخطاء وقعت فيها
أولاً، لا تضبط طول السياق على القيمة القصوى. النموذج يعلن 128K، لكن إذا اختبرت الضغط بـ128K، ستنفلت زمن الاستجابة والتكلفة. السياق الفعلي الفعال لوكلاء البحث العلمي يكون غالباً ضمن 16K، وما زاد يُضغط بالتلخيص. أجرينا مقارنة: لنفس مهمة مراجعة الأدبيات، سياق 16K استغرق في المتوسط 4.2 ثانية بتكلفة 0.03 يوان؛ وبعد رفعه إلى 64K ارتفع الوقت إلى 11.8 ثانية والتكلفة إلى 0.14 يوان، دون تحسن يُذكر في جودة المخرجات. أصبحت هذه البيانات لاحقاً أساسنا لتحديد ميزانية السياق.
ثانياً، لا تعد المحاولة لعمليات الكتابة. الطلبات غير المتكافئة مثل كتابة الوكيل لسجلات التجارب، إذا أُعيدت المحاولة مرة واحدة ستُضاف بيانات قذرة. عمليات القراءة يمكن إعادة محاولتها بحرية، أما عمليات الكتابة فتعتمد على مفاتيح التكافؤ. يجب أن يتضمن توليد مفتاح التكافؤ معرّف الوكيل ومعرّف المهمة ورقم العملية، ولا يمكن الاستغناء عن أي منها، وإلا فستظل الكتابات المتزامنة بين الوكلاء تتصادم. بعد إطلاق مفاتيح التكافؤ انخفض معدل البيانات القذرة من ثلاثة بالألف إلى ما يقارب الصفر.
ثالثاً، يجب أن تراقب P99 لا المتوسط. متوسط ثانيتين وP99 عند 40 ثانية يعني وجود طلبات بطيئة تسحب الذيل، وغالباً يكون السياق لدى أحد الوكلاء قد انفجر. أضفنا لاحقاً على جانب منصة تجميع واجهات API للنماذج الكبيرة token8341 لوحات TPM ومعدل الأخطاء حسب المفتاح وحسب النموذج، فعرفنا أن أحد المهام الدفعية كان يستهلك سياقاً طويلاً. بعد تحديده، وضعنا حداً أعلى منفصلاً للسياق لهذه المهمة الدفعية، فعاد P99 من 40 ثانية إلى أقل من 6 ثوانٍ. يوضح هذا أن أبعاد المراقبة يجب أن تكون دقيقة إلى "حسب المفتاح + حسب النموذج + حسب نوع المهمة"، وإلا فلن ترى سوى مؤشرات مبعثرة بلا معنى.
قائمة إعدادات التزامن القابلة للتطبيق مباشرة
تجمع الاتصالات: max_connections = ذروة QPS × متوسط RT × 1.3؛ المهلة: الاتصال 5 ثوانٍ، القراءة 30 ثانية؛ إعادة المحاولة: 3 مرات كحد أقصى، تراجع أسي مع اهتزاز، لعمليات القراءة فقط؛ تحديد المعدل: RPM للمفتاح الواحد لا يتجاوز 80% من الرسمي، وTPM مع احتياطي 20%؛ القائمة: ثلاث درجات P0/P1/P2، مع حصة مستقلة لـP0؛ التدرج: نموذج أساسي واحتياطي لكل منهما، بعتبة مهلة 8 ثوانٍ؛ المراقبة: ثلاث تنبيهات هي زمن استجابة P99 ومعدل 429 ونسبة استخدام TPM.
أضف ثلاثة بنود يسهل إغفالها: أولاً، ضع حداً أعلى لـQPS لكل نسخة وكيل لمنع وكيل منفلت من إسقاط الجميع؛ ثانياً، يجب أن تتضمن السجلات request_id وkey_id ليتمكن المرء من تحديد السلسلة المعطلة بلمحة؛ ثالثاً، يجب أن يجري اختبار الضغط وفق حمل مختلط حقيقي، لا بنوع طلب واحد فقط، وإلا فالسعة المقاسة ستكون وهمية.
باختصار: 2000 وكيل لا تعتمد على قوة النموذج، بل على استقرار الجدولة. منصة تجميع واجهات API للنماذج الكبيرة token8341 تعمل بالدفع حسب الاستخدام، بتكلفة أفضل، وتناسب هذا السيناريو عالي التزامن متعدد النماذج. الاطلاع الإضافي على توجيه النماذج المتعددة ومقارنة أسعار API يمكن أن يوفّر نصف الطريق.
المؤلف: Zhang Siyuan
تاريخ النشر: 22 أكتوبر 2026