Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 38

وصف أدوات نماذج اللغة

أهلاً بك مرة أخرى!

في درسنا السابق، قمنا ببناء أول "أداة" برمجية لنا: دالة بايثون بسيطة اسمها count_words يمكنها حساب عدد الكلمات في أي نص. لكننا تركنا سؤالاً مهماً معلقاً: كيف سيعرف "عقل" وكيلنا، أي النموذج اللغوي الكبير (LLM)، بوجود هذه الأداة أو كيفية استخدامها؟

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


1. سد الفجوة: من كود بايثون إلى لغة مفهومة

لنتذكر حقيقة أساسية: النموذج اللغوي الكبير (LLM) هو نظام يتعامل مع النصوص. يمكنك أن تعطيه نصاً ويقوم بتوليد نص آخر. إنه لا يفهم كود بايثون مباشرة ولا يمكنه تنفيذ ملف count_words.py. إذاً، كيف يمكننا إخباره بوجود هذه الأداة الرائعة التي بنيناها؟

الحل هو أننا لا نعطيه الكود نفسه، بل نقدم له وصفاً نصياً منظماً للأداة. هذا الوصف يعمل كـ "دليل مستخدم" للنموذج اللغوي.

فكر في الأمر كأنك مدير لفريق عمل. أنت لا تقوم بالمهام الفنية بنفسك، ولكن لديك قائمة بأسماء أعضاء فريقك والمهارات التي يتقنها كل منهم. عندما تأتي مهمة جديدة (مثلاً: "تصميم شعار")، فإنك تبحث في قائمتك عن الشخص الذي يمتلك مهارة "التصميم الجرافيكي" وتوكّل إليه المهمة.

في عالمنا:

  • المدير هو النموذج اللغوي (LLM).
  • أعضاء الفريق هم أدواتنا (دوال بايثون).
  • قائمة المهارات هي "وصف الأداة" الذي سنقوم بإعداده.
  • المهمة الجديدة هي طلب المستخدم (Prompt).

مهمتنا الآن هي كتابة "بطاقة المهارات" الخاصة بدالة count_words بشكل واضح ومنظم.



2. تشريح وصف الأداة (Tool Description)

لكي يفهم النموذج اللغوي هذا الوصف، يجب أن يكون بصيغة موحدة ومتفق عليها. الصيغة الأكثر شيوعاً هي JSON (JavaScript Object Notation). لا تقلق من الاسم، فالـ JSON هو مجرد تنسيق نصي بسيط جداً لتنظيم البيانات على شكل "مفتاح: قيمة" (key: value)، وهو سهل القراءة لكل من البشر والآلات.

يتكون وصف الأداة النموذجي من ثلاثة أجزاء رئيسية:

  1. name (الاسم): اسم الدالة الدقيق كما هو في كود بايثون. هذا هو الاسم الذي سيستخدمه النموذج "لاستدعاء" الأداة.
  2. description (الوصف): شرح واضح باللغة الطبيعية لما تفعله الأداة. هذا هو الجزء الأهم، فالنموذج يعتمد على هذا الوصف ليقرر ما إذا كانت الأداة مناسبة لطلب المستخدم أم لا.
  3. parameters (المعاملات): وصف للمدخلات (arguments) التي تحتاجها الدالة لتعمل. لكل مُدخل، نحدد:
    • اسمه (e.g., text).
    • نوعه (string للنص, number للرقم, etc.).
    • وصفه (ماذا يمثل هذا المدخل؟).
    • ما إذا كان إجبارياً (required).

لنطبق هذا على دالتنا count_words(text):

{
  "name": "count_words",
  "description": "تقوم هذه الدالة بحساب عدد الكلمات في نص معين يتم توفيره.",
  "parameters": {
    "type": "object",
    "properties": {
      "text": {
        "type": "string",
        "description": "النص الذي سيتم تحليل عدد الكلمات فيه."
      }
    },
    "required": ["text"]
  }
}

لنحلل هذا الهيكل:

  • "name": "count_words": أخبرنا النموذج أن اسم الأداة هو count_words.
  • "description": "...": شرحنا له أن وظيفتها هي حساب عدد الكلمات. لو كتبنا وصفاً غامضاً مثل "تعالج النص"، قد يستخدمها النموذج بشكل خاطئ. الوصف الدقيق هو مفتاح النجاح.
  • "parameters": فتحنا قسماً للمدخلات.
    • ضمن "properties", عرفنا مدخلاً واحداً اسمه "text".
    • حددنا أن نوعه "string" (نص).
    • وصفنا وظيفته: "النص الذي سيتم تحليل عدد الكلمات فيه".
    • في "required", أضفنا "text"، مما يعني أنه لا يمكن استدعاء الدالة بدون توفير هذا المدخل.

