الوكلاء في مهام سير العمل

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

ما ستقوم بإنشاءه

ستقوم بإنشاء سير عمل:

  • يستخدم Azure Foundry Agent Service لإنشاء عوامل ذكية
  • تنفيذ وكيل الترجمة الفرنسي الذي يترجم الإدخال إلى الفرنسية
  • تنفيذ وكيل ترجمة إسباني يترجم الفرنسية إلى الإسبانية
  • تنفيذ وكيل الترجمة الإنجليزية الذي يترجم الأسبانية مرة أخرى إلى اللغة الإنجليزية
  • توصيل الوكلاء في مسار سير عمل تسلسلي
  • دفق التحديثات في الوقت الحقيقي أثناء معالجة الوكلاء لطلبات
  • يوضح تنظيف الموارد المناسب لوكلاء Azure Foundry

المفاهيم التي تمت تغطيتها

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

الخطوة 1: تثبيت حزم NuGet

أولا، قم بتثبيت الحزم المطلوبة لمشروع .NET الخاص بك:

dotnet add package Azure.AI.Projects --prerelease
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease
dotnet add package Microsoft.Agents.AI.Workflows --prerelease

الخطوة 2: إعداد Azure Foundry Client

تكوين عميل Azure Foundry مع متغيرات البيئة والمصادقة:

using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;

public static class Program
{
    private static async Task Main()
    {
        // Set up the Azure AI Project client
        var endpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
            ?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
        var deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
        var aiProjectClient = new AIProjectClient(new Uri(endpoint), new AzureCliCredential());

الخطوة 3: إنشاء أسلوب مصنع العامل

تنفيذ أسلوب مساعد لإنشاء Azure وكلاء Foundry مع إرشادات محددة:

    /// <summary>
    /// Creates a translation agent for the specified target language.
    /// </summary>
    /// <param name="targetLanguage">The target language for translation</param>
    /// <param name="aiProjectClient">The AIProjectClient to create the agent</param>
    /// <param name="model">The model to use for the agent</param>
    /// <returns>A ChatClientAgent configured for the specified language</returns>
    private static async Task<ChatClientAgent> GetTranslationAgentAsync(
        string targetLanguage,
        AIProjectClient aiProjectClient,
        string model)
    {
        string agentName = $"{targetLanguage} Translator";
        var version = await aiProjectClient.AgentAdministrationClient.CreateAgentVersionAsync(
            agentName,
            new ProjectsAgentVersionCreationOptions(
                new DeclarativeAgentDefinition(model)
                {
                    Instructions = $"You are a translation assistant that translates the provided text to {targetLanguage}."
                }));

        return aiProjectClient.AsAIAgent(version);
    }
}

الخطوة 4: إنشاء وكلاء متخصصين Azure Foundry

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

        // Create agents
        AIAgent frenchAgent = await GetTranslationAgentAsync("French", aiProjectClient, deploymentName);
        AIAgent spanishAgent = await GetTranslationAgentAsync("Spanish", aiProjectClient, deploymentName);
        AIAgent englishAgent = await GetTranslationAgentAsync("English", aiProjectClient, deploymentName);

الخطوة 5: إنشاء سير العمل

قم بتوصيل الوكلاء في سير عمل تسلسلي باستخدام WorkflowBuilder:

        // Build the workflow by adding executors and connecting them
        var workflow = new WorkflowBuilder(frenchAgent)
            .AddEdge(frenchAgent, spanishAgent)
            .AddEdge(spanishAgent, englishAgent)
            .Build();

الخطوة 6: التنفيذ باستخدام الدفق

قم بتشغيل سير العمل مع الدفق لمراقبة التحديثات في الوقت الحقيقي من جميع العوامل:

        // Execute the workflow
        await using StreamingRun run = await InProcessExecution.RunStreamingAsync(workflow, new ChatMessage(ChatRole.User, "Hello World!"));

