Dela via


Vad är agenter?

Agenter är programvarubaserade entiteter som använder AI-modeller för att göra fungerar åt dig. De är byggda för att utföra en mängd olika uppgifter och kallas olika namn baserat på de jobb de utför.

Till exempel kallas en agent som skapats för att besvara frågor för en chattrobot på grund av chattbaserad upplevelse. Dessa agenter baseras vanligtvis på dina egna data, till exempel företagsdokument.

En agent som skapats för att fungera längs sidan kallas vanligtvis för en andrepilot. Dessa agenter hjälper dig att slutföra uppgifter som att skriva e-postmeddelanden eller skapa andra office-artefakter genom att ge rekommendationer som du väljer att antingen acceptera eller avvisa.

En agent som skapats för att hantera repetitiva uppgifter är vanligtvis märkt som helt autonom. De svarar på händelser och utför åtgärder utan att behöva ingripa. Detta skiljer sig från en andrepilot eftersom det gör arbete åt dig istället för tillsammans med dig.

Semantisk kernel ger dig infrastrukturen för att skapa alla typer av agenter som du behöver utan att vara expert på AI.

3 typer av agenter: Chatbot Copilot och Fullständigt autonoma

Skapa din första agent

En agent består av tre grundläggande byggstenar som harmoniskt arbetar tillsammans för att utföra uppgifter åt dig. Låt oss ta en närmare titt genom att skapa en andrepilot som hjälper dig att skriva och skicka ett e-postmeddelande.

Byggblock för en agent

En andrepilot för att skriva och skicka e-postmeddelanden

För att skapa den här andrepiloten måste du skapa ett plugin-program som kan skicka e-postmeddelanden, en planerare som genererar en plan för att skriva ett e-postmeddelande och en persona som interagerar med dig för att få den information som behövs för att skicka e-postmeddelandet.

Steg Description
1 Hämta användarens e-postadress och namn
2 Hämta mottagarens e-postadress
3 Hämta ämnet för e-postmeddelandet
4 Generera ämne och brödtext för e-postmeddelandet
5 Granska e-postmeddelandet med användaren
6 Skicka e-postmeddelandet

För att aktivera det här scenariot behöver vi skapa ett plugin-program som kan skicka e-postmeddelanden, en planerare som kan generera en plan för att skriva ett e-postmeddelande och en persona som kan interagera med användaren för att få nödvändig information.

Följande avsnitt beskriver de konceptuella byggstenarna och hur du sätter ihop dem för att skapa din första agent. Efteråt kan du läsa de specifika guiderna för varje byggblock för att lära dig mer om hur du skapar dem.

Plugin-program: ge dina agentkunskaper

För att generera planen ovan behöver andrepiloten först de funktioner som krävs för att utföra de här stegen. Det är här plugin-program kommer in. Med plugin-program kan du ge dina agentkunskaper via kod. Du kan till exempel skapa ett plugin-program som skickar e-postmeddelanden, hämtar information från en databas, ber om hjälp eller till och med sparar och hämtar minnen från tidigare konversationer.

I vårt exempel kan vi skapa ett enkelt plugin-program som skickar e-postmeddelanden med inbyggd kod. Vårt plugin-program har bara en enda funktion, send_email, som tar in e-postadressen, ämnet och brödtexten i e-postmeddelandet. Den skulle sedan använda den här informationen för att skicka e-postmeddelandet.

using System.ComponentModel;
using Microsoft.SemanticKernel;

public class EmailPlugin
{
    [KernelFunction("send_email")]
    [Description("Sends an email to a recipient.")]
    public async Task SendEmailAsync(
        Kernel kernel,
        List<string> recipientEmails,
        string subject,
        string body
    )
    {
        // Add logic to send an email using the recipientEmails, subject, and body
        // For now, we'll just print out a success message to the console
        Console.WriteLine("Email sent!");
    }
}
from semantic_kernel.functions import kernel_function