بهذا الشكل، نحن لم نعطِ النموذج اللغوي الكود، بل أعطيناه "خارطة طريق" واضحة لفهم واستخدام أداتنا.

اختبر فهمك!

في الدرس السابق، قمت بإنشاء دالة get_character_count(text) كتمرين. حاول الآن كتابة وصف JSON لهذه الدالة بنفس الطريقة. يجب أن يوضح الوصف أنها تحسب عدد الحروف وليس الكلمات.

اظهر الإجابة
{
  "name": "get_character_count",
  "description": "تقوم هذه الدالة بحساب عدد الحروف في نص معين، بما في ذلك المسافات.",
  "parameters": {
    "type": "object",
    "properties": {
      "text": {
        "type": "string",
        "description": "النص الذي سيتم حساب عدد حروفه."
      }
    },
    "required": ["text"]
  }
}

لاحظ كيف أن التغيير الرئيسي كان في حقل description ليعكس الوظيفة الدقيقة للأداة الجديدة.



3. كيف يستخدم النموذج اللغوي هذا الوصف؟

الآن بعد أن أصبح لدينا وصف الأداة بصيغة JSON، كيف تحدث عملية التفاعل الكاملة؟

عندما نرسل طلباً للنموذج اللغوي، فإننا نرفق معه قائمة بكل "أوصاف الأدوات" المتاحة. العملية تسير كالتالي:

  1. الطلب: نرسل للنموذج شيئين: طلب المستخدم (مثلاً: "كم عدد الكلمات في 'أهلاً بك في عالم الذكاء الاصطناعي'؟") بالإضافة إلى وصف JSON الخاص بأداة count_words.
  2. التفكير والاختيار: يقرأ النموذج طلب المستخدم، ثم يقرأ وصف الأداة. يلاحظ أن عبارة "كم عدد الكلمات" تتطابق بشكل كبير مع description أداة count_words.
  3. اقتراح الاستدعاء: النموذج لا يعطي إجابة نهائية. بدلاً من ذلك، يرسل لنا رداً منظماً يقول فيه: "لقد قررت أن الأداة الأنسب هي count_words. يرجى استدعاؤها بالمدخل التالي: text: 'أهلاً بك في عالم الذكاء الاصطناعي'".
  4. التنفيذ (في كودنا): يقوم برنامج البايثون الخاص بنا باستلام هذا الاقتراح، وينفذ دالة count_words الفعلية مع النص المطلوب، ويحصل على النتيجة (مثلاً: 6).
  5. الإبلاغ: نأخذ النتيجة (6) ونرسلها مرة أخرى للنموذج قائلين: "نتيجة تنفيذ الأداة كانت 6". عندها فقط، يقوم النموذج بتوليد الرد النهائي للمستخدم بلغة طبيعية: "الجملة تحتوي على 6 كلمات".

الرسم التوضيحي التالي من OpenAI يلخص هذه الدورة بشكل ممتاز.

Function Calling Diagram: Developer-Model Interaction
هذا الرسم يوضح دورة التفاعل الكاملة: 1) المطور يرسل الطلب مع وصف الأداة. 2) النموذج يقرر استدعاء الأداة. 3) المطور ينفذ الكود الفعلي للأداة. 4) المطور يرسل نتيجة التنفيذ للنموذج. 5) النموذج يستخدم النتيجة لصياغة الرد النهائي.


خلاصة الدرس

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

أهم النقاط:

  • النماذج اللغوية لا تفهم كود بايثون مباشرة؛ بل تفهم الأوصاف النصية المنظمة.
  • نستخدم تنسيق JSON لإنشاء "وصف أداة" يتضمن اسمها، وشرحاً لوظيفتها، وتفصيلاً لمدخلاتها.
  • جودة حقل description هي العامل الأهم لكي يتخذ النموذج قراراً صحيحاً باختيار الأداة المناسبة.
  • دورة العمل تتضمن إرسال الوصف، تلقي "اقتراح" باستدعاء الأداة من النموذج، تنفيذها في كودنا، ثم إرسال النتيجة للنموذج لصياغة الرد النهائي.

ماذا بعد؟

لقد قمنا بتجهيز كل شيء نظرياً. لدينا دالة بايثون (count_words) ولدينا وصفها بصيغة JSON. لكن ما زال ينقصنا "الغراء" الذي يربط كل هذه الأجزاء معاً.

في الدرس القادم، سنتعلم تنفيذ آلية لاختيار الأداة المناسبة وتنفيذها بناءً على قرار النموذج. سنكتب كود بايثون الذي يقوم فعلياً بإرسال الطلب والوصف إلى واجهة برمجة التطبيقات (API) للنموذج، ويفسر رده، وينفذ الدالة الصحيحة. سننتقل من التخطيط إلى التنفيذ الفعلي