        // Must send the turn token to trigger the agents.
        // The agents are wrapped as executors. When they receive messages,
        // they will cache the messages and only start processing when they receive a TurnToken.
        await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
        await foreach (WorkflowEvent evt in run.WatchStreamAsync())
        {
            if (evt is AgentResponseUpdateEvent executorComplete)
            {
                Console.WriteLine($"{executorComplete.ExecutorId}: {executorComplete.Data}");
            }
        }

الخطوة 7: تنظيف الموارد

تنظيف عوامل Azure Foundry بشكل صحيح بعد الاستخدام:

        // Cleanup the agents created for the sample.
        await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(frenchAgent.Id);
        await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(spanishAgent.Id);
        await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(englishAgent.Id);
    }

كيفية عملها

  1. إعداد عميل Azure Foundry: يستخدم AIProjectClient مع بيانات اعتماد Azure CLI للمصادقة
  2. إنشاء عامل: إنشاء وكلاء تم إصدارهم على Azure Foundry مع إرشادات محددة للترجمة
  3. المعالجة التسلسلية: يترجم العامل الفرنسي الإدخال أولا، ثم العامل الأسباني، ثم الوكيل الإنجليزي
  4. تحويل نمط الرمز المميز: يقوم العاملون بتخزين الرسائل مؤقتا ومعالجتها فقط عندما يتلقون TurnToken
  5. تحديثات الدفق: AgentResponseUpdateEvent توفر تحديثات للرمز المميز في الوقت الحقيقي حيث يقوم الوكلاء بإنشاء استجابات
  6. إدارة الموارد: التنظيف المناسب لوكلاء Azure Foundry باستخدام واجهة برمجة تطبيقات الإدارة

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

  • Azure Foundry Agent Service: وكلاء الذكاء الاصطناعي المستندة إلى السحابة مع قدرات التفكير المتقدمة
  • AIProjectClient: عميل لإنشاء وإدارة العوامل على Azure Foundry
  • WorkflowEvent: تحتوي أحداث الإخراج (type="output") على بيانات إخراج العامل (AgentResponseUpdate للتدفق، AgentResponse وعدم البث)
  • TurnToken: الإشارة التي تقوم بتشغيل معالجة العامل بعد التخزين المؤقت للرسائل
  • سير العمل التسلسلي: العوامل المتصلة في مسار حيث يتدفق الإخراج من واحد إلى آخر

التنفيذ الكامل

لتنفيذ العمل الكامل لسير عمل عوامل Azure Foundry هذا، راجع نموذج Program.cs FoundryAgent في مستودع Agent Framework.

ما ستقوم بإنشاءه

ستقوم بإنشاء سير عمل:

  • يستخدم FoundryChatClient لإنشاء عوامل ذكية
  • تنفيذ عامل Writer الذي ينشئ محتوى استنادا إلى المطالبات
  • تنفيذ عامل المراجع الذي يوفر ملاحظات حول المحتوى
  • توصيل الوكلاء في مسار سير عمل تسلسلي
  • دفق التحديثات في الوقت الحقيقي أثناء معالجة الوكلاء لطلبات

المفاهيم التي تمت تغطيتها

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

  • Python 3.10 أو أحدث
  • تم تثبيت إطار عمل العامل: pip install agent-framework
  • Azure استجابات OpenAI التي تم تكوينها مع متغيرات البيئة المناسبة
  • مصادقة Azure CLI:az login

الخطوة 1: استيراد التبعيات المطلوبة

ابدأ باستيراد المكونات الضرورية لسير العمل Azure عوامل استجابات OpenAI:

import asyncio
import os

from agent_framework import AgentResponseUpdate, WorkflowBuilder
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

الخطوة 2: إنشاء عميل استجابات openAI Azure

إنشاء عميل مشترك واحد يمكنك استخدامه لإنشاء عوامل متعددة:

