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 o ambiente de desenvolvimento

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

Importante

Você deve ter o Visual Studio Code e o .NET Framework 8.0 instalado para concluir essas etapas. Também pode ser necessário instalar a extensão Visual Studio Code C# Dev Kit.

  1. Abra o Visual Studio Code.

  2. Na seção Visual Studio Code Start , selecione Clone Git Repository.

  3. Na barra de URL, digite 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 encontrar e lembrar, como uma pasta na á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. Abra 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

    Deverá ver um ficheiro "Program.cs".

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

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

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

Sugerir concertos ao utilizador

  1. Na pasta 'Plugins', crie um novo ficheiro chamado 'MusicConcertPlugin.cs'

  2. No ficheiro 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 GetTours função lê um arquivo chamado 'concertdates.txt' e retorna o conteúdo. Esta função será usada para recuperar uma lista dos próximos concertos.

    Em seguida, crie um prompt para pedir ao LLM para sugerir um concerto com base na música tocada recentemente pelo usuário.

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

  4. Crie um ficheiro '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 ficheiro '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.
    

    Este prompt pede ao LLM para sugerir um concerto com base nas músicas tocadas recentemente pelo usuário e na localização. Em seguida, ative a configuração de chamada de função automática.

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

    using Microsoft.SemanticKernel.Connectors.OpenAI;
    

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

  7. Atualize o Program.cs arquivo 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. Entre dotnet run no terminal

    A sugestão gerada deve recomendar um concerto com base nas músicas tocadas recentemente e localização. 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 deteta automaticamente a função de plugin apropriada para usar 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 AutoInvokeKernelFunctions configuração permite que o kernel semântico chame automaticamente funções e prompts que são adicionados ao seu kernel. Esta ferramenta pode capacitá-lo a criar aplicativos dinâmicos e robustos usando menos código.