بناء أنظمة الذكاء الاصطناعي متعددة الوكلاء باستخدام Microsoft Agent Framework

· 12 دقيقة قراءة

مقدمة

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

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

يمنح Microsoft Agent Framework، وهو جزء من النظام البيئي Semantic Kernel الأوسع، لمطوري .NET مجموعة أدوات من الدرجة الأولى لبناء هذه الأنواع من الأنظمة بالضبط. في هذا المنشور، سننتقل من الصفر إلى مسار عمل متعدد الوكلاء يعمل بشكل كامل، ويغطي المفاهيم الأساسية وأنماط التنسيق والتعليمات البرمجية العملية التي تحتاجها للبدء.

ما هو إطار عمل وكيل Microsoft؟

يعد Agent Framework بمثابة إجابة Microsoft لبناء وتنسيق ونشر وكلاء الذكاء الاصطناعي والأنظمة متعددة الوكلاء في .NET. إنه يجلس جنبًا إلى جنب مع Semantic Kernel ويتكامل معه بشكل عميق، وهو عبارة عن SDK مفتوح المصدر من Microsoft لتنسيق الذكاء الاصطناعي منذ عام 2023.

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

يدعم إطار العمل العديد من موفري النماذج بما في ذلك Azure OpenAI وOpenAI والنماذج المستضافة على Azure AI Foundry. إنه لا يعتمد على النماذج في التصميم ولكنه متكامل بعمق مع نظام Azure البيئي، مما يجعله مقنعًا بشكل خاص لسيناريوهات المؤسسات.

تشمل القدرات الرئيسية ما يلي:

  • أنواع الوكلاء المتعددة: ChatCompletionAgent، وOpenAIAssistantAgent، وAzureAIAgent للواجهات الخلفية المختلفة
  • أنماط التنسيق: سير عمل الدردشة التسلسلية والمتزامنة والتسليم والجماعية
  • نظام المكونات الإضافية: توسيع الوكلاء باستخدام وظائف C# الأصلية، ومواصفات OpenAPI، وأدوات بروتوكول سياق النموذج (MCP)
  • إدارة المحادثة: الترابط المضمن وإدارة السجل واستراتيجيات الإنهاء
  • قابلية الملاحظة: التكامل مع OpenTelemetry لتتبع تفاعلات الوكيل

المفاهيم الأساسية

قبل أن نكتب أي كود، دعونا نحدد المفردات. يدور إطار عمل الوكيل حول بعض التجريدات الأساسية.

الوكلاء

الوكيل هو كيان مدعوم بنموذج الذكاء الاصطناعي، ويتم تكوينه بتعليمات محددة (موجه النظام)، واسم، واختياريًا مجموعة من المكونات الإضافية أو الأدوات. كل وكيل هو متخصص - أنت تحدد ما يعرفه، وما يمكنه فعله، وكيف يجب أن يتصرف.

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

ChatCompletionAgent agent = new()
{
    Name = "Reviewer",
    Instructions = "You are a senior code reviewer. Analyze the provided code for bugs, security issues, and style violations. Be concise and actionable.",
    Kernel = kernel
};

OpenAIAssistantAgent

يستفيد نوع الوكيل هذا من واجهة برمجة التطبيقات OpenAI Assistants API، التي توفر حالة المحادثة من جانب الخادم، ومعالجة الملفات، وتفسير التعليمات البرمجية. إنها ثقيلة الوزن ولكنها تمنحك سلاسل رسائل مستمرة وأدوات مدمجة مثل مترجم التعليمات البرمجية والبحث عن الملفات.

OpenAIAssistantAgent agent = await OpenAIAssistantAgent.CreateAsync(
    clientProvider: clientProvider,
    definition: new OpenAIAssistantDefinition("gpt-4o")
    {
        Name = "DataAnalyst",
        Instructions = "You analyze datasets and produce statistical summaries."
    }
);

وكيلGroupChat

هذا هو المنسق. AgentGroupChat يدير المحادثات متعددة الأدوار بين عدة وكلاء، ويتحكم في من يتحدث بعد ذلك، ومتى تنتهي المحادثة، وكيفية مشاركة السجل. إنه المكان الذي يحدث فيه سحر التعاون متعدد الوكلاء.

أنماط التنسيق

يدعم إطار العمل أربعة أنماط تزامن أساسية، كل منها يناسب مشاكل مختلفة.

متسلسل

