次の方法で共有


構造化された出力を使用して応答を要求する

このクイック スタートでは、 構造化された出力で応答を要求するチャット アプリを作成します。 構造化された出力応答は、プレーン テキストではなく、指定した種類のチャット応答です。 このクイック スタートで作成するチャット アプリは、さまざまな製品レビューのセンチメントを分析し、カスタム列挙の値に従って各レビューを分類します。

[前提条件]

AI サービスを構成する

Azure portal を使用して Azure OpenAI サービスとモデルをプロビジョニングするには、「Azure OpenAI Service リソースの作成とデプロイ」 記事の手順を実行します。 [モデルのデプロイ] ステップで、 gpt-4o モデルを選択します。

チャット アプリを作成する

gpt-4o AI モデルに接続するコンソール アプリを作成するには、次の手順を実行します。

  1. ターミナル ウィンドウで、アプリを作成するディレクトリに移動し、 dotnet new コマンドを使用して新しいコンソール アプリを作成します。

    dotnet new console -o SOChat
    
  2. SOChat ディレクトリに移動し、必要なパッケージをアプリに追加します。

    dotnet add package Azure.AI.OpenAI
    dotnet add package Azure.Identity
    dotnet add package Microsoft.Extensions.AI
    dotnet add package Microsoft.Extensions.AI.OpenAI
    dotnet add package Microsoft.Extensions.Configuration
    dotnet add package Microsoft.Extensions.Configuration.UserSecrets
    
  3. 次のコマンドを実行して、Azure OpenAI エンドポイント、モデル名、テナント ID の アプリ シークレット を追加します。

    dotnet user-secrets init
    dotnet user-secrets set AZURE_OPENAI_ENDPOINT <your-Azure-OpenAI-endpoint>
    dotnet user-secrets set AZURE_OPENAI_GPT_NAME gpt-4o
    dotnet user-secrets set AZURE_TENANT_ID <your-tenant-ID>
    

    環境によっては、テナント ID が必要ない場合があります。 その場合は、 DefaultAzureCredentialをインスタンス化するコードから削除します。

  4. 任意のエディターで新しいアプリを開きます。

コードを追加する

  1. さまざまなセンチメントを記述する列挙体を定義します。

    public enum Sentiment
    {
        Positive,
        Negative,
        Neutral
    }
    
  2. モデルと通信する IChatClient を作成します。

    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .Build();
    
    string endpoint = config["AZURE_OPENAI_ENDPOINT"];
    string model = config["AZURE_OPENAI_GPT_NAME"];
    string tenantId = config["AZURE_TENANT_ID"];
    
    // Get a chat client for the Azure OpenAI endpoint.
    AzureOpenAIClient azureClient =
        new(
            new Uri(endpoint),
            new DefaultAzureCredential(new DefaultAzureCredentialOptions() { TenantId = tenantId }));
    IChatClient chatClient = azureClient
        .GetChatClient(deploymentName: model)
        .AsIChatClient();
    

    DefaultAzureCredential は、環境またはローカル ツールからの認証資格情報を検索します。 Visual Studio または Azure CLI へのサインインに使用したアカウントに Azure AI Developer ロールを割り当てる必要があります。 詳細については、「 .NET を使用した Foundry Tools への認証」を参照してください。

  3. 1 つの製品レビューでモデルに要求を送信し、分析されたセンチメントをコンソールに出力します。 要求された構造化出力の型を宣言するには、 ChatClientStructuredOutputExtensions.GetResponseAsync<T>(IChatClient, String, ChatOptions, Nullable<Boolean>, CancellationToken) 拡張メソッドに型引数として渡します。

    string review = "I'm happy with the product!";
    var response = await chatClient.GetResponseAsync<Sentiment>($"What's the sentiment of this review? {review}");
    Console.WriteLine($"Sentiment: {response.Result}");
    

    このコードでは、次のような出力が生成されます。

    Sentiment: Positive
    
  4. 単一のレビューを分析する代わりに、レビューのコレクションを分析できます。

    string[] inputs = [
        "Best purchase ever!",
        "Returned it immediately.",
        "Hello",
        "It works as advertised.",
        "The packaging was damaged but otherwise okay."
    ];
    
    foreach (var i in inputs)
    {
        var response2 = await chatClient.GetResponseAsync<Sentiment>($"What's the sentiment of this review? {i}");
        Console.WriteLine($"Review: {i} | Sentiment: {response2.Result}");
    }
    

    このコードでは、次のような出力が生成されます。

    Review: Best purchase ever! | Sentiment: Positive
    Review: Returned it immediately. | Sentiment: Negative
    Review: Hello | Sentiment: Neutral
    Review: It works as advertised. | Sentiment: Neutral
    Review: The packaging was damaged but otherwise okay. | Sentiment: Neutral
    
  5. また、分析された列挙値だけを要求する代わりに、分析された値と共にテキスト応答を要求できます。

    テキスト応答と分析されたセンチメントを格納する レコードの種類 を定義します。

    record SentimentRecord(string ResponseText, Sentiment ReviewSentiment);
    

    (このレコード型は、 プライマリ コンストラクター 構文を使用して定義されます。プライマリ コンストラクターは、型定義と、クラスのインスタンスをインスタンス化するために必要なパラメーターを組み合わせます。C# コンパイラは、プライマリ コンストラクター パラメーターのパブリック プロパティを生成します)。

    レコード型を型引数として使用して要求を GetResponseAsync<T>に送信します。

    var review3 = "This product worked okay.";
    var response3 = await chatClient.GetResponseAsync<SentimentRecord>($"What's the sentiment of this review? {review3}");
    
    Console.WriteLine($"Response text: {response3.Result.ResponseText}");
    Console.WriteLine($"Sentiment: {response3.Result.ReviewSentiment}");
    

    このコードでは、次のような出力が生成されます。

    Response text: Certainly, I have analyzed the sentiment of the review you provided.
    Sentiment: Neutral
    

リソースをクリーンアップする

不要になった場合は、Azure OpenAI リソースと GPT-4 モデルのデプロイを削除します。

  1. Azure portal で、Azure OpenAI リソースに移動します。
  2. Azure OpenAI リソースを選択し、[削除] を選択します。

こちらも参照ください