Semantic Kernel and AutoGen

 لو أنت داخل مجال الذكاء الاصطناعي جديد، أو حتى شغال فيه، أكيد سمعت عن "العملاقين" بتوع مايكروسوفت: Semantic Kernel و AutoGen. الاتنين دول هما اللي شايلين الليلة دلوقتي في بناء برامج وتطبيقات الـ AI.
عشان نفهمهم من غير تعقيد وكلام مجعلص، تعال نتخيل إننا بنفتح "مطعم كبير" 🍽️، ونشوف كل واحد فيهم هيعمل إيه في المطعم ده.

1. الـ Semantic Kernel (المدير التنفيذي والرباط) 🧠🔗

ده تقدر تعتبره "شيف المطبخ والمدير" اللي بيربط كل حاجة ببعضها. الـ Semantic Kernel (واختصاره SK) هو الجسر اللي بيخلي الكود التقليدي بتاع زمان (زي Python أو #C) يفهم لغة نماذج الذكاء الاصطناعي (زي GPT-4).
  • بيعمل إيه؟ بياخد الأوامر منك، ويروح يربطها بقاعدة البيانات، أو يخلّي الـ AI ينفذ وظيفة معينة (بلاك بوكس/Plugins) جوه السيستم بتاعك بأمان واستقرار.
  • رمزه في مطعمنا: 👨‍🍳 الشيف الكبير. هو اللي واقف في المطبخ، في إيده السكينة (الكود) وفي دماغه الوصفة (الـ AI)، وبيطلع لك الطبق مظبوط وثابت كل مرة.

2. الـ AutoGen (شلة الموظفين والوكلاء) 🤝🤖

ده بقى حكاية تانية خالص! ده مش مجرد شيف واقف لوحده، ده إطار عمل معمول عشان يعمل "اجتماعات ومناقشات" بين كذا ذكاء اصطناعي (Multi-Agents). يعني بتعمل فريق عمل كامل، وكل واحد ليه وظيفة، وبيقعدوا يكلموا بعض لحد ما يحلوا المشكلة.
  • بيعمل إيه؟ بتبرمج فيه "وكيل" بيفهم في البرمجة، و"وكيل" تاني بيفهم في المراجعة، و"وكيل" تالت بيفهم في التسويق. الـ AutoGen بيخليهم يتناقشوا مع بعض، ويردوا على بعض تلقائي عشان يخلصوا لك الشغلانة.
  • رمزه في مطعمنا: 👥 طاقم إدارة المطعم بالكامل. (المحاسب، ومسؤول المشتريات، ومدير الصالة). بيقعدوا مع بعض في اجتماع: المحاسب يقول "الميزانية كام"، ومسؤول المشتريات يرد "هنجيب خضار بكذا"، وهكذا لحد ما الليلة تمشي.

💡 مثال عملي يفهمك الفرق (حكاية "منيو المطعم") 📜

تخيل إننا عاوزين نعمل "منيو أكلات جديد للمطعم":
  • لو استخدمنا Semantic Kernel (👨‍🍳):
    أنت هتدخل على السيستم وتقول له: "يا شيف، اقترح لي أكلة جديدة". الشيف (SK) هيروح بسرعة يبص في المخزن يشوف إيه المكونات المتاحة (قاعدة البيانات)، ويطلب من الـ AI يختار أكلة، ويطلع لك النتيجة: "مكرونة بالبشاميل" بصورة مباشرة ومنظمة. خطوة واحدة سريعة ومستقرة.
  • لو استخدمنا AutoGen (👥):
    هنا الموضوع بيبقى "ورشة عمل"! هتعمل 3 وكلاء أذكياء:
    1. الوكيل المبتكر (Chef Agent): "أنا باقترح نعمل سوشي مقلي!" 🍣
    2. الوكيل المالي (Finance Agent): "لا يا عم، السوشي غالي والميزانية مش هتكفي، خلينا في حاجة موفرة." 💰
    3. وكيل الجودة (Quality Agent): "طب إيه رأيكم في حواوشي بخلطة سرية؟ رخيص والناس بتحبه." 🥩
      يقعدوا يكلموا بعض ويردوا على بعض جوه الكود، وفي الآخر يطلعوا لك بالقرار الصح بعد مناقشة طويلة.

⚙️ ملخص الاستخدام (امتى تختار مين؟)

  • استخدم Semantic Kernel (🧠🔗) لو عندك برنامج أو موقع لشركة، وعاوز تدخّل فيه ذكاء اصطناعي يعمل مهمة محددة بدقة، وأمان، ومن غير لف ودوران (برامج الشركات الكبيرة Enterprise).
  • استخدم AutoGen (🤝🤖) لو بتعمل مشروع معقد محتاج "تفكير جماعي"، أو عاوز تبني نظام يحل مشاكل برمجية معقدة، أو يعمل عصف ذهني (Brainstorming) ويطلع أفكار لوحده.
ملحوظة على الماشي: مايكروسوفت صايعة، وعارفة إن الاتنين جامدين، فعشان كده دمجتهم مؤخراً في نظام واحد اسمه Microsoft Agent Framework عشان تقدر تخلي الشيف والوكلاء يشتغلوا في نفس المطبخ مع بعض! 😉

في المثال ده، هنعمل وكيل ذكاء اصطناعي (Agent) ونربطه بكود دوت نت حقيقي (Plugin) عشان نخليه يقدر يحسب الخصومات في المطعم بتاعنا تلقائيًا. [3, 4]

1. تجهيز المشروع وتثبيت المكتبات 📦

افتح الـ Terminal عندك واكتب الأوامر دي لإنشاء مشروع جديد وتثبيت مكتبات مايكروسوفت الحديثة للـ Agents والـ AI: [5, 6]
dotnet new console -n RestaurantAgentDemo
cd RestaurantAgentDemo
# تثبيت مكتبات الذكاء الاصطناعي والـ Agents من مايكروسوفت
dotnet add package Microsoft.Agents.AI --version 1.0.0
dotnet add package Microsoft.Extensions.AI --version 1.0.0
dotnet add package Microsoft.Extensions.AI.OpenAI --version 1.0.0

2. كتابة كود البرمجة (Program.cs) 💻

امسح الكود القديم في ملف Program.cs وحط الكود ده، اللي بيشرح نفسه خطوة بخطوة:
using System;
using System.Threading.Tasks;
using Microsoft.Agents.AI; // مكتبة الوكلاء الأذكياء
using Microsoft.Extensions.AI; // مكتبة التجريد الأساسية للـ AI
using OpenAI; // مكتبة OpenAI
class Program
{
static async Task Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine("🤖 مرحبًا بك في نظام إدارة المطعم الذكي!");
// 1. إعداد اتصال بموديل الذكاء الاصطناعي (مثلاً GPT-4o mini)
// ملحوظة: تأكد من وضع مفتاح الـ API الخاص بك في بيئة النظام
string apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? "YOUR_API_KEY";
IChatClient chatClient = new OpenAIClient(apiKey)
.AsChatClient("gpt-4o-mini");
// 2. إنشاء الوكيل (Agent) وتحديد هويته ووظيفته (زي الشيف والمدير)
ChatClientAgent restaurantAgent = new ChatClientAgent(chatClient)
{
Name = "RestaurantManager",
Instructions = """
أنت مدير مطعم مصري ذكي ومحترف ومرحب بالزبائن.
وظيفتك الإجابة على استفسارات المنيو وحساب الفاتورة النهائية للزبون.
استخدم الأداة المتاحة لديك لحساب الخصومات بدقة دائماً قبل إعطاء السعر النهائي.
تحدث دائمًا باللهجة المصرية الخفيفة والمرحبة.
"""
};
// 3. إضافة المكونات الإضافية (Plugins/Tools) - كود دوت نت حقيقي بيحسب الخصم
// بنخلّي الـ AI يشوف الدالة دي ويقدر يستدعيها لما يحتاجها
restaurantAgent.Tools.Add(AIFunctionFactory.Create(CalculateDiscount));
// 4. بدء محادثة تجريبية مع الوكيل
string userMessage = "لو سمحت أنا طلبت أكل بـ 500 جنيه، وعاوز أعرف الحساب كام بعد الخصم؟";
Console.WriteLine($"\n👨 الزبون: {userMessage}");
// إرسال الرسالة وانتظار الرد (الـ AI هيفهم لوحده إنه لازم ينفذ دالة الخصم الأول)
var response = await restaurantAgent.InvokeAsync(userMessage);
Console.WriteLine($"\n🤖 المدير: {response.Message.Text}");
}
/// <summary>
/// دالة دوت نت تقليدية (Native Function) لحساب الخصم للمطعم
/// </summary>
static double CalculateDiscount(double originalPrice)
{
Console.WriteLine($"\n[⚙️ سيستم دوت نت]: جاري حساب الخصم للمبلغ {originalPrice} جنيه...");
// لو الطلب بـ 300 جنيه أو أكتر ياخد خصم 15%
if (originalPrice >= 300)
{
return originalPrice * 0.85;
}
return originalPrice; // مفيش خصم
}
}

