ChatGPT + Enterprise data with Azure OpenAI and Cognitive Search
このサンプルでは、Retrieval Augmented Generation パターンを使用して、独自のデータで ChatGPT のような生成AIを活用したアプリケーションを開発します。ChatGPT モデル (gpt-35-turbo
) へのアクセスには Azure OpenAI を使用し、データのインデックス化と検索には Azure Cognitive Search を使用します。
このリポジトリにはサンプルデータが含まれているので、エンドツーエンドで試すことができます。このサンプルアプリケーションでは、鉄道技術に関する架空の論文をデータとして使い、水素ハイブリット電車に関する技術的な質問に答えることができます。
このアプリケーションの開発の詳細については、こちらの記事をご参照ください:
- Transform your business with smart .NET apps powered by Azure and ChatGPT blog post
- Build Intelligent Apps with .NET and Azure - Build Session
サンプルアプリケーションの機能
- ボイスチャット/文字チャット/Q&Aインターフェース
- 引用やソースコンテンツの追跡など、ユーザーが回答の信頼性を評価するためのさまざまなオプション
- データ準備、プロンプト構築、モデル(ChatGPT)と検索(Cognitive Search)間のオーケストレーション
サンプルアプリケーションの実行手順
💡注意💡
このサンプルをデプロイして実行するには、Azure OpenAIサービスへのアクセスを有効にしたAzureサブスクリプションが必要です。 申請はこちらです。また、Azureのサブスクリプション自体をお持ちでない方はこちらにアクセスして、Azureのトライアルを申請できます。
🚩警告🚩
デフォルトでは、このサンプルは、月額費用が発生する Azure App Service、Azure Static Web App、Azure Cognitive Search リソースと、ドキュメントページごとに費用が発生する Form Recognizer リソースを作成します。このコストを回避したい場合は、infra
フォルダ下のパラメータファイルを変更することで、それぞれのリソースを無料版に切り替えることができます (ただし、考慮すべき制限もあります。たとえば、無料の Cognitive Search リソースは 1 サブスクリプションにつき 1 つまでで、無料の Form Recognizer リソースは各ドキュメントの最初の 2 ページのみしか分析できません)
前提条件
ローカルで実行する場合
- Azure Developer CLI
- .NET 7
- Git
- Powershell 7+ (pwsh) - For Windows ユーザのみ
- 重要: PowerShell コマンドから
pwsh.exe
を実行できることを確認します。失敗した場合は、PowerShellをアップグレードする必要があります。
- 重要: PowerShell コマンドから
- Docker
- 重要:
azd
のプロビジョニング/デプロイコマンドを実行する前に、Docker が起動していることを確認してください。
- 重要:
💡注意💡
Azure アカウントには、User Access Administrator または Owner などのMicrosoft.Authorization/roleAssignments/write
権限が必要です。
GitHubコードスペースまたはVS Codeリモートコンテナで実行する場合
GitHub Codespaces または Visual Studio Code Dev Container を利用できます。以下のボタンのいずれかをクリックして、このリポジトリを開いてください。
インストール
プロジェクトの初期化
- 新しいフォルダを作成し、ターミナルでそのフォルダに移動
azd auth login
実行azd init -t azure-search-openai-demo-csharp
実行- このサンプルで使用されているモデルを現在サポートしている地域は、米国東部または米国南中部です。最新の地域とモデルのリストについては、 こちらをチェックしてください。
スクラッチから開始する場合
既存のAzureサービスがなく、新しいデプロイから始めたい場合は、以下のコマンドを実行します。
azd up
を実行 - Azure リソースをプロビジョニングし、このサンプルをそれらのリソースにデプロイします。
💡注意💡
このアプリケーションはtext-davinci-003
とgpt-35-turbo
のモデルを使用しています。どのリージョンにデプロイするかを選択する際には、そのリージョンで利用可能であることを確認してください(例: EastUS) 詳細については Azure OpenAI Service documentationを参照してください。
- アプリケーションが正常にデプロイされると、コンソールにURLが表示されます。 そのURLをクリックして、ブラウザでアプリケーションを開きます。
💡注意💡
アプリケーションが完全にデプロイされるまで数分かかる場合があります。
既存のリソースを利用する場合
azd env set AZURE_OPENAI_SERVICE {既存のOpenAIのサービス名}
を実行azd env set AZURE_OPENAI_RESOURCE_GROUP {OpenAIサービスがプロビジョニングされる既存のリソースグループ名}
を実行azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT {既存のChatGPTデプロイメントの名前}
を実行。※この手順はChatGPT デプロイメントがデフォルトの 'chat' でない場合にのみ必要azd env set AZURE_OPENAI_GPT_DEPLOYMENT {既存の GPT デプロイメントの名前}
を実行します。※この手順はChatGPT デプロイメントがデフォルトのdavinci
でない場合のみ必要azd up
を実行
📝メモ📝
既存の Search Account や Storage Account を利用することもできます。 既存のリソースを設定するためにazd env set
に渡す環境変数のリストについては./infra/main.parameters.json
を参照してください。
リポジトリのクローンのデプロイまたは再デプロイの場合
azd up
の実行
4. App Spacesを使ってレポをデプロイする場合
📝メモ📝
リポジトリにazdがサポートするbicepファイルがあることを確認し、手動(初回デプロイ用)またはコード変更時(最新の変更で自動的に再デプロイ)にトリガーできる初期GitHub Actions Workflowファイルを追加します。 リポジトリをApp Spacesと互換性を持たせるには、AZDが適切なタグを持つ既存のリソースグループにデプロイできるように、メインのバイセップとメインのパラメーターファイルを変更する必要があります。
- メインパラメータファイルにAZURE_RESOURCE_GROUPを追加し、App SpacesがGitHub Actionsワークフローファイルに設定した環境変数の値を読み込むようにします。
"resourceGroupName": { "value": "${AZURE_RESOURCE_GROUP}" }
- メインパラメータファイルにAZURE_TAGSを追加し、App SpacesがGitHub Actionsワークフローファイルに設定した環境変数から値を読み込むようにする。
"tags": { "value": "${AZURE_TAGS}" }
- App Spacesによって設定されている値を読み取るために、メインのbicepファイルにリソースグループとタグのサポートを追加します。
param resourceGroupName string = '' param tags string = ''
azd
によって設定されたデフォルトのタグと、App Spacesによって設定されたタグを組み合わせる。メインのbicepファイルのtags initializationを以下のように置き換えますvar baseTags = { 'azd-env-name': environmentName } var updatedTags = union(empty(tags) ? {} : base64ToJson(tags), baseTags) Make sure to use "updatedTags" when assigning "tags" to resource group created in your bicep file and update the other resources to use "baseTags" instead of "tags". For example - ```json resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}' location: location tags: updatedTags }
ローカルでの実行の場合
azd auth login
の実行- アプリケーションがデプロイされたら、環境変数
AZURE_KEY_VAULT_ENDPOINT
を設定します。この値は .azure/YOUR-ENVIRONMENT-NAME/.env ファイルまたは Azure ポータルで確認 - 次のコマンドを実行して、ASP.NET Core Minimal API サーバー(クライアントホスト)を起動
dotnet run --project ./app/backend/MinimalApi.csproj --urls=https://localhost:7181/
ブラウザでhttps://localhost:7181に移動し、アプリを試してみてください。
環境の共有
デプロイされた既存の環境へのアクセス権を他の人に与えたい場合は、以下を実行してください。
- Azure CLIのインストール
azd init -t azure-search-openai-demo-csharp
の実行azd env refresh -e {環境名}
を実行
- このコマンドを実行するには
azd
環境名、サブスクリプション ID、リージョンが必要であることに注意してください。 これで、azd
環境の.env
ファイルに、アプリをローカルで実行するために必要なすべての設定が入力されます。
pwsh ./scripts/roles.ps1
を実行
- これは必要なロールをすべてユーザに割り当て、ローカルでアプリを実行できるようにします。 ユーザがサブスクリプションでロールを作成するのに必要な権限を持っていない場合は、このスクリプトを実行する必要があるかもしれません。
azd.env
ファイルまたはシェルで、環境変数AZURE_PRINCIPAL_ID
を自分のAzure ID
に設定してください。
リソースのクリーンアップ
azd down
の実行
クイックスタート
-
Azure の場合:
azd
によってデプロイされた Azure Static Web App に移動する。URL はazd
が完了したときに出力されるEndpoint
か、Azure ポータルで確認できます。 -
ローカルで実行する場合: クライアント・アプリはhttps://localhost:7181に、Open APIサーバーはhttps://localhost:7181/swaggerにアクセスしてください。
サンプルアプリの設定方法
-
音声チャットページで、音声設定ダイアログを選択し、音声合成設定を行います。
- [Blazor Clippy] と対話するためにメッセージを入力するか、[Speak] トグルボタンを選択して音声テキストを入力として使用することができます。
-
[Chat] または [Ask] のコンテキストでさまざまなトピックを試してみてください。チャットの場合は、フォローアップの質問、明確な説明、答えを簡単にしたり詳しく説明したりすることなどを試してみてください。
-
引用と出典の設定
- [設定] アイコンをクリックすると、さまざまなオプションを試したり、プロンプトを微調整したりできます。
参考情報
- Revolutionize your Enterprise Data with ChatGPT: Next-gen Apps w/ Azure OpenAI and Cognitive Search
- Azure Cognitive Search
- Azure OpenAI Service
Azure.AI.OpenAI
NuGet package- Original Blazor App
Note
The PDF documents used in this demo contain information generated using a language model (Azure OpenAI Service). The information contained in these documents is only for demonstration purposes and does not reflect the opinions or beliefs of Microsoft. Microsoft makes no representations or warranties of any kind, express or implied, about the completeness, accuracy, reliability, suitability or availability with respect to the information contained in this document. All rights reserved to Microsoft.
よくある質問
質問: Azure Cognitive Searchは大きな文書の検索をサポートしているのに、なぜPDFをチャンクに分割する必要があるのでしょうか?
回答: チャンクによって、トークンの制限のためにOpenAIに送信する情報量を制限できます。コンテンツを分割することで、OpenAIに注入できる潜在的なテキストのチャンクを見つけることができます。私たちが使っているチャンクの方法は、あるチャンクが終わると次のチャンクが始まるように、テキストのスライディングウィンドウを活用します。これにより、テキストの文脈が失われる可能性を減らすことが可能です。