ai-agents-for-beginners

Дослідження фреймворків AI агентів

(Натисніть на зображення вище, щоб переглянути відео цього уроку)

Дослідження фреймворків AI агентів

Фреймворки AI агентів — це програмні платформи, створені для спрощення розробки, розгортання та управління AI агентами. Ці фреймворки надають розробникам готові компоненти, абстракції та інструменти, які спрощують створення складних AI систем.

Вони допомагають розробникам зосередитися на унікальних аспектах їхніх додатків, забезпечуючи стандартизовані підходи до вирішення загальних викликів у розробці AI агентів. Це підвищує масштабованість, доступність та ефективність у створенні AI систем.

Вступ

Цей урок охоплює:

Цілі навчання

Цілі цього уроку допоможуть вам зрозуміти:

Що таке фреймворки AI агентів і що вони дозволяють робити розробникам?

Традиційні AI фреймворки можуть допомогти інтегрувати AI у ваші додатки та покращити їх у таких аспектах:

Це звучить чудово, чи не так? Тож навіщо нам потрібен фреймворк AI агентів?

Фреймворки AI агентів представляють щось більше, ніж просто AI фреймворки. Вони створені для того, щоб забезпечити створення інтелектуальних агентів, які можуть взаємодіяти з користувачами, іншими агентами та середовищем для досягнення конкретних цілей. Ці агенти можуть демонструвати автономну поведінку, приймати рішення та адаптуватися до змінних умов. Давайте розглянемо деякі ключові можливості, які забезпечують фреймворки AI агентів:

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

Як швидко прототипувати, ітерувати та покращувати можливості агентів?

Це швидко змінюваний ландшафт, але є деякі речі, які є спільними для більшості фреймворків AI агентів і можуть допомогти вам швидко прототипувати та ітерувати, а саме модульні компоненти, інструменти для співпраці та навчання в реальному часі. Давайте розглянемо ці аспекти:

Використовуйте модульні компоненти

SDK, такі як Microsoft Semantic Kernel і LangChain, пропонують готові компоненти, такі як AI конектори, шаблони підказок і управління пам’яттю.

Як команди можуть використовувати це: Команди можуть швидко зібрати ці компоненти, щоб створити функціональний прототип без необхідності починати з нуля, що дозволяє швидко експериментувати та ітерувати.

Як це працює на практиці: Ви можете використовувати готовий парсер для вилучення інформації з введення користувача, модуль пам’яті для зберігання та отримання даних і генератор підказок для взаємодії з користувачами, все це без необхідності створювати ці компоненти з нуля.

Приклад коду. Давайте розглянемо приклади того, як можна використовувати готовий AI конектор із Semantic Kernel Python і .Net, який використовує автоматичні виклики функцій для відповіді моделі на введення користувача:

# Semantic Kernel Python Example

import asyncio
from typing import Annotated

from semantic_kernel.connectors.ai import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, AzureChatPromptExecutionSettings
from semantic_kernel.contents import ChatHistory
from semantic_kernel.functions import kernel_function
from semantic_kernel.kernel import Kernel

# Define a ChatHistory object to hold the conversation's context
chat_history = ChatHistory()
chat_history.add_user_message("I'd like to go to New York on January 1, 2025")


# Define a sample plugin that contains the function to book travel
class BookTravelPlugin:
    """A Sample Book Travel Plugin"""

    @kernel_function(name="book_flight", description="Book travel given location and date")
    async def book_flight(
        self, date: Annotated[str, "The date of travel"], location: Annotated[str, "The location to travel to"]
    ) -> str:
        return f"Travel was booked to {location} on {date}"

# Create the Kernel
kernel = Kernel()

# Add the sample plugin to the Kernel object
kernel.add_plugin(BookTravelPlugin(), plugin_name="book_travel")

# Define the Azure OpenAI AI Connector
chat_service = AzureChatCompletion(
    deployment_name="YOUR_DEPLOYMENT_NAME", 
    api_key="YOUR_API_KEY", 
    endpoint="https://<your-resource>.azure.openai.com/",
)

# Define the request settings to configure the model with auto-function calling
request_settings = AzureChatPromptExecutionSettings(function_choice_behavior=FunctionChoiceBehavior.Auto())


