ai-agents-for-beginners

Esplorare i Framework per Agenti AI

(Clicca sull’immagine sopra per vedere il video di questa lezione)

Esplora i Framework per Agenti AI

I framework per agenti AI sono piattaforme software progettate per semplificare la creazione, il deployment e la gestione degli agenti AI. Questi framework offrono ai sviluppatori componenti predefiniti, astrazioni e strumenti che facilitano lo sviluppo di sistemi AI complessi.

Questi framework aiutano gli sviluppatori a concentrarsi sugli aspetti unici delle loro applicazioni fornendo approcci standardizzati alle sfide comuni nello sviluppo di agenti AI. Migliorano la scalabilità, l’accessibilità e l’efficienza nella costruzione di sistemi AI.

Introduzione

Questa lezione coprirà:

Obiettivi di apprendimento

Gli obiettivi di questa lezione sono aiutarti a comprendere:

Cosa sono i Framework per Agenti AI e cosa permettono agli sviluppatori di fare?

I framework AI tradizionali possono aiutarti a integrare l’AI nelle tue app e migliorare queste app nei seguenti modi:

Sembra tutto fantastico, giusto? Quindi perché abbiamo bisogno del Framework per Agenti AI?

I framework per agenti AI rappresentano qualcosa di più rispetto ai semplici framework AI. Sono progettati per consentire la creazione di agenti intelligenti che possono interagire con gli utenti, altri agenti e l’ambiente per raggiungere obiettivi specifici. Questi agenti possono mostrare comportamenti autonomi, prendere decisioni e adattarsi a condizioni mutevoli. Vediamo alcune capacità chiave abilitate dai Framework per Agenti AI:

In sintesi, gli agenti ti permettono di fare di più, portare l’automazione al livello successivo, creare sistemi più intelligenti che possono adattarsi e apprendere dal loro ambiente.

Come prototipare rapidamente, iterare e migliorare le capacità dell’agente?

Questo è un panorama in rapida evoluzione, ma ci sono alcune cose comuni alla maggior parte dei Framework per Agenti AI che possono aiutarti a prototipare e iterare rapidamente, ovvero componenti modulari, strumenti collaborativi e apprendimento in tempo reale. Approfondiamo questi aspetti:

Usa Componenti Modulari

SDK come Microsoft Semantic Kernel e LangChain offrono componenti predefiniti come connettori AI, modelli di prompt e gestione della memoria.

Come possono usarli i team: I team possono assemblare rapidamente questi componenti per creare un prototipo funzionale senza partire da zero, consentendo una sperimentazione e iterazione rapide.

Come funziona in pratica: Puoi utilizzare un parser predefinito per estrarre informazioni dall’input dell’utente, un modulo di memoria per archiviare e recuperare dati e un generatore di prompt per interagire con gli utenti, tutto senza dover costruire questi componenti da zero.

Esempio di codice. Vediamo esempi di come puoi utilizzare un connettore AI predefinito con Semantic Kernel Python e .Net che utilizza chiamate di funzione automatiche per far rispondere il modello all’input dell’utente:

# 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}");
    }
}

Quello che puoi vedere da questo esempio è come puoi sfruttare un parser predefinito per estrarre informazioni chiave dall’input dell’utente, come l’origine, la destinazione e la data di una richiesta di prenotazione di volo. Questo approccio modulare ti consente di concentrarti sulla logica di alto livello.

Sfrutta Strumenti Collaborativi

Framework come CrewAI, Microsoft AutoGen e Semantic Kernel facilitano la creazione di più agenti che possono lavorare insieme.

Come possono usarli i team: I team possono progettare agenti con ruoli e compiti specifici, consentendo loro di testare e perfezionare i flussi di lavoro collaborativi e migliorare l’efficienza complessiva del sistema.

Come funziona in pratica: Puoi creare un team di agenti in cui ogni agente ha una funzione specializzata, come il recupero di dati, l’analisi o il processo decisionale. Questi agenti possono comunicare e condividere informazioni per raggiungere un obiettivo comune, come rispondere a una query dell’utente o completare un compito.

