WinForms

【C#/WinForms実践入門編(10)】AIアシスタントアプリ ~Azure OpenAI Serviceを使う!~

今回のテーマは「AIアシスタントアプリの開発」です。Azure OpenAIを使って、テキスト生成やデータ分析を行うWinFormsアプリを作成します。

この記事では以下の内容を説明します。

  • Azure OpenAIの基本概念と特徴
  • Azure OpenAIの設定方法
  • C#アプリからAzure OpenAIへの接続方法
    (コンソールアプリで接続を行います)

次のような方に役立つ内容となっています。

  • AIを活用したWindowsアプリを開発したい方
  • Azure OpenAIをアプリに組み込みたい方
  • ChatGPTのような機能を自社アプリに統合したい方

これから数回にわたって、AI機能を活用したWindowsアプリ開発方法について解説していきます。

今回は第1回として、Azure OpenAIへの接続と基本的な対話機能をコンソールアプリで実装します。

そしてこれを土台として次回以降、WinFormsアプリでAzure OpenAIを使った機能を作ります。

プロ太

Azure OpenAIを使う最も基本の部分になるので、Windowsアプリだけではなく、Webアプリ等での活用にも役立つかと思います!

演習のコード一式はGitHubに置いてあります。

YouTube動画は以下にあります。

講義:Azure OpenAI Serviceとは?

Azure OpenAI Serviceは、Microsoft Azureが提供するクラウドベースのAIサービスです。

OpenAIが開発した大規模言語モデル(GPT-4o, GPT-4o-mini)をAzureのインフラストラクチャ上で利用できるようにしたものです。

OpenAIはChatGPTなどのサービスを提供していますが、Azure OpenAIはMicrosoftのクラウドサービスであるAzure上で、同様の機能を企業向けに提供しています。

次に述べるような特徴があります。

高度なAIモデルへのアクセス

