연습 - Azure OpenAI용 .NET SDK 설치 및 첫 번째 앱 만들기

완료됨

이제 텍스트 및 채팅 완성을 이해했으므로 이를 사용하는 기본 애플리케이션을 만들어 보겠습니다.

등산로를 추천하여 등산객의 야외 탐험을 돕는 단체에서 일하고 있습니다. 권장 기능에 대화형 AI를 추가하는 것을 고려하고 있으며 프로토타입을 만들려고 합니다.

GPT-35-Turbo 모델에서 제공하는 채팅 완성 API를 사용해야 합니다.

Azure OpenAI 리소스 만들기

첫 번째 단계는 Azure OpenAI 리소스를 만들고 모델을 배포하는 것입니다. 이 연습에서는 GPT-3 Turbo 모델을 사용해 보겠습니다. 설명서에 설명된 것처럼 GPT-3.5 Turbo는 채팅 완성 API를 사용하며 사용 사례에 적합합니다.

필수 조건

  • Azure 구독

  • 원하는 구독의 Azure OpenAI에 부여된 액세스 권한

    현재 이 서비스에 대한 액세스 권한은 애플리케이션에서만 부여됩니다. https://aka.ms/oai/access에서 양식을 작성하여 Azure OpenAI에 대한 액세스를 신청할 수 있습니다.

  • Azure CLI 설치됨

리소스 만들기 및 모델 배포

리소스를 만들고 모델을 배포하는 것은 다단계 프로세스입니다. Azure CLI는 Azure Portal 사용하는 것보다 더 빠를 수 있으므로 이를 사용합니다. 그러나 원하는 경우 Azure Portal을 사용할 수 있습니다.

  1. 아직 로그인하지 않은 경우 az login 명령을 실행하여 로그인합니다.

  2. 새 Azure 리소스를 만들 때 새 리소스 그룹을 만들거나 기존 리소스 그룹을 사용할 수 있습니다. 이 명령은 새 리소스 그룹을 만드는 방법을 보여줍니다. HikingConversations-RG라는 이름을 사용하지만 원하는 이름으로 대체하거나 기존 그룹의 이름을 사용할 수 있습니다.

    az group create \
    --name HikingConversations-RG \
    --location eastus
    
    az group create `
    --name HikingConversations-RG `
    --location eastus
    
  3. 다음 명령을 실행하여 OpenAI 리소스를 HikingConversations-RG 리소스 그룹에 만듭니다. OpenAI 리소스 이름을 HikingConversationsAI로 지정합니다.

    az cognitiveservices account create \
    -n HikingConversationsAI \
    -g HikingConversations-RG \
    -l eastus \
    --kind OpenAI \
    --sku s0
    
    az cognitiveservices account create `
    -n HikingConversationsAI `
    -g HikingConversations-RG `
    -l eastus `
    --kind OpenAI `
    --sku s0
    
  4. 다음으로 GPT-35-Turbo 모델을 만든 OpenAI 리소스에 배포하려고 합니다. 모델 배포 HikingRecommendationTurbo를 호출합니다. 리소스 그룹 이름으로 HikingConversations-RG를 사용하고, OpenAI 리소스 이름으로 HikingConversationsAI를 사용하고 있으며, 다른 값을 사용했다면 해당 값으로 대체해야 합니다.

    az cognitiveservices account deployment create \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --deployment-name HikingRecommendationTurbo \
    --model-name gpt-35-turbo \
    --model-version "0301" \
    --model-format OpenAI \
    --scale-settings-scale-type "Standard"
    
    az cognitiveservices account deployment create `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --deployment-name HikingRecommendationTurbo `
    --model-name gpt-35-turbo `
    --model-version "0301" `
    --model-format OpenAI `
    --scale-settings-scale-type "Standard"
    
  5. 리소스와 모델이 만들어지면 .NET SDK가 Azure OpenAI 리소스에 액세스할 수 있도록 기본 URL 및 액세스 키를 가져와야 합니다. 다음 명령을 사용하여 엔드포인트 및 기본 API 키를 가져와서 나중에 사용할 수 있도록 기록해 둡니다.

    엔드포인트

    az cognitiveservices account show \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --query "properties.endpoint"
    
    az cognitiveservices account show `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --query "properties.endpoint"
    

    기본 API 키

    az cognitiveservices account keys list \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --query "key1"
    
    az cognitiveservices account keys list `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --query "key1"
    

콘솔 애플리케이션 만들기 및 OpenAI SDK 추가

다음으로 베어본 .NET 콘솔 애플리케이션을 만들고 Azure OpenAI SDK를 추가하려고 합니다.

  1. 다음을 실행하여 HikingConversationsAI라는 이름의 새 .NET 애플리케이션을 만듭니다.

    dotnet new console -n HikingConversationsAI
    
  2. 새로 생성된 HikingConversationsAI 디렉토리로 전환합니다.

    cd HikingConversationsAI
    
  3. 그런 다음, Azure Open AI SDK를 추가합니다.

    dotnet add package Azure.AI.OpenAI --prerelease
    
  4. VS Code 또는 Visual Studio에서 프로젝트를 엽니다.

  5. Program.cs 파일에서 기존 코드를 모두 삭제합니다.

  6. Program.cs의 상단에 using Azure.AI.OpenAI;을(를) 추가합니다.

  7. Program.cs의 상단에 using Azure;을(를) 추가합니다.

  8. Azure OpenAI 리소스의 엔드포인트, 기본 API 키 및 배포한 모델의 이름에 대한 참조를 포함하는 세 개의 클래스 수준 변수를 추가합니다.

    string openAIEndpoint = "<YOUR ENDPOINT URL VALUE>";
    string openAIAPIKey = "<YOUR PRIMARY API KEY VALUE>";
    string openAIDeploymentName = "HikingRecommendationTurbo";
    

    위의 단계에서는 배포 이름을 HikingRecommendationTurbo로 지정했습니다. 다른 값을 사용했다면 해당 값을 대신 사용해야 합니다.

  9. 마지막으로, Azure OpenAI 리소스와 통신하는 데 필요한 클래스를 인스턴스화합니다.

    var endpoint = new Uri(openAIEndpoint);
    var credentials = new AzureKeyCredential(openAIAPIKey);
    var openAIClient = new AzureOpenAIClient(endpoint, credentials);
    

