
في هذا الفصل، سنغوص في قلب الوكيل الذكي: العملية التي يحول بها طلبًا نصيًا عامًا من المستخدم إلى خطة تنفيذية منظمة وقابلة للتنفيذ آليًا. هذه هي الخطوة الأكثر حسماً والتي تميز النظام الذكي عن مجرد برنامج نصي بسيط.
قد يتساءل البعض: لماذا هذا التعقيد؟ لماذا لا نأخذ الطلب "ابحث عن آخر أخبار الذكاء الاصطناعي وارسل لي ملخصًا على الإيميل" وننفذه مباشرة ببضعة أسطر من الكود؟ الجواب يكمن في المرونة، القوة، والقابلية للتوسع.
لتحويل الطلب إلى خطة، يحتاج نظامنا إلى ثلاثة مكونات تعمل بتناغم:
هذه هي الوحدة المسؤولة عن فهم "النية" العامة من الطلب. لا تحلل التفاصيل الدقيقة للخطوات بعد، بل تحدد المجال والهدف العام. على سبيل المثال، من طلب "رتب ملفات مشروعي في مجلدات حسب الامتداد" تستنتج أن النية هي "تنظيم الملفات".
قاعدة بيانات تحتوي على جميع الإجراءات الأولية (Primitive Actions) التي يمكن للوكيل القيام بها. كل أداة لها وصف دقيق لوظيفتها، ومعاملات الإدخال المطلوبة، ونوع المخرجات. أمثلة: search_web(query), send_email(to, subject, body), read_file(path).
العقل المدبر. يأخذ النية من المحلل، وينظر إلى مكتبة الأدوات المتاحة، ويبني خطة هرمية (شجرة) من المهام. يستخدم غالبًا نماذج لغة كبيرة (LLMs) لقدرتها الفائقة على فهم السياق وتوليد نص منظم.
لنقم ببناء نموذج أولي لمخطّط يستدعي واجهة نموذج لغة (مثل OpenAI GPT) لتحويل الطلب إلى خطة JSON منظمة. سنفترض أن لدينا مجموعة أدوات محددة مسبقًا.
ننشئ كائنًا يصف جميع الأدوات المتاحة للوكيل. هذا الكائن سيرسل لاحقًا إلى الـ LLM لمساعدته في التخطيط.
// تعريف الأدوات المتاحة للوكيل
const availableTools = {
searchWeb: {
description: "يبحث على الإنترنت عن معلومات باستخدام استعلام معين. يُستخدم لجمع البيانات أو الإجابات من الويب.",
parameters: {
query: { type: "string", description: "استعلام البحث" }
},
returns: "مصفوفة من النتائج (العناوين، الروابط، المقتطفات)."
},
processData: {
description: "يحلل ويلخص أو يستخرج معلومات محددة من نص معين.",
parameters: {
text: { type: "string", description: "النص المراد معالجته" },
instruction: { type: "string", description: "تعليمات المعالجة (مثل 'لخص'، 'استخرج التواريخ')" }
},
returns: "النص الناتج بعد المعالجة."
},
sendEmail: {
description: "يرسل رسالة بريد إلكتروني إلى مستلم واحد أو أكثر.",
parameters: {
to: { type: "string", description: "عنوان البريد الإلكتروني للمستلم" },
subject: { type: "string", description: "موضوع الرسالة" },
body: { type: "string", description: "محتوى الرسالة" }
},
returns: "تأكيد الإرسال أو خطأ."
},
readDirectory: {
description: "يقرأ محتويات مجلد معين في نظام الملفات.",
parameters: {
path: { type: "string", description: "المسار إلى المجلد" }
},
returns: "مصفوفة بأسماء الملفات والمجلدات الفرعية."
}
};
جاري تحميل التقييمات...