async def main() -> None:
    client = FoundryChatClient(
        project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        model=os.environ["FOUNDRY_MODEL"],
        credential=AzureCliCredential(),
    )

الخطوة 3: إنشاء وكلاء متخصصين

إنشاء وكيلين متخصصين لإنشاء المحتوى ومراجعته:

    # Create a Writer agent that generates content
    writer_agent = client.as_agent(
        name="Writer",
        instructions=(
            "You are an excellent content writer. You create new content and edit contents based on the feedback."
        ),
    )

    # Create a Reviewer agent that provides feedback
    reviewer_agent = client.as_agent(
        name="Reviewer",
        instructions=(
            "You are an excellent content reviewer. "
            "Provide actionable feedback to the writer about the provided content. "
            "Provide the feedback in the most concise manner possible."
        ),
    )

الخطوة 4: إنشاء سير العمل

قم بتوصيل العوامل في سير عمل تسلسلي باستخدام المنشئ:

        # Build the workflow with agents as executors
        workflow = WorkflowBuilder(start_executor=writer_agent).add_edge(writer_agent, reviewer_agent).build()

الخطوة 5: التنفيذ مع الدفق

قم بتشغيل سير العمل مع الدفق لمراقبة التحديثات في الوقت الحقيقي من كلا الوكيلين:

    last_author: str | None = None

    events = workflow.run("Create a slogan for a new electric SUV that is affordable and fun to drive.", stream=True)
    async for event in events:
        if event.type == "output" and isinstance(event.data, AgentResponseUpdate):
            update = event.data
            author = update.author_name
            if author != last_author:
                if last_author is not None:
                    print()
                print(f"{author}: {update.text}", end="", flush=True)
                last_author = author
            else:
                print(update.text, end="", flush=True)

الخطوة 6: إكمال الدالة الرئيسية

التفاف كل شيء في الدالة الرئيسية مع التنفيذ غير المتزامن المناسب:

if __name__ == "__main__":
    asyncio.run(main())

كيفية عملها

  1. إعداد العميل: يستخدم واحدا FoundryChatClient مع بيانات اعتماد Azure CLI للمصادقة.
  2. إنشاء عامل: ينشئ وكلاء Writer و Reviewer من نفس تكوين العميل.
  3. المعالجة التسلسلية: ينشئ وكيل الكاتب المحتوى أولا، ثم يمرره إلى عامل المراجع.
  4. تحديثات الدفق: توفر أحداث الإخراج (type="output") مع AgentResponseUpdate البيانات تحديثات للرمز المميز في الوقت الحقيقي حيث يقوم العاملون بإنشاء استجابات.

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

  • FoundryChatClient: العميل المشترك المستخدم لإنشاء عوامل سير العمل بتكوين متسق.
  • WorkflowEvent: تحتوي أحداث الإخراج (type="output") على بيانات إخراج العامل (AgentResponseUpdate للتدفق، AgentResponse لغير البث).
  • سير العمل التسلسلي: الوكلاء المتصلون في البنية الأساسية لبرنامج ربط العمليات التجارية حيث يتدفق الإخراج من واحد إلى آخر.

التنفيذ الكامل

لتنفيذ العمل الكامل، راجع azure_ai_agents_streaming.py في مستودع إطار عمل العامل.

ما ستقوم بإنشاءه

ستقوم بإنشاء سير عمل:

  • يستخدم Azure عوامل OpenAI كمنفذي سير العمل
  • تنفيذ وكيل ترجمة فرنسي
  • تنفيذ عامل ترجمة إسباني
  • تنفيذ وكيل ترجمة باللغة الإنجليزية
  • توصيل الوكلاء في مسار سير عمل تسلسلي
  • دفق التحديثات في الوقت الحقيقي أثناء معالجة الوكلاء لطلبات

المفاهيم التي تمت تغطيتها

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

  • الانتقال إلى 1.25 أو إصدار أحدث
  • Microsoft نقطة نهاية مشروع Foundry ونشر النموذج الذي تم تكوينه
  • مصادقة Azure CLI أو مصدر بيانات اعتماد Azure آخر

