كان أحد أكبر العوائق في بناء وكلاء ذكاء اصطناعي متينين هو الانفصال بين الطبيعة المرنة والاحتمالية لنماذج اللغات الكبيرة (LLMs) والمتطلبات الحتمية والمحددة للأنظمة الخارجية. كيف يمكن لنموذج يتوقع الرموز التالية أن يتفاعل بدقة مع واجهة برمجة تطبيقات REST، أو يستعلم عن قاعدة بيانات SQL، أو يشغل سير عمل محدد دون أن يهذي بالبارامترات؟ تكمن الإجابة في استدعاء الوظائف (المعروف أيضاً باسم استخدام الأدوات أو الإجراءات).
بالنسبة للمطورين من المستوى المتوسط والمتقدم، يتطلب الانتقال من إكمال المحادثات البسيطة إلى وكلاء وظيفيين تغييراً في طريقة التفكير. لم تعد تقوم فقط بصياغة الأوامر للنموذج؛ بل تقوم بتعريف واجهة قابلة للتنفيذ. يستكشف هذا المنشور بنية استدعاء الوظائف، ويعرض استراتيجيات التنفيذ، ويبرز أفضل الممارسات لضمان الموثوقية.
فهم الآلية
في جوهرها، يسمح استدعاء الوظائف لنموذج اللغات الكبيرة (LLM) بإخراج بيانات هيكلية (عادةً بتنسيق JSON) تمثل اسم الوظيفة وبارامتراتاتها، بدلاً من مجرد نص لغوي طبيعي. تقوم التطبيق باعتراض هذا الرد، وتنفيذ الكود الفعلي، ثم إعادة تغذية النتيجة إلى النموذج.
تحويل هذه العملية لنموذج LLM من مولد للنصوص الثابتة إلى وكيل نشط قادر على التفكير في تغييرات الحالة واسترجاع البيانات. يتبع سير العمل عادةً هذه الحلقة:
- إدخال المستخدم: يرسل المستخدم طلباً.
- قرار النموذج: يحدد نموذج LLM أن هناك حاجة إلى أداة خارجية ويقوم بإخراج كائن استدعاء الوظيفة.
- التنفيذ: يقوم الخادم الخلفي بتحليل بيانات JSON، واستدعاء الوظيفة المحددة، والتقاط المخرجات.
- الرد: يتم إرفاق نتيجة الوظيفة بتاريخ المحادثة.
- المخرج النهائي: يولد نموذج LLM ردًا بلغة طبيعية بناءً على مخرجات الأداة.
تعريف المخطط: العقد
يعتمد نجاح وكيلك بشكل كبير على كيفية تعريفك لوظائفك. تسمح واجهات برمجة التطبيقات الحديثة (مثل OpenAI وAnthropic وMistral) بتوفير تعريف لمخطط JSON لكل أداة متاحة. يعمل هذا المخطط كعقد صارم.
فكر في سيناريو يحتاج فيه وكيل الذكاء الاصطناعي إلى جلب بيانات الطقس. يجب عليك تعريف اسم الوظيفة، ووصف لما تفعله، والبارامترات المتوقعة. إليك مثال عملي باستخدام هيكل واجهة برمجة تطبيقات وهمي يشبه هيكل OpenAI:
const tools = [
{
type: "function",
function: {
name: "get_weather",
description: "Get the current weather in a given location",
parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "The city and state, e.g., San Francisco, CA"
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
description: "The temperature unit to use"
}
},
required: ["location"]
}
}
}
];
لاحظ استخدام enum للوحدة. هذا أمر بالغ الأهمية لتقليل مساحة البحث الخاصة بالنموذج وتقليل الأخطاء. إذا تركت البارامترات غامضة جداً، فقد يقوم النموذج بتمرير سلاسل عشوائية لا يمكن لخادمك الخلفي معالجتها.
التعامل مع الحلقة: تنفيذ متين
يعد تنفيذ حلقة التشغيل هو المكان الذي يواجه فيه العديد من المطورين حالات حافة. من النادر أن يحصل نموذج LLM على الأمر بشكل صحيح في المحاولة الأولى، خاصة مع التفكير المعقد متعدد الخطوات. يجب عليك تنفيذ معالجة الأخطاء لبيانات JSON غير الصالحة أو فشل مكالمات واجهة برمجة التطبيقات.
عندما يقوم النموذج بإخراج استدعاء وظيفة، يجب أن يبدو كودك شيئاً مثل هذا:
async function handleModelResponse(response) {
if (response.choices[0].finish_reason === 'function_call') {
const call = response.choices[0].message.function_call;
// 1. Execute the function
let result;
try {
result = await executeTool(call.name, call.arguments);
} catch (error) {
result = { error: "Failed to execute function" };
}
// 2. Append result to conversation
const conversationHistory = [
...previousMessages,
response.choices[0].message,
{
role: "function",
name: call.name,
content: JSON.stringify(result)
}
];
// 3. Send back to model for final answer
return await getModelFinalAnswer(conversationHistory);
}
}
من خلال تمرير role: "function" صراحةً مرة أخرى إلى النموذج، تغلق الحلقة. يمتلك النموذج الآن سياق البيانات المسترجعة ويمكنه صياغة رد متماسك، مثل "الطقس الحالي في سان فرانسيسكو هو 72 درجة فهرنهايت."
الخاتمة
يُعد استدعاء الوظائف العمود الفقري لوكيل الذكاء الاصطناعي الحديث. فهو يسمح لنماذج اللغات الكبيرة (LLMs) بتجاوز توليد النصوص والتفاعل مع العالم الرقمي بفعالية. بالنسبة للمطورين، فإن النقطة الرئيسية هي أن الهيكلية أمر بالغ الأهمية. من خلال توفير مخططات واضحة، ومعالجة أخطاء متينة، وحلقة تنفيذ محددة جيداً، يمكنك بناء وكلاء ليسوا مجرد عروض ديمو مذهلة، بل أدوات جاهزة للإنتاج وموثوقة.
مع تحسن قدرات النماذج في التفكير، ستقل احتكاك استدعاء الوظائف، لكن البنية الأساسية ستبقى كما هي: حدد الأداة، نفذ النية، وادمج النتيجة.