Dela via


Anvisningar: chattens slutförandeagent

Varning

Semantic Kernel Agent Framework- är i förhandsversion och kan komma att ändras.

Översikt

I det här exemplet kommer vi att utforska hur du konfigurerar ett plugin-program för att komma åt GitHub-API:et och ge templaterade instruktioner till en chattkompletteringsagent för att besvara frågor om en GitHub-lagringsplats. Metoden kommer att delas upp steg för steg för att belysa de viktigaste delarna i kodningsprocessen. Som en del av uppgiften tillhandahåller agenten dokumentciteringar i svaret.

Direktuppspelning används för att leverera agentens svar. Detta ger realtidsuppdateringar under aktivitetens gång.

Komma igång

Innan du fortsätter med funktionskodning kontrollerar du att utvecklingsmiljön är helt konfigurerad och konfigurerad.

Börja med att skapa ett konsolprojekt . Inkludera sedan följande paketreferenser för att säkerställa att alla nödvändiga beroenden är tillgängliga.

Om du vill lägga till paketberoenden från kommandoraden dotnet använder du kommandot:

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Binder
dotnet add package Microsoft.Extensions.Configuration.UserSecrets
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables
dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI
dotnet add package Microsoft.SemanticKernel.Agents.Core --prerelease

Om du hanterar NuGet-paket i Visual Studio kontrollerar du att Include prerelease det är markerat.

Projektfilen (.csproj) bör innehålla följande PackageReference definitioner:

  <ItemGroup>
    <PackageReference Include="Azure.Identity" Version="<stable>" />
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="<stable>" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="<stable>" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="<stable>" />
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="<stable>" />
    <PackageReference Include="Microsoft.SemanticKernel.Agents.Core" Version="<latest>" />
    <PackageReference Include="Microsoft.SemanticKernel.Connectors.AzureOpenAI" Version="<latest>" />
  </ItemGroup>

Agent Framework är experimentellt och kräver varningsundertryckning. Detta kan adresseras som en egenskap i projektfilen (.csproj):

  <PropertyGroup>
    <NoWarn>$(NoWarn);CA2007;IDE1006;SKEXP0001;SKEXP0110;OPENAI001</NoWarn>
  </PropertyGroup>

Kopiera dessutom GitHub-plugin-programmet och modellerna (GitHubPlugin.cs och ) frånLearnResources. Lägg till de här filerna i projektmappen.

Börja med att skapa en mapp som innehåller skriptet (.py filen) och exempelresurserna. Ta med följande importer överst .py i filen:

import asyncio
import os
import sys
from datetime import datetime

from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.contents.chat_history import ChatHistory
from semantic_kernel.contents.chat_message_content import ChatMessageContent
from semantic_kernel.contents.utils.author_role import AuthorRole
from semantic_kernel.kernel import Kernel
from semantic_kernel.functions.kernel_arguments import KernelArguments

# Adjust the sys.path so we can use the GitHubPlugin and GitHubSettings classes
# This is so we can run the code from the samples/learn_resources/agent_docs directory
# If you are running code from your own project, you may not need need to do this.
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from plugins.GithubPlugin.github import GitHubPlugin, GitHubSettings  # noqa: E402

Kopiera dessutom GitHub-plugin-programmet och modellerna (github.py) från Semantic KernelLearnResources Project. Lägg till de här filerna i projektmappen.

Agenter är för närvarande inte tillgängliga i Java.

Konfiguration

Det här exemplet kräver konfigurationsinställning för att ansluta till fjärrtjänster. Du måste definiera inställningar för antingen Open AI eller Azure Open AI och även för GitHub.

Obs! Information om personliga åtkomsttoken för GitHub finns i: Hantera dina personliga åtkomsttoken.

# Open AI
dotnet user-secrets set "OpenAISettings:ApiKey" "<api-key>"
dotnet user-secrets set "OpenAISettings:ChatModel" "gpt-4o"

# Azure Open AI
dotnet user-secrets set "AzureOpenAISettings:ApiKey" "<api-key>" # Not required if using token-credential
dotnet user-secrets set "AzureOpenAISettings:Endpoint" "<model-endpoint>"
dotnet user-secrets set "AzureOpenAISettings:ChatModelDeployment" "gpt-4o"

# GitHub
dotnet user-secrets set "GitHubSettings:BaseUrl" "https://api.github.com"
dotnet user-secrets set "GitHubSettings:Token" "<personal access token>"

