Microsoft Agent Framework спасет Рождество

· 8 мин чтения

Введение

Поиск идеальных рождественских подарков может оказаться стрессом. Между мозговым штурмом идей подарков, сравнением цен в разных магазинах и проверкой того, чтобы все было доставлено вовремя, праздничные покупки быстро становятся непосильными. Что, если бы мы могли делегировать эти задачи специализированным агентам ИИ, которые работали бы вместе? В этом посте мы рассмотрим, как использовать Microsoft Agent Framework для создания многоагентной системы, в которой каждый агент специализируется на определенной задаче, от генерации идей для подарков до сравнения цен, и все это координируется посредством рабочих процессов.

Праздничный технический календарь на 2025 год

Этот проект является частью моего выступления на Праздничном техническом календаре 2025, замечательном общественном мероприятии, посвященном технологиям в праздничный сезон. Дополнительную информацию о мероприятии можно найти на странице Sessionize.

Что такое платформа агентов Microsoft?

Agent Framework — это решение Microsoft для создания, координации и развертывания агентов искусственного интеллекта и многоагентных систем. Он обеспечивает гибкую основу для создания агентов, которые могут работать последовательно, одновременно или по шаблонам передачи обслуживания. Платформа поддерживает модели OpenAI, Azure OpenAI и Microsoft Foundry, что делает ее невероятно универсальной.

Ключевые особенности включают в себя:

  • Многоагентная оркестровка: групповой чат, последовательный, одновременный и шаблоны передачи обслуживания.
  • Экосистема плагинов: расширение за счет встроенных функций, OpenAPI и протокола контекста модели (MCP).
  • Поддержка рабочих процессов: создавайте сложные конвейеры агентов с исполнителями и границами.

Предварительные условия

Прежде чем углубляться в код, убедитесь, что у вас есть:

  • .NET 9
  • Доступ к Azure OpenAI (или ключ API OpenAI)
  • Visual Studio или код Visual Studio