async def main():
    # Make the request to the model for the given chat history and request settings
    # The Kernel contains the sample that the model will request to invoke
    response = await chat_service.get_chat_message_content(
        chat_history=chat_history, settings=request_settings, kernel=kernel
    )
    assert response is not None

    """
    Note: In the auto function calling process, the model determines it can invoke the 
    `BookTravelPlugin` using the `book_flight` function, supplying the necessary arguments. 
    
    For example:

    "tool_calls": [
        {
            "id": "call_abc123",
            "type": "function",
            "function": {
                "name": "BookTravelPlugin-book_flight",
                "arguments": "{'location': 'New York', 'date': '2025-01-01'}"
            }
        }
    ]

    Since the location and date arguments are required (as defined by the kernel function), if the 
    model lacks either, it will prompt the user to provide them. For instance:

    User: Book me a flight to New York.
    Model: Sure, I'd love to help you book a flight. Could you please specify the date?
    User: I want to travel on January 1, 2025.
    Model: Your flight to New York on January 1, 2025, has been successfully booked. Safe travels!
    """

    print(f"`{response}`")
    # Example AI Model Response: `Your flight to New York on January 1, 2025, has been successfully booked. Safe travels! ✈️🗽`

    # Add the model's response to our chat history context
    chat_history.add_assistant_message(response.content)


if __name__ == "__main__":
    asyncio.run(main())
// Semantic Kernel C# example

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using System.ComponentModel;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;

ChatHistory chatHistory = [];
chatHistory.AddUserMessage("I'd like to go to New York on January 1, 2025");

var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT"
);
kernelBuilder.Plugins.AddFromType<BookTravelPlugin>("BookTravel"); 
var kernel = kernelBuilder.Build();

var settings = new AzureOpenAIPromptExecutionSettings()
{
    FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};

var chatCompletion = kernel.GetRequiredService<IChatCompletionService>();

var response = await chatCompletion.GetChatMessageContentAsync(chatHistory, settings, kernel);

/*
Behind the scenes, the model recognizes the tool to call, what arguments it already has (location) and (date)
{

"tool_calls": [
    {
        "id": "call_abc123",
        "type": "function",
        "function": {
            "name": "BookTravelPlugin-book_flight",
            "arguments": "{'location': 'New York', 'date': '2025-01-01'}"
        }
    }
]
*/

Console.WriteLine(response.Content);
chatHistory.AddMessage(response!.Role, response!.Content!);

// Example AI Model Response: Your flight to New York on January 1, 2025, has been successfully booked. Safe travels! ✈️🗽

// Define a plugin that contains the function to book travel
public class BookTravelPlugin
{
    [KernelFunction("book_flight")]
    [Description("Book travel given location and date")]
    public async Task<string> BookFlight(DateTime date, string location)
    {
        return await Task.FromResult( $"Travel was booked to {location} on {date}");
    }
}

З цього прикладу видно, як можна використовувати готовий парсер для вилучення ключової інформації з введення користувача, наприклад, місця відправлення, призначення та дати запиту на бронювання рейсу. Цей модульний підхід дозволяє зосередитися на логіці високого рівня.

Використовуйте інструменти для співпраці

Фреймворки, такі як CrewAI, Microsoft AutoGen і Semantic Kernel, сприяють створенню кількох агентів, які можуть працювати разом.

Як команди можуть використовувати це: Команди можуть проектувати агентів із конкретними ролями та завданнями, що дозволяє тестувати та вдосконалювати робочі процеси співпраці та підвищувати загальну ефективність системи.

Як це працює на практиці: Ви можете створити команду агентів, де кожен агент має спеціалізовану функцію, наприклад, отримання даних, аналіз або прийняття рішень. Ці агенти можуть спілкуватися та обмінюватися інформацією для досягнення спільної мети, наприклад, відповіді на запит користувача або виконання завдання.

Приклад коду (AutoGen):

# creating agents, then create a round robin schedule where they can work together, in this case in order

# Data Retrieval Agent
# Data Analysis Agent
# Decision Making Agent

agent_retrieve = AssistantAgent(
    name="dataretrieval",
    model_client=model_client,
    tools=[retrieve_tool],
    system_message="Use tools to solve tasks."
)

agent_analyze = AssistantAgent(
    name="dataanalysis",
    model_client=model_client,
    tools=[analyze_tool],
    system_message="Use tools to solve tasks."
)

# conversation ends when user says "APPROVE"
termination = TextMentionTermination("APPROVE")

user_proxy = UserProxyAgent("user_proxy", input_func=input)

team = RoundRobinGroupChat([agent_retrieve, agent_analyze, user_proxy], termination_condition=termination)

stream = team.run_stream(task="Analyze data", max_turns=10)
# Use asyncio.run(...) when running in a script.
await Console(stream)

У попередньому коді показано, як можна створити завдання, яке включає кілька агентів, що працюють разом для аналізу даних. Кожен агент виконує певну функцію, а завдання виконується шляхом координації агентів для досягнення бажаного результату. Створюючи спеціалізованих агентів із визначеними ролями, ви можете підвищити ефективність і продуктивність завдань.

Навчайтеся в реальному часі

Розширені фреймворки забезпечують можливості для розуміння контексту в реальному часі та адаптації.

