.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 モデルに接続し、ハイキング データを分析し、分析情報を提供します。
前提条件
- .NET 8 SDK - .NET 8 SDK をインストールします。
- Azure サブスクリプション。無料で作成できます。
- Azure OpenAI サービスにアクセスします。
- Azure Developer CLI (省略可能) - Azure Developer CLI のインストールまたは更新。
サンプル プロジェクトを入手する
サンプル リポジトリをクローンする
前のセクションの手順を使用して独自のアプリを作成することも、すべてのクイックスタートの完成したサンプル アプリを含む GitHub リポジトリを複製することもできます。 Azure OpenAI を使用する予定の場合、サンプル リポジトリは、Azure OpenAI リソースをプロビジョニングできる Azure Developer CLI テンプレートとしても構成されます。
git clone https://github.com/dotnet/ai-samples.git
Azure OpenAI サービスを作成する
- Azure Developer CLI
- Azure CLI
- Azure Portal
サンプルの GitHub リポジトリは、Azure Developer CLI (azd
) テンプレートとして構成されています。azd
がこれを使用して、Azure OpenAI サービスとモデルをプロビジョニングできます。
ターミナルまたはコマンド プロンプトから、サンプル リポジトリの
src\quickstarts\azure-openai
ディレクトリに移動します。azd up
コマンドを実行して、Azure OpenAI リソースをプロビジョニングします。 Azure OpenAI サービスの作成とモデルのデプロイには数分かかる場合があります。azd up
azd
また、Azure OpenAI エンドポイントやモデル名など、サンプル アプリに必要なユーザー シークレットも構成します。
ハイキング チャットのサンプルを試す
ターミナルまたはコマンド プロンプトから、
src\quickstarts\openai\semantic-kernel\03-ChattingAboutMyHikes
ディレクトリに移動します。次のコマンドを実行して、OpenAI API キーをサンプル アプリのシークレットとして構成します。
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key>
dotnet run
コマンドを使用してアプリを実行します。dotnet run
ターミナルまたはコマンド プロンプトから、
semantic-kernel\02-HikerAI
ディレクトリに移動します。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"];
AzureOpenAIChatCompletionService
サービスは、要求と応答を円滑にします。
// == Create the Azure OpenAI Chat Completion Service ==========
AzureOpenAIChatCompletionService service = new(deployment, endpoint, new DefaultAzureCredential());
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 アプリにユーザー シークレットが構成され、テストできるようになりました。
次のステップ
.NET