연습 - 네이티브 함수 만들기
이 연습에서는 사용자의 "최근 재생" 목록에 노래를 추가하는 네이티브 함수를 만듭니다. 나중에 최근 재생한 노래 목록을 사용하여 사용자 지정 권장 사항을 제공할 수 있습니다. 그럼 시작하겠습니다.
개발 환경 준비
이러한 연습을 위해 시작 프로젝트를 사용할 수 있습니다. 시작 프로젝트를 설정하려면 다음 단계를 따릅니다.
Important
이 단계를 완료하려면 Visual Studio Code 및 .NET Framework 8.0이 설치되어 있어야 합니다. Visual Studio Code C# 개발 키트 확장을 설치해야 할 수도 있습니다.
Visual Studio Code를 엽니다.
Visual Studio Code 시작 섹션에서 Git 리포지토리 복제를 선택합니다.
URL 표시줄에
https://github.com/MicrosoftLearning/MSLearn-Develop-AI-Agents-with-Azure-OpenAI-and-Semantic-Kernel-SDK.git
를 입력합니다.파일 탐색기에서 바탕 화면의 폴더와 같이 쉽게 찾고 기억할 수 있는 위치에 새 폴더를 만듭니다.
리포지토리 대상으로 선택 단추를 클릭합니다.
프로젝트를 성공적으로 복제하려면 GitHub에 로그인해야 합니다.
Visual Studio Code에서 프로젝트를 엽니다.
탐색기에서 M03-give-your-ai-agent-skills/M03-Project 폴더를 마우스 오른쪽 단추로 클릭하고 통합 터미널에서 열기를 클릭합니다.
M03-give-your-ai-agent-skills/M03-Project 폴더를 확장합니다.
"Program.cs" 파일이 표시됩니다.
Program.cs 파일을 열고 Azure OpenAI Services 배포 이름, API 키, 엔드포인트로 다음 변수를 업데이트합니다.
string yourDeploymentName = ""; string yourEndpoint = ""; string yourKey = "";
이제 연습을 시작할 준비가 되었습니다. 행운을 빕니다!
음악 라이브러리 플러그 인 만들기
'Project' 디렉터리에 새 폴더를 만들고 이름을 'Plugins'로 지정합니다.
'Plugins' 폴더에 'MusicLibrary.cs'라는 새 파일을 만듭니다.
다음 코드를 입력합니다.
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'라는 텍스트 파일에 저장되어 있다고 가정할 수 있습니다. 다음으로 목록에 노래를 추가하는 코드를 추가할 수 있습니다.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' 파일을 만듭니다.'M03-Project' 폴더에 'data'라는 새 폴더를 만듭니다.
'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" } ]
다음으로 새 플러그 인을 가져오고 호출하여 목록을 수정해 보겠습니다.
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
를 호출합니다. 또한 아티스트, 노래, 장르를 인수로 전달합니다.터미널에
dotnet run
을 입력하여 코드를 실행합니다.다음과 같은 출력이 표시됩니다.
Added 'Danse' to recently played
'recentlyplayed.txt'를 열면 목록에 새 노래가 추가된 것을 볼 수 있습니다. 잘했습니다!