ينفذ الوكلاء واحدًا تلو الآخر بترتيب محدد. يتم تغذية مخرجات الوكيل A إلى الوكيل B، الذي يتم تغذية مخرجاته إلى الوكيل C. وهذا مثالي لخطوط الأنابيب: مسودة → مراجعة → تحرير → نشر.

// Conceptual flow
var draft = await writerAgent.InvokeAsync("Write a blog post about .NET 9");
var reviewed = await reviewerAgent.InvokeAsync($"Review this: {draft}");
var edited = await editorAgent.InvokeAsync($"Edit based on feedback: {reviewed}");

متزامنة

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

التسليم

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

دردشة جماعية

يشارك العديد من الوكلاء في محادثة مفتوحة، ويتناوبون بناءً على استراتيجية الاختيار. تطبق فئة AgentGroupChat هذا النمط من خلال منطق أخذ الأدوار والإنهاء القابل للتكوين.

بناء وكيلك الأول

دعونا نصبح عمليين. فيما يلي كيفية إنشاء وكيلك الأول خطوة بخطوة.

المتطلبات الأساسية

سوف تحتاج إلى:

  • .NET 9 SDK
  • مورد Azure OpenAI بنموذج منشور (على سبيل المثال، gpt-4o)
  • Visual Studio أو VS Code

إعداد المشروع

قم بإنشاء تطبيق وحدة تحكم جديد وقم بتثبيت الحزم المطلوبة:

dotnet new console -n AgentDemo
cd AgentDemo
dotnet add package Microsoft.SemanticKernel --prerelease
dotnet add package Microsoft.SemanticKernel.Agents.Core --prerelease
dotnet add package Azure.AI.OpenAI
dotnet add package Azure.Identity

إنشاء وكيل بسيط

أولاً، قم بإعداد النواة باستخدام تكوين Azure OpenAI الخاص بك:

using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;

var builder = Kernel.CreateBuilder();

builder.AddAzureOpenAIChatCompletion(
    deploymentName: "gpt-4o",
    endpoint: "https://your-resource.openai.azure.com/",
    credentials: new DefaultAzureCredential()
);

Kernel kernel = builder.Build();

الآن قم بإنشاء وكيل واستدعائه:

ChatCompletionAgent agent = new()
{
    Name = "TechWriter",
    Instructions = """
        You are a technical writer specializing in software documentation.
        Write clear, concise content aimed at experienced developers.
        Use code examples when appropriate.
        Always structure your output with headings and bullet points.
        """,
    Kernel = kernel
};

ChatHistory history = new();
history.AddUserMessage("Explain dependency injection in .NET in 200 words.");

await foreach (ChatMessageContent response in agent.InvokeAsync(history))
{
    Console.WriteLine(response.Content);
}

هذا كل شيء. لديك وكيل العمل. لكن القوة الحقيقية تأتي عندما يعمل الوكلاء معًا.

تنسيق متعدد الوكلاء باستخدام AgentGroupChat

دعونا نبني شيئًا أكثر إثارة للاهتمام — دردشة جماعية يتعاون فيها العديد من الوكلاء. يدير الفصل AgentGroupChat تدفق المحادثة، بما في ذلك من يتحدث بعد ذلك ومتى يتوقف.

تعريف الوكلاء

سنقوم بإنشاء ثلاثة وكلاء: كاتب، ومراجع، ومحرر.

ChatCompletionAgent writer = new()
{
    Name = "Writer",
    Instructions = """
        You are a content writer. When given a topic, produce a well-structured
        draft. Focus on clarity and technical accuracy.
        When you receive feedback from the Reviewer, incorporate it into a
        revised draft.
        """,
    Kernel = kernel
};

ChatCompletionAgent reviewer = new()
{
    Name = "Reviewer",
    Instructions = """
        You are a content reviewer. Analyze drafts for technical accuracy,
        clarity, and completeness. Provide specific, actionable feedback.
        Do NOT rewrite the content  only provide feedback.
        When the content meets your standards, respond with: APPROVED
        """,
    Kernel = kernel
};

ChatCompletionAgent editor = new()
{
    Name = "Editor",
    Instructions = """
        You are an editor. Once content is approved by the Reviewer,
        polish it for grammar, tone, and formatting.
        Output only the final polished version.
        When you have produced the final version, respond with: COMPLETE
        """,
    Kernel = kernel
};

إعداد الدردشة الجماعية