Följande klass används i alla agentexempel. Se till att inkludera den i projektet för att säkerställa rätt funktioner. Den här klassen fungerar som en grundläggande komponent för de exempel som följer.

using System.Reflection;
using Microsoft.Extensions.Configuration;

namespace AgentsSample;

public class Settings
{
    private readonly IConfigurationRoot configRoot;

    private AzureOpenAISettings azureOpenAI;
    private OpenAISettings openAI;

    public AzureOpenAISettings AzureOpenAI => this.azureOpenAI ??= this.GetSettings<Settings.AzureOpenAISettings>();
    public OpenAISettings OpenAI => this.openAI ??= this.GetSettings<Settings.OpenAISettings>();

    public class OpenAISettings
    {
        public string ChatModel { get; set; } = string.Empty;
        public string ApiKey { get; set; } = string.Empty;
    }

    public class AzureOpenAISettings
    {
        public string ChatModelDeployment { get; set; } = string.Empty;
        public string Endpoint { get; set; } = string.Empty;
        public string ApiKey { get; set; } = string.Empty;
    }

    public TSettings GetSettings<TSettings>() =>
        this.configRoot.GetRequiredSection(typeof(TSettings).Name).Get<TSettings>()!;

    public Settings()
    {
        this.configRoot =
            new ConfigurationBuilder()
                .AddEnvironmentVariables()
                .AddUserSecrets(Assembly.GetExecutingAssembly(), optional: true)
                .Build();
    }
}

Det snabbaste sättet att komma igång med rätt konfiguration för att köra exempelkoden är att skapa en .env fil i roten av projektet (där skriptet körs).

Konfigurera följande inställningar i .env filen för Antingen Azure OpenAI eller OpenAI:

AZURE_OPENAI_API_KEY="..."
AZURE_OPENAI_ENDPOINT="https://..."
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME="..."
AZURE_OPENAI_API_VERSION="..."

OPENAI_API_KEY="sk-..."
OPENAI_ORG_ID=""
OPENAI_CHAT_MODEL_ID=""

När de har konfigurerats hämtar respektive AI-tjänstklasser de variabler som krävs och använder dem under instansieringen.

Agenter är för närvarande inte tillgängliga i Java.

Kodning

Kodningsprocessen för det här exemplet omfattar:

  1. Installation – Initiera inställningar och plugin-programmet.
  2. Agentdefinition – Skapa chattens slutförandeagent med templaterade instruktioner och plugin-program.
  3. Chattslingan – Skriv loopen som driver interaktion mellan användare och agent.

Den fullständiga exempelkoden finns i avsnittet Slutlig . Se det avsnittet för den fullständiga implementeringen.

Ställ in

Innan du skapar en chattkompletteringsagent måste konfigurationsinställningar, plugin-program och Kernel initieras.

Initiera klassen som Settings refererades i föregående konfigurationsavsnitt .

Settings settings = new();

Agenter är för närvarande inte tillgängliga i Java.

Initiera plugin-programmet med dess inställningar.

Här visas ett meddelande som anger förloppet.

Console.WriteLine("Initialize plugins...");
GitHubSettings githubSettings = settings.GetSettings<GitHubSettings>();
GitHubPlugin githubPlugin = new(githubSettings);
gh_settings = GitHubSettings(
    token="<PAT value>"
)
kernel.add_plugin(GitHubPlugin(settings=gh_settings), plugin_name="github")

Agenter är för närvarande inte tillgängliga i Java.

Initiera nu en Kernel instans med en IChatCompletionService och den GitHubPlugin tidigare skapade.

Console.WriteLine("Creating kernel...");
IKernelBuilder builder = Kernel.CreateBuilder();

builder.AddAzureOpenAIChatCompletion(
    settings.AzureOpenAI.ChatModelDeployment,
    settings.AzureOpenAI.Endpoint,
    new AzureCliCredential());

builder.Plugins.AddFromObject(githubPlugin);

Kernel kernel = builder.Build();
kernel = Kernel()

# Add the AzureChatCompletion AI Service to the Kernel
service_id = "agent"
kernel.add_service(AzureChatCompletion(service_id=service_id))

settings = kernel.get_prompt_execution_settings_from_service_id(service_id=service_id)
# Configure the function choice behavior to auto invoke kernel functions
settings.function_choice_behavior = FunctionChoiceBehavior.Auto()

Agenter är för närvarande inte tillgängliga i Java.

Agentdefinition

Slutligen är vi redo att instansiera en chattkompletteringsagent med dess instruktioner, tillhörande kernel och standardinställningarna för argument och körning. I det här fallet vill vi att alla plugin-funktioner ska köras automatiskt.