🔥 إيه اللي بيحصل ورا الكواليس في الكود ده؟

  1. الـ Kernel/Agent الشغال (🧠): عطينا للذكاء الاصطناعي "شخصية" مدير المطعم المصري عبر الـ Instructions.
  2. الربط مع الـ C# (🔗): السطر restaurantAgent.Tools.Add(...) ده هو جوهر الـ Semantic Kernel؛ بياخد كود السي شارب العادي ويحوله لـ Tool يفهمها الموديل.
  3. الذكاء واتخاذ القرار (🤖): لما الزبون قال "بـ 500 جنيه وعاوز الخصم"، الـ AI مش هيخمن الحساب من دماغه؛ هو ذكي كفاية إنه هيوقف المحادثة لحظة، ويروح يستدعي دالة CalculateDiscount اللي كتبناها بالـ C#، وياخد النتيجة الصح (425 جنيه)، ويرجع يصيغها ليك بأسلوب مصري جميل ولطيف.
تعال نفصص الكود اللي فات حتة حتة ونشوف فين الـ Semantic Kernel وفين الـ AutoGen بالظبط ورا الكواليس:

1. فين الـ Semantic Kernel (الرباط وطبقة الـ SDK)؟ 🧠🔗

جزء الـ Semantic Kernel في الكود بيظهر في ربط كود الـ C# العادي بالذكاء الاصطناعي، وإدارة الأدوات والاتصال بالـ API.
شوف السطور دي من الكود:
// 1. دي وظيفة Semantic Kernel: التجريد والاتصال بموديل الذكاء الاصطناعي
IChatClient chatClient = new OpenAIClient(apiKey).AsChatClient("gpt-4o-mini");

