연습 - 네이티브 함수 만들기

완료됨

이 연습에서는 사용자의 "최근 재생" 목록에 노래를 추가하는 네이티브 함수를 만듭니다. 나중에 최근 재생한 노래 목록을 사용하여 사용자 지정 권장 사항을 제공할 수 있습니다. 그럼 시작하겠습니다.

개발 환경 준비

이러한 연습을 위해 시작 프로젝트를 사용할 수 있습니다. 시작 프로젝트를 설정하려면 다음 단계를 따릅니다.

Important

이 단계를 완료하려면 Visual Studio Code 및 .NET Framework 8.0이 설치되어 있어야 합니다. Visual Studio Code C# 개발 키트 확장을 설치해야 할 수도 있습니다.

  1. Visual Studio Code를 엽니다.

  2. Visual Studio Code 시작 섹션에서 Git 리포지토리 복제를 선택합니다.

  3. URL 표시줄에 https://github.com/MicrosoftLearning/MSLearn-Develop-AI-Agents-with-Azure-OpenAI-and-Semantic-Kernel-SDK.git를 입력합니다.

  4. 파일 탐색기에서 바탕 화면의 폴더와 같이 쉽게 찾고 기억할 수 있는 위치에 새 폴더를 만듭니다.

  5. 리포지토리 대상으로 선택 단추를 클릭합니다.

    프로젝트를 성공적으로 복제하려면 GitHub에 로그인해야 합니다.

  6. Visual Studio Code에서 프로젝트를 엽니다.

  7. 탐색기에서 M03-give-your-ai-agent-skills/M03-Project 폴더를 마우스 오른쪽 단추로 클릭하고 통합 터미널에서 열기를 클릭합니다.

  8. M03-give-your-ai-agent-skills/M03-Project 폴더를 확장합니다.

    "Program.cs" 파일이 표시됩니다.

  9. Program.cs 파일을 열고 Azure OpenAI Services 배포 이름, API 키, 엔드포인트로 다음 변수를 업데이트합니다.

    string yourDeploymentName = "";
    string yourEndpoint = "";
    string yourKey = "";
    

이제 연습을 시작할 준비가 되었습니다. 행운을 빕니다!

음악 라이브러리 플러그 인 만들기

  1. 'Project' 디렉터리에 새 폴더를 만들고 이름을 'Plugins'로 지정합니다.

  2. 'Plugins' 폴더에 'MusicLibrary.cs'라는 새 파일을 만듭니다.

  3. 다음 코드를 입력합니다.

    using System.ComponentModel;
    using System.Text.Json;
    using System.Text.Json.Nodes;
    using Microsoft.SemanticKernel;
    
    public class MusicLibraryPlugin
    {
        [KernelFunction, 
        Description("Get a list of music recently played by the user")]
        public static string GetRecentPlays()
        {
            string dir = Directory.GetCurrentDirectory();
            string content = File.ReadAllText($"{dir}/data/recentlyplayed.txt");
            return content;
        }
    }
    

    이 코드에서는 KernelFunction 데코레이터를 사용하여 네이티브 함수를 선언합니다. 또한 Description 데코레이터를 사용하여 함수의 기능에 대한 설명을 추가합니다. 지금은 사용자의 최근 재생 목록이 'recentlyplayed.txt'라는 텍스트 파일에 저장되어 있다고 가정할 수 있습니다. 다음으로 목록에 노래를 추가하는 코드를 추가할 수 있습니다.

  4. MusicLibraryPlugin 클래스에 다음 코드를 추가합니다.

    [KernelFunction, Description("Add a song to the recently played list")]
    public static string AddToRecentlyPlayed(
        [Description("The name of the artist")] string artist, 
        [Description("The title of the song")] string song, 
        [Description("The song genre")] string genre)
    {
        // Read the existing content from the file
        string filePath = "data/recentlyplayed.txt";
        string jsonContent = File.ReadAllText(filePath);
        var recentlyPlayed = (JsonArray) JsonNode.Parse(jsonContent);
    
        var newSong = new JsonObject
        {
            ["title"] = song,
            ["artist"] = artist,
            ["genre"] = genre
        };
    
        recentlyPlayed.Insert(0, newSong);
        File.WriteAllText(filePath, JsonSerializer.Serialize(recentlyPlayed,
            new JsonSerializerOptions { WriteIndented = true }));
    
        return $"Added '{song}' to recently played";
    }
    

    이 코드에서는 아티스트, 노래, 장르를 문자열로 받아들이는 함수를 만듭니다. 함수의 Description 외에도 입력 변수에 대한 설명도 추가합니다. 이 코드는 파일에서 기존 콘텐츠를 읽고 구문 분석한 후 새 노래를 목록에 추가합니다. 그런 다음 업데이트된 목록이 파일에 다시 기록됩니다. 다음으로 일부 샘플 데이터가 포함된 'recentlyplayed.txt' 파일을 만듭니다.

  5. 'M03-Project' 폴더에 'data'라는 새 폴더를 만듭니다.

  6. 'data' 폴더에 'recentlyplayed.txt'라는 새 파일을 만든 후 다음 콘텐츠를 붙여넣습니다.

    [
        {
            "title": "Loanh Quanh",
            "artist": "Ly Hoa",
            "genre": "indie, folk"
        },
        {
            "title": "Kalam Eineh",
            "artist": "Yasemin",
            "genre": "pop, Egyptian pop"
        },
        {
            "title": "I Miss You",
            "artist": "Chishin",
            "genre": "hiphop, rap"
        },
        {
            "title": "4EVER",
            "artist": "Gaby",
            "genre": "alternative, indie"
        }
    ]
    

    다음으로 새 플러그 인을 가져오고 호출하여 목록을 수정해 보겠습니다.

  7. Program.cs 파일을 다음 코드로 업데이트합니다.

    var kernel = builder.Build();
    kernel.ImportPluginFromType<MusicLibraryPlugin>();
    
    var result = await kernel.InvokeAsync(
        "MusicLibraryPlugin", 
        "AddToRecentlyPlayed", 
        new() {
            ["artist"] = "Tiara", 
            ["song"] = "Danse", 
            ["genre"] = "French pop, electropop, pop"
        }
    );
    
    Console.WriteLine(result);
    

    이 코드에서는 ImportPluginFromType을 사용하여 MusicLibraryPlugin을 커널로 가져옵니다. 그런 다음 사용하려는 플러그 인 이름과 호출하려는 함수를 사용하여 InvokeAsync를 호출합니다. 또한 아티스트, 노래, 장르를 인수로 전달합니다.

  8. 터미널에 dotnet run을 입력하여 코드를 실행합니다.

    다음과 같은 출력이 표시됩니다.

    Added 'Danse' to recently played
    

    'recentlyplayed.txt'를 열면 목록에 새 노래가 추가된 것을 볼 수 있습니다. 잘했습니다!