시스템 프롬프트 만들기

모델에 초기 지침을 제공하는 초기 시스템 역할 프롬프트를 만들어 보겠습니다.

  1. 먼저 하이킹을 추천할 때 대화 중에 모델에서 작업을 수행하는 방법을 지시하는 프롬프트를 만듭니다.

    var systemPrompt = 
    """
    You are a hiking enthusiast who helps people discover fun hikes. You are upbeat and friendly. 
    You ask people what type of hikes they like to take and then suggest some.
    """;
    
  2. 다음으로 모델과 주고받을 모든 메시지를 보관할 List<ChatMessage>를 만듭니다.

    List<ChatMessage> chatHistory = new();
    
  3. 그런 다음 새 SystemChatMessage 개체를 만들고 chatHistory 목록에 추가합니다. ChatMessage을(를) 시스템 역할에서 가져오도록 설정할 것입니다.

    SystemChatMessage systemMessage = ChatMessage.CreateSystemMessage(systemPrompt);
    
    chatHistory.Add(systemMessage);
    

대화 시작

다음으로 첫 번째 메시지를 모델에 보내 대화를 시작합니다.

  1. 사용자에 대한 프롬프트를 만들고 사용자 메시지로 chatHistory에 추가합니다.

    string userGreeting = """
    Hi there hiking recommendation bot! 
    Can't wait to hear what you have in store for me!
    """;
    
    UserChatMessage userGreetingMessage = ChatMessage.CreateUserMessage(userGreeting);
    chatHistory.Add(userGreetingMessage);
    
    Console.WriteLine($"User >>> {userGreeting}");
    
  2. 이제 ChatClient 개체에 대한 참조를 가져와야 합니다. 이 개체는 모델과의 채팅 대화를 용이하게 해 줍니다. 따라서 배포한 모델 중 사용하려는 모델을 Azure OpenAI 클라이언트 개체에 알려야 합니다.

    var chatClient = openAIClient.GetChatClient(openAIDeploymentName);
    
  3. 다음으로 chatHistory를 전달하는 ChatClient 클래스의 CompleteChatAsync 함수를 호출합니다.

    var response = await chatClient.CompleteChatAsync(chatHistory);
    
  4. 그런 다음 마지막으로 모델이 반환한 값을 읽습니다.

    Console.WriteLine($"AI >>> {response.Value.Content.Last().Text}");
    
  5. 지금까지 진행한 내용을 살펴보겠습니다. 터미널에 dotnet run을(를) 입력하여 애플리케이션을 실행할 수 있습니다.

  6. userGreetingMessage의 값을 변경하여 모델을 다르게 응답하는 방법을 확인합니다.

한 예제 실행에서 다음을 수신했습니다.

Hello! Great to hear from you. What type of hikes are you interested in? Do you enjoy easy scenic walks, challenging trails, or something in between? Do you prefer hikes with waterfalls, mountain views, or unique geological formations?

모델이 비결정적이므로 다른 항목을 받거나 동일한 입력으로도 다른 출력을 생성할 수 있습니다.

대화 계속

대화에 응답한 다음 응답을 출력하여 계속해 보겠습니다.

  1. 대화의 컨텍스트를 유지해야 하므로 chatHistory 목록에 직접 돌아온 응답을 추가합니다.

    var assistantMessage = ChatMessage.CreateAssistantMessage(response.Value.Content.Last().Text);
    
    chatHistory.Add(assistantMessage); 
    
  2. 다음으로 다른 사용자 프롬프트를 만들어 모델에 보냅니다.

    var hikeRequest = 
    """
    I would like a strenuous hike near where I live that ends with
    a view that is amazing.
    """;
    
    Console.WriteLine($"User >>> {hikeRequest}");
    
    UserChatMessage hikeMessage = ChatMessage.CreateUserMessage(hikeRequest);
    
    chatHistory.Add(hikeMessage);
    
    response = await chatClient.CompleteChatAsync(chatHistory); 
    
    Console.WriteLine($"AI >>> {response.Value.Content.Last().Text}");
    
  3. hikeRequest 변수를 변경하여 다양한 유형의 인상을 요청하여 실험할 수 있습니다. 한 예제 실행에서 다음을 수신했습니다.

    Great choice! If you're up for a challenge, I recommend checking out the hike to Poo Poo Point in Issaquah, Washington. The hike is 7.2 miles roundtrip, with an elevation gain of 1,858 feet, so it's definitely a workout. But the stunning views of Mount Rainier and the Cascade Mountains make it all worthwhile. Plus, you'll get to see paragliders taking off from Poo Poo Point. It's a popular hike, so I recommend going early to avoid crowds. Let me know if you need more information!
    

요약

이제 gpt-35-turbo 모델과 함께 Azure OpenAI SDK를 사용하여 하이킹 권장 사항을 제공하는 데 도움이 되는 대화를 만들 수 있습니다. 다음으로, 모델에 보내는 프롬프트를 개선하는 방법을 살펴보겠습니다.