نماذج اللغة الكبيرة (LLMs) لا تتدخل في الكود الخاص بك – بل تقدم لك طلباً، وأنت من يقوم بتشغيل الدالة. هذه الحقيقة البسيطة تقلب الأسطورة القائلة بأن "النموذج يستدعي روتين Python الخاص بي بشكل سحري"، وتجبر المطورين على إعادة التفكير في عمليات تصحيح الأخطاء (debugging) والأمن.

حلقة الإرسال (dispatch loop)، خطوة بخطوة

عندما يحتاج نموذج اللغة الكبيرة (LLM) إلى أداة، فإنه يتبع تسلسلاً حتمياً:

  1. التخطيط – يقرر النموذج أن هناك إجراءً مطلوباً (مثل "استرداد مبلغ مدفوع").
  2. إنشاء طلب – يقوم النموذج بإخراج نص مهيكل — عادةً بتنسيق JSON — يحدد اسم الأداة ويوفر الوسائط (arguments).
  3. التحليل (Parsing) – يقوم تطبيقك أو إطار عمل داعم بقراءة هذا النص.
  4. المطابقة – يبحث إطار العمل عن الاسم في سجل الدوال الحقيقية التي قمت بتعريفها.
  5. التحقق من الصحة (Validating) – يتحقق من مطابقة الوسائط لمخطط (schema) الدالة ومن أن المستدعي مخول بذلك.
  6. التنفيذ – يتم تشغيل الدالة المطابقة في بيئتك، لتقوم بالعمل المطلوب.
  7. الإرجاع – يتم تغليف النتيجة وإرسالها مرة أخرى إلى النموذج لمواصلة عملية الاستنتاج.

فكر في نموذج اللغة الكبيرة (LLM) كمخطط، وفي إطار العمل كموزع (dispatcher)، وفي الدالة كعامل يقوم فعلياً بنقل البيانات أو الأموال.

لماذا تستمر أسطورة "السحر"

يرى معظم المطورين سطراً واحداً من مخرجات النموذج يبدو وكأنه استدعاء لدالة، فيفترضون أن النموذج قام بالعملية بنفسه. مصطلح "استدعاء الأدوات" (tool calling) في وثائق المزودين يوحي بأن النموذج يستدعي الكود مباشرة.

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

أطر العمل التي تخفي التفاصيل التقنية المعقدة

تقوم مكتبات مثل PydanticAI و LangChain بتجريد هذه الحلقة لتمكينك من التركيز على منطق العمل (business logic). وهي تقوم تلقائياً بـ:

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

وحتى مع وجود هذه المساعدات، يظل النمط كما هو: النموذج لا ينفذ الكود أبداً.

دعم استدعاء الأدوات الأصلي من المزودين

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

يصبح تصحيح الأخطاء أسهل عندما تعيد تسمية المشكلة

بدلاً من لوم "عميل مرتبك" (confused agent)، قل إن المشكلة هي "استجابة النموذج لم تتضمن أي استدعاءات للأدوات". هذا التمييز مهم:

  • عدم وجود استدعاء للأداة – أجاب النموذج مباشرة أو فشل في إنشاء طلب بتنسيق صحيح.
  • طلب غير صحيح التنسيق (Malformed request) – يكون تنسيق JSON خاطئاً من الناحية النحوية أو تفتقر إلى الحقول المطلوبة، مما يؤدي إلى رفض الموزع له.
  • فشل التحقق من الصحة – لا تتطابق الوسائط مع المخطط، مما يؤدي إلى حدوث خطأ قبل التنفيذ.

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

نصائح عملية لبناء مسار عمل (pipeline) موثوق

  • عامل مخرجات النموذج كمدخلات غير موثوقة. قم بتمرير كل طلب عبر عملية تحقق حتمية قبل استدعاء أي كود يؤدي إلى آثار جانبية (side-effecting code).
  • سجل الطلب الخام ونتيجة كل خطوة من خطوات التحقق. هذا ينشئ سجلاً قابلاً لإعادة التشغيل عند حدوث خطأ ما.
  • ضع حدوداً صريحة لاستدعاءات الأدوات المتتالية؛ فالحلقات اللانهائية قد تستهلك الموارد أو تتجاوز حدود معدل الاستخدام (rate limits).
  • قم بتغليف كل دالة في كتلة try/except تعيد كائناً مهيكلاً للخطأ يمكن للنموذج فهمه، مما يحفز إعادة المحاولة أو التراجع السلس (graceful fallback).
  • افصل عمليات التحقق من الأذونات عن منطق العمل. تحقق من حقوق المستدعي قبل تشغيل الدالة، خاصة بالنسبة للإجراءات ذات الامتيازات مثل "حذف مستخدم".
  • استخدم تعريفات قائمة على المخططات (schema-driven) (مثل نماذج Pydantic) حتى يتمكن إطار العمل من إنشاء مخطط JSON تلقائياً والذي يجب على النموذج اتباعه.

ما يجب مراقبته مستقبلاً

مع قيام المزودين بتحسين واجهات برمجة تطبيقات (APIs) استدعاء الأدوات الأصلية، توقع وجود عقود أكثر صرامة حول تنسيقات الطلبات ورموز خطأ أكثر تفصيلاً. ستجعل هذه التغييرات عملية التحقق أسهل وتسمح للمطورين ببناء حواجز أمنية أكثر صرامة. ابقَ على اطلاع بتحديثات المكتبات — فالعديد منها يضيف دعماً مدمجاً لأحدث ميزات المزودين.

الخلاصة

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