Azure OpenAI Service を使用して検索拡張生成 (RAG) を実装する
Azure OpenAI Service を使用すると、基になる LLM のインテリジェンスで独自のデータを使用できます。 独自のデータのみを関連トピックに使用するようにモデルを制限したり、事前トレーニング済みモデルの結果とブレンドしたりすることができます。
この演習のシナリオで、あなたは Margie’s Travel Agency で働くソフトウェア開発者の役割を演じます。 Azure AI Search を使用して独自のデータのインデックスを作成し、それを Azure OpenAI で使用してプロンプトを拡張する方法について説明します。
この演習には約 30 分かかります。
Azure リソースをプロビジョニングする
この演習を完了するには、以下が必要です。
- Azure OpenAI リソース。
- Azure AI Search リソース。
- Azure ストレージ アカウント リソース。
- Azure portal (
https://portal.azure.com
) にサインインします。 - 次の設定で Azure OpenAI リソースを作成します。
- [サブスクリプション]: “Azure OpenAI Service へのアクセスが承認されている Azure サブスクリプションを選びます”**
- [リソース グループ]: リソース グループを作成または選択します
- [リージョン]: 以下のいずれかのリージョンからランダムに選択する*
- オーストラリア東部
- カナダ東部
- 米国東部
- 米国東部 2
- フランス中部
- 東日本
- 米国中北部
- スウェーデン中部
- スイス北部
- 英国南部
- [名前]: “希望する一意の名前”
- 価格レベル: Standard S0
* Azure OpenAI リソースは、リージョンのクォータによって制限されます。 一覧表示されているリージョンには、この演習で使用されるモデル タイプの既定のクォータが含まれています。 リージョンをランダムに選択することで、サブスクリプションを他のユーザーと共有しているシナリオで、1 つのリージョンがクォータ制限に達するリスクが軽減されます。 演習の後半でクォータ制限に達した場合は、別のリージョンに別のリソースを作成する必要が生じる可能性があります。
- Azure OpenAI リソースのプロビジョニング中に、次の設定で Azure AI Search リソースを作成します。
- サブスクリプション: Azure OpenAI リソースをプロビジョニングしたサブスクリプション
- [リソース グループ]: “Azure OpenAI リソースをプロビジョニングしたリソース グループ”**
- サービス名: 任意の一意の名前
- 位置: Azure OpenAI リソースをプロビジョニングしたリージョン**
- 価格レベル: Basic
- Azure AI 検索リソースのプロビジョニング中に、次の設定でストレージ アカウント リソースを作成します。
- サブスクリプション: Azure OpenAI リソースをプロビジョニングしたサブスクリプション
- [リソース グループ]: “Azure OpenAI リソースをプロビジョニングしたリソース グループ”**
- ストレージ アカウント名: 任意の一意の名前
- リージョン: Azure OpenAI リソースをプロビジョニングしたリージョン
- パフォーマンス: 標準
- 冗長: ローカル冗長ストレージ (LRS)
- 3 つのリソースがすべて Azure サブスクリプションに正常にデプロイされたら、Azure portal で確認し、次の情報を収集します (この演習の後半で必要になります)。
- 作成した Azure OpenAI リソースのエンドポイントとキー (Azure Portal の Azure OpenAI リソースの [キーとエンドポイント] ページで使用できます)
- Azure AI Search サービスのエンドポイント (Azure portal の Azure AI Search リソースの概要ページの URL 値)。
- Azure AI Search リソースのプライマリ管理者キー (Azure portal の Azure AI Search リソースの [キー] ページで入手できます)。
データをアップロードする
独自のデータを使用して、生成 AI モデルで使用するプロンプトを表示します。 この演習では、データは架空の Margies Travel 社の旅行パンフレットのコレクションで構成されています。
- 新しいブラウザー タブで、
https://aka.ms/own-data-brochures
からパンフレット データのアーカイブをダウンロードします。 パンフレットを PC 上のフォルダーに展開します。 - Azure portal で、自分のストレージ アカウントに移動し、[ストレージ ブラウザー] ページを表示します。
- [BLOB コンテナー] を選択し、
margies-travel
という名前の新しいコンテナーを追加します。 - margies-travel コンテナーを選択し、前に抽出した PDF パンフレットを BLOB コンテナーのルート フォルダーにアップロードします。
AI モデルをデプロイする
この演習では、次の 2 つの AI モデルを使用します。
- パンフレット内のテキストをベクター化するテキスト埋め込みモデル。グラウンディング プロンプトで使用するために効率的にインデックスを作成できます。
- データに基づいたプロンプトに対する応答の生成にアプリケーションで使用できる GPT モデル。
これらのモデルをデプロイするには、AI Foundry を使用します。
- Azure portal で、Azure OpenAI リソースに移動します。 次に、リンクを使用して、Azure AI Foundry ポータルでリソースを開きます。
- Azure AI Foundry ポータルの [デプロイ] ページで、既存のモデル デプロイを表示します。 以下の設定を使用して、text-embedding-ada-002 モデルの新しい基本モデル デプロイを作成します。
- デプロイ名: text-embedding-ada-002
- モデル: text-embedding-ada-002
- モデル バージョン: 既定のバージョン
- デプロイの種類:Standard
- 1 分あたりのトークンのレート制限: 5K*
- コンテンツ フィルター: 既定
- 動的クォータを有効にする: 有効
- テキスト埋め込みモデルがデプロイされたら、[デプロイ] ページに戻り、次の設定で gpt-35-turbo-16k モデルの新しいデプロイを作成します。
- デプロイ名: gpt-35-turbo-16k
- モデル: gpt-35-turbo-16k “(16k モデルが使用できない場合は、gpt-35-turbo を選びます)”**
- モデル バージョン: 既定のバージョン
- デプロイの種類:Standard
- 1 分あたりのトークンのレート制限: 5K*
- コンテンツ フィルター: 既定
- 動的クォータを有効にする: 有効
* この演習は、1 分あたり 5,000 トークンのレート制限内で余裕を持って完了できます。またこの制限によって、同じサブスクリプションを使用する他のユーザーのために容量を残すこともできます。
インデックスを作成する
プロンプトで独自のデータを簡単に使用できるようにするには、Azure AI Search を使用してインデックスを作成します。 インデックス作成プロセス中に前にデプロイしたテキスト埋め込みモデルを使用して、テキスト データをベクトル化します (その結果、インデックス内の各テキスト トークンが数値ベクトルで表され、生成 AI モデルがテキストを表す方法との互換性が得られます)
- Azure portal で、Azure AI Search リソースに移動します。
- [概要] ページで、[データのインポートとベクトル化] を選択します。
- [データ接続のセットアップ] ページで、[Azure Blob Storage] を選択し、次の設定でデータ ソースを構成します。
- サブスクリプション: ストレージ アカウントをプロビジョニングした Azure サブスクリプション。
- Blob Storage アカウント: 前に作成したストレージ アカウント。
- BLOB コンテナー: margies-travel
- BLOB フォルダー: 空白のままにします
- 削除の追跡を有効にする: 未選択
- マネージド ID を使用して認証する: 未選択
- [テキストのベクトル化] ページで、次の設定を選択します。
- サブタイプ: Azure OpenAI
- サブスクリプション: Azure OpenAI Service をプロビジョニングした Azure サブスクリプション。
- Azure OpenAI Service: お使いの Azure OpenAI Service リソース
- モデル デプロイ: text-embedding-ada-002
- 認証の種類: API キー
- Azure OpenAI サービスに接続すると、アカウントに追加コストが発生することを了承します: 選択済み
- 次のページでは、画像をベクター化したり、AI スキルを使用してデータを抽出したりするオプションは選択しないでください。
- 次のページで、セマンティック ランク付けを有効にし、インデクサーを 1 回実行するようにスケジュールします。
- 最後のページで、オブジェクト名のプレフィックスを
margies-index
に設定し、インデックスを作成します。
Visual Studio Code でアプリを開発する準備をする
次に、Azure OpenAI Service SDK を使うアプリで独自のデータを使う方法を見てみましょう。 Visual Studio Code を使用してアプリを開発します。 アプリのコード ファイルは、GitHub リポジトリで提供されています。
ヒント: 既に mslearn-openai リポジトリをクローンしている場合は、Visual Studio Code で開きます。 それ以外の場合は、次の手順に従って開発環境に複製します。
- Visual Studio Code を起動します。
- パレットを開き (SHIFT+CTRL+P)、Git:Clone コマンドを実行して、
https://github.com/MicrosoftLearning/mslearn-openai
リポジトリをローカル フォルダーに複製します (どのフォルダーでも問題ありません)。 -
リポジトリを複製したら、Visual Studio Code でフォルダーを開きます。
注:Visual Studio Code に、開いているコードを信頼するかどうかを求めるポップアップ メッセージが表示された場合は、ポップアップの [はい、作成者を信頼します] オプションをクリックします。
-
リポジトリ内の C# コード プロジェクトをサポートするために追加のファイルがインストールされるまで待ちます。
注: ビルドとデバッグに必要なアセットを追加するように求めるプロンプトが表示された場合は、[今はしない] を選択します。
アプリケーションを構成する
C# と Python の両方のアプリケーションが用意されており、どちらのアプリも同じ機能を備えています。 まず、Azure OpenAI リソースの使用を有効にするために、アプリケーションの主要な部分をいくつか完成させます。
- Visual Studio Code の [エクスプローラー] ペインで、Labfiles/06-use-own-data フォルダーを参照し、言語の設定に応じて、CSharp または Python フォルダーを展開します。 各フォルダーには、Azure OpenAI 機能を統合するアプリの言語固有のファイルが含まれています。
-
コード ファイルが含まれている CSharp または Python フォルダーを右クリックし、統合ターミナルを開きます。 次に、言語設定に応じて適切なコマンドを実行して、Azure OpenAI SDK パッケージをインストールします。
C#:
dotnet add package Azure.AI.OpenAI --version 1.0.0-beta.14
Python:
pip install openai==1.55.3
-
[エクスプローラー] ペインの CSharp または Python フォルダーで、使用する言語の構成ファイルを開きます
- C#: appsettings.json
- Python: .env
- 次を含めて構成値を更新します。
- 作成した Azure OpenAI リソースのエンドポイントとキー (Azure Portal の Azure OpenAI リソースの [キーとエンドポイント] ページで使用できます)
- gpt-35-turbo モデルのデプロイで指定したデプロイ名 (Azure AI Foundry ポータルの [デプロイ] ページで確認できます)。
- 検索サービスのエンドポイント (Azure Portal の検索リソースの概要ページの URL 値)。
- 検索リソースのキー (Azure Portal の検索リソースの [キー] ページで使用できます。管理者キーのいずれかを使用できます)。
- 検索インデックスの名前 (
margies-index
になります)。
- 構成ファイルを保存します。
Azure OpenAI サービスを使うコードを追加する
これで、Azure OpenAI SDK を使って、デプロイされたモデルを使う準備が整いました。
-
[エクスプローラー] ペインの CSharp または Python フォルダーで、使う言語のコード ファイルを開き、コメント “Configure your data source” を、Azure OpenAI SDK ライブラリを追加するコードに置き換えます。
C#: ownData.cs
// Configure your data source AzureSearchChatExtensionConfiguration ownDataConfig = new() { SearchEndpoint = new Uri(azureSearchEndpoint), Authentication = new OnYourDataApiKeyAuthenticationOptions(azureSearchKey), IndexName = azureSearchIndex };
Python: ownData.py
# Configure your data source extension_config = dict(dataSources = [ { "type": "AzureCognitiveSearch", "parameters": { "endpoint":azure_search_endpoint, "key": azure_search_key, "indexName": azure_search_index, } }] )
-
コードの残りの部分を確認して、データ ソース設定に関する情報の提供に使われる要求本文内での “拡張機能” の使用に注目してください。**
-
コード ファイルに加えた変更を保存します。
アプリケーションを実行する
アプリが構成されたので、それを実行してモデルに要求を送信し、応答を確認します。 異なるオプションの間で違いがあるのはプロンプトの内容のみであり、他のすべてのパラメーター (トークン数や温度など) は要求ごとに変わりがないことがわかります。
-
対話型ターミナル ペインで、フォルダー コンテキストが優先言語のフォルダーであることを確認します。 その後、次のコマンドを入力してアプリケーションを作成します。
- C# :
dotnet run
- Python:
python ownData.py
ヒント: ターミナル ツールバーの 最大化パネル サイズ (^) アイコンを使用すると、コンソール テキストをさらに表示できます。
- C# :
-
プロンプト
Tell me about London
に対する応答を確認します。これには、回答だけでなく、検索サービスから取得したプロンプトのグラウンディングに使われるデータの詳細が含まれているはずです。ヒント: 検索インデックスからの引用を表示する場合は、コード ファイルの先頭近くにある変数 show citations を true に設定します。
クリーンアップ
Azure OpenAI リソースでの作業が完了したら、Azure portal (https://portal.azure.com
) でリソースを忘れずに削除します。 これには、ストレージ アカウントと検索リソースも含まれます。これらによって比較的多額のコストが発生する可能性があるため、必ず削除してください。