Як команди можуть використовувати це: Команди можуть реалізовувати зворотні зв’язки, де агенти навчаються від взаємодій і динамічно коригують свою поведінку, що призводить до постійного вдосконалення та уточнення можливостей.

Як це працює на практиці: Агенти можуть аналізувати зворотний зв’язок користувачів, дані середовища та результати завдань, щоб оновлювати свою базу знань, коригувати алгоритми прийняття рішень і покращувати продуктивність з часом. Цей ітеративний процес навчання дозволяє агентам адаптуватися до змінних умов і вподобань користувачів, підвищуючи загальну ефективність системи.

Які відмінності між фреймворками AutoGen, Semantic Kernel та Azure AI Agent Service?

Існує багато способів порівняти ці фреймворки, але давайте розглянемо деякі ключові відмінності з точки зору їхнього дизайну, можливостей і цільових сценаріїв використання:

AutoGen

AutoGen — це фреймворк з відкритим кодом, розроблений AI Frontiers Lab Microsoft Research. Він зосереджений на подієво-орієнтованих, розподілених агентних додатках, що дозволяють використовувати кілька LLMs і SLMs, інструменти та розширені шаблони дизайну мультиагентів.

AutoGen побудований навколо основної концепції агентів, які є автономними сутностями, здатними сприймати своє середовище, приймати рішення та виконувати дії для досягнення конкретних цілей. Агенти спілкуються через асинхронні повідомлення, що дозволяє їм працювати незалежно та паралельно, підвищуючи масштабованість і чутливість системи.

Агенти базуються на акторній моделі. Згідно з Вікіпедією, актор — це основний будівельний блок паралельних обчислень. У відповідь на отримане повідомлення актор може: приймати локальні рішення, створювати більше акторів, надсилати більше повідомлень і визначати, як реагувати на наступне отримане повідомлення.

Сценарії використання: Автоматизація генерації коду, завдання аналізу даних і створення користувацьких агентів для функцій планування та досліджень.

Ось деякі важливі основні концепції AutoGen:

Semantic Kernel + Agent Framework

Semantic Kernel — це SDK для оркестрації AI, готовий до використання в підприємствах. Він складається з AI і Memory конекторів, а також фреймворку агентів.

Спочатку розглянемо деякі основні компоненти:

Отже, це основи фреймворку Semantic Kernel, а як щодо Agent Framework?

Сервіс Azure AI Agent

Сервіс Azure AI Agent — це більш нове доповнення, представлене на Microsoft Ignite 2024. Він дозволяє розробляти та розгортати AI-агенти з більш гнучкими моделями, такими як прямий виклик відкритих LLM, таких як Llama 3, Mistral і Cohere.

Сервіс Azure AI Agent забезпечує сильніші механізми безпеки для підприємств і методи зберігання даних, що робить його придатним для корпоративних застосувань.

Він працює “з коробки” з фреймворками оркестрації мультиагентів, такими як AutoGen і Semantic Kernel.

Цей сервіс наразі знаходиться в Public Preview і підтримує Python та C# для створення агентів.

Використовуючи Semantic Kernel Python, ми можемо створити Azure AI Agent з плагіном, визначеним користувачем:

import asyncio
from typing import Annotated

from azure.identity.aio import DefaultAzureCredential

from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings, AzureAIAgentThread
from semantic_kernel.contents import ChatMessageContent
from semantic_kernel.contents import AuthorRole
from semantic_kernel.functions import kernel_function


# Define a sample plugin for the sample
class MenuPlugin:
    """A sample Menu Plugin used for the concept sample."""

    @kernel_function(description="Provides a list of specials from the menu.")
    def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
        return """
        Special Soup: Clam Chowder
        Special Salad: Cobb Salad
        Special Drink: Chai Tea
        """

    @kernel_function(description="Provides the price of the requested menu item.")
    def get_item_price(
        self, menu_item: Annotated[str, "The name of the menu item."]
    ) -> Annotated[str, "Returns the price of the menu item."]:
        return "$9.99"


async def main() -> None:
    ai_agent_settings = AzureAIAgentSettings.create()

    async with (
        DefaultAzureCredential() as creds,
        AzureAIAgent.create_client(
            credential=creds,
            conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
        ) as client,
    ):
        # Create agent definition
        agent_definition = await client.agents.create_agent(
            model=ai_agent_settings.model_deployment_name,
            name="Host",
            instructions="Answer questions about the menu.",
        )

        # Create the AzureAI Agent using the defined client and agent definition
        agent = AzureAIAgent(
            client=client,
            definition=agent_definition,
            plugins=[MenuPlugin()],
        )

        # Create a thread to hold the conversation
        # If no thread is provided, a new thread will be
        # created and returned with the initial response
        thread: AzureAIAgentThread | None = None

        user_inputs = [
            "Hello",
            "What is the special soup?",
            "How much does that cost?",
            "Thank you",
        ]

        try:
            for user_input in user_inputs:
                print(f"# User: '{user_input}'")
                # Invoke the agent for the specified thread
                response = await agent.get_response(
                    messages=user_input,
                    thread_id=thread,
                )
                print(f"# {response.name}: {response.content}")
                thread = response.thread
        finally:
            await thread.delete() if thread else None
            await client.agents.delete_agent(agent.id)


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