class EmailPlugin:
    @kernel_function(
        name="send_email",
        description="Sends an email to a recipient."
    )
    async def send_email(self, recipient_emails: str|List[str], subject: str, body: str):
        # Add logic to send an email using the recipient_emails, subject, and body
        # For now, we'll just print out a success message to the console
        print("Email sent!")

Det finns andra sätt att skapa plugin-program. Om du till exempel har en RestAPI som kan skicka e-post kan du automatiskt skapa ett plugin-program med dess OpenAPI-specifikation. Mer information om andra sätt att skapa plugin-program finns i avsnittet plugin-program.

Planering: slutföra uppgifter i flera steg

För att faktiskt använda det här plugin-programmet (och för att koppla upp dem med andra steg) skulle andrepiloten sedan behöva generera en plan. Det är här planeringen kommer in. Planeringen kommer från den inbyggda möjligheten för LLM:er att avgöra hur en uppgift ska slutföras iterativt.

Kommentar

Tidigare skapades särskilda uppmaningar av AI-apputvecklare för att vägleda AI:n när det gäller att generera en plan som kan användas av ett SDK som Semantic Kernel. Men med tillkomsten av LLM:er kan AIs nu generera planer direkt från en konversation med en användare med hjälp av funktionsanrop.

Med inbyggda planeringsstödformulär är det nu lika enkelt att använda semantisk kernel som att anropa en tjänst för chattens slutförande med automatisk funktionsanrop aktiverat.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;

// Create kernel with an email plugin
var builder = Kernel.CreateBuilder();
builder.Plugins.AddFromType<EmailPlugin>();
Kernel kernel = builder.Build();

// Create chat completion service
AzureOpenAIChatCompletionService chatCompletionService = new (
    deploymentName: "gpt-4",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT"
);

// Enable planning
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new() 
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};

// Create chat history
var history = new ChatHistory();
history.AddUserMessage("Can you help me write an email for my boss?");

// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
    history,
    executionSettings: openAIPromptExecutionSettings,
    kernel: kernel
);
import asyncio
import logging

from semantic_kernel import Kernel
from semantic_kernel.functions import kernel_function
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.connectors.ai.function_call_behavior import FunctionCallBehavior
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.contents.chat_history import ChatHistory
from semantic_kernel.functions.kernel_arguments import KernelArguments

from semantic_kernel.connectors.ai.open_ai.prompt_execution_settings.azure_chat_prompt_execution_settings import (
    AzureChatPromptExecutionSettings,
)