يحتاج AgentGroupChat إلى تكوينين رئيسيين: استراتيجية الاختيار (من يتحدث بعد ذلك) و استراتيجية الإنهاء (متى يتوقف).

AgentGroupChat chat = new(writer, reviewer, editor)
{
    ExecutionSettings = new()
    {
        SelectionStrategy = new SequentialSelectionStrategy(),
        TerminationStrategy = new ApprovalTerminationStrategy()
        {
            Agents = [editor],
            MaximumIterations = 12
        }
    }
};

استراتيجية الإنهاء المخصصةتحدد استراتيجية الإنهاء متى تنتهي المحادثة. إليك كلمة مخصصة تبحث عن الكلمة الأساسية “مكتملة”:

class ApprovalTerminationStrategy : TerminationStrategy
{
    protected override Task<bool> ShouldAgentTerminateAsync(
        Agent agent,
        IReadOnlyList<ChatMessageContent> history,
        CancellationToken cancellationToken = default)
    {
        bool isComplete = history
            .Last()
            .Content?
            .Contains("COMPLETE", StringComparison.OrdinalIgnoreCase) ?? false;

        return Task.FromResult(isComplete);
    }
}

تشغيل المحادثة

ابدأ المحادثة برسالة مستخدم واسمح للوكلاء بالتعاون:

chat.AddChatMessage(
    new ChatMessageContent(AuthorRole.User,
        "Write a 300-word technical overview of gRPC vs REST for microservices.")
);

await foreach (ChatMessageContent message in chat.InvokeAsync())
{
    Console.WriteLine($"[{message.AuthorName}]: {message.Content}");
    Console.WriteLine("---");
}

سيبدو التدفق كما يلي:

  1. الكاتب ينتج مسودة
  2. المراجع يقدم الملاحظات
  3. الكاتب يراجع بناءً على التعليقات
  4. المراجع يقول “تمت الموافقة عليه”
  5. المحرر يصقل ويقول “مكتمل”
  6. تنتهي المحادثة

يستمر هذا ذهابًا وإيابًا تلقائيًا حتى يتم استيفاء شرط الإنهاء أو الوصول إلى MaximumIterations.

الإضافات والأدوات

يصبح الوكلاء أقوياء حقًا عندما يمكنهم التفاعل مع الأنظمة الخارجية. يدعم Agent Framework ثلاث آليات تمديد رئيسية.

الوظائف الأصلية (مكونات Kernel الإضافية)

يمكنك منح الوكلاء إمكانية الوصول إلى أساليب C# كأدوات. سوف يقوم الوكيل باستدعاء هذه الوظائف عندما يحدد أن هناك حاجة إليها:

public class ContentToolsPlugin
{
    [KernelFunction("word_count")]
    [Description("Counts the number of words in the provided text.")]
    public int WordCount([Description("The text to count words in")] string text)
    {
        return text.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
    }

    [KernelFunction("check_readability")]
    [Description("Calculates a readability score for the given text.")]
    public string CheckReadability([Description("The text to analyze")] string text)
    {
        var words = text.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
        var sentences = text.Split(['.', '!', '?'], StringSplitOptions.RemoveEmptyEntries).Length;

        if (sentences == 0) return "Unable to calculate — no sentences found.";

        double avgWordsPerSentence = (double)words / sentences;

        return avgWordsPerSentence switch
        {
            < 15 => $"Easy to read (avg {avgWordsPerSentence:F1} words/sentence)",
            < 25 => $"Moderate difficulty (avg {avgWordsPerSentence:F1} words/sentence)",
            _ => $"Difficult to read (avg {avgWordsPerSentence:F1} words/sentence). Consider shorter sentences."
        };
    }
}

قم بتسجيل الإضافة على النواة قبل إنشاء الوكيل:

kernel.Plugins.AddFromType<ContentToolsPlugin>();

ChatCompletionAgent analyst = new()
{
    Name = "ContentAnalyst",
    Instructions = "Analyze content using available tools. Report word count and readability.",
    Kernel = kernel,
    Arguments = new KernelArguments(
        new PromptExecutionSettings
        {
            FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
        })
};

بروتوكول السياق النموذجي (MCP)

يعد MCP معيارًا مفتوحًا لربط نماذج الذكاء الاصطناعي بالأدوات الخارجية ومصادر البيانات. يدعم Agent Framework MCP، مما يعني أن وكلاءك يمكنهم استخدام الأدوات التي يكشفها أي خادم متوافق مع MCP. وهذا يفتح الباب أمام أنظمة الملفات وقواعد البيانات وواجهات برمجة التطبيقات والمزيد — كل ذلك من خلال واجهة موحدة.

