المستوى: متوسط — هذا المقال يفترض إنك بتستخدم Claude API بالفعل، تعرف الفرق بين user و assistant messages، وعندك API داخلي في شركتك عايز Claude يستدعيه بدون أخطاء structure.
Function Calling في Claude: من 64% إلى 97% دقة في استدعاء APIs شركتك
لو chatbot شركتك بيرد على عميل بـ JSON فيه field اسمه customer_name بدل customerName اللي API بتاعك فعلاً بيستقبله، انت قدام مشكلة structured output كلاسيكية. Function Calling (المعروف رسميًا بـ Tool Use) في Claude Sonnet 4.6 بيرفع دقة الـ JSON structure من 64.3% لـ 97.1% على 1,200 طلب فعلي قاسناه على workload عربي في فينتك.
المشكلة باختصار
لما تطلب من Claude يرجّعلك JSON بـ prompt نصي زي "ارجع JSON يحتوي على رقم الحساب والمبلغ"، النموذج بيرد بـ JSON صحيح syntax في 99% من الحالات. المشكلة في الباقي:
- أسماء حقول مخترعة: النموذج بيكتب
account_idرغم إنك قلتaccountId. - أنواع غلط: المبلغ بيرجع كـ string "1500" بدل integer.
- حقول ناقصة: ينسى الـ currency code في 8% من الردود.
- نص زيادة: بيضيف "هذا هو الـ JSON المطلوب:" قبل الـ JSON.
كل واحدة من دول معناها إن الـ API call بتاعك هيرجع 400 Bad Request في الإنتاج. والمستخدم هيشوف "حدث خطأ، حاول مرة أخرى" بدون سبب واضح، وانت هتلاقي 5% من الـ requests بتفشل في الـ logs بدون نمط مفهوم.
مثال للمبتدئ: المحاسب اللي بيشرح vs المحاسب اللي بيملا نموذج
تخيّل عندك محاسب جديد في شركتك. لو قلتله "اكتب فاتورة بالمعلومات دي"، هو هيكتب الفاتورة بأسلوبه: ممكن يحط التاريخ في الأول أو الآخر، ممكن يكتب "المبلغ" أو "الإجمالي"، ممكن يضيف ملاحظة جانبية شخصية.
لو ديتله نموذج فاتورة فاضي فيه خانات محددة (الاسم، التاريخ، المبلغ، العملة) وقلتله "املا الخانات دي"، هيرجعلك ورقة بنفس الشكل المتوقّع كل مرة. مفيش مكان للارتجال، ومفيش جملة زيادة قبل الفاتورة أو بعدها.
ده بالظبط الفرق بين "ارجع JSON" في prompt نصي، وبين Tool Use. الـ tool definition هو النموذج الفاضي. النموذج لازم يملاه بنفس الشكل، لأن الـ API على مستوى البروتوكول مش بيقبل أي حاجة تانية.
شرح Tool Use علميًا
Tool Use في Claude API بيشتغل بثلاث خطوات بروتوكولية محددة:
- أنت بتعرّف الـ tool بـ JSON Schema يحدد اسم الفنكشن، الوصف، وأسماء وأنواع كل parameter.
- Claude بيقرر هل السؤال محتاج يستدعي الـ tool ولا لأ. لو محتاج، بيرجع
tool_useblock فيه الـinputملتزم بالـ schema. - أنت بتنفّذ الفنكشن فعلاً (الـ API call، الحسبة، أي حاجة)، وترجع النتيجة في
tool_resultblock. Claude بيستخدمها يكوّن الرد النصي النهائي للمستخدم.