Esempio di codice (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)

Quello che vedi nel codice precedente è come puoi creare un compito che coinvolge più agenti che lavorano insieme per analizzare i dati. Ogni agente svolge una funzione specifica e il compito viene eseguito coordinando gli agenti per raggiungere il risultato desiderato. Creando agenti dedicati con ruoli specializzati, puoi migliorare l’efficienza e le prestazioni del compito.

Apprendi in Tempo Reale

I framework avanzati forniscono capacità per la comprensione contestuale e l’adattamento in tempo reale.

Come possono usarli i team: I team possono implementare cicli di feedback in cui gli agenti apprendono dalle interazioni e regolano dinamicamente il loro comportamento, portando a un miglioramento continuo e al perfezionamento delle capacità.

Come funziona in pratica: Gli agenti possono analizzare il feedback degli utenti, i dati ambientali e i risultati dei compiti per aggiornare la loro base di conoscenze, regolare gli algoritmi decisionali e migliorare le prestazioni nel tempo. Questo processo di apprendimento iterativo consente agli agenti di adattarsi alle condizioni mutevoli e alle preferenze degli utenti, migliorando l’efficacia complessiva del sistema.

Quali sono le differenze tra i framework AutoGen, Semantic Kernel e Azure AI Agent Service?

Ci sono molti modi per confrontare questi framework, ma vediamo alcune differenze chiave in termini di design, capacità e casi d’uso target:

AutoGen

AutoGen è un framework open-source sviluppato dal laboratorio AI Frontiers di Microsoft Research. Si concentra su applicazioni distribuite e basate su eventi, abilitando LLM e SLM multipli, strumenti e modelli avanzati di progettazione multi-agente.

AutoGen è costruito attorno al concetto centrale di agenti, che sono entità autonome in grado di percepire il loro ambiente, prendere decisioni e intraprendere azioni per raggiungere obiettivi specifici. Gli agenti comunicano attraverso messaggi asincroni, consentendo loro di lavorare in modo indipendente e in parallelo, migliorando la scalabilità e la reattività del sistema.

Secondo Wikipedia, un attore è il blocco di base della computazione concorrente. In risposta a un messaggio ricevuto, un attore può: prendere decisioni locali, creare altri attori, inviare altri messaggi e determinare come rispondere al prossimo messaggio ricevuto.

Casi d’uso: Automazione della generazione di codice, compiti di analisi dei dati e creazione di agenti personalizzati per funzioni di pianificazione e ricerca.

Ecco alcuni concetti fondamentali di AutoGen:

Semantic Kernel + Framework per Agenti

Semantic Kernel è un SDK di orchestrazione AI pronto per l’azienda. Consiste in connettori AI e di memoria, insieme a un Framework per Agenti.

Copriamo prima alcuni componenti fondamentali:

Azure AI Agent Service

Azure AI Agent Service è un’aggiunta più recente, introdotta al Microsoft Ignite 2024. Consente lo sviluppo e il deployment di agenti AI con modelli più flessibili, come la chiamata diretta a LLM open-source come Llama 3, Mistral e Cohere.

Azure AI Agent Service offre meccanismi di sicurezza aziendale più robusti e metodi di archiviazione dei dati, rendendolo adatto per applicazioni aziendali.

Funziona immediatamente con framework di orchestrazione multi-agente come AutoGen e Semantic Kernel.

Questo servizio è attualmente in Public Preview e supporta Python e C# per la creazione di agenti.

Utilizzando Semantic Kernel Python, possiamo creare un Azure AI Agent con un plugin definito dall’utente:

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())

Concetti principali

Azure AI Agent Service si basa sui seguenti concetti principali:

Casi d’uso: Azure AI Agent Service è progettato per applicazioni aziendali che richiedono un deployment di agenti AI sicuro, scalabile e flessibile.

Qual è la differenza tra questi framework?

Sembra che ci sia molta sovrapposizione tra questi framework, ma ci sono alcune differenze chiave in termini di design, capacità e casi d’uso target:

Non sei ancora sicuro di quale scegliere?

Casi d’uso

