Exercício - Invocar funções automaticamente

Concluído

O SDK do Kernel Semântico permite que você coordene automaticamente funções e prompts que são referenciados em seu kernel. Em vez de invocar manualmente funções e prompts, essa ferramenta ajuda você a economizar tempo e torna seus aplicativos mais inteligentes. Vamos experimentar!

Preparar seu ambiente de desenvolvimento

No caso desses exercícios, um projeto inicial está disponível para você usar. Use as seguintes etapas para configurar o projeto inicial:

Importante

Você deverá ter o Visual Studio Code e o .NET Framework 8.0 instalados para concluir essas etapas. É possível que você também precise instalar a extensão do Kit de Desenvolvimento do C# do Visual Studio Code.

  1. Abra o Visual Studio Code.

  2. Na seção Iniciar do Visual Studio Code, selecione Clonar repositório do Git.

  3. Na barra de URL, insira https://github.com/MicrosoftLearning/MSLearn-Develop-AI-Agents-with-Azure-OpenAI-and-Semantic-Kernel-SDK.git

  4. No Explorador de Arquivos, crie uma nova pasta em um local fácil de localizar e lembrar, como uma pasta em sua Área de Trabalho.

  5. Clique no botão Selecionar como destino do repositório.

    Você precisa estar conectado ao GitHub para clonar o projeto com êxito.

  6. Abrir o projeto no Visual Studio Code

  7. No Explorer, clique com o botão direito do mouse na pasta M05-auto-invoke-functions/M05-Project e clique em Abrir no Terminal Integrado

  8. Expanda a pasta M05-auto-invoke-functions/M05-Project

    Você deve ver um arquivo "Program.cs".

  9. Abra o arquivo Program.cs e atualize as seguintes variáveis com o nome de implantação dos Serviços OpenAI do Azure, a chave de API e o ponto de extremidade.

    string yourDeploymentName = "";
    string yourEndpoint = "";
    string yourAPIKey = "";
    

Agora você está pronto para começar o exercício. Boa sorte!

Sugira shows ao usuário

  1. Na pasta "Plugins", crie um novo arquivo chamado "MusicConcertPlugin.cs"

  2. No arquivo MusicConcertPlugin", adicione o seguinte código:

    using System.ComponentModel;
    using Microsoft.SemanticKernel;
    
    public class MusicConcertPlugin
    {
        [KernelFunction, Description("Get a list of upcoming concerts")]
        public static string GetTours()
        {
            string dir = Directory.GetCurrentDirectory();
            string content = File.ReadAllText($"{dir}/data/concertdates.txt");
            return content;
        }
    }
    

    A função GetTours lê um arquivo chamado “concertdates.txt” e retorna o conteúdo. Essa função será usada para recuperar uma lista dos próximos shows.

    Em seguida, crie uma solicitação para pedir ao LLM que sugira um show com base na música tocada recentemente pelo usuário.

  3. Na pasta "Prompts", crie uma nova pasta chamada "SuggestConcert"

  4. Crie um arquivo "config.json" na pasta "SuggestConcert" com o seguinte conteúdo:

    {
        "schema": 1,
        "type": "completion",
        "description": "Suggest a concert to the user",
        "execution_settings": {
            "default": {
                "max_tokens": 4000,
                "temperature": 0
            }
        },
        "input_variables": [
            {
                "name": "upcomingConcerts",
                "description": "A list of artist's upcoming concerts",
                "required": true
            },
            {
                "name": "recentlyPlayedSongs",
                "description": "A list of songs recently played by the user",
                "required": true
            },
            {
                "name": "location",
                "description": "The user's location",
                "required": true
            }
        ]
    }
    
  5. Crie um arquivo "skprompt.txt" na pasta "SuggestConcert" com o seguinte conteúdo:

    Based on the user's recently played songs:
    {{$recentlyPlayedSongs}}
    
    And a list of upcoming concerts:
    {{$upcomingConcerts}}
    
    Suggest an upcoming concert. The user lives in {{$location}}, 
    please recommend a relevant concert that is close to their location.
    

    Essa solicitação pede ao LLM que sugira um show com base nas músicas tocadas recentemente pelo usuário e na sua localização. Em seguida, você habilita a configuração de chamada automática de função.

  6. Abra o arquivo Program.cs e a seguinte instrução usando:

    using Microsoft.SemanticKernel.Connectors.OpenAI;
    

    Esse pacote permitirá que você use a configuração de chamada automática de função.

  7. Atualize o arquivo Program.cs com o seguinte código:

    kernel.ImportPluginFromType<MusicLibraryPlugin>();
    kernel.ImportPluginFromType<MusicConcertPlugin>();
    kernel.ImportPluginFromPromptDirectory("Prompts");
    
    OpenAIPromptExecutionSettings settings = new()
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
    };
    
    string prompt = @"I live in Portland OR USA. Based on my recently 
        played songs and a list of upcoming concerts, which concert 
        do you recommend?";
    
    var result = await kernel.InvokePromptAsync(prompt, new(settings));
    
    Console.WriteLine(result);
    
  8. Insira dotnet run no terminal

    A sugestão gerada deve recomendar um show com base no local e nas músicas recentemente tocadas. A saída pode ser semelhante à seguinte resposta:

    Based on your recently played songs and your location in Portland, OR, I would recommend attending the upcoming concert of Lisa Taylor. She will be performing in Portland on April 16, 2024. This concert would be a great opportunity for you to enjoy live music and experience Lisa Taylor' beautiful songs.
    

    O kernel semântico detecta automaticamente a função de plugin apropriada a ser usada e passa os parâmetros corretos. Você pode tentar modificar o local para ver como a recomendação muda. Você também pode tentar alterar o prompt para dizer ao LLM para sugerir uma música da biblioteca.

A configuração AutoInvokeKernelFunctions permite que o kernel semântico chame automaticamente funções e prompts adicionados ao seu kernel. Essa ferramenta pode capacitar você a criar aplicativos dinâmicos e robustos usando menos código.