Azure OpenAI サービスを利用することで、OpenAIが開発した最先端の言語モデル(GPT-4o、o3-miniなど)にアクセスできます。(使用できるモデル一覧

これにより、テキスト生成、コード作成、言語翻訳などの自然言語処理タスクや画像生成などを高精度で実行できます。

Azureの信頼性とセキュリティ

Microsoft Azureのクラウドプラットフォーム上で動作するため、高い安定性とスケーラビリティを備えています。

また、セキュリティ機能もしっかりしていて、データの安全性とコンプライアンスを確保しながらAIモデルを活用できます。

Azure AI Foundryを使った管理

​​Azure Open AIのサービス管理はAzure AI Foundryというポータルで行います。
(昔あったAzure AI StudioはAzure AI Foundryへ統合されました。)

Azure AI Foundryとは、Microsoftが提供するAIサービスを一元管理できるツールで、AIモデルの構築、テスト、デプロイを効率的に行うことができます。

これにより、ユーザはAzure AI Foundry内でAzure OpenAI Serviceのモデルをデプロイし、操作することが可能です。

プロ太

現在、OpenAIのモデル含めてたすべてのAIモデルは、「Azure AI Foundary Portal」で一元的に管理します。

Azure AI Foundary Portal内に、OpenAIのモデルのみ簡易な設定で扱える管理画面も存在します。今回の演習ではその管理画面を使います。

演習:C#でAzure OpenAIを使う

今回作るアプリと作成手順

今回作成するのは、テキスト入力に対してAIが回答を生成する簡単なコンソールアプリです。

プロ太

C#でAzure OpenAIをどのように使うかを確認するための、最小機能を作ります!

以下の手順で進めます。

  • 手順1:Azure OpenAI環境の構築
  • 手順2:プロジェクトの作成とNuGetパッケージのインストール
  • 手順3:環境変数を利用してAPIキー等を設定
  • 手順4:アプリのコードを作成

手順1:Azure OpenAI環境の構築

Azureアカウントを作成し、Azureポータルを利用できるようにします。

アカウント作成手順やAzureの基本的な概念については、以下の記事の「Azureの環境構築と設定」を参考にしてください。

【C#、Blazor】Webアプリ開発入門編(Ex3)Microsoft Entra ID(旧AzureAD)~アプリへ簡単に認証機能を追加!~【ASP.NET Core】 今回はC#BlazorアプリへMicrosoft EntraID(旧Azure Active Directory)認証を組み込む方法を...

Azureポータルにログイン後、「リソース作成」で「Azure OpenAI」を選び作成しましょう。(「openai」といったキーワードで検索するとよいでしょう)

例えば、次のように「基本」の設定をします。

リソースグループは既存のものを使うか新規で作成をしましょう。名前はAPIアクセス時のURLとなるためユニークである必要があります。

「ネットワーク」の設定は以下のデフォルト値でよいです。インターネットからのアクセスを許可しています。

あとは作成しましょう。デプロイが完了するのを待ちます。

デプロイが完了したら、作成したAzure OpenAIリソースを開き「Go to Azure AI Foundry Portal」を開きます。

Azure AI Foundry Portalで、「モデル カタログ」を選び、好きなモデルを選びましょう。ここではgpt-4oを選びます。

モデルによって、できること・性能・API使用料金が異なります。「Azure OpenAI Serviceの価格」ページを参考にしましょう。

以下のように選んだモデルの詳細な情報が表示されます。「デプロイ」を選択しましょう。

以下の画面になるので「リソースを作成してデプロイする」でデプロイ完了です。
(「カスタマイズ」でリージョンなど変更することもできます。)

デプロイ後、例えば左側メニュー一覧の「共有リソース>デプロイ」でデプロイしたモデル一覧が表示され、選択できます。

モデルを選ぶと以下の画面になります。

以下の部分はアプリ側の設定で使うので、メモしておきましょう。

  • デプロイ名:”gpt-4o”といった名前
  • ターゲットURLの前半部分:https://XXXX.openai.azure.com
  • キー:”CWz…MP0″といった文字列

キーの扱いには注意しましょう。流出した場合、不正利用される危険があります。

プロ太

これでAzure側の環境構築ができました!

手順2:プロジェクトの作成とNuGetパッケージのインストール

コンソールアプリの新規プロジェクトを「AzureOpenAISample」といった名前で作成し、Azure.AI.OpenAIパッケージをインストールしましょう。

今回、.NET9、Azure.AI.OpenAI 2.1.0を使っています。

手順3:環境変数でAPIキー等を設定

APIキーなどについては、今回環境変数を使って設定します。

Visual Studioのデバッグ環境での環境変数は、「デバッグ>AzureOpenAISample」のプロパティで、以下のように設定します。

手順4:アプリのコードを作成

ライブラリに付属しているサンプルコードを参考にして、作成します。

Program.csを以下のように作成します。

using Azure;
using Azure.AI.OpenAI;
using OpenAI.Chat;

namespace AzureOpenAISample
{
    class Program
    {
        // Azure OpenAI 設定
        private static readonly string? Endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
        private static readonly string? ApiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY");
        private static readonly string? DeploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME");

        static void Main(string[] args)
        {
            // 環境変数の確認
            if (string.IsNullOrEmpty(Endpoint))
            {
                Console.WriteLine("環境変数 AZURE_OPENAI_ENDPOINT が設定されていません。");
                return;
            }

            if (string.IsNullOrEmpty(ApiKey))
            {
                Console.WriteLine("環境変数 AZURE_OPENAI_KEY が設定されていません。");
                return;
            }

            if (string.IsNullOrEmpty(DeploymentName))
            {
                Console.WriteLine("環境変数 AZURE_OPENAI_DEPLOYMENT_NAME が設定されていません。");
                return;
            }

            // Azure OpenAI クライアントの初期化
            AzureOpenAIClient azureClient = new AzureOpenAIClient(
                new Uri(Endpoint),
                new AzureKeyCredential(ApiKey));

            // チャットクライアントの取得
            ChatClient chatClient = azureClient.GetChatClient(DeploymentName);

            // チャット履歴
            List<ChatMessage> conversationMessages = new List<ChatMessage>();

            Console.WriteLine("Azure OpenAIチャットコンソール (終了するには 'exit' と入力)");
            Console.WriteLine("-----------------------------------------------");

            while (true)
            {
                Console.Write("\nあなた: ");
                string? userInput = Console.ReadLine();

                if (string.IsNullOrEmpty(userInput) || userInput.ToLower() == "exit")
                    break;

                // ユーザーメッセージを履歴に追加
                conversationMessages.Add(new UserChatMessage(userInput));

                try
                {
                    // チャット完了リクエスト
                    ChatCompletion completion = chatClient.CompleteChat(conversationMessages);

                    // レスポンスの表示
                    Console.WriteLine($"\nアシスタント: {completion.Content[0].Text}");

                    // アシスタントの応答を履歴に追加
                    conversationMessages.Add(new AssistantChatMessage(completion));
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"\nエラーが発生しました: {ex.Message}");
                }
            }
        }
    }
}

