مقدمة: الذكاء الاصطناعي يتجاوز مرحلة الكلام مع خاصية Function Calling
حتى وقت قريب، كان الذكاء الاصطناعي التوليدي (Generative AI) مثل ChatGPT يُستخدم في المحادثات، الكتابة، وتوليد الأكواد — لكنه لم يكن يتفاعل فعليًا مع العالم الخارجي.
كان مجرد “عقل لغوي” يفكر ويقترح، دون أن ينفذ أي شيء بيده.
لكن مع ظهور خاصية Function Calling من شركة OpenAI، تغيّر هذا تمامًا.
الآن أصبح بإمكان النماذج مثل GPT-4 وGPT-5 أن تطلب تنفيذ أوامر برمجية حقيقية، مثل إرسال بريد، جلب بيانات من قاعدة، أو تشغيل مهمة على الخادم.
إنها الخطوة الأولى نحو بناء وكلاء ذكاء اصطناعي (AI Agents) حقيقيين.
ما هي Function Calling؟
خاصية Function Calling هي ميزة مدمجة داخل واجهة OpenAI API تتيح للنموذج أن “يطلب” تنفيذ دالة (Function) من الدوال التي يحددها المطور مسبقًا.
الفكرة ليست أن النموذج يشغّل الكود بنفسه،
بل أنه يقترح استدعاء دالة معينة بناءً على فهمه لطلب المستخدم.
يمكن تشبيهها بجسرٍ يربط بين:
- قدرة النموذج على الفهم اللغوي،
- والقدرة البرمجية للنظام الذي تبنيه.
أي أن الذكاء الاصطناعي يفكر، وأنت (كمطور) تكتب الدوال التي تمثل “الأيدي” التي يستخدمها للتنفيذ.
كيف تعمل Function Calling من الداخل؟
الآلية بسيطة لكن ذكية جدًا، وتعمل على أربع مراحل أساسية:
1. المستخدم يكتب طلبًا طبيعيًا
مثلًا:
“احسب لي مساحة دائرة نصف قطرها 5.”
2. النموذج يحلل الطلب
النموذج يفهم أن المطلوب عملية رياضية،
ثم يقرر أنه يحتاج دالة اسمها مثلًا calculate_circle_area.
3. النموذج يرسل لك طلب استدعاء
الرد من النموذج لا يكون نصًا عاديًا، بل كائن JSON يحتوي على:
- اسم الدالة.
- المعاملات (Parameters) اللازمة لها.
مثلًا:
{
"function_call": {
"name": "calculate_circle_area",
"arguments": { "radius": 5 }
}
}
4. أنت تنفّذ الدالة فعليًا في تطبيقك
الكود في تطبيقك يقرأ هذا الطلب، ينفّذ الدالة فعليًا (باستخدام Python أو Java أو أي لغة أخرى)،
ثم يرسل النتيجة مجددًا إلى النموذج ليكمل الرد على المستخدم.
فكرة عميقة: من الذي يكتب الدوال؟
وهنا السر الحقيقي 👇
الدوال (functions) لا تأتي جاهزة من OpenAI.
بل أنت من يحددها داخل مشروعك.
أنت من تقرر ما هي “الأدوات” التي يستطيع الذكاء الاصطناعي استخدامها، وما شكلها، وما مدخلاتها.
مثلاً:
- إذا كنت تبني مساعدًا للطقس → يمكنك تعريف دالة
get_weather(city). - إذا كنت تبني نظام مبيعات → دوال مثل
search_products(keyword)أوcreate_invoice(order_id). - وإذا كنت تبني مساعدًا لمطور Flutter → دوال مثل
generate_widget(name, layout).
إذًا، أنت تتحكم في البيئة والأدوات، بينما الذكاء الاصطناعي يقرر “متى” و“كيف” يستخدمها.
كيف يختار النموذج الدالة المناسبة؟
عندما تزوده انت كمطور بقائمة الدوال المتاحة، يقوم النموذج بتحليل طلب المستخدم لغويًا،
ثم يختار الدالة الأقرب لوصف المهمة.
لكن حتى يفهمها جيدًا، يجب أن تزوده بمعلومات دقيقة عند تعريف كل دالة:
- الاسم (name): يعكس مهمتها بوضوح.
- الوصف (description): يشرح متى ولماذا تُستخدم.
- المدخلات (parameters): يوضح البيانات التي تحتاجها.
كلما كانت أوصافك واضحة ومحددة، أصبح النموذج أكثر دقة في اختيار الدالة الصحيحة.
دورك كمطور في هذه العملية
1. تعريف الأدوات
أنت تكتب جميع الدوال التي تريد أن يستخدمها الذكاء الاصطناعي.
قد تكون دوال بسيطة مثل add_numbers(a, b) أو دوال متقدمة تتصل بـ APIs خارجية.
2. ربطها بالذكاء الاصطناعي
تسجّل أسماء هذه الدوال ووصفها في استدعاء واجهة OpenAI API.
بهذا الشكل يعرف النموذج ما هي الأدوات المتاحة أمامه.
3. استقبال طلبات الاستدعاء وتنفيذها
عندما يقرّر النموذج أنه يحتاج استدعاء دالة،
سيُرسل إليك كائن JSON يحتوي على الاسم والمعاملات.
دورك هنا أن تنفّذ الدالة فعليًا ثم تعيد النتيجة إليه.
الأمان والتحكم الكامل
من المهم أن تدرك أن النموذج لا يستطيع تنفيذ أي كود بنفسه.
هو فقط “يقترح” استدعاء دالة، وأنت من تتحكم بما يتم تنفيذه فعليًا.
وهذا يضمن الأمان الكامل:
- النموذج لا يمكنه الوصول مباشرة إلى الملفات أو الإنترنت إلا عبر الدوال التي تعرّفها له.
- لا يمكنه تنفيذ كود عشوائي.
- لا يستطيع الخروج من النطاق الذي حددته له.
بهذه الطريقة، أنت تملك السيطرة الكاملة على ما يمكن للنموذج فعله.
لماذا Function Calling مهمة جدًا؟
خاصية Function Calling هي نقطة التحول الأساسية التي جعلت الذكاء الاصطناعي يتحول من “كاتب نصوص” إلى “عامل فعلي”.
بفضلها، أصبح من الممكن بناء أنظمة ذكاء اصطناعي حقيقية قادرة على:
- تنفيذ عمليات على البيانات.
- التحكم في قواعد بيانات أو واجهات APIs.
- دمج الذكاء الاصطناعي مع تطبيقات حقيقية (مثل البريد الإلكتروني، التقويم، المتاجر…).
هذه الخاصية هي الأساس الذي بُني عليه مفهوم الـ AI Agents — أي الوكلاء الذين يمكنهم التفكير ثم التنفيذ.
الفرق بين Function Calling وMCP
قد يبدو الأمر متشابهاً مع بروتوكول MCP (Model Context Protocol) الذي طورته شركة Anthropic،
لكن هناك فرق جوهري بينهما:
| المقارنة | Function Calling | MCP |
|---|---|---|
| النطاق | ميزة داخل واجهات OpenAI فقط | بروتوكول عام مفتوح |
| الغرض | تمكين النموذج من تنفيذ دوال في تطبيقك | ربط النماذج بتطبيقات وأدوات خارجية بشكل موحّد |
| من يعرّف الدوال | أنت (كمطور المشروع) | يمكن لأي جهة بناء “سيرفر أدوات” يتصل بالنماذج |
| التحكم | كامل في يد المطور | يعتمد على الإذن بين النموذج والخدمة |
| التركيز | التطبيقات المحلية الصغيرة إلى المتوسطة | الأنظمة المتعددة النماذج (Multi-AI Systems) |
بكلمات بسيطة:
Function Calling = خطوة ذكية داخل تطبيقك.
MCP = لغة عالمية لربط الذكاء الاصطناعي بالبرامج.
ممارسات فعّالة عند تصميم الدوال
لكي تعمل Function Calling بأفضل شكل، هناك قواعد عملية أثبتت نجاحها:
1. اجعل كل دالة تقوم بمهمة واحدة فقط
ابتعد عن الدوال “الضخمة” التي تفعل كل شيء.
اجعلها صغيرة ومحددة، مثل:
get_user_info()update_profile()delete_account()
هذا يجعل النموذج يفهم متى يستخدم كل واحدة بسهولة.
2. اختر أسماء وصفية وواضحة
يفضل أن تبدأ الأسماء بالفعل (مثل get، create، update، send…).
ذلك يساعد النموذج لغويًا في تمييز الوظيفة المقصودة.
3. اكتب وصفًا دقيقًا لكل دالة
الوصف هو ما يجعل النموذج يعرف متى يستخدمها.
كلما كان النص واقعيًا وواضحًا، زادت الدقة.
4. راقب الأداء وعدّل باستمرار
راقب كيف يستخدم النموذج الدوال،
وإذا وجدت أنه يختار دالة خاطئة، حسّن اسمها أو وصفها.
5. استخدم تنسيق JSON الصحيح
كل المعاملات (parameters) تُرسل وتُستقبل بتنسيق JSON،
فاحرص أن تكون البنية واضحة ومتوافقة مع تعريفك في الكود.
أمثلة على مجالات الاستخدام الواقعية
- المساعدات الذكية الشخصية: لتنظيم المهام، إرسال الرسائل، وحجز الاجتماعات.
- التجارة الإلكترونية: لإدارة السلة، البحث في المنتجات، إنشاء الفواتير.
- تحليل البيانات: لجلب البيانات، معالجتها، وإرسال التقارير.
- تطبيقات التعليم: توليد أسئلة، تصحيح الإجابات، إنشاء محتوى مخصص.
- الأنظمة الطبية: تحليل تقارير، تحديد مواعيد، وتوليد ملخصات للمرضى.
بمعنى آخر:
Function Calling هي البوابة التي تجعل الذكاء الاصطناعي جزءًا حقيقيًا من تطبيقاتك،
وليس مجرد “مساعد نصي” يكتب الكلام فقط.
كيف تبني وكيل ذكاء اصطناعي حقيقي باستخدام GPT وFunction Calling
تطبيق عملي: وكيل الطقس الذكي (AI Weather Agent)
بعد أن فهمنا في الجزء الأول كيف تعمل خاصية Function Calling في نماذج GPT،
سننتقل الآن من الجانب النظري إلى الجانب العملي.
في هذا الجزء، سنبني خطوة بخطوة وكيل ذكاء اصطناعي ذكي قادر على فهم طلبات المستخدم باللغة الطبيعية (مثل:
“كيف الطقس في القاهرة اليوم؟”)
ثم جلب بيانات الطقس فعليًا من خدمة خارجية عبر الإنترنت.
الهدف من هذا التطبيق ليس فقط عرض كود جاهز، بل فهم كيفية دمج الذكاء الاصطناعي مع الكود البرمجي الحقيقي،
أي جعل GPT لا يكتفي بالتحليل، بل “يتفاعل مع العالم”.
قد يبدو أن الذكاء الاصطناعي لا يحتاج إلى Function Calling لأنه يستطيع بالفعل الاتصال بالإنترنت — وهذا صحيح جزئيًا في بيئة ChatGPT داخل موقع OpenAI، حيث توفر الشركة أداة مدمجة تُسمى Browsing أو Web Access تمكّنه من قراءة الصفحات الحية وجلب معلومات حديثة.
لكن هذا يقتصر على النسخة الموجهة للمستخدم النهائي داخل منصة OpenAI، ولا يُطبَّق تلقائيًا في بيئة التطوير عبر واجهة الـ API.
عندما تبني تطبيقك الخاص باستخدام GPT من خلال الـAPI، فإن النموذج لا يمتلك صلاحية تصفح الإنترنت أو الوصول إلى البيانات الخارجية إلا إذا زوّدته أنت بهذه الإمكانية.وهنا تأتي أهمية Function Calling:
فهي الأداة التي تسمح للمطور بربط النموذج بالمصادر التي يختارها — مثل واجهات APIs، قواعد بيانات، أو خدمات ويب محددة — تحت إشرافه الكامل.
بذلك، تحصل على ذكاء اصطناعي يمكنه جلب معلومات حقيقية وآمنة من مصادر محددة من قبلك، بدل أن يعتمد على التصفح العام أو المعلومات القديمة من بيانات التدريب.
المتطلبات الأساسية
قبل البدء، تأكد من توفر ما يلي:
- Python 3.9 أو أحدث.
- حساب في OpenAI Platform للحصول على مفتاح API.
- مفتاح من خدمة طقس مجانية (مثل OpenWeatherMap).
- مكتبات Python التالية:
pip install openai requests
الفكرة الأساسية للمشروع
سنُنشئ برنامجًا يعمل كالآتي:
- المستخدم يكتب سؤالًا طبيعيًا مثل: “ما حالة الطقس في الرياض اليوم؟”
- نموذج GPT يفهم الطلب ويقرر أنه يحتاج دالة لجلب بيانات الطقس.
- النموذج يطلب تنفيذ دالة
get_weather(city)عبر خاصية Function Calling. - برنامجنا ينفّذ هذه الدالة فعليًا — يتصل بخدمة OpenWeatherMap ويجلب البيانات.
- النتيجة تُرسل للنموذج مرة أخرى ليصيغ الرد النهائي للمستخدم بشكل جميل.
بكلمات بسيطة:
الذكاء الاصطناعي “يفكر”،
والبرنامج “ينفذ”.
🧠 المفهوم الأساسي: العلاقة بين GPT والدوال
لفهم العملية بدقة، تخيّلها بهذا التسلسل:
| المرحلة | ما يحدث |
|---|---|
| 1 | المستخدم يرسل سؤالًا باللغة الطبيعية. |
| 2 | GPT يحلل السؤال ويقرر أن الحل يحتاج دالة معينة. |
| 3 | GPT لا ينفذ الكود، بل “يطلب” استدعاء الدالة بالاسم والمعاملات المناسبة. |
| 4 | الكود في تطبيقك ينفّذ الدالة فعليًا ويعيد النتيجة. |
| 5 | GPT يدمج النتيجة ويقدّم الرد النهائي للمستخدم. |
بهذا الأسلوب، أصبح بإمكانك جعل GPT يتفاعل مع الإنترنت، الملفات، أو أي خدمة خارجية من خلال واجهات برمجية (APIs).
المرحلة 1: تعريف الدوال التي يمكن للذكاء الاصطناعي استخدامها
نبدأ بتعريف “الأدوات” التي سيسمح للنموذج باستخدامها.
الفكرة هنا أن تخبر GPT:
“عندما تحتاج أن تعرف حالة الطقس، يمكنك استخدام هذه الدالة.”
functions = [
{
"name": "get_weather",
"description": "تُعيد حالة الطقس الحالية في مدينة محددة.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "اسم المدينة بالعربية أو الإنجليزية."
}
},
"required": ["city"]
}
}
]
لاحظ:
- الاسم get_weather هو ما سيستخدمه النموذج لاستدعاء الوظيفة.
- الوصف يشرح متى يجب استخدامها.
- المعاملات تحدد البيانات المطلوبة (هنا فقط اسم المدينة).
المرحلة 2: إنشاء الدالة الفعلية في كودك
هنا نكتب الدالة التي تنفّذ المهمة فعلاً — أي تتصل بخدمة الطقس وتعيد النتائج.
import requests
def get_weather(city):
api_key = "ضع مفتاحك هنا"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric&lang=ar"
response = requests.get(url)
data = response.json()
if data.get("cod") != 200:
return {"error": data.get("message", "تعذر جلب البيانات")}
result = {
"city": data["name"],
"temperature": data["main"]["temp"],
"description": data["weather"][0]["description"]
}
return result
هذه الدالة مستقلة — يمكن استدعاؤها يدويًا، أو من قبل الذكاء الاصطناعي لاحقًا.
المرحلة 3: إرسال طلب إلى GPT مع تعريف الدوال
الآن نربط الذكاء الاصطناعي بهذه الدالة عبر واجهة OpenAI الرسمية.
سنستخدم ChatCompletion، ونزوده بكل من:
- الرسالة الأصلية من المستخدم.
- قائمة الدوال (
functions) التي يمكنه استدعاؤها.
from openai import OpenAI
client = OpenAI(api_key="ضع مفتاح OpenAI هنا")
messages = [
{"role": "user", "content": "ما حالة الطقس في القاهرة اليوم؟"}
]
response = client.chat.completions.create(
model="gpt-4o-mini", # يمكنك استخدام gpt-4-turbo أو gpt-5
messages=messages,
functions=functions,
function_call="auto"
)
سيقوم النموذج بتحليل الرسالة، وإذا احتاج استخدام الدالة get_weather،
سيُرجع في الرد جزءًا يسمى function_call.
🔍 المرحلة 4: تحليل استدعاء الدالة وتنفيذها فعليًا
النموذج لا ينفذ الدالة بنفسه، بل يخبرك بما يريد تنفيذه.
لذلك، في الكود نتحقق إن كان هناك استدعاء وظيفة:
message = response.choices[0].message
if message.get("function_call"):
function_name = message["function_call"]["name"]
arguments = message["function_call"]["arguments"]
ثم نستدعي الدالة المقابلة فعليًا في مشروعنا:
if function_name == "get_weather":
city = eval(arguments)["city"]
weather_data = get_weather(city)
🔄 المرحلة 5: إرسال النتيجة مرة أخرى إلى النموذج
الآن لدينا البيانات الفعلية من الإنترنت.
نرسلها مرة أخرى إلى النموذج كي يصيغها برد طبيعي للمستخدم:
second_response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
*messages,
message,
{"role": "function", "name": function_name, "content": str(weather_data)}
]
)
ثم نطبع الرد النهائي:
print(second_response.choices[0].message["content"])
النموذج سيحوّل البيانات الخام إلى جملة طبيعية مثل:
“درجة الحرارة في القاهرة حاليًا 29° مئوية والجو مشمس جزئيًا.”
🔐 المرحلة 6: ملاحظات الأمان والتحكم
عند العمل مع Function Calling، تذكّر دائمًا النقاط التالية:
- النموذج لا ينفذ الكود بنفسه.
هو فقط “يقترح” استدعاء دالة، وأنت من تنفذها. - لا تسمح له إلا بالدوال التي تعرّفها صراحة.
لا تتركه ينفذ أوامر عامة مثلexec()أو الوصول للنظام. - تحقق دائمًا من المعاملات (parameters) قبل تمريرها إلى دالتك.
قد تكون البيانات ناقصة أو غير متوقعة. - استخدم مفاتيح API بشكل آمن (لا تضعها في الكود العام أو المستودعات).
🧠 كيف يمكن تطوير هذا الوكيل لاحقًا؟
بعد بناء النموذج الأساسي، يمكنك إضافة الكثير من الإمكانيات:
| الإضافة | الفائدة |
|---|---|
| دالة get_forecast(days) | لعرض توقعات الأيام القادمة. |
| دالة suggest_outfit() | يقترح الملابس المناسبة حسب حالة الطقس. |
| دمج مع قاعدة بيانات | لتخزين آخر الاستفسارات وتحليلها. |
| دعم لغات متعددة | يمكن للنموذج أن يرد بالعربية أو الإنجليزية حسب المستخدم. |
بمجرد أن تضيف مزيدًا من الدوال، سيتطور وكيلك الذكي ليصبح أكثر فائدة وتفاعلاً.
الخاتمة: خطوة نحو ذكاء اصطناعي فعّال
ميزة Function Calling ليست مجرد تحديث تقني صغير،
بل هي بداية حقبة جديدة تجعل الذكاء الاصطناعي جزءًا من النظام البرمجي الحقيقي.
هي الطريقة التي ينتقل بها الذكاء الاصطناعي من مرحلة “النقاش والتحليل”
إلى مرحلة “الفعل والتنفيذ”.
المطور لم يعد يتعامل مع الذكاء الاصطناعي كمجيب للأسئلة فقط،
بل كعضو في الفريق — يفهم المطلوب، ويقترح الحل، ثم يطلب تنفيذ الوظيفة المناسبة.