الخطوة 1: إعداد تكوين Foundry

endpoint := os.Getenv("FOUNDRY_PROJECT_ENDPOINT")
model := cmp.Or(os.Getenv("FOUNDRY_MODEL"), "gpt-4o-mini")

token, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    return err
}

تحذير

azidentity.NewDefaultAzureCredential مناسب للتنمية ولكنه يتطلب دراسة متأنية في الإنتاج. في الإنتاج، ضع في اعتبارك استخدام بيانات اعتماد معينة، مثل azidentity.NewManagedIdentityCredential، لتجنب مشكلات زمن الانتقال، وبحث بيانات الاعتماد غير المقصودة، والمخاطر الأمنية المحتملة من الآليات الاحتياطية.

الخطوة 2: إنشاء دالة Agent Factory

إنشاء وكلاء مع إرشادات ترجمة محددة:

newTranslationAgent := func(language string) *agent.Agent {
    return foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
        Instructions: fmt.Sprintf(
            "Translate the user's text to %s. Return only the translation.",
            language,
        ),
        Config: agent.Config{Name: language + "Agent"},
    })
}

الخطوة 3: إنشاء وكلاء متخصصين

frenchAgent := newTranslationAgent("French")
spanishAgent := newTranslationAgent("Spanish")
englishAgent := newTranslationAgent("English")

الخطوة 4: إنشاء سير العمل

يمكن استخدام الوكلاء كمنفذين لسير العمل، مما يتيح خطوات سير العمل التي تعمل بالذكاء الاصطناعي.

ربط كل عامل كمنفذ سير عمل، ثم توصيل المنفذين بالحواف:

import (
    "github.com/microsoft/agent-framework-go/agent"
    "github.com/microsoft/agent-framework-go/workflow/agentworkflow"
    "github.com/microsoft/agent-framework-go/message"
    "github.com/microsoft/agent-framework-go/workflow"
    "github.com/microsoft/agent-framework-go/workflow/inproc"
)

cfg := agentworkflow.Config{DisableForwardIncomingMessages: true}
french := agentworkflow.New(frenchAgent, cfg)
spanish := agentworkflow.New(spanishAgent, cfg)
english := agentworkflow.New(englishAgent, cfg)

wf, err := workflow.NewBuilder(french).
    AddEdge(french, spanish).
    AddEdge(spanish, english).
    WithOutputFrom(english).
    Build()
if err != nil {
    return err
}

الخطوة 5: التنفيذ مع الدفق

قم بتشغيل سير العمل وتمكين أحداث التحديث باستخدام workflow.TurnToken:

run, err := inproc.Default.RunStreaming(ctx, wf, message.NewText("Hello World"))
if err != nil {
    return err
}
defer run.Close(ctx)

emitEvents := true
if err := run.SendMessage(ctx, workflow.TurnToken{EmitEvents: &emitEvents}); err != nil {
    return err
}

for evt, err := range run.WatchStream(ctx) {
    if err != nil {
        return err
    }
    if out, ok := evt.(workflow.OutputEvent); ok {
        if update, ok := out.Output.(*agent.ResponseUpdate); ok {
            fmt.Printf("%s: %s\n", out.ExecutorID, update.String())
        }
    }
}

