Azure OpenAI Service On your data でベクトル検索を行う
はじめに
2023 年 8 月の更新で Azure OpenAI Service On your data でベクトル検索ができるようになったため、使い方や勘所をまとめました。
On your data ベクトル検索で何が変わる?
2023 年 6 月に On your data のナレッジベースとして使われている Azure Cognitive Search にてベクトル検索のパブリックプレビューが開始しました。これに伴い、On your data にも以下の検索方法が新たに追加されました。
イメージ図
これまでは従来の全文検索とセマンティック検索の選択肢しかありませんでしたが、ベクトル検索の選択肢が増えたことにより検索精度がボトルネックになっている場合の解決策になる可能性があります。
一方で、ベクトル検索ではクエリもベクトルに変換する必要があるため、検索のたびに Azure OpenAI Service で Embedding を行うコストが追加でかかるようになる点には留意しておく必要があります。
なお、On your data の仕組みや Azure Cognitive Search のベクトル検索については以前の記事でまとめましたので、そちらを参照してください。
参考
- Azure Cognitive Search のベクトル検索を Python で行う
- Azure OpenAI Service On Your Data の仕組みと使う上で気を付けるべきポイント
- Grounding LLMs (LLM を使ったグラウンディングの方法、課題、トレードオフなど)
使い方
0. 前提
以下が準備されていること。
- Azure OpenAI Service のリソース
- Azure Cognitive Search (Free レベル以外) のリソース
- Python 実行環境
参考
- Azure OpenAI Service リソースを作成してデプロイする
- ポータルで Azure Cognitive Search サービスを作成する
- Azure Cognitive Searchのサービス レベルを選択する
1. モデルデプロイ
ベクトル検索を行う場合は Azure OpenAI Service の Chat Completions と Embeddings モデルの両方をデプロイしておく必要があります。
Embeddings モデル
text-embedding-ada-002
Chat Completions モデル (以下のいずれかひとつ)
gpt-35-turbo
gpt-35-turbo-16k
gpt-4
gpt-4-32k
なお、Chat completions モデルに GPT-4 を利用する場合は Azure OpenAI Service の利用申請に加えて GPT-4 の利用申請が必要です。
参考
2. データソースの追加
On your data にはデータソースの指定方法が 3 種類あります。執筆時点で 2 と 3 ではアナライザーの言語を指定することができないため、日本語を想定する場合 1 が唯一の選択肢になります。
- Azure Cognitive Search (日本語ドキュメントも可能)
- Azure Blob Storage (英語ドキュメントのみ)
- Upload Files (英語ドキュメントのみ)
参考
2.1. Azure Cognitive Search
この選択肢では、利用者が任意の Azure Cognitive Search のインデックスを作成して On your data でそのインデックスを指定します。インデックス作成時に任意の言語のアナライザーを選べるため、日本語ドキュメントも検索対象にすることができます。
2.1.1. インデックス作成スクリプトの取得
Microsoft 公式サンプルコードに On your data で指定するためのインデックスを作成するスクリプト が含まれています。まずは、任意の開発環境に以下のリポジトリをクローンします。
git clone https://github.com/microsoft/sample-app-aoai-chatGPT.git
参考
- Data Preparation (スクリプトの Readme)
2.1.2. パッケージインストール
ルートディレクトリに含まれる requirements-dev.txt
を使って Python 実行環境にツールに必要なパッケージをインストールします。
pip install -r requirements-dev.txt
2.1.2. 設定
scripts
フォルダに含まれる config.json
にて設定を行います。
各設定項目の説明
項目 | 値の例 | 説明 |
---|---|---|
data_path | ../data_jp | インデックス作成対象のデータが格納されたフォルダのパス |
location | japaneast | Azure Cognitive Search のリソースが存在する Azure リージョン |
subscription_id | Azure サブスクリプション ID | |
resource_group | Azure Cognitive Search リソースが含まれるリソースグループ名 | |
search_service_name | Azure Cogntive Search リソース名 (新規作成もしくは既存) | |
index_name | Azure Cogntive Search インデックス名 (新規作成もしくは既存) | |
chunk_size | 任意の値 | チャンクサイズ (トークン数) |
token_overlap | 任意の値 | チャンクオーバーラップ (トークン数) |
semantic_config_name | default | "default"を設定 |
vector_config_name | default | "default"を設定 |
language | ja | アナライザーの言語 |
なお、リポジトリに含まれている config.json
のテンプレート には vector_config_name
が含まれていないため、手作業で追加する必要があります。
2.1.3. ロール付与
自分自身 (ツールを実行するユーザー) に Azure OpenAI Service に対する Cognitive Services ユーザー
のロールを付与します。
参考
- マネージド ID を使用して Azure OpenAI Service を構成する方法
- Azure portal を使用して Azure ロールを割り当てる
- Azure OpenAI Service のロールベースのアクセス制御
2.1.4. ツール実行
Azure にサインインをしてツールを実行します。コマンド中の <your-aoai-resource-name>
は Azure OpenAI Service のリソース名、<your-embeddings-model-deploy-name>
は text-embedding-ada-002
のデプロイ名と置き換えます。実行に成功すると、config.json
で設定した名前の Azure Cognitive Search インデックスが作成されます。
az login
python data_preparation.py --config config.json --embedding-model-endpoint "https://<your-aoai-resource-name>.openai.azure.com/openai/deployments/<your-embeddings-model-deploy-name>/embeddings?api-version=2023-05-15"
参考
- Azure OpenAI Service の REST API リファレンス
- Azure Cognitive Search のインデックス
- Data Preparation - Optional: Crack PDFs to Text (PDF ファイルを対象にする場合)
2.1.5. On your data にデータソース (Azure Cognitive Search) を追加
ここからは Azure OpenAI Studio での作業です。
データソース追加画面で事前に作成したインデックスを選択します。"Add vector search to this search resource." にチェックを入れ、事前にデプロイした text-embedding-ada-002
のデプロイ名を選択します。
フィールドマッピングはあらかじめ指定されています。これまでは存在していなかった Vector Fields
が追加されています。
任意の検索方法を選択します。執筆時点でセマンティック検索は英語のみでサポートされているため、日本語アナライザーを指定してインデックスを作成した場合は Vector
(単一ベクトル検索) か Hybrid (vector + keyword)
(ハイブリッド検索) のいずれかを選択します。
Save and close
を押すとデータソースの追加がただちに完了して、ユーザーの問いかけに対して指定したデータソースの検索結果に基づいて回答が行われるようになります。
※ 検索結果はあくまでもイメージです。スクリーンショットの例では Wiki40b データセットを使って検索を行っているため、検索結果は最新の情報ではありません。
2.2. Azure Blob Storage
この選択肢では、任意の Azure Blob コンテナーを指定すると、そのコンテナに含まれるファイルに対する Azure Cognitive Search インデックスが自動作成されます。ただし、前述のとおり執筆時点ではアナライザーの言語を指定することができないため、対象が英語の場合のみの選択肢です。
参考
2.2.1. On your data にデータソース (Azure Blob Storage) を追加
すべて Azure OpenAI Studio の操作のみで完結します。データソース追加画面で "Add vector search to this search resource." にチェックを入れ、事前にデプロイした text-embedding-ada-002
のデプロイ名を選択します。
なお、この選択肢ではベクトル検索と同じく新たに追加されたインデックス自動更新機能を使うことができます。
検索の種類を選択します。この例では Hybrid + semantic
(セマンティックハイブリッド検索) を選択しています。
Save and close
を押すと、Azure Cognitive Search インデックスの作成が行われます。インデックスの作成が完了すると、ユーザーの問いかけに対して指定したデータソースの検索結果に基づいて回答が行われるようになります。
※ 検索結果はあくまでもイメージです。スクリーンショットの例では Wiki40b データセットを使って検索を行っているため、検索結果は最新の情報ではありません。
2.3. Upload Files
この選択肢では、任意の Azure Storage アカウントを指定して、そこにアップロードしたファイル対する Azure Cognitive Search インデックスが自動作成されます。ただし、前述のとおり執筆時点ではアナライザーの言語を指定することができないため、対象が英語の場合のみの選択肢です。
参考
2.3.1. On your data にデータソース (Upload Files) を追加
すべて Azure OpenAI Studio の操作のみで完結します。データソース追加画面で "Add vector search to this search resource." にチェックを入れ、事前にデプロイした text-embedding-ada-002
のデプロイ名を選択します。
任意のファイルをアップロードします。アップロード先の Blob コンテナーは自動作成されます。
検索の種類を選択します。この例では Hybrid + semantic
(セマンティックハイブリッド検索) を選択しています。
Save and close
を押すと、Azure Cognitive Search インデックスの作成が行われます。インデックスの作成が完了すると、ユーザーの問いかけに対して指定したデータソースの検索結果に基づいて回答が行われるようになります。
※ 検索結果はあくまでもイメージです。スクリーンショットの例では Wiki40b データセットを使って検索を行っているため、検索結果は最新の情報ではありません。
おわりに
プレビュー開始当初はやや粗削りだった On your data も徐々に機能が追加されて洗練されてきている印象です。今後の日本語対応や、その先の GA (一般提供) への期待が膨らみます。
以上です。🍵
Discussion
詳しい手順とてもためになりました。しかし、1点困ったことが起きています。
手順通りでインデックスが作られるのですが、それを使用すると"Add vector search to this search resource."にチェックを入れることができません。セマンティックはいけるのですが、ベクトル用のフィールドが作られてないようです。
名前もAI Searchに代わり色々仕様が変わっているのかもしれませんが、解決策をご教示いただけませんでしょうか。
リポジトリに元々含まれている
config.json
にはvector_config_name
の項目が無いため、手作業で追加する必要があります。記事を更新しましたのでご確認ください。Azure AI Search への名称変更は単なるリブランディングのためサービスとしては以前からあった Azure Cognitive Search と同じものです。
こんな初歩的なところを見落としていたなんて!
対応ありがとうございました!