演習 - .NET SDK for Azure OpenAI をインストールし、最初のアプリを作成する

完了

テキストとチャットの入力候補が理解できたところで、それを利用する基本的なアプリケーションを作成してみましょう。

アウトドアを楽しむ人のためにハイキングコースを推奨する組織であなたは働いています。 推奨機能に会話 AIを追加することを検討しており、試作品の制作を希望しています。

GPT-35-Turbo モデルのチャット入力候補 API を使用する必要があると判断します。

Azure OpenAI リソースを作成する

最初の手順は Azure OpenAI リソースを作成し、モデルをデプロイすることです。 この演習では GPT-3 Turbo モデルを使用してみましょう。 ドキュメントに記載されているとおり、GPT-3.5 Turbo ではチャット入力候補 API が使用されており、今回の用途に最適です。

前提条件

  • Azure サブスクリプション

  • 目的のサブスクリプション内の Azure OpenAI に付与されたアクセス権

    現時点では、このサービスへのアクセスは申請によってのみ許可されます。 Azure OpenAI へのアクセスを申請するには、https://aka.ms/oai/access のフォームに入力してください。

  • Azure CLI がインストールされていること

リソースを作成し、モデルをデプロイする

リソースの作成とモデルのデプロイは複数の手順からなるプロセスとなります。 Azure portal を使用するより簡単であるため、Azure CLI を使用します。 ただし、必要であれば 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. 次のコマンドを実行し、HikingConversations-RG リソース グループに OpenAI リソースを作成します。 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. 次に、作成した OpenAI リソースに GPT-35-Turbo モデルをデプロイします。 モデル デプロイ HikingRecommendationTurbo を呼び出します。 HikingConversations-RG をリソース グループ名として、HikingConversationsAI を OpenAI リソース名として使用しています。別の値を使用した場合、必ずこれらの値を変更してください。

    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. using Azure.AI.OpenAI;Program.cs の先頭に追加します。

  7. using Azure;Program.cs の先頭に追加します。

  8. Azure OpenAI リソースのエンドポイントへの参照、プライマリ API キー、デプロイしたモデルの名前が入っている 3 つのクラスレベル変数を追加します。

    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 の値を変更してみてください。モデルの反応が変わることがわかります。

1 つの実行例で、次のメッセージが表示されました。

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 変数を変更して別の種類のハイキングを要求するなど、実験できます。 1 つの実行例では、次を受け取りました。

    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!
    

まとめ

これで Azure OpenAI SDK と共に gpt-35-turbo モデルを使用し、おすすめハイキングを提示する会話を作成できるようになりました。 次に、モデルに送信するプロンプトを改善する方法を見てみましょう。