async def main():
    # Initialize the kernel
    kernel = Kernel()

    # Add Azure OpenAI chat completion
    kernel.add_service(AzureChatCompletion(
        deployment_name="your_models_deployment_name",
        api_key="your_api_key",
        base_url="your_base_url",
    ))

    # Set the logging level for  semantic_kernel.kernel to DEBUG.
    logging.basicConfig(
        format="[%(asctime)s - %(name)s:%(lineno)d - %(levelname)s] %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
    logging.getLogger("kernel").setLevel(logging.DEBUG)

    # Add a plugin (the EmailPlugin class is defined above)
    kernel.add_plugin(
        EmailPlugin(),
        plugin_name="Email",
    )

    chat_completion : AzureChatCompletion = kernel.get_service(type=ChatCompletionClientBase)

    # Enable planning
    execution_settings = AzureChatPromptExecutionSettings(tool_choice="auto")
    execution_settings.function_call_behavior = FunctionCallBehavior.EnableFunctions(auto_invoke=True, filters={})

    # Create a history of the conversation
    history = ChatHistory()
    history.add_user_message("Can you help me write an email for my boss?")

    result = (await chat_completion.get_chat_message_contents(
        chat_history=history,
        settings=execution_settings,
        kernel=kernel,
        arguments=KernelArguments(),
    ))[0]
    print(result)

# Run the main function
if __name__ == "__main__":
    asyncio.run(main())

Mer information om hur du planerar med semantisk kernel finns i planeringsartikeln.

Personas: ge din agent en jobbbeskrivning

I de flesta fall räcker det med att använda de inbyggda planeringsfunktionerna i LLM:er med plugin-program för att skapa en agent, men när du skapar fler domänspecifika agenter kanske du vill lägga till en persona i din agent.

En persona är anvisningarna som du tillhandahåller din agent så att de kan utföra den roll som du vill att de ska spela på ett effektivare sätt. När det är som enklast kan personen instruera AI:n att vara artig, be om förtydligande vid behov eller rollspel som en specifik arbetstitel (t.ex. en kundtjänstrepresentant).

För företagsscenarier kanske du dock vill ge mer detaljerade instruktioner till din agent. Du kanske till exempel vill instruera din agent att följa specifika regler, be om godkännande innan du vidtar åtgärder eller eskalera till en människa om AI:n inte kan slutföra en uppgift.

För att tillhandahålla en persona till din agent skriver du helt enkelt ett systemmeddelande i chatthistoriken som beskriver persona. AI:n använder sedan den här personan för att vägleda dess interaktioner med användaren.

// Create chat history
ChatHistory chatMessages = new ChatHistory("""
    You are a friendly assistant who likes to follow the rules. You will complete required steps
    and request approval before taking any consequential actions. If the user doesn't provide
    enough information for you to complete a task, you will keep asking questions until you have
    enough information to complete the task.
    """);
chatMessages.AddUserMessage("Can you help me write an email for my boss?");

// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
    history,
    executionSettings: openAIPromptExecutionSettings,
    kernel: kernel
);
# Create a history of the conversation
history = ChatHistory(system_message="""
    You are a friendly assistant who likes to follow the rules. You will complete required steps
    and request approval before taking any consequential actions. If the user doesn't provide
    enough information for you to complete a task, you will keep asking questions until you have
    enough information to complete the task.
    """)
history.add_user_message("Can you help me write an email for my boss?")

# Get the response from the AI
result = (await chat_completion.get_chat_message_contents(
    chat_history=history,
    settings=execution_settings,
    kernel=kernel,
    arguments=KernelArguments(),
))[0]

Mer information om hur du redigerar effektiva personas finns i artikeln personas.

Sätta ihop bitarna

Nu när vi förstår de viktigaste byggstenarna i en agent kan vi nu kombinera dem för att skapa vår första agent. För att göra det initierar vi objektet Kernel med våra plugin-program, planerare och persona. Efteråt använder Kernel vi objektet för att generera en plan och sedan köra planen.

// Create the kernel
var builder = Kernel.CreateBuilder();
builder.Services.AddLogging(c => c.SetMinimumLevel(LogLevel.Trace).AddDebug());
builder.Services.AddChatCompletionService(kernelSettings);
builder.Plugins.AddFromType<EmailPlugin>();
Kernel kernel = builder.Build();

// Retrieve the chat completion service from the kernel
IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

// Create the chat history
ChatHistory chatMessages = new ChatHistory("""
    You are a friendly assistant who likes to follow the rules. You will complete required steps
    and request approval before taking any consequential actions. If the user doesn't provide
    enough information for you to complete a task, you will keep asking questions until you have
    enough information to complete the task.
    """);

// Start the conversation
while (true)
{
    // Get user input
    System.Console.Write("User > ");
    chatMessages.AddUserMessage(Console.ReadLine()!);

    // Get the chat completions
    OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
    {
        FunctionCallBehavior = FunctionCallBehavior.AutoInvokeKernelFunctions
    };
    var result = chatCompletionService.GetStreamingChatMessageContentsAsync(
        chatMessages,
        executionSettings: openAIPromptExecutionSettings,
        kernel: kernel);

    // Stream the results
    string fullMessage = "";
    await foreach (var content in result)
    {
        if (content.Role.HasValue)
        {
            System.Console.Write("Assistant > ");
        }
        System.Console.Write(content.Content);
        fullMessage += content.Content;
    }
    System.Console.WriteLine();

    // Add the message from the agent to the chat history
    chatMessages.AddAssistantMessage(fullMessage);
}
import asyncio

