このサンプルは、検索拡張生成パターンを使用して、独自のデータ上でChatGPTのようなエクスペリエンスを作成するためのいくつかのアプローチを示しています。 Azure Openaiサービスを使用して、ChATGPTモデル(GPT-35ターボ)にアクセスし、AZURE AIはデータインデックス作成と検索を検索します。
リポジトリにはサンプルデータが含まれているため、エンドツーエンドを試す準備ができています。このサンプルアプリケーションでは、Contoso Real Estateと呼ばれる架空の会社を使用しています。このエクスペリエンスにより、顧客は製品の使用に関するサポート質問をすることができます。サンプルデータには、利用規約、プライバシーポリシー、サポートガイドを説明するドキュメントのセットが含まれています。
アプリケーションは、以下を含む複数のコンポーネントから作成されます。
アプリのビデオ概要をご覧ください
重要:このサンプルを展開して実行するには、次のことが必要です。
Microsoft.Authorization/roleAssignments/write
Permissions(ロールベースのアクセス制御管理者、ユーザーアクセス管理者、または所有者など)が必要です。サブスクリプションレベルのアクセス許可がない場合は、既存のリソースグループのRBACで許可され、その既存のグループに展開する必要があります。Microsoft.Resources/deployments/write
Permissionsがサブスクリプションレベルで必要です。 価格は、地域ごとに異なる場合があります。正確なコストを見積もることはできません。以下のリソースについては、Azure Pricing Calculatorを試すことができます。
azd down --purge
。
このプロジェクトを正常にセットアップする方法は複数あります。
始める最も簡単な方法は、すべてのツールをセットアップするための事前設定を提供するGitHub CodeSpacesです。詳細をご覧ください。または、以下の指示に従ってローカル環境を設定することもできます。
GitHub Codespacesを使用して、このレポを実質的に実行できます。これにより、ブラウザでWebベースのコードとコードを開きます。
コードスペースと同様のオプションは、VSコードリモートコンテナです。これは、開発者コンテナ拡張機能を使用してローカルとコードインスタンスでプロジェクトを開きます。
pwsh.exe
を実行できるようにしてください。これが失敗した場合、PowerShellをアップグレードする必要がある可能性があります。次に、プロジェクトコードを取得します。
azd auth login
を実行しますazd init -t azure-search-openai-javascript
を実行します既存のAzureサービスがなく、新しい展開から開始したい場合は、次のコマンドを実行します。
azd up
- これにより、Azureリソースを提供し、このサンプルをそれらのリソースに展開します。これには、 ./data
フォルダーにあるファイルに基づいて検索インデックスの構築が含まれます。eastus2
に展開されます。 azd env set AZURE_OPENAI_RESOURCE_GROUP_LOCATION {location}
を使用して、別の場所を設定できます。現在、場所の短いリストのみが受け入れられています。そのロケーションリストは、OpenAIモデルの可用性テーブルに基づいており、可用性が変化するにつれて時代遅れになる可能性があります。eastus2
に展開されます。 azd env set AZURE_WEBAPP_LOCATION {location}
を使用して、別の場所を設定できます。現在、場所の短いリストのみが受け入れられています。 Static Webアプリはグローバルサービスであり、選択した場所は、このサンプルでは使用されていないマネージド関数アプリにのみ影響することに注意してください。次のようになります。
注:アプリケーションが完全に展開されるまでに15分以上かかる場合があります。
既存のAzureリソースが既にある場合は、 azd
環境値を設定してそれらを再利用できます。
azd env set AZURE_RESOURCE_GROUP {Name of existing resource group}
azd env set AZURE_LOCATION {Location of existing resource group}
azd env set AZURE_OPENAI_SERVICE {Name of existing OpenAI service}
azd env set AZURE_OPENAI_RESOURCE_GROUP {Name of existing resource group that OpenAI service is provisioned to}
azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT {Name of existing ChatGPT deployment}
を実行します。 ChatGPTの展開がデフォルトの「チャット」ではない場合にのみ必要です。azd env set AZURE_OPENAI_EMBEDDING_DEPLOYMENT {Name of existing GPT embedding deployment}
。埋め込み展開がデフォルトの「埋め込み」ではない場合にのみ必要です。 azd env set AZURE_SEARCH_SERVICE {Name of existing Azure AI Search service}
azd env set AZURE_SEARCH_SERVICE_RESOURCE_GROUP {Name of existing resource group with ACS service}
azd up
ステップで選択する場所とは異なる場所にある場合は、 azd env set AZURE_SEARCH_SERVICE_LOCATION {Location of existing service}
を実行します。azd env set AZURE_SEARCH_SERVICE_SKU {Name of SKU}
を実行します。フリーティアは、管理されたアイデンティティをサポートしていないため、機能しません。 (他の可能な値を参照) 既存のストレージアカウントを使用することもできます。 ./infra/main.parameters.json
を参照してください。環境変数のリストを参照して、既存のリソースを構成するためにazd env set
に渡されます。
これで、上記のゼロから展開する手順に従って、 azd up
実行できます。これは、リソースの提供とコードの展開の両方になります。
app
フォルダーのバックエンド/フロントエンドコードのみを変更した場合、Azureリソースを再構築する必要はありません。実行することができます:
azd deploy
インフラストラクチャファイル( infra
フォルダーまたはazure.yaml
)を変更した場合、Azureリソースを再構築する必要があります。実行することでそれを行うことができます:
azd up
他の誰かが完全に展開された既存の環境にアクセスできるようにするには、あなたまたは彼らは次の手順に従うことができます。
azd init -t azure-search-openai-javascript
を実行するか、このリポジトリをクローンします。azd env refresh -e {environment name}
を実行すると、このコマンドを実行するにはAZD環境名、サブスクリプションID、および場所が必要になります。これらの値は.azure/{env name}/.env
ファイルにあります。これにより、AZD環境の.env
ファイルが、アプリをローカルに実行するために必要なすべての設定に登録されます。AZURE_PRINCIPAL_ID
をその.env
ファイルまたはアクティブシェルでAzure IDに設定しますaz ad signed-in-user show
./scripts/roles.ps1
または./scripts/roles.sh
を実行して、必要なすべての役割をユーザーに割り当てます。サブスクリプションで役割を作成するために必要な許可がない場合は、このスクリプトを実行する必要がある場合があります。スクリプトが実行されると、アプリをローカルに実行できるはずです。 このサンプルによって作成されたすべてのリソースをクリーンアップするには:
azd down --purge
y
を入力してくださいy
を入力してくださいリソースグループとすべてのリソースが削除されます。
デフォルトでは、展開されたAzure Webアプリには認証またはアクセス制限が有効になっています。つまり、Webアプリへのルーティング可能なネットワークアクセスを持つ人は誰でもインデックス付きデータとチャットできます。 ADDアプリ認証チュートリアルに従い、展開されたWebアプリに対してセットアップすることにより、Azure Entra IDへの認証が必要です。
その後、特定のユーザーまたはグループセットへのアクセスを制限するために、「必要な割り当て」を変更して、Azure Entraアプリをユーザーのセットに制限する手順に従うことができます。エンタープライズアプリケーションの下でオプションを使用し、ユーザー/グループアクセスを割り当てます。明示的なアクセスが許可されていないユーザーは、エラーメッセージを受け取ります-AADSTS50105:管理者は、アプリケーションへのアクセスが具体的に付与されていない限り、ユーザーをブロックするようにアプリケーション<App_Name>を設定しました。
追加のセキュリティメカニズムを展開することをお勧めします。該当する場合は、VNETのセットアップまたはプロキシポリシーの設定を検討してください。
デフォルトでは、展開された検索APIは、展開されたWebアプリの原点と同じオリジンからのリクエストのみを許可します。別の起源でホストされているフロントエンドのCORを有効にするには、実行します。
azd env set ALLOWED_ORIGIN https://<your-domain.com>
を実行しますazd up
azd up
コマンドを正常に実行した後にのみローカルで実行できます。
azd auth login
を実行しますazd env get-values > .env
を実行して、アプリの環境変数を取得しますaz login
実行しますnpm start
か、「VSコードタスク:アプリを開始」を実行して、プロジェクトをローカルに開始します。 Webアプリに一度:
検索APIサービスは、AIチャットアプリのHTTPプロトコルを実装しています。このリポジトリで掲載されているnode.js実装の代わりに、このリポジトリのPythonバックエンドクライアントのように、同じプロトコルを実装する任意のサービスと交換できます。
これを行うには、次の手順に従ってください。
azd env get-values | grep WEBAPP_URI
URLを取得します。http://localhost:5173
を使用してください。https://<your_codespace_base_url>-5173.app.github.dev
を使用してください。azd env set ALLOWED_ORIGIN <your_frontend_url>
を使用して、許可されたオリジンとしてフロントエンドURLを設定します。azd env get-values | grep BACKEND_URI
。azd env set BACKEND_URI <your_backend_url>
を実行します。展開されたWebアプリを使用したい場合は、 azd up
再配置まで実行します。
マシンまたはコードスペースでローカルWebアプリを使用する場合は、実行してください。
# Export the environment variable.
# The syntax may be different depending on your shell or if you're using Windows.
export BACKEND_URI= < your_backend_url >
# Start the app
npm start --workspace=webapp
このサンプルは、Azure Containerアプリに展開されたバックエンドサービスとAPI、およびAzure Static Webアプリに展開されたFrontendアプリケーションの2つのアプリケーションで構成されています。デフォルトでは、展開されたAzure Containerアプリには認証またはアクセス制限が有効になります。つまり、コンテナアプリへのルーティング可能なネットワークアクセスを持つ人は誰でもインデックス付きデータとチャットできます。 Add Container App Authenticationチュートリアルに従って、展開されたAzure Containerアプリに対してセットアップすることにより、Azure Entra IDへの認証が必要です。
特定のユーザーまたはグループセットへのアクセスを制限するには、「必要な割り当て?」を変更して、Azure Entraアプリをユーザーのセットに制限する手順に従うことができます。エンタープライズアプリケーションの下でオプションを使用し、ユーザー/グループアクセスを割り当てます。明示的なアクセスが許可されていないユーザーは、エラーメッセージを受け取ります-AADSTS50105:管理者は、アプリケーションへのアクセスが具体的に付与されていない限り、ユーザーをブロックするようにアプリケーション<App_Name>を設定しました。
このサンプルは、独自の生産アプリケーションの出発点となるように設計されていますが、生産に展開する前に、セキュリティとパフォーマンスを徹底的にレビューする必要があります。考慮すべきことがいくつかあります:
infra/main.bicep
のchatGptDeploymentCapacity
とembeddingDeploymentCapacity
パラメーターを変更することにより、容量を増やすことができます。また、Azure Openai Studioのクォータタブを表示して、どれだけの容量があるかを理解することもできます。Standard_LRS
SKUを使用します。回復力を向上させるには、 Standard_ZRS
生産展開に使用することをお勧めします。これはinfra/main.bicep
のstorage
モジュールの下でsku
プロパティを使用して指定できます。Standard
SKUを使用して、1か月に1000の無料クエリを提供します。アプリが1000以上の質問が発生すると仮定すると、 semanticSearch
「標準」に変更するか、リクエストオプションでセマンティック検索を完全に無効にする必要があります。検索サービス容量が超えていることに関するエラーが表示されている場合は、 infra/core/search/search-services.bicep
のreplicaCount
変更することでレプリカの数を増やすか、Azureポータルから手動でスケーリングすることでレプリカの数を増やすことが役立つ場合があります。チャンクにより、トークンの制限のためにOpenAIに送信する情報の量を制限することができます。コンテンツを分割することにより、Openaiに注入できるテキストの潜在的なチャンクを簡単に見つけることができます。チャンキングの方法は、1つのチャンクを終了する文が次の文章を開始するように、テキストのスライドウィンドウをレバレッジします。これにより、テキストのコンテキストを失う可能性を減らすことができます。
より多くのドキュメントをアップロードするには、それらをデータ/フォルダーに入れて、 ./scripts/index-data.sh
index-data.shまたは./scripts/index-data.ps1
を実行します。
このユースケースのもう1つの人気リポジトリはこちらです:https://github.com/microsoft/sample-app-aoai-chatgpt/
このリポジトリは、Azure Openai StudioとAzure Portalを使用してセットアップに使用するために設計されています。また、ゼロから完全に展開したい人のためのazd
サポートも含まれています。
主な違い:
機能比較:
特徴 | azure-search-openai-javascript | サンプル-App-aoai-chatgpt |
---|---|---|
ラグアプローチ | 複数のアプローチ | ChatCompletion API Data_Sourcesを介してのみ |
ベクトルサポート | ✅はい | ✅はい |
データ摂取 | ✅はい(MD) | ✅はい(PDF、TXT、MD、HTML) |
永続的なチャット履歴 | いいえ(ブラウザタブのみ) | はい、cosmosdbで |
技術比較:
技術 | azure-search-openai-javascript | サンプル-App-aoai-chatgpt |
---|---|---|
フロントエンド | 反応/点灯 | 反応します |
バックエンド | node.js(fustify) | Python(フラスコ) |
ベクターDB | Azure AI検索 | Azure AI検索 |
展開 | Azure開発者CLI(AZD) | Azure Portal、AZ、AZD |
これらのコマンドを実行します:
azd env set AZURE_OPENAI_CHATGPT_MODEL gpt-4
また、アカウントが許可されているTPMの量に応じて、 infra/main.bicep
ファイルの容量を調整する必要がある場合があります。
チャットタブは、チャット-Read-Retrieve-Read.tsでプログラムされたアプローチを使用します。 Ask Tabは、ask-retrieve-then-read.tsでプログラムされたアプローチを使用します。また、[エージェントを使用](https://github.com/azure-samples/azure-search-openai-javascript/blob/main/packages/search/src/lib/approaches/ask-read-retrrieve-read.tsも利用できます。
azd up
コマンドはAzure開発者CLIからのものであり、Azureリソースのプロビジョニングと選択したAzureホストにコードを展開することの両方を処理します。
azd up
コマンドは、 azure.yaml
ファイルを使用して、インフラストラクチャとしてコードとしてinfra/
フォルダーの.bicep
ファイルを組み合わせて使用します。このプロジェクトのazure.yaml
ファイルは、事前パッケージステップとポストプロビジョンステップについていくつかの「フック」を宣言します。 up
コマンドは、最初にノード依存関係をインストールし、React.jsベースのJavaScriptファイルを構築するprepackage
フックを実行します。次に、すべてのコード(フロントエンドサービスとバックエンドサービスの両方)をzipファイルにパッケージ化し、後で展開します。
次に、 main.bicep
およびmain.parameters.json
に基づいてリソースを提供します。その時点で、OpenAIリソースの場所にデフォルト値がないため、利用可能な地域の短いリストから場所を選択するよう求められます。次に、必要なすべてのリソースを提供するために、Azureにリクエストを送信します。すべてをプロビジョニングすると、 postprovision
フックを実行してローカルデータを処理し、Azure AI検索インデックスに追加します。
最後に、 azure.yaml
を調べてAzureホスト(この場合はコンテナアプリと静的Webアプリ)を決定し、ZipにAzureアプリサービスをアップロードします。 azd up
コマンドが完了するようになりましたが、アプリが完全に利用可能になり、最初の展開後に動作するまで数分かかる場合があります。
関連するコマンドは、プロビジョニング(Infraファイルが変更された場合)のazd provision
プロビジョニングと、更新されたアプリコードを展開するためのazd deploy
デプロイです。
最も一般的な障害シナリオとソリューションは次のとおりです。
サブスクリプション( AZURE_SUBSCRIPTION_ID
)は、Azure Openaiサービスにアクセスできません。 AZURE_SUBSCRIPTION_ID
Openaiアクセス要求プロセスで指定されたIDと一致するようにしてください。
Azure Openai(East US 2の代わりにEast US 2など)で有効になっていない地域でリソースを作成しようとしています。モデルの可用性のこのマトリックスを参照してください。
クォータ、ほとんどの場合、地域あたりのリソースの数を超えました。クォータと制限に関するこの記事を参照してください。
「同じリソース名が許可されていない」競合を取得しています。サンプルを複数回実行し、毎回作成しているリソースを削除したが、それらをパージするのを忘れている可能性が高いです。 Azureは、ソフト削除からパージしない限り、48時間リソースを保持します。リソースのパージに関するこの記事を参照してください。
azd up
を実行してWebサイトにアクセスした後、ブラウザに「404が見つかりません」が表示されます。 10分待って、まだ起動している可能性があるため、もう一度やり直してください。次に、 azd deploy
を実行して、もう一度待ってみてください。展開されたアプリでエラーが発生している場合は、アプリサービスアプリの展開をデバッグするためのこれらのヒントを参照し、エラーログが問題を解決するのに役立つ場合は問題を提出してください。
エラー401 Principal does not have access to API/Operation
。環境変数には、 AZURE_TENANT_ID
、 AZURE_CLIENT_ID
、 AZURE_CLIENT_SECRET
が含まれるためです。関連するサービスプリンシパルに許可を付与するか、環境からこれらの変数を削除して、通常のアクセスを確保する必要があります。詳細については、Azure Identity SDKを参照してください。
注:このデモで使用されるドキュメントには、言語モデル(Azure Openaiサービス)を使用して生成された情報が含まれています。これらの文書に含まれる情報は、デモンストレーション目的でのみであり、Microsoftの意見や信念を反映していません。 Microsoftは、このドキュメントに含まれる情報に関して、完全性、正確性、信頼性、適合性、または可用性について、明示的または暗示されたいかなる種類の表明または保証を行いません。マイクロソフトに予約されているすべての権利。