Основні концепції

Сервіс Azure AI Agent має наступні основні концепції:

Сфери застосування: Сервіс Azure AI Agent призначений для корпоративних застосувань, які потребують безпечного, масштабованого та гнучкого розгортання AI-агентів.

У чому різниця між цими фреймворками?

Здається, що між цими фреймворками є багато спільного, але є ключові відмінності в їх дизайні, можливостях і цільових сферах застосування:

Все ще не знаєте, що вибрати?

Сфери застосування

Давайте спробуємо допомогти вам, розглянувши деякі поширені сценарії:

П: Я експериментую, вивчаю і створюю прототипи агентних застосувань, і хочу мати можливість швидко створювати і експериментувати.

В: AutoGen буде хорошим вибором для цього сценарію, оскільки він зосереджується на подіях, розподілених агентних застосуваннях і підтримує передові шаблони дизайну мультиагентів.

П: Що робить AutoGen кращим вибором, ніж Semantic Kernel і Azure AI Agent Service для цього сценарію?

В: AutoGen спеціально розроблений для подій, розподілених агентних застосувань, що робить його добре підходящим для автоматизації завдань генерації коду і аналізу даних. Він забезпечує необхідні інструменти і можливості для ефективного створення складних мультиагентних систем.

П: Здається, що Azure AI Agent Service також може підійти, адже він має інструменти для генерації коду і багато іншого?

В: Так, Azure AI Agent Service — це платформний сервіс для агентів, який додає вбудовані можливості для кількох моделей, Azure AI Search, Bing Search і Azure Functions. Це дозволяє легко створювати ваших агентів у Foundry Portal і розгортати їх у масштабі.

П: Я все ще заплутався, просто дайте мені один варіант.

В: Чудовим вибором буде спочатку створити ваш застосунок у Semantic Kernel, а потім використовувати Azure AI Agent Service для розгортання вашого агента. Цей підхід дозволяє легко зберігати ваших агентів, використовуючи потужність для створення мультиагентних систем у Semantic Kernel. Крім того, Semantic Kernel має конектор в AutoGen, що робить його легким для використання обох фреймворків разом.

Давайте підсумуємо ключові відмінності в таблиці:

Фреймворк Фокус Основні концепції Сфери застосування
AutoGen Події, розподілені агентні застосування Агенти, Персони, Функції, Дані Генерація коду, завдання аналізу даних
Semantic Kernel Розуміння і генерація текстового контенту, схожого на людський Агенти, Модульні компоненти, Співпраця Розуміння природної мови, генерація контенту
Azure AI Agent Service Гнучкі моделі, корпоративна безпека, Генерація коду, Виклик інструментів Модульність, Співпраця, Оркестрація процесів Безпечне, масштабоване і гнучке розгортання AI-агентів

Який ідеальний сценарій використання для кожного з цих фреймворків?

Чи можу я інтегрувати свої існуючі інструменти Azure екосистеми безпосередньо, чи мені потрібні окремі рішення?

Відповідь — так, ви можете інтегрувати свої існуючі інструменти Azure екосистеми безпосередньо з Azure AI Agent Service, особливо тому, що він був створений для безперебійної роботи з іншими сервісами Azure. Наприклад, ви могли б інтегрувати Bing, Azure AI Search і Azure Functions. Також є глибока інтеграція з Azure AI Foundry.

Для AutoGen і Semantic Kernel ви також можете інтегруватися з сервісами Azure, але це може вимагати виклику сервісів Azure з вашого коду. Інший спосіб інтеграції — використання Azure SDK для взаємодії з сервісами Azure з ваших агентів. Крім того, як було згадано, ви можете використовувати Azure AI Agent Service як оркестратор для ваших агентів, створених в AutoGen або Semantic Kernel, що забезпечить легкий доступ до екосистеми Azure.

Приклади коду

Є ще питання про AI Agent Frameworks?

Приєднуйтесь до Azure AI Foundry Discord, щоб зустрітися з іншими учнями, відвідати години консультацій і отримати відповіді на ваші запитання про AI-агентів.

Посилання

Попередній урок

Вступ до AI-агентів і сфер застосування агентів

Наступний урок

Розуміння шаблонів агентного дизайну


Відмова від відповідальності:
Цей документ був перекладений за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.