from semantic_kernel import Kernel
from semantic_kernel.contents.chat_history import ChatHistory
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.connectors.ai.function_call_behavior import FunctionCallBehavior
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.connectors.ai.open_ai.prompt_execution_settings.azure_chat_prompt_execution_settings import (
    AzureChatPromptExecutionSettings,
)
from semantic_kernel.functions.kernel_arguments import KernelArguments

async def main():
    # Initialize the kernel
    kernel = Kernel()

    # Add Azure OpenAI chat completion
    kernel.add_service(AzureChatCompletion(
        deployment_name="your_models_deployment_name",
        api_key="your_api_key",
        base_url="your_base_url",
    ))

    # Add a plugin (the EmailPlugin class is defined above)
    kernel.add_plugin(
        EmailPlugin(),
        plugin_name="Email",
    )

    chat_completion : AzureChatCompletion = kernel.get_service(type=ChatCompletionClientBase)

    # Enable planning
    execution_settings = AzureChatPromptExecutionSettings(tool_choice="auto")
    execution_settings.function_call_behavior = FunctionCallBehavior.EnableFunctions(auto_invoke=True, filters={})

    # Create a history of the conversation
    history = ChatHistory()

    # Start the conversation
    while True:
        # Get user input
        user_input = input("User > ")
        history.add_user_message(user_input)

        # Get the response from the AI
        result = (await chat_completion.get_chat_message_contents(
            chat_history=history,
            settings=execution_settings,
            kernel=kernel,
            arguments=KernelArguments(),
        ))[0]

        # Print the response
        print("Assistant > " + str(result))
        history.add_assistant_message(str(result))

# Run the main function
if __name__ == "__main__":
    asyncio.run(main())

Testa din agent

Nu när vi har slutfört vårt program kan vi ge det en testkörning. Nedan visas en exempelkonversation med vår agent när du använder gpt-4-modellen.

