今回はMicrosoft.Extensions.AIからAzure OpenAIを使用する方法についてお届けします。
昨年10月にMicrosoft.Extensions.AIが使えるようになったので、今回はAzure OpenAIをMicrosoft.Extensions.AIから利用する方法を確認してみます。
Microsoft.Extensions.AIとは?
Microsoft.Extensions.AIは、小規模および大規模言語モデル (SLM および LLM)、埋め込み、ミドルウェアなどの AI サービスと対話するための統一された抽象化レイヤーを提供するライブラリです。この抽象化レイヤーを利用することで、開発ではローカルでOllamaを使用して開発を行い、運用ではAzure OpenAIを使用するといった方法がわずかな変更を行うだけで可能になります。
使ってみる
Azure OpenAIの利用準備
Azure AI ServiceからAzure OpenAIを選択して[Azure OpenAIの作成]をクリックします。

リソースの作成に必要な情報を入力します。ネットワークとタグはデフォルトのままで作成します。

作成が完了すると以下のように作成したAzure OpenAIのリソースが表示されます。

デプロイしたリソースmescius-openai-testをクリックします。左のメニューから「キーとエンドポイント」を選択します。表示されたキーとエンドポイントをメモ帳などに控えておきます。

左のメニューから「概要」をクリックします。さらに「Go to Azure AI Foundry portal」か[Explore Azure AI Foundry portal]をクリックします。

「新しいデプロイの作成」-「基本モデルから」をクリックします。

モデルは「gpt-4-o」を選択します。デプロイ名は「mescius-gpt-4o-test」としておきます。

デプロイが完了した後に、こちらのデプロイ名をメモ帳などに控えておきます。
アプリケーションの作成
Visual Studioでコンソールアプリケーションを作成します。

NuGetパッケージマネージャーから以下のパッケージをインストールします。
- Azure.AI.OpenAI
- Microsoft.Extensions.AI
- Microsoft.Extensions.AI.OpenAI
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.UserSecrets

シークレットマネージャーを使用してAzure OpenAIのエンドポイントとデプロイ名を格納します。ソリューションエクスプローラーでプロジェクト名を右クリックして「ユーザーシークレットの管理」を選択します。

secret.jsonが表示されるので以下のような構成にします。
{
"AZURE_OPENAI_ENDPOINT": "エンドポイントのURL",
"AZURE_OPENAI_KEY": "キー",
"AZURE_OPENAI_GPT_NAME": "デプロイ名"
}
Program.csを以下のように更新します。Microsoft.Extensions.AI
のIChatClient
インターフェイスを使用してAzure OpenAIのクライアントAzureOpenAIClient
クラスを使用します。
using Azure;
using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Configuration;
Console.WriteLine("Microsoft.Extensions.AIを利用してAzure OpenAI を試してみる");
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
IChatClient client =
new AzureOpenAIClient(
new Uri(config["AZURE_OPENAI_ENDPOINT"]),
new AzureKeyCredential(config["AZURE_OPENAI_KEY"]))
.AsChatClient(config["AZURE_OPENAI_GPT_NAME"]);
GetResponseAsync
メソッドでチャットメッセージを送信して応答を受け取ります。
Console.WriteLine(await client.GetResponseAsync("ActiveReportsについて200文字程度で簡単に教えてください。"));

応答をストリーミングで受け取る場合はGetStreamingResponseAsync
メソッドを使用します。
await foreach (var update in client.GetStreamingResponseAsync("ActiveReportsについて簡単に教えてください。"))
{
Console.Write(update);
}
チャットを行う場合は、ChatMessage
クラスのリストを使用します。ロールやチャット履歴を使用したメッセージを渡すことが可能です。
List<ChatMessage> chatHistory = new()
{
new ChatMessage(ChatRole.System, """
あなたは.NETアプリケーション開発のスペシャリストです。
""")
};
while (true)
{
// ユーザーからの入力を受け取る
Console.WriteLine("Your prompt:");
var userPrompt = Console.ReadLine();
chatHistory.Add(new ChatMessage(ChatRole.User, userPrompt));
// AIの応答をストリーミングで受け取り、チャット履歴に追加
Console.WriteLine("AI Response:");
var response = "";
await foreach (var item in
client.GetStreamingResponseAsync(chatHistory))
{
Console.Write(item.Text);
response += item.Text;
}
chatHistory.Add(new ChatMessage(ChatRole.Assistant, response));
Console.WriteLine();
}
さいごに
今回はAzure OpenAIをMicrosoft.Extensions.AIから利用する方法を確認してみました。プレビュー版ということでまだまだ変更があるかと思いますが、引き続きウォッチして情報をお届けできればと思います。また、ローカル環境でOllamaを使う場合も今後の記事で紹介していきます。