// 2. دي الوظيفة الجوهرية لـ Semantic Kernel: تحويل دالة C# عادية إلى أداة يفهمها الـ AI (Native Function / Plugin)
restaurantAgent.Tools.Add(AIFunctionFactory.Create(CalculateDiscount));
  • ليه ده Semantic Kernel؟ لأن وظيفة الـ Semantic Kernel الأساسية هي إنه يعمل كـ "مترجم" أو "جسر". هو اللي أخد دالة الـ C# التقليدية (CalculateDiscount) وخلاها تظهر للذكاء الاصطناعي كـ "أداة" (Tool) يقدر يستدعيها وينفذها في الوقت المناسب. من غير الجزء ده، الـ AI هيكون مجرد شات بوت أعمى ما يعرفش أي حاجة عن نظام الفواتير بتاعك.

2. فين الـ AutoGen (مفهوم الوكيل الذكي ومستقبل المحادثات)؟ 🤝🤖

جزء الـ AutoGen بيظهر في طريقة تعريف وتغليف الذكاء الاصطناعي على شكل "وكيل مستقل" (Agent) له اسم، ووظيفة، وتوجيهات محددة، ويقدر ياخد قرارات لوحده ويتكلم بالنيابة عن السيستم.
شوف السطر ده من الكود:
// دي وظيفة AutoGen: إنشاء "وكيل" مستقل (Agent) له شخصية ووظيفة محددة
ChatClientAgent restaurantAgent = new ChatClientAgent(chatClient)
{
    Name = "RestaurantManager",
    Instructions = "أنت مدير مطعم مصري ذكي... استخدم الأدوات لحساب الخصم..."
};
  • ليه ده AutoGen؟ لأنك مش بتنادي على الـ AI بشكل مباشر وتبعت له نص عادي (زي الشغل التقليدي)؛ أنت هنا صممت كائن برامجي (Object) اسمه Agent. الـ AutoGen هو اللي بيخليه يتصرف كـ "موظف" مستقل في المطعم.
  • بروح الـ AutoGen: في المثال اللي فات، إحنا عملنا وكيل واحد بس (restaurantAgent). لكن البنية دي مجهزة تماماً إنك تعمل سطر تاني وتنشئ وكيل تاني وتسميه ChefAgent وتخليهم يكلموا بعض (وهي دي الميزة القاتلة للـ AutoGen).

📊 ملخص الحكاية في جدول صغير:

الميزة في الكودمين المسؤول عنها؟بتعمل إيه بالظبط؟
Tools.Add(...)Semantic Kernel ⚙️ربطت الـ AI بالـ Database أو بكود الـ C# بتاعك (حساب الخصم).
ChatClientAgentAutoGen 🤖عملت الـ AI على شكل "موظف/وكيل" مستقل له اسم ووظيفة وشخصية.
InvokeAsyncالاتنين مع بعض 🔄الوكيل (AutoGen) فكّر، واستخدم المترجم (Semantic Kernel) عشان يشغل دالة الـ C#، ورجع رد عليك.


اربط الحزام بقى عشان هتشوف سحر الـ AutoGen الحقيقي لما نعمل "شلة وكلاء" يكلموا بعض ويردوا على بعض جوه كود الـ #C! 😉
في المثال ده، هنعمل وكيلين (Agents):
  1. المدير (RestaurantManager): بيستقبل طلب الزبون ويرحب بيه بالمصري.
  2. المحاسب (Accountant): ده راجل دحيح وبتاع أرقام، وظيفته ياخد السعر، ويشغل دالة الـ C# ويطلع الحسبة المظبوطة.

الكود المطور (Program.cs) 💻

امسح الكود القديم وحط الكود ده، وركز في طريقة ربطهم ببعض:
using System;
using System.Threading.Tasks;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using OpenAI;

class Program
{
    static async Task Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;
        Console.WriteLine("🤖 مرحبًا بك في ورشة عمل المطعم الذكي (Multi-Agent System)!\n");

        // إعداد الاتصال بالـ AI
        string apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? "YOUR_API_KEY";
        IChatClient chatClient = new OpenAIClient(apiKey).AsChatClient("gpt-4o-mini");

        // -------------------------------------------------------------
        // [الجزء الأول: AutoGen] - إنشاء فريق العمل (الوكلاء)
        // -------------------------------------------------------------

        // 1. وكيل المدير: وظيفته العلاقات العامة والترحيب
        ChatClientAgent managerAgent = new ChatClientAgent(chatClient)
        {
            Name = "Manager",
            Instructions = """
            أنت مدير مطعم مصري مرحب ومرح جداً. وظيفتك ترحب بالزبون بأسلوب مصري جميل.
            عندما يطلب الزبون حساب الفاتورة، لا تحسبها بنفسك أبداً، بل اطلب من "Accountant" أن يحسبها.
            """
        };

        // 2. وكيل المحاسب: وظيفته الحسابات الدقيقة واستخدام الأدوات
        ChatClientAgent accountantAgent = new ChatClientAgent(chatClient)
        {
            Name = "Accountant",
            Instructions = """
            أنت محاسب المطعم الدقيق جداً. تتحدث بلهجة مصرية جادة ومحترفة.
            وظيفتك الوحيدة هي حساب الخصومات الفاتورة باستخدام الأداة المتاحة لديك فقط.
            بعد الحساب، أعطِ الناتج النهائي للمدير (Manager).
            """
        };

        // -------------------------------------------------------------
        // [الجزء الثاني: Semantic Kernel] - إعطاء المحاسب أدوات حقيقية
        // -------------------------------------------------------------
        accountantAgent.Tools.Add(AIFunctionFactory.Create(CalculateDiscount));

        // -------------------------------------------------------------
        // [الجزء الثالث: AutoGen المتقدم] - دمجهم في "غرفة محادثة جماعية"
        // -------------------------------------------------------------
        // بنعمل Group Chat وبنحط فيها الوكلاء بتوعنا عشان يبدأوا يتكلموا سوا
        AgentGroupChat groupChat = new AgentGroupChat(managerAgent, accountantAgent);

        // رسالة الزبون اللي هتشغل الليلة
        string customerRequest = "يا مدير، أنا طلبت أكل بـ 600 جنيه، احسبلي الحساب كام؟";
        Console.WriteLine($"👨 الزبون: {customerRequest}\n");

        // بنضيف رسالة الزبون لغرفة المحادثة
        groupChat.AddMessage(new ChatMessage(ChatRole.User, customerRequest));

        // بنخلي الوكلاء يكلموا بعض لمدة "3 خطوات" (جولات) ورا بعض ونشوف هيقولوا إيه
        int turnCount = 1;
        await foreach (var message in groupChat.GetChatMessagesAsync())
        {
            if (turnCount > 3) break; // نكتفي بـ 3 ردود متبادلة

            Console.WriteLine($"💬 [الخطوة {turnCount}] {message.AuthorName}: {message.Text}");
            turnCount++;
        }
    }

    /// <summary>
    /// دالة دوت نت التقليدية (Semantic Kernel Tool) لحساب الخصم
    /// </summary>
    static double CalculateDiscount(double originalPrice)
    {
        Console.WriteLine($"   ⚙️ [سيستم C#]: جاري تشغيل الدالة الحسابية للمبلغ {originalPrice} جنيه...");
        return originalPrice * 0.80; // خصم 20% للمبالغ الكبيرة
    }
}

🎬 السيناريو اللي هيحصل قدام عينك في الـ Console (شرح العرض):

لما تشغل البرنامج، الحوار هيمشي كأنه مسرحية تلقائية كالتالي:
  1. الخطوة 1 (المدير - Manager):
    "يا مرحب بيك يا فندم! منور مطعمنا والله. من عيوني الإثنين، هخلي المحاسب بتاعنا حالا يشوفلك الخصم كام.. يا متر محاسب (Accountant) شوف الأستاذ حسابه كام بعد الخصم لوسمحت."
  2. الخطوة 2 (المحاسب - Accountant):
    هنا المحاسب هيفهم إنه لازم يحسب. قبل ما يتكلم، الـ Semantic Kernel هيشتغل في الخلفية ويشغل دالة CalculateDiscount عشان يحسب الـ 600 جنيه (تطلع 480).
    المحاسب يرد: "أهلاً بك يا فندم. بناءً على السيستم، الحساب الأصلي 600 جنيه، وبعد تطبيق خصم الـ 20%، الحساب النهائي هو 480 جنيه يا مدير."
  3. الخطوة 3 (المدير - Manager):
    "تسلم إيدك يا متر! شفت بقى يا فندم؟ حسابك طلع 480 جنيه بس يا باشا، ألف هنا وشفا على قلبك!"

💡 الخلاصة النهائية عشان تثبت في دماغك:

  • الـ AutoGen هو اللي عمل "غرفة الدردشة" (AgentGroupChat) وخلى المدير والمحاسب يمرروا الكلام لبعض ويفهموا أدوارهم من غير ما أنت تكتب if/else لكل واحد.
  • الـ Semantic Kernel هو اللي كان مستخبي جوه جيب المحاسب (Tools.Add)، وأول ما المحاسب احتاج يحسب بجد، طلع الـ Tool وشغل كود الـ C# ورجع النتيجة للـ AI.
لو جربت الكود ده عندك، هتنبهر من كمية الـ "ذكاء" والتنسيق اللي بيحصل بين الوكلاء وبعضهم! هل الفكرة بقت واضحة كدة والفرق بينهم نور في دماغك؟

Comments

Popular posts from this blog

Best Practices for Storing and Loading JSON Objects from a Large SQL Server Table Using .NET Core

Maxpooling vs minpooling vs average pooling

Understand the Softmax Function in Minutes