このコードは、Azure OpenAIでシンプルなチャットボットを実装しています。要点は以下です。

準備と設定:Azure OpenAIサービスへの接続に必要なエンドポイントとAPIキー(環境変数から取得)を設定しています。

クライアント初期化:これらの情報を使ってAzure OpenAIに接続し、GPT-4oモデルを利用するためのチャットクライアントを準備します。

対話の仕組み:プログラムはユーザの入力を待ち受け、「exit」と入力されるまで会話を続けます。全ての会話はリストに履歴として保存されます。

チャット処理:ユーザの入力をAzure OpenAIに送信し、AIの応答を受け取ってコンソールに表示します。エラーが発生した場合は適切にメッセージを表示します。

Azure.AI.OpenAIパッケージを使うと、会話履歴の管理についても既に用意された部品をそのまま使えるので便利ですね。

プロ太

これでアプリができました!動かしてみましょう!

アプリを実行

デバッグ実行してチャットをしてみましょう。以下のような会話ができます。

Azure OpenAIチャットコンソール (終了するには 'exit' と入力)
-----------------------------------------------

あなた: C#について3行で説明してください。

アシスタント: C#は、Microsoftが開発したオブジェクト指向プログラミング言語です。
効率的なコード記述と高い生産性を提供し、.NETフレームワーク上で動作します。
デスクトップアプリやWebアプリ、ゲーム開発(Unity)など幅広い用途で利用されます。

あなた: Pythonについてもお願いします。

アシスタント: Pythonは、シンプルで読みやすい文法を持つ汎用プログラミング言語です。
科学計算、データ解析、Web開発、AI・機械学習など幅広い分野で活用されています。
豊富なライブラリとコミュニティがあり、初心者にも学びやすい特徴があります。

あなた: 私が最初に質問した言語は何でしたか?

アシスタント: あなたが最初に質問した言語は「C#」です!

…
プロ美

会話の履歴をちゃんと覚えてるね!

プロ太

AzureOpenAIを使って、ChatGPTっぽいものができましたね。

これを土台にして、もうちょっと面白いアプリを作っていきましょう!

まとめ

本記事では、Azure OpenAI Serviceを使ったAIアプリの開発の基礎について学びました。

Azure OpenAI Serviceには以下の特徴と利点があります:

  • 高度なAIモデル活用:OpenAIの最先端言語モデル(GPT-4o、GPT-4o-miniなど)を利用して、テキスト生成や言語処理タスクを高精度で実行できる
  • Azureの信頼性とセキュリティ:Microsoftの堅牢なクラウドプラットフォーム上で動作し、データの安全性とコンプライアンスを確保できる
  • Azure AI Foundryによる一元管理:AIモデルの構築、テスト、デプロイを効率的に行える統合ポータルを使用できる

コンソールアプリを通じて、C#からAzure OpenAIに接続して会話機能を実装する方法を実践的に学びました。

APIキーの安全な管理や、Azure.AI.OpenAIクライアントライブラリを使った会話履歴の管理など、実用的なアプリ開発の基本要素についても理解を深めました。

このような基盤技術は、今後WindowsアプリだけでなくWebアプリなど他のプラットフォームでのAI機能実装にも役立ちます。

OpenAIのAPIを直接使ってWebアプリでチャットを作る内容も紹介しているので、興味があればこちらも参考にしてください。

【C#、Blazor】Webアプリ開発入門編(Ex2)BlazorアプリへChatGPTを組み込む! ~AIチャットの作り方~【ASP.NET Core】 今回はC#BlazorアプリへChatGPTを組み込む方法を解説します。 本記事では、以下について説明します。 Ope...

次回以降は、今回学んだ基本をベースにWinFormsアプリでAzure OpenAIを活用した機能を実装していきましょう!

プロ太

引き続き、一緒にAIも活用したC# WinFormsアプリ開発を学んでいきましょう!

ABOUT ME
プロ太
●仕事:現在は個人事業主(メンター・情報発信等)、大手IT企業で技術者・マネージャ(15年以上)、大学の外部講師、学生時代は学習塾で非常勤講師(約4年間) ●博士(工学)の学位取得 ●高校生の頃に独学で始め、プログラミング歴20年以上 ●言語:C# 、Java、C/C++、Python、JavaScript/TypeScript等 ●分野:Webアプリ、テスト自動化、生成AI、デバッガ、コード解析、ドメイン特化言語

ご依頼・ご相談について

プログラミング学習のご相談、お仕事のご依頼については、
こちらのお問い合わせページをご確認ください。