.NET を使用して AI チャット アプリを構築する

シンプルな .NET 8 コンソール チャット アプリケーションを作成して、OpenAI と Semantic Kernel の利用を開始します。 このアプリケーションはローカルで実行され、OpenAI gpt-3.5-turbo モデルを使用します。 次の手順に従って、OpenAI にアクセスし、Semantic Kernel の使用方法を学習します。

前提条件

  • .NET 8.0 SDK - .NET 8.0 SDK をインストールします
  • このサンプルを実行できるようにするための OpenAI の API キー
  • Windows では PowerShell v7+ が必要です。 バージョンを検証するには、ターミナルで pwsh を実行します。 現在のバージョンが返されるはずです。 エラーが返された場合は、コマンド dotnet tool update --global PowerShell を実行します。

シンプルな .NET 8 コンソール チャット アプリケーションを作成して、OpenAI と Semantic Kernel の利用を開始します。 このアプリケーションはローカルで実行され、Azure OpenAI にデプロイされた OpenAI gpt-35-turbo モデルに接続しします。 Azure OpenAI をプロビジョニングし、Semantic Kernel の使用方法を学習するには、以下の手順に従います。

前提条件

サンプル プロジェクトを入手する

すべてのクイックスタートのサンプル アプリが含まれる GitHub リポジトリをクローンします。

git clone https://github.com/dotnet/ai-samples.git

Azure OpenAI サービスを作成する

サンプルの GitHub リポジトリは、Azure Developer CLI (azd) テンプレートとして構成されています。azd がこれを使用して、Azure OpenAI サービスとモデルをプロビジョニングできます。

  1. ターミナルまたはコマンド プロンプトで、サンプル リポジトリの src\quickstarts\azure-openai ディレクトリに移動します。

  2. azd up コマンドを実行して、Azure OpenAI リソースをプロビジョニングします。 Azure OpenAI サービスの作成とモデルのデプロイには数分かかる場合があります。

    azd up
    

    azd は、OpenAI アクセス キーなど、サンプル アプリに必要なユーザー シークレットも構成します。

    Note

    azd up のデプロイ中にエラーが発生した場合は、「トラブルシューティング」セクションを参照してください。

HikerAI サンプルを試す

  1. ターミナルまたはコマンド プロンプトから、openai\02-HikerAI ディレクトリに移動します。

  2. 次のコマンドを実行して、OpenAI API キーをサンプル アプリのシークレットとして構成します。

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. dotnet run コマンドを使用してアプリを実行します。

    dotnet run
    
  1. ターミナルまたはコマンド プロンプトから、azure-openai\02-HikerAI ディレクトリに移動します。

  2. dotnet run コマンドを使用してアプリを実行します。

    dotnet run
    

    ヒント

    エラー メッセージが表示される場合は、Azure OpenAI リソースのデプロイが完了していない可能性があります。 しばらく待ってからもう一度お試しください。

コードを調べる

このアプリでは、Microsoft.SemanticKernel パッケージを使用して、OpenAI サービスへの要求を送受信します。

アプリのコードは、Program.cs ファイル内に含まれています。 コードの最初の数行によって、構成値が設定され、dotnet user-secrets コマンドを使用して以前に設定された OpenAI キーが取得されます。

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string model = "gpt-3.5-turbo";
string key = config["OpenAIKey"];

OpenAIChatCompletionService サービスは、要求と応答を支援します。

// Create the OpenAI Chat Completion Service
OpenAIChatCompletionService service = new(model, key);

コードを調べる

このアプリケーションでは、Microsoft.SemanticKernel パッケージを使用して、Azure にデプロイされた Azure OpenAI サービスに要求を送受信します。

アプリケーション全体が Program.cs ファイル内に含まれています。 コードの最初の数行によって、アプリケーションのプロビジョニング中に dotnet user-secrets に設定されたシークレットと構成値が取得されます。

// Retrieve the local secrets saved during the Azure deployment
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

AzureOpenAIChatCompletionService サービスは、要求と応答を支援します。

// Create the Azure OpenAI Chat Completion Service
AzureOpenAIChatCompletionService service = new(deployment, endpoint, key);

モデルにさらにコンテキストを提供するシステム プロンプトを追加します。これは、会話中のモデルの動作と生成される補完に影響します。

// Start the conversation with context for the AI model
ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area. 
    You are upbeat and friendly. You introduce yourself when first saying hello.
    When helping people out, you always ask them for this information
    to inform the hiking recommendation you provide:

    1. Where they are located
    2. What hiking intensity they are looking for

    You will then provide three suggestions for nearby hikes that vary in length
    after you get that information. You will also share an interesting fact about
    the local nature on the hikes when making a recommendation.
    """);

AddUserMessage 関数を使用して、チャット履歴にユーザー メッセージを追加します。 GetChatMessageContentAsync 関数を使用して、システム プロンプトとユーザー要求に基づいて応答を生成するようにモデルに指示します。


// Add user message to chat history
chatHistory.AddUserMessage("Hi! Apparently you can help me find a hike that I will like?");

// Print User Message to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

// Get response
var response = await service.GetChatMessageContentAsync(
    chatHistory, new OpenAIPromptExecutionSettings() { MaxTokens = 400 });

モードからの応答を追加して、チャット履歴を維持します。

// Add response to chat history
chatHistory.Add(response);

// Print Response to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

システム プロンプトとユーザー メッセージをカスタマイズして、好みのハイキングを見つけるのを助けるために、モデルがどのように応答するかを確認します。

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

サンプル アプリケーションまたはリソースが不要になったら、対応するデプロイとすべてのリソースを削除します。

azd down

トラブルシューティング

Windows では、azd up の実行後に次のエラー メッセージが表示されることがあります。

postprovision.ps1 はデジタル署名されていません。 スクリプトはシステムで実行されません

postprovision.ps1 スクリプトは、アプリケーションで使用される .NET ユーザー シークレットを設定するために実行されます。 このエラーを回避するために、次の PowerShell コマンドを実行します。

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

azd up コマンドを再実行します。

もう 1 つの考えられるエラー:

'pwsh' が内部または外部コマンド、操作可能プログラムまたはバッチ ファイルとして認識されない。 警告: 'postprovision' フックは終了コード '1' で失敗しました、パス: '.\infra\post-script\postprovision.ps1'。 : 終了コード: 1 ContinueOnError が true に設定されているため、実行が継続されます。

postprovision.ps1 スクリプトは、アプリケーションで使用される .NET ユーザー シークレットを設定するために実行されます。 このエラーを回避するには、次の PowerShell コマンドを使用して手動でスクリプトを実行します。

.\infra\post-script\postprovision.ps1

.NET AI アプリにユーザー シークレットが構成され、テストできるようになりました。

次のステップ