.NET AI チャット アプリからデータに関する分析情報を取得する

.NET 8 コンソール アプリを使用して OpenAI gpt-3.5-turbo モデルに接続し、AI 開発を開始します。 Semantic Kernel を使用して AI モデルに接続し、ハイキング データを分析し、分析情報を提供します。

前提条件

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

.NET 8 コンソール アプリを使用して、Azure にデプロイされた OpenAI gpt-3.5-turbo モデルに接続し、AI 開発を開始します。 Semantic Kernel を使用して AI モデルに接続し、ハイキング データを分析し、分析情報を提供します。

前提条件

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

すべてのクイックスタートのサンプル アプリが含まれる 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 のデプロイ中にエラーが発生した場合は、「トラブルシューティング」セクションを参照してください。

ハイキング チャットのサンプルを試す

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

  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);

OpenAIChatCompletionService クライアントが作成されると、アプリはファイル hikes.md の内容を読み取り、それを使用してシステム プロンプトを追加して、モデルにさらなるコンテキストを提供します。 これは、モデルの動作と会話中に生成される入力候補に影響します。

このアプリケーションでは、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);

OpenAIChatCompletionService クライアントが作成されると、アプリはファイル hikes.md の内容を読み取り、それを使用してシステム プロンプトを追加して、モデルにさらなるコンテキストを提供します。 これは、モデルの動作と会話中に生成される入力候補に影響します。

// Provide context for the AI model
ChatHistory chatHistory = new($"""
    You are upbeat and friendly. You introduce yourself when first saying hello. 
    Provide a short answer only based on the user hiking records below:  

    {File.ReadAllText("hikes.md")}
    """);
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

次のコードでは、AddUserMessage 関数を使用してモデルにユーザー プロンプトを追加します。 GetChatMessageContentAsync 関数は、システムとユーザーのプロンプトに基づいて応答を生成するようにモデルに指示します。

// Start the conversation
chatHistory.AddUserMessage("Hi!");
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

chatHistory.Add(
    await service.GetChatMessageContentAsync(
        chatHistory,
        new OpenAIPromptExecutionSettings()
        { 
            MaxTokens = 400 
        }));
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

アプリは、チャット履歴またはコンテキストを維持するために、モデルからの応答を chatHistory に追加します。

// Continue the conversation with a question.
chatHistory.AddUserMessage(
    "I would like to know the ratio of the hikes I've done in Canada compared to other countries.");

Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

chatHistory.Add(await service.GetChatMessageContentAsync(
    chatHistory,
    new OpenAIPromptExecutionSettings()
    { 
        MaxTokens = 400 
    }));

Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

システムまたはユーザー プロンプトをカスタマイズして、さまざまな質問とコンテキストを提供します。

  • 雨が降っているときに、私は何回ハイキングしましたか?
  • 2021 年に、私は何回ハイキングをしましたか?

モデルは、入力に基づいて各プロンプトに対して関連する応答を生成します。

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

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

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 アプリにユーザー シークレットが構成され、テストできるようになりました。

次のステップ