Console.WriteLine("Defining agent...");
ChatCompletionAgent agent =
    new()
    {
        Name = "SampleAssistantAgent",
        Instructions =
            """
            You are an agent designed to query and retrieve information from a single GitHub repository in a read-only manner.
            You are also able to access the profile of the active user.

            Use the current date and time to provide up-to-date details or time-sensitive responses.

            The repository you are querying is a public repository with the following name: {{$repository}}

            The current date and time is: {{$now}}. 
            """,
        Kernel = kernel,
        Arguments =
            new KernelArguments(new AzureOpenAIPromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() })
            {
                { "repository", "microsoft/semantic-kernel" }
            }
    };

Console.WriteLine("Ready!");
agent = ChatCompletionAgent(
    service_id="agent",
    kernel=kernel,
    name="SampleAssistantAgent",
    instructions=f"""
        You are an agent designed to query and retrieve information from a single GitHub repository in a read-only 
        manner.
        You are also able to access the profile of the active user.

        Use the current date and time to provide up-to-date details or time-sensitive responses.

        The repository you are querying is a public repository with the following name: microsoft/semantic-kernel

        The current date and time is: {{$now}}. 
        """,
    arguments=KernelArguments(
        settings=AzureAIPromptExecutionSettings(function_choice_behavior=FunctionChoiceBehavior.Auto()),
        repository="microsoft/semantic-kernel",
    ),
)

Agenter är för närvarande inte tillgängliga i Java.

Chattloopen

Äntligen kan vi samordna interaktionen mellan användaren och agenten. Börja med att skapa ett chatthistorikobjekt för att behålla konversationstillståndet och skapa en tom loop.

ChatHistory history = [];
bool isComplete = false;
do
{
    // processing logic here
} while (!isComplete);
history = ChatHistory()
is_complete: bool = False
while not is_complete:
    # processing logic here

Agenter är för närvarande inte tillgängliga i Java.

Nu ska vi samla in användarindata i föregående loop. I det här fallet ignoreras tomma indata och termen EXIT signalerar att konversationen har slutförts. Giltiga indata läggs till i chatthistorikensom ett användarmeddelande.

Console.WriteLine();
Console.Write("> ");
string input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
    continue;
}
if (input.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase))
{
    isComplete = true;
    break;
}

history.Add(new ChatMessageContent(AuthorRole.User, input));

Console.WriteLine();
user_input = input("User:> ")
if not user_input:
    continue

if user_input.lower() == "exit":
    is_complete = True
    break

history.add_message(ChatMessageContent(role=AuthorRole.USER, content=user_input))

Agenter är för närvarande inte tillgängliga i Java.

Om du vill generera ett agentsvar på användarindata anropar du agenten med argument för att ange den sista mallparametern som anger aktuellt datum och tid.

Agentsvaret visas sedan för användaren.

DateTime now = DateTime.Now;
KernelArguments arguments =
    new()
    {
        { "now", $"{now.ToShortDateString()} {now.ToShortTimeString()}" }
    };
await foreach (ChatMessageContent response in agent.InvokeAsync(history, arguments))
{
    Console.WriteLine($"{response.Content}");
}
from datetime import datetime

arguments = KernelArguments(
    now=datetime.now().strftime("%Y-%m-%d %H:%M")
)

async for response in agent.invoke(history, arguments):
    print(f"{response.content}")

Agenter är för närvarande inte tillgängliga i Java.

Slutgiltig

För att samla alla steg har vi den slutliga koden för det här exemplet. Den fullständiga implementeringen tillhandahålls nedan.

Prova att använda följande föreslagna indata:

  1. Vad är mitt användarnamn?
  2. Beskriv lagringsplatsen.
  3. Beskriv det senaste problemet som skapats på lagringsplatsen.
  4. Lista de 10 frågor som har stängts under den senaste veckan.
  5. Hur var dessa problem märkta?
  6. Lista de 5 senast öppnade problemen märkta med "Agenter"
using System;
using System.Threading.Tasks;
using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
using Plugins;

namespace AgentsSample;