Установите необходимые пакеты (обратите внимание, что в предварительной версии требуется флаг --prerelease:

[[[ТОК_3]]]

Агенты по покупке подарков

Наш поисковик рождественских подарков будет состоять из трех специализированных агентов, работающих вместе:

  1. Агент по идеям подарков — генерирует креативные предложения подарков на основе профиля получателя.
  2. Агент сравнения цен — находит лучшие цены в разных магазинах.
  3. Агент сводки – собирает окончательные рекомендации.

Модели

Давайте начнем с определения наших моделей данных, которые будут проходить через конвейер агента:

[[[ТОК_4]]]

Создание агентов

Прелесть Agent Framework в том, насколько легко создавать специализированные агенты. Каждый агент представляет собой просто ChatClientAgent со специальным системным приглашением, определяющим его опыт.

[[[ТОК_6]]]

Создание рабочего процесса

Теперь самое интересное — подключение наших агентов к последовательному рабочему процессу. Платформа агентов предоставляет WorkflowBuilder и AgentWorkflowBuilder для объединения агентов в различные шаблоны.

[[[ТОК_9]]]

Одновременный запуск агентов

Что делать, если мы хотим искать подарки для нескольких человек одновременно? Agent Framework поддерживает одновременное выполнение, что идеально подходит для этого сценария:

[[[ТОК_10]]]

Пользовательские исполнители для большего контроляДля более сложных сценариев вы можете создавать собственные исполнители, которые дают вам детальный контроль над рабочим процессом:

[[[ТОК_11]]]

Затем вы можете вставить этот исполнитель в свой рабочий процесс:

[[[ТОК_12]]]

Добавление реального веб-поиска с заземлением Bing

На данный момент наши агенты генерируют ответы на основе знаний модели ИИ. Но что, если мы хотим найти в Интернете актуальные цены и наличие товаров? Именно здесь на помощь приходит Обоснование с помощью Bing Search. Это инструмент, доступный в Microsoft Foundry (ранее Azure AI Foundry), который позволяет вашим агентам включать общедоступные веб-данные в реальном времени при формировании ответов.

Сначала вам необходимо создать ресурс Заземление с помощью поиска Bing на Портале Azure. Обязательно создайте его в той же группе ресурсов, что и ваш проект ИИ.

Настройка заземления с помощью поиска Bing

Прелесть заземления с помощью Bing Search заключается в том, что оно напрямую интегрируется с агентами Azure AI. Агент решает, когда использовать инструмент поиска, на основе запроса пользователя, выполняет поиск в Интернете и использует результаты для генерации обоснованного ответа.

using Azure.AI.Agents.Persistent;
using Azure.Identity;

public static class BingGroundingSetup
{
    public static async Task<PersistentAgent> CreateAgentWithBingGroundingAsync(
        string projectEndpoint,
        string modelDeploymentName,
        string bingConnectionId)
    {
        // Create the Persistent Agents client
        var agentClient = new PersistentAgentsClient(projectEndpoint, new DefaultAzureCredential());

        // Configure the Bing Grounding tool
        var bingGroundingTool = new BingGroundingToolDefinition(
            new BingGroundingSearchToolParameters(
                [new BingGroundingSearchConfiguration(bingConnectionId)]
            )
        );

        // Create the agent with Bing Grounding enabled
        var agent = await agentClient.Administration.CreateAgentAsync(
            model: modelDeploymentName,
            name: "ChristmasPriceHunter",
            instructions: @"You are a Christmas gift price comparison specialist.
                
                When given gift ideas, use Bing to search for:
                - Current prices at major retailers (Amazon, Best Buy, Target, Walmart)
                - Available discounts and holiday deals
                - Shipping times to ensure delivery before Christmas
                
                Always provide URLs to the products you find.
                Highlight the best deals and recommend where to buy.",
            tools: [bingGroundingTool]
        );

        return agent;
    }
}

Создание агента сравнения цен с помощью реального поиска

Теперь давайте создадим полноценный агент сравнения цен, который ищет в Интернете реальную информацию о продуктах:

using Azure.AI.Agents.Persistent;
using Azure.Identity;

public class ChristmasPriceAgent
{
    private readonly PersistentAgentsClient _client;
    private readonly string _modelDeployment;
    private readonly string _bingConnectionId;

    public ChristmasPriceAgent(string projectEndpoint, string modelDeployment, string bingConnectionId)
    {
        _client = new PersistentAgentsClient(projectEndpoint, new DefaultAzureCredential());
        _modelDeployment = modelDeployment;
        _bingConnectionId = bingConnectionId;
    }

    public async Task<string> FindGiftPricesAsync(string giftIdeas)
    {
        // Create agent with Bing Grounding
        var bingTool = new BingGroundingToolDefinition(
            new BingGroundingSearchToolParameters(
                [new BingGroundingSearchConfiguration(_bingConnectionId)]
            )
        );

        var agent = await _client.Administration.CreateAgentAsync(
            model: _modelDeployment,
            name: "PriceHunter",
            instructions: @"Search the web for current prices on the given gift ideas. 
                For each gift, find prices from at least 2-3 different stores.
                Include direct links to the products.
                Note any Christmas sales or discounts available.",
            tools: [bingTool]
        );

        try
        {
            // Create a thread for the conversation
            var thread = await _client.Threads.CreateThreadAsync();

            // Add the gift ideas as a message
            await _client.Messages.CreateMessageAsync(
                thread.Id,
                MessageRole.User,
                $"Find current prices for these gift ideas: {giftIdeas}"
            );

            // Run the agent
            var run = await _client.Runs.CreateRunAsync(thread.Id, agent.Id);

            // Wait for completion
            do
            {
                await Task.Delay(500);
                run = await _client.Runs.GetRunAsync(thread.Id, run.Id);
            }
            while (run.Status == RunStatus.Queued || run.Status == RunStatus.InProgress);

            // Get the response
            var messages = _client.Messages.GetMessages(thread.Id);
            var response = messages
                .Where(m => m.Role == MessageRole.Agent)
                .SelectMany(m => m.ContentItems)
                .OfType<MessageTextContent>()
                .FirstOrDefault();

            // Clean up
            await _client.Threads.DeleteThreadAsync(thread.Id);

            return response?.Text ?? "No results found.";
        }
        finally
        {
            // Clean up the agent
            await _client.Administration.DeleteAgentAsync(agent.Id);
        }
    }
}

Интеграция заземления Bing в рабочий процесс

Вот как можно использовать ценового агента на базе Bing в полном рабочем процессе поиска подарков:

public static async Task RunWithBingGroundingAsync()
{
    var projectEndpoint = Environment.GetEnvironmentVariable("PROJECT_ENDPOINT")!;
    var modelDeployment = Environment.GetEnvironmentVariable("MODEL_DEPLOYMENT_NAME") ?? "gpt-4o";
    var bingConnectionId = Environment.GetEnvironmentVariable("BING_CONNECTION_ID")!;
    // Connection ID format: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}/connections/{connection}

    Console.WriteLine("🔍 Searching the web for real prices with Bing Grounding...\n");

    var priceAgent = new ChristmasPriceAgent(projectEndpoint, modelDeployment, bingConnectionId);

    // First, generate gift ideas (could come from another agent)
    var giftIdeas = "1. Milwaukee cordless drill set, 2. Weber portable grill, 3. Carhartt beanie";

    // Search for real prices
    var priceResults = await priceAgent.FindGiftPricesAsync(giftIdeas);

    Console.WriteLine("📊 Price Comparison Results:");
    Console.WriteLine(priceResults);
    Console.WriteLine("\n🎁 Happy Shopping! 🎁");
}

Обработка цитат из результатов Bing

Одним из важных аспектов заземления с помощью поиска Bing является то, что ответы включают цитаты со ссылками на исходные веб-сайты. Вот как их извлечь и отобразить:

public static void ProcessBingGroundingResponse(IEnumerable<PersistentThreadMessage> messages)
{
    foreach (var message in messages.Where(m => m.Role == MessageRole.Agent))
    {
        foreach (var content in message.ContentItems)
        {
            if (content is MessageTextContent textContent)
            {
                var response = textContent.Text;

                // Process URL citations
                if (textContent.Annotations != null)
                {
                    foreach (var annotation in textContent.Annotations)
                    {
                        if (annotation is MessageTextUriCitationAnnotation uriAnnotation)
                        {
                            // Replace citation placeholder with markdown link
                            response = response.Replace(
                                uriAnnotation.Text,
                                $" [{uriAnnotation.UriCitation.Title}]({uriAnnotation.UriCitation.Uri})"
                            );
                        }
                    }
                }

                Console.WriteLine(response);
            }
        }
    }
}

Теперь, когда агент сравнения цен запускается, он использует Обоснование с помощью поиска Bing для поиска реальных списков продуктов, текущих цен и доступных предложений в Интернете. Агент автоматически решает, когда выполнять поиск, на основе запроса и возвращает обоснованные ответы с соответствующими цитатами.

Полная программа

Вот как все устроено в Program.cs:

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;

Console.WriteLine("🎄 Christmas Gift Finder - Powered by AI Agents 🎄\n");

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!;
var deployment = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";

var chatClient = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
    .GetChatClient(deployment)
    .AsIChatClient();

// Create the agent team
var ideaAgent = ChristmasAgentFactory.CreateGiftIdeaAgent(chatClient);
var priceAgent = ChristmasAgentFactory.CreatePriceComparisonAgent(chatClient);
var summaryAgent = ChristmasAgentFactory.CreateSummaryAgent(chatClient);

// Build the workflow
var workflow = AgentWorkflowBuilder.BuildSequential(
    "ChristmasGiftWorkflow",
    [ideaAgent, priceAgent, summaryAgent]);

Console.Write("Who are you shopping for? ");
var recipientName = Console.ReadLine() ?? "Someone special";

Console.Write("What are their interests? ");
var interests = Console.ReadLine() ?? "general";

Console.Write("What's your budget? $");
var budget = Console.ReadLine() ?? "50";

var prompt = $"Find Christmas gifts for {recipientName} who enjoys {interests}. Budget: ${budget}";

Console.WriteLine("\n🔍 Searching for the perfect gifts...\n");

await using var run = await InProcessExecution.StreamAsync(
    workflow,
    new ChatMessage(ChatRole.User, prompt));

await run.TrySendMessageAsync(new TurnToken(emitEvents: true));

await foreach (var evt in run.WatchStreamAsync())
{
    switch (evt)
    {
        case AgentRunUpdateEvent update:
            Console.Write(update.Update.Text);
            break;
        case WorkflowOutputEvent output:
            Console.WriteLine("\n\n🎁 Happy Shopping! 🎁");
            break;
    }
}

Заключение

Microsoft Agent Framework позволяет на удивление легко создавать многоагентные системы, в которых каждый агент специализируется на определенной задаче. Координируя рабочие процессы этих агентов, мы можем структурированным и эффективным образом решать сложные проблемы, такие как рождественские покупки.

Что делает это еще более мощным, так это возможность добавлять реальные возможности с помощью инструментов. Благодаря интеграции Grounding с Bing Search от Microsoft Foundry наш агент по сравнению цен может фактически искать в Интернете текущие цены, предложения и наличие товаров, превращая простого чат-бота с искусственным интеллектом в действительно полезного помощника по покупкам с соответствующими цитатами.

Поддержка структурой последовательных, параллельных шаблонов и шаблонов передачи обслуживания означает, что вы можете разрабатывать системы агентов, которые точно соответствуют вашим потребностям. Будь то поиск подарков, планирование поездок или любая другая многоэтапная задача, Agent Framework предоставляет все необходимые элементы для ее реализации.В этот праздничный сезон позвольте ИИ-агентам заняться исследованиями, а вы сосредоточитесь на упаковке подарков и приятном времяпрепровождении с семьей!

Исходный код

Концепции, показанные в этом посте, основаны на официальных образцах Agent Framework. Дополнительные примеры можно найти в репозитории Microsoft Agent Framework GitHub.

Счастливых праздников и удачного кодирования! 🎄