Roll Meddelande
🔵Användare Kan du hjälpa mig att skriva ett e-postmeddelande till min chef?
🔴Assistent Naturligtvis skulle jag gärna hjälpa dig att skriva ett e-postmeddelande till din chef. Kan du ge mig mer information? Mer specifikt behöver jag veta:
1. Ämnet eller syftet med e-postmeddelandet.
2. Din chefs e-postadress.
🔵Användare Jag vill ge henne en uppdatering om förra månadens försäljning. Vi slog en massa rekord som jag vill dela med henne, men vi hade en utmaning att sälja X4321-modellen.
🔴Assistent Det låter som ett bra ämne för ett e-postmeddelande. Kan du ge mig din chefs e-postadress så att jag kan hjälpa dig vidare?
🔵Användare Javisst! Det är sarah@contoso.com
🔴Assistent Toppen! Här är en plan för din e-post:
1. Börja med en tydlig ämnesrad och hälsning: Ämnesraden bör vara kortfattad och informativ, till exempel "Uppdatera om förra månadens försäljnings- och X4321-modellutmaningar". Starta e-postmeddelandet med en professionell hälsning, som "Kära Sarah".
2. Markera prestationer och utmaningar i separata stycken: Börja med de positiva nyheterna om de rekordstora prestationerna. Använd specifika data och exempel för att illustrera framgången. Övergå sedan till utmaningarna med X4321-modellen. Var ärlig och tydlig med problemen, men föreslå också potentiella lösningar eller åtgärder som vidtas för att ta itu med dessa utmaningar.
3. Avsluta med en Call to Action och Professional Closing: Om du behöver Sarah att vidta några åtgärder, ange detta tydligt mot slutet av e-postmeddelandet. Detta kan vara att be om hennes synpunkter, ett möte för att diskutera ytterligare eller någon annan relevant åtgärd. Stäng e-postmeddelandet professionellt med en fras som "Bästa hälsningar" eller "Uppriktigt", följt av ditt namn.
Kom ihåg att korrekturläsa e-postmeddelandet för grammatiska fel eller otydliga instruktioner innan du skickar det. Detta hjälper till att säkerställa att meddelandet är professionellt och lätt att förstå.
Vill du att jag ska skriva e-postmeddelandet baserat på de här stegen?
🔵Användare Ja tack!
🔴Assistent Visst, här är ett utkast baserat på de steg vi diskuterade:
Ämne: Uppdatera om förra månadens försäljnings- och X4321-modellutmaningar
Kära Sarah,
Jag hoppas att detta e-postmeddelande hittar dig väl. Jag skriver för att uppdatera dig om vår försäljningsprestanda för den senaste månaden.
Jag är glad att kunna rapportera att vi slog flera försäljningsrekord förra månaden. Vårt teams hårda arbete och engagemang har lönat sig, vilket har resulterat i en betydande tillväxt i våra totala försäljningssiffror. [Här kan du lägga till specifika data eller exempel på brutna poster]
Vi stod dock inför vissa utmaningar med X4321-modellen. Trots vårt bästa arbete uppfyllde försäljningen för den här modellen inte våra förväntningar. [Här kan du förklara mer om de utmaningar som står inför]
Vi arbetar för närvarande med strategier för att förbättra försäljningen av X4321-modellen. [Här kan du nämna några specifika steg eller planer som du måste åtgärda problemet]
Jag skulle uppskatta era synpunkter i denna fråga. Om du vill kan vi schemalägga ett möte för att diskutera detta ytterligare.
Tack för ditt fortsatta stöd och din vägledning.
Vänliga hälsningar
[Ditt namn]
Granska det här utkastet och låt mig veta om du vill göra några ändringar innan jag skickar det.
🔵Användare Kan du lägga till att vi ökade våra intäkter med 20 %? Du kan också dela att X4321 inte sålde lika bra eftersom de flesta kunder uppgraderade till Y5000-modellen, men det är inte så illa eftersom det var det som bidrog till att öka våra intäkter.
🔴Assistent Absolut, här är det uppdaterade utkastet:
Ämne: Uppdatera om förra månadens försäljnings- och X4321-modellutmaningar
Kära Sarah,
Jag hoppas att detta e-postmeddelande hittar dig väl. Jag skriver för att uppdatera dig om vår försäljningsprestanda för den senaste månaden.
Jag är glad att kunna rapportera att vi slog flera försäljningsrekord förra månaden. Vårt teams hårda arbete och engagemang har lönat sig, vilket resulterar i en betydande 20% ökning av våra totala intäkter. Denna tillväxt är ett bevis på vårt teams engagemang och kvaliteten på våra produkter.
Vi stod dock inför vissa utmaningar med X4321-modellen. Trots vårt bästa arbete uppfyllde försäljningen för den här modellen inte våra förväntningar. Intressant nog uppgraderade de flesta kunder till Y5000-modellen, vilket bidrog avsevärt till våra ökade intäkter. Vi strävar efter att förbättra försäljningen av alla våra modeller, men den här förändringen i kundpreferensen är inte helt negativ.
Vi analyserar för närvarande den här trenden och arbetar med strategier för att utnyttja den för framtida försäljning. Dina insikter och förslag skulle vara mycket uppskattade.
Tack för ditt fortsatta stöd och din vägledning.
Vänliga hälsningar
Stephen
Granska det uppdaterade utkastet och låt mig veta om du vill göra några ändringar innan jag skickar det.
🔵Användare Signera det med Stephen och sedan kan du gå vidare och skicka det till Sarah
🟢Verktyg E-post skickad!
🔴Assistent E-postmeddelandet har skickats till Sarah. Om det finns något annat du behöver hjälp med kan du fråga!

Nästa steg

Nu när du har skapat din första agent kan du fördjupa dig i de olika komponenterna i Semantic Kernel.

Avsnitt beskrivning
Kärna Konfigurera och använda kärn kernelobjektet
AI-tjänster Integrering och användning av olika AI-tjänster
Plugin-program Integrera intern kod och API:er med semantisk kernel
Planerare Göra det möjligt för DINA AI-agenter att utföra uppgifter i flera steg
Personas Anpassa dina AI-agenter för att samarbeta bättre med andra