コンソールアプリのチャットクライアントを作ります。
Learn の記事 の内容をベースに理解しやすいコードに再構成しています。 動作も直感的に、コードも斜めに読んでどうなっているか何をしているかわかりやすくしています。 NuGet の Azure.AI.OpenAI というプレリリースのパッケージを使用してとても簡単に AI チャットを実装していきます。
■ ベースにした Learn の記事
■ クライアントアプリのコード
コードは GitHub に上げています。
ここにも書いておくとこんな感じです。
//** **************************************************************************************************** **// //** 事前準備 **// // API Key 等。ここでは環境変数から取得。コードに書かなくてよいように // DeploymentName は環境変数にしなくてもよいとは思いますが、コピペで検証しやすいように環境変数にしています var openAIEndpoint = Environment.GetEnvironmentVariable("OpenAIEndpoint")!; var openAIAPIKey = Environment.GetEnvironmentVariable("OpenAIAPIKey")!; var openAIDeploymentName = Environment.GetEnvironmentVariable("OpenAIDeploymentName")!; // システムプロンプトの文言を用意しておきます var systemPrompt = "あなたはニンジャ伝説のすべてを知る全能のニンジャです。モータルのニュービーからの質問に丁寧に答えてください。"; // デバッグ用メモ (この値をコンソールで手入力してデバッグする想定) // var (userMessage001, userMessage002) = ("日本の首都はサイタマ。古事記にもそう書いてある。", "アイエエエ! トーキョ!? トーキョ、ナンデ?"); //** **************************************************************************************************** **// //** AI と会話するクライアントや会話履歴の保持するオブジェクトを生成 **// // エンドポイント、キー、デプロイメント名を使って AI のクライアントを生成。会話履歴にはシステムメッセージを既に追加しておく OpenAI.Chat.ChatClient chatClient; List<OpenAI.Chat.ChatMessage> chatHistory; { Azure.AI.OpenAI.AzureOpenAIClient openAIClient = new(new Uri(openAIEndpoint), new Azure.AzureKeyCredential(openAIAPIKey)); OpenAI.Chat.SystemChatMessage systemMessage = OpenAI.Chat.ChatMessage.CreateSystemMessage(systemPrompt); chatClient = openAIClient.GetChatClient(openAIDeploymentName); chatHistory = new() { systemMessage }; } //** **************************************************************************************************** **// // チャットを開始 while (true) { // ユーザー入力を待機 Console.Write("AI >>> 質問をドーゾ。(終了は Ctrl+C)\n\nUser >>> "); string userInput = Console.ReadLine() ?? string.Empty; // ユーザー入力をまず会話履歴に追加 { OpenAI.Chat.UserChatMessage userGreetingMessage = OpenAI.Chat.ChatMessage.CreateUserMessage(userInput); chatHistory.Add(userGreetingMessage); } // AI からの回答に時間がかかるので、ニューザー入力を受け付けたことを表示 Console.WriteLine("\nSYSTEM >>> 質問を受け付けました。AI に問い合わせています......"); // AI に会話履歴 (今回のユーザー質問も格納済み) 送信。回答を待機。回答を会話履歴に追加。回答をコンソール表示 { System.ClientModel.ClientResult<OpenAI.Chat.ChatCompletion> response = await chatClient.CompleteChatAsync(chatHistory); string aiMessage = response.Value.Content.Last().Text; OpenAI.Chat.AssistantChatMessage assistantMessage = OpenAI.Chat.ChatMessage.CreateAssistantMessage(aiMessage); chatHistory.Add(assistantMessage); Console.WriteLine($"\nAI >>> {aiMessage}\n"); } }
簡単に言うと、Azure の管理画面からエンドポイントやキーを持ってきて API クライアントライブラリのクラスでクライアントを作って、AI とチャットします。 AI は会話を覚えていないので、チャットする際には毎回会話履歴と今回の質問を渡すのですが、通常の List で OK です。その中に、AI の発言オブジェクトやユーザーの質問オブジェクトを格納しておきます。これらはライブラリのクラスです。
実際の内容はコメントを見ながら斜めにコードを見てもらえればわかるでしょう。
■ 実行イメージ
実行するとこんな感じになります。
AI >>> 質問をドーゾ。(終了は Ctrl+C) User >>> 日本の首都はサイタマ。古事記にもそう書いてある。 SYSTEM >>> 質問を受け付けました。AI に問い合わせています...... AI >>> 実際のところ、日本の首都は東京です。古事記にも記載された首都は楽市という場所であり、現在の埼玉県とされることもあ りますが、それが直接的に現在の首都とは関係がありません。歴史的な経緯から、東京が日本の首都となっており、行政や政治の中心地となっています。 AI >>> 質問をドーゾ。(終了は Ctrl+C) User >>> アイエエエ! トーキョ!? トーキョ、ナンデ? SYSTEM >>> 質問を受け付けました。AI に問い合わせています...... AI >>> 東京がなぜ日本の首都となったかというと、1872年に明治政府が江戸(現在の東京)に移り、東京を日本の政治・経済・文化 の中心地として発展させたことが大きな背景になっています。また、東京は日本の中央に位置する交通の要所でもあり、現代では国際的な都市としても多くの人々が暮らし、訪れる大都市になっています。 AI >>> 質問をドーゾ。(終了は Ctrl+C) User >>>
■ 実行を画像で手順を追って




■ Azure OpenAI
Azure 側の手順です。
OpenAI を使うサービスの枠を作って、その中に実際の AI モデルをデプロイします。二段階になっているところが少しわかりやすにくいかもしれません。
ちなみに今回はやりませんが、この枠 (リソース) の中に複数のデプロイを作成することができます。
OpenAI で検索してリソース作成


サブスクリプションやリソースグループの指定が必要です。


タグはただ動かすなら要らないので無視。



できました。
モデルのデプロイ
Azure OpenAI Studio に移動します。

Azure OpenAI Studio に移動しました。

新しいデプロイの作成をします。

ここで指定するデプロイ名を前述のコード上でチャットクライアントを生成する際に使います。

デプロイができたら、左のメニューでチャットプレイグラウンドへ移動します。

ちゃんとデプロイされて AI とお話できるか試してみましょう。


お話できていますね!
■ コードに戻る
コードを先に掲載しているので、ここまで準備できたらコードに戻って実行しましょう。
■ 簡単ですね
Azure OpenAI、簡単ですね!