Vediamo se possiamo aiutarti esaminando alcuni casi d’uso comuni:

D: Sto sperimentando, imparando e costruendo applicazioni agentiche proof-of-concept, e voglio essere in grado di costruire e sperimentare rapidamente

R: AutoGen sarebbe una buona scelta per questo scenario, poiché si concentra su applicazioni agentiche distribuite e basate su eventi e supporta modelli di progettazione avanzati per sistemi multi-agente.

D: Cosa rende AutoGen una scelta migliore rispetto a Semantic Kernel e Azure AI Agent Service per questo caso d’uso?

R: AutoGen è specificamente progettato per applicazioni agentiche distribuite e basate su eventi, rendendolo particolarmente adatto per automatizzare attività di generazione di codice e analisi dei dati. Fornisce gli strumenti e le capacità necessarie per costruire sistemi multi-agente complessi in modo efficiente.

D: Sembra che anche Azure AI Agent Service potrebbe funzionare qui, ha strumenti per la generazione di codice e altro?

R: Sì, Azure AI Agent Service è una piattaforma per agenti e aggiunge funzionalità integrate per modelli multipli, Azure AI Search, Bing Search e Azure Functions. Rende facile costruire i tuoi agenti nel Foundry Portal e distribuirli su larga scala.

D: Sono ancora confuso, dammi solo un’opzione

R: Una scelta eccellente è costruire la tua applicazione in Semantic Kernel prima e poi utilizzare Azure AI Agent Service per distribuire il tuo agente. Questo approccio ti consente di mantenere facilmente i tuoi agenti sfruttando al contempo la potenza di costruire sistemi multi-agente in Semantic Kernel. Inoltre, Semantic Kernel ha un connettore in AutoGen, rendendo facile utilizzare entrambi i framework insieme.

Riassumiamo le differenze chiave in una tabella:

Framework Focus Concetti principali Casi d’uso
AutoGen Applicazioni agentiche distribuite e basate su eventi Agenti, Personas, Funzioni, Dati Generazione di codice, analisi dei dati
Semantic Kernel Comprensione e generazione di contenuti simili a quelli umani Agenti, Componenti modulari, Collaborazione Comprensione del linguaggio naturale, generazione di contenuti
Azure AI Agent Service Modelli flessibili, sicurezza aziendale, Generazione di codice, Chiamata di strumenti Modularità, Collaborazione, Orchestrazione dei processi Deployment di agenti AI sicuro, scalabile e flessibile

Qual è il caso d’uso ideale per ciascuno di questi framework?

Posso integrare direttamente i miei strumenti dell’ecosistema Azure esistenti o ho bisogno di soluzioni autonome?

La risposta è sì, puoi integrare direttamente i tuoi strumenti dell’ecosistema Azure esistenti con Azure AI Agent Service, soprattutto perché è stato progettato per funzionare senza problemi con altri servizi Azure. Ad esempio, potresti integrare Bing, Azure AI Search e Azure Functions. C’è anche un’integrazione profonda con Azure AI Foundry.

Per AutoGen e Semantic Kernel, puoi anche integrare i servizi Azure, ma potrebbe essere necessario chiamare i servizi Azure dal tuo codice. Un altro modo per integrare è utilizzare gli SDK Azure per interagire con i servizi Azure dai tuoi agenti. Inoltre, come menzionato, puoi utilizzare Azure AI Agent Service come orchestratore per i tuoi agenti costruiti in AutoGen o Semantic Kernel, il che renderebbe facile l’accesso all’ecosistema Azure.

Hai altre domande sui framework AI Agent?

Unisciti al Discord di Azure AI Foundry per incontrare altri studenti, partecipare agli orari di ufficio e ottenere risposte alle tue domande sugli AI Agent.

Riferimenti

Lezione precedente

Introduzione agli AI Agent e ai casi d’uso degli agenti

Lezione successiva

Comprendere i modelli di progettazione agentica


Disclaimer:
Questo documento è stato tradotto utilizzando il servizio di traduzione automatica Co-op Translator. Sebbene ci impegniamo per garantire l’accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall’uso di questa traduzione.