كيفية عملها

  1. إعداد العميل: يستخدم بيانات اعتماد Azure مع عميل OpenAI.
  2. إنشاء العامل: إنشاء وكلاء متخصصين مع إرشادات خاصة باللغة.
  3. استضافة العامل: يستخدم agentworkflow.New لربط كل عامل كمنفذ سير عمل.
  4. المعالجة التسلسلية: يتم تشغيل المنفذ الفرنسي أولا، ثم الأسبانية، ثم الإنجليزية.
  5. تحويل نمط الرمز المميز: الرسائل المخزن المؤقت للوكلاء المستضافين وتشغيلها عندما يتلقون workflow.TurnToken.
  6. تحديثات الدفق: workflow.OutputEvent يمكن أن تحتوي القيم على *agent.ResponseUpdate مخرجات للتقدم في الوقت الحقيقي.

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

  • Azure OpenAI Agent: مدعوم agent.Agent من قبل Azure OpenAI.
  • تدفق عمل العامل. جديد: يتكيف مع عامل للاستخدام كمنفذ سير عمل.
  • سير العمل. TurnToken: الإشارة التي تقوم بتشغيل عوامل مستضافة لمعالجة الرسائل المخزنة مؤقتا.
  • Workflow OutputEvent: يحمل تحديثات استجابة العامل ومخرجات سير العمل النهائية.
  • سير العمل التسلسلي: الوكلاء المتصلون في البنية الأساسية لبرنامج ربط العمليات التجارية حيث يتدفق الإخراج من واحد إلى آخر.

التنفيذ الكامل

package main

import (
    "cmp"
    "context"
    "fmt"
    "log"
    "os"

    "github.com/microsoft/agent-framework-go/agent"
    "github.com/microsoft/agent-framework-go/workflow/agentworkflow"
    "github.com/microsoft/agent-framework-go/message"
    "github.com/microsoft/agent-framework-go/workflow"
    "github.com/microsoft/agent-framework-go/workflow/inproc"

    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/microsoft/agent-framework-go/provider/foundryprovider"
)

func main() {
    ctx := context.Background()
    endpoint := os.Getenv("FOUNDRY_PROJECT_ENDPOINT")
    model := cmp.Or(os.Getenv("FOUNDRY_MODEL"), "gpt-4o-mini")

    credential, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
        log.Fatal(err)
    }

    newTranslationAgent := func(language string) *agent.Agent {
        return foundryprovider.NewAgent(endpoint, credential, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
            Instructions: fmt.Sprintf(
                "Translate the user's text to %s. Return only the translation.",
                language,
            ),
            Config: agent.Config{Name: language + "Agent"},
        })
    }

    cfg := agentworkflow.Config{DisableForwardIncomingMessages: true}
    french := agentworkflow.New(newTranslationAgent("French"), cfg)
    spanish := agentworkflow.New(newTranslationAgent("Spanish"), cfg)
    english := agentworkflow.New(newTranslationAgent("English"), cfg)

    wf, err := workflow.NewBuilder(french).
        AddEdge(french, spanish).
        AddEdge(spanish, english).
        WithOutputFrom(english).
        Build()
    if err != nil {
        log.Fatal(err)
    }

    run, err := inproc.Default.RunStreaming(ctx, wf, message.NewText("Hello World"))
    if err != nil {
        log.Fatal(err)
    }
    defer run.Close(ctx)

    emitEvents := true
    if err := run.SendMessage(ctx, workflow.TurnToken{EmitEvents: &emitEvents}); err != nil {
        log.Fatal(err)
    }

    for evt, err := range run.WatchStream(ctx) {
        if err != nil {
            log.Fatal(err)
        }
        if out, ok := evt.(workflow.OutputEvent); ok {
            if update, ok := out.Output.(*agent.ResponseUpdate); ok {
                fmt.Printf("%s: %s\n", out.ExecutorID, update.String())
            }
        }
    }
}

تحذير

azidentity.NewDefaultAzureCredential مناسب للتنمية ولكنه يتطلب دراسة متأنية في الإنتاج. في الإنتاج، ضع في اعتبارك استخدام بيانات اعتماد معينة، مثل azidentity.NewManagedIdentityCredential، لتجنب مشكلات زمن الانتقال، وبحث بيانات الاعتماد غير المقصودة، والمخاطر الأمنية المحتملة من الآليات الاحتياطية.

Tip

راجع العوامل في نموذج مهام سير العمل للحصول على مثال كامل.

الخطوات التالية