public static class Program
{
    public static async Task Main()
    {
        // Load configuration from environment variables or user secrets.
        Settings settings = new();

        Console.WriteLine("Initialize plugins...");
        GitHubSettings githubSettings = settings.GetSettings<GitHubSettings>();
        GitHubPlugin githubPlugin = new(githubSettings);

        Console.WriteLine("Creating kernel...");
        IKernelBuilder builder = Kernel.CreateBuilder();

        builder.AddAzureOpenAIChatCompletion(
            settings.AzureOpenAI.ChatModelDeployment,
            settings.AzureOpenAI.Endpoint,
            new AzureCliCredential());

        builder.Plugins.AddFromObject(githubPlugin);

        Kernel kernel = builder.Build();

        Console.WriteLine("Defining agent...");
        ChatCompletionAgent agent =
            new()
            {
                Name = "SampleAssistantAgent",
                Instructions =
                        """
                        You are an agent designed to query and retrieve information from a single GitHub repository in a read-only manner.
                        You are also able to access the profile of the active user.

                        Use the current date and time to provide up-to-date details or time-sensitive responses.

                        The repository you are querying is a public repository with the following name: {{$repository}}

                        The current date and time is: {{$now}}. 
                        """,
                Kernel = kernel,
                Arguments =
                    new KernelArguments(new AzureOpenAIPromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() })
                    {
                        { "repository", "microsoft/semantic-kernel" }
                    }
            };

        Console.WriteLine("Ready!");

        ChatHistory history = [];
        bool isComplete = false;
        do
        {
            Console.WriteLine();
            Console.Write("> ");
            string input = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(input))
            {
                continue;
            }
            if (input.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase))
            {
                isComplete = true;
                break;
            }

            history.Add(new ChatMessageContent(AuthorRole.User, input));

            Console.WriteLine();

            DateTime now = DateTime.Now;
            KernelArguments arguments =
                new()
                {
                    { "now", $"{now.ToShortDateString()} {now.ToShortTimeString()}" }
                };
            await foreach (ChatMessageContent response in agent.InvokeAsync(history, arguments))
            {
                // Display response.
                Console.WriteLine($"{response.Content}");
            }

        } while (!isComplete);
    }
}
import asyncio
import os
import sys
from datetime import datetime

from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.contents.chat_history import ChatHistory
from semantic_kernel.contents.chat_message_content import ChatMessageContent
from semantic_kernel.contents.utils.author_role import AuthorRole
from semantic_kernel.functions.kernel_arguments import KernelArguments
from semantic_kernel.kernel import Kernel

# Adjust the sys.path so we can use the GitHubPlugin and GitHubSettings classes
# This is so we can run the code from the samples/learn_resources/agent_docs directory
# If you are running code from your own project, you may not need need to do this.
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from plugins.GithubPlugin.github import GitHubPlugin, GitHubSettings  # noqa: E402

###################################################################
# The following sample demonstrates how to create a simple,       #
# ChatCompletionAgent to use a GitHub plugin to interact          #
# with the GitHub API.                                            #
###################################################################


async def main():
    kernel = Kernel()

    # Add the AzureChatCompletion AI Service to the Kernel
    service_id = "agent"
    kernel.add_service(AzureChatCompletion(service_id=service_id))

    settings = kernel.get_prompt_execution_settings_from_service_id(service_id=service_id)
    # Configure the function choice behavior to auto invoke kernel functions
    settings.function_choice_behavior = FunctionChoiceBehavior.Auto()

    # Set your GitHub Personal Access Token (PAT) value here
    gh_settings = GitHubSettings(token="<PAT value>")
    kernel.add_plugin(plugin=GitHubPlugin(gh_settings), plugin_name="GithubPlugin")

    # Create the agent
    agent = ChatCompletionAgent(
        service_id="agent",
        kernel=kernel,
        name="SampleAssistantAgent",
        instructions=f"""
            You are an agent designed to query and retrieve information from a single GitHub repository in a read-only 
            manner.
            You are also able to access the profile of the active user.

            Use the current date and time to provide up-to-date details or time-sensitive responses.

            The repository you are querying is a public repository with the following name: microsoft/semantic-kernel

            The current date and time is: {{$now}}. 
            """,
        arguments=KernelArguments(settings=settings),
    )

    history = ChatHistory()
    is_complete: bool = False
    while not is_complete:
        user_input = input("User:> ")
        if not user_input:
            continue

        if user_input.lower() == "exit":
            is_complete = True
            break

        history.add_message(ChatMessageContent(role=AuthorRole.USER, content=user_input))

        arguments = KernelArguments(
            now=datetime.now().strftime("%Y-%m-%d %H:%M")
        )

        async for response in agent.invoke(history=history, arguments):
            print(f"{response.content}")


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

Agenter är för närvarande inte tillgängliga i Java.