// Example: Adding an MCP server for file operations
kernel.Plugins.AddFromMcpServer("filesystem",
    new Uri("http://localhost:3000/mcp"));

يعد هذا أمرًا مثيرًا بشكل خاص لأنه يعني أن عملائك لا يقتصرون على ما تقوم بإنشائه - بل يمكنهم الاستفادة من النظام البيئي لأدوات MCP التي يطورها الآخرون ويشاركونها.

مثال من العالم الحقيقي: خط أنابيب مراجعة المحتوى

دعونا نجمع كل شيء معًا في سيناريو عملي. تخيل أنك تقوم بإنشاء أداة داخلية تعمل على أتمتة مراجعة المحتوى لفريق التوثيق. يتكون خط الأنابيب من أربع مراحل:

  1. الباحث — يجمع المعلومات الفنية ذات الصلة
  2. الكاتب — يُنتج مسودة بناءً على البحث
  3. المراجع — يتحقق من الدقة والاكتمال
  4. الناشر — يقوم بتنسيق المخرجات النهائية وإعدادها

وهنا تنفيذ مكثف:

using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;

// Build the kernel
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
    deploymentName: "gpt-4o",
    endpoint: "https://your-resource.openai.azure.com/",
    credentials: new DefaultAzureCredential()
);
Kernel kernel = builder.Build();

// Define specialized agents
ChatCompletionAgent researcher = new()
{
    Name = "Researcher",
    Instructions = """
        You are a technical researcher. Given a topic, identify the key
        concepts, recent developments, and important details that should
        be covered. Output a structured research brief.
        """,
    Kernel = kernel
};

ChatCompletionAgent writer = new()
{
    Name = "Writer",
    Instructions = """
        You are a technical writer. Using the research brief provided,
        write a comprehensive, well-structured article. Include code
        examples where relevant. Target audience: experienced developers.
        """,
    Kernel = kernel
};

ChatCompletionAgent reviewer = new()
{
    Name = "Reviewer",
    Instructions = """
        You are a senior technical reviewer. Check the article for:
        - Technical accuracy
        - Completeness relative to the research brief
        - Code correctness
        - Clarity and structure
        If everything looks good, respond with APPROVED.
        Otherwise, provide specific feedback for revision.
        """,
    Kernel = kernel
};

ChatCompletionAgent publisher = new()
{
    Name = "Publisher",
    Instructions = """
        You are a content publisher. Once the article is approved,
        format it with proper markdown, add a summary at the top,
        and ensure consistent formatting throughout.
        End your response with COMPLETE.
        """,
    Kernel = kernel
};

// Configure the group chat
AgentGroupChat chat = new(researcher, writer, reviewer, publisher)
{
    ExecutionSettings = new()
    {
        SelectionStrategy = new SequentialSelectionStrategy(),
        TerminationStrategy = new ApprovalTerminationStrategy()
        {
            Agents = [publisher],
            MaximumIterations = 15
        }
    }
};

// Start the pipeline
chat.AddChatMessage(new ChatMessageContent(
    AuthorRole.User,
    "Create a technical article about implementing health checks in ASP.NET Core microservices."
));

await foreach (ChatMessageContent message in chat.InvokeAsync())
{
    Console.ForegroundColor = message.AuthorName switch
    {
        "Researcher" => ConsoleColor.Cyan,
        "Writer" => ConsoleColor.Green,
        "Reviewer" => ConsoleColor.Yellow,
        "Publisher" => ConsoleColor.Magenta,
        _ => ConsoleColor.White
    };

    Console.WriteLine($"\n{'='new string('=', 60)}");
    Console.WriteLine($"[{message.AuthorName}]");
    Console.WriteLine(new string('=', 60));
    Console.WriteLine(message.Content);
}

Console.ResetColor();

ينتج هذا المسار مقالة مدروسة ومكتوبة ومراجعة ومنسقة بالكامل - كل ذلك من خلال تعاون الوكيل. يركز كل وكيل على ما يفعله بشكل أفضل، ويقوم AgentGroupChat بتنسيق سير العمل.

أفضل الممارسات

بعد إنشاء العديد من الأنظمة متعددة الوكلاء، إليك الأنماط والممارسات التي وجدتها الأكثر قيمة.

معالجة الأخطاء

قم دائمًا بتعيين MaximumIterations على إستراتيجية الإنهاء الخاصة بك. وبدون ذلك، يمكن للوكلاء الدخول في حلقات لا نهائية - خاصة عندما يستمر المراجع في العثور على المشكلات ويستمر الكاتب في المراجعة دون تحسين.

TerminationStrategy = new ApprovalTerminationStrategy()
{
    MaximumIterations = 12 // Safety net
}

قم بلف استدعاءات وكيلك في كتل محاولة الالتقاط. حدود معدل واجهة برمجة التطبيقات (API)، ومشكلات الشبكة، وأخطاء النماذج كلها حقائق لأنظمة الإنتاج:

try
{
    await foreach (var message in chat.InvokeAsync(cancellationToken))
    {
        // Process messages
    }
}
catch (HttpOperationException ex) when (ex.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
{
    // Implement retry with exponential backoff
    await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken);
}

إمكانية الملاحظةيتكامل Agent Framework مع OpenTelemetry، مما يعني أنه يمكنك تتبع كل تفاعل للوكيل، واستدعاء أداة، واستخدام الرمز المميز. يعد هذا أمرًا ضروريًا لتصحيح أخطاء سير العمل متعدد الوكلاء حيث لا يكون من الواضح دائمًا الوكيل الذي تسبب في المشكلة.

قم بإعداد القياس عن بعد الأساسي عن طريق إضافة حزم القياس عن بعد Semantic Kernel وتكوين المصدر المفضل لديك (Application Insights، Jaeger، وما إلى ذلك):

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        tracing.AddSource("Microsoft.SemanticKernel*");
        tracing.AddOtlpExporter();
    });

إدارة التكاليف

تعمل الأنظمة متعددة الوكلاء على مضاعفة تكاليف واجهة برمجة التطبيقات (API) الخاصة بك - كل دور وكيل هو عبارة عن استدعاء لواجهة برمجة التطبيقات (API)، ويمكن أن تولد الدردشات الجماعية العديد من الأدوار. بعض الاستراتيجيات لإبقاء التكاليف تحت السيطرة:

  • استخدم نماذج أرخص للوكلاء الأبسط: لا يحتاج كل وكيل إلى GPT-4o. قد يعمل المراجع بشكل جيد مع نموذج أصغر، بينما يحتاج الكاتب فقط إلى الضارب الثقيل.
  • السجل الحدي: استخدم ReducedHistoryCount في إعدادات التنفيذ لديك لتحديد مقدار سياق المحادثة الذي يتلقاه كل وكيل.
  • تعيين حدود تكرار صارمة: منع المحادثات الهاربة ذات قيم MaximumIterations المعقولة.
  • التخزين المؤقت عندما يكون ذلك ممكنًا: إذا أجرى الوكيل نفس البحث بشكل متكرر، فقم بتخزين النتائج مؤقتًا في مكون إضافي.

تصميم الوكيل

  • حافظ على تركيز التعليمات: يجب أن يتحمل كل وكيل مسؤولية واحدة واضحة. تؤدي التعليمات الواسعة إلى أداء متواضع في جميع المهام.
  • كن واضحًا بشأن تنسيق المخرجات: أخبر الوكلاء بكيفية تنظيم ردودهم بالضبط. وهذا يجعل التحليل المصب موثوقًا به.
  • استخدام الكلمات الرئيسية للإنهاء: حدد الإشارات الواضحة (مثل “تمت الموافقة عليه” أو “مكتمل”) التي يستخدمها الوكلاء للإشارة إلى الانتهاء. وهذا يجعل استراتيجيات الإنهاء بسيطة ويمكن التنبؤ بها.

الخلاصة

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

يجعل Microsoft Agent Framework هذا الأمر عمليًا لمطوري .NET. التجريدات نظيفة - الوكلاء، والمحادثات الجماعية، واستراتيجيات الاختيار والإنهاء - وهي تتشكل بشكل طبيعي. بالاشتراك مع النظام البيئي الإضافي لـ Semantic Kernel واستضافة نماذج Azure، لديك مجموعة كاملة لبناء أنظمة متعددة الوكلاء على مستوى الإنتاج.

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

ابدأ صغيرًا - أنشئ وكيلين يتعاونان في مهمة بسيطة. بمجرد ملاحظة تحسن الجودة مقارنة بأساليب الوكيل الفردي، ستحتاج إلى تحليل كل شيء إلى فرق وكلاء.

ترميز سعيد!