生成 AI 時代の全文検索・ベクトルデータベースとして生まれ変わった Azure AI Search ですが、2/21 にすべてのプランでベクトルフィールドの上限が 2,048 次元から 3,072 次元に拡張されました。これは 2/23 に Azure OpenAI Service でも一般提供が開始された次世代の Embeddings モデル text-embedding-3-large
に合わせたものです。対応としてかなり早かったのではないでしょうか。Microsoft がベクトル検索機能に関する機能改善に注力していることがわかります。
これにより Azure AI Search は OpenAI の Embeddings モデルをフルサイズで格納することができます。※現在は Azure portal UI 上からは設定できません。
(* from OpenAI Blog)
ベクトル検索の精度評価
今後は、text-embedding-ada-002
と新モデルとの精度評価が行われることと思います。すでに OpenAI 社は以下のようなベンチマークを公開しています。
(* from OpenAI Blog)
text-embedding-ada-002
と text-embedding-3-large
の比較では、MIRACL で平均スコアが 31.4% から 54.9% に増加しているのが分かります。MIRACL データセットは 18 の異なる言語にわたる検索に焦点を当てた多言語検索データセットであるため、マルチリンガルでの検索能力が向上しています。では日本語の精度はどうなんでしょうか。
今回、私も MIRACL を利用して日本語ドキュメントの精度評価を行ってみたいと思います。MIRACL には日本語の質問(query
)とWikipedia から取得されたトピックを手作業で判定した正例(positive_passages
) +負例(negative_passages
)が含まれています。
データはモデルのトレーニングに使用できるように Train/Dev に分割されています。
このトピックをすべて Azure AI Search に投入して精度の比較を行います。
データセットの入手
今回は dev
のみを使用します。
from datasets import load_dataset
dataset = load_dataset("miracl/miracl", 'ja', split="dev")
結果
日本語でも text-embedding-ada-002
と text-embedding-3-large
で Recall@3 が 1回目 +0.181、2回目 +0.192 上昇しました。
ada v2 | text-embedding-3-small | text-embedding-3-large | |
---|---|---|---|
#1 Recall@3 avg | 0.521 | 0.562 | 0.702 |
#1 Recall@5 avg | 0.706 | 0.723 | 0.813 |
#2 Recall@3 avg | 0.524 | 0.594 | 0.716 |
#2 Recall@5 avg | 0.643 | 0.657 | 0.815 |
dev
から positive_passages
+ negative_passages
で結合し、前処理、重複を除去し 8,066 件に調製したテキストを Azure AI Search のインデックスに登録。このインデックスに対して query
で検索し、上位 3 or 5 件の Recall を計算。クエリーは試行の度にランダムで 100 件抽出。今回はすべて 8,191 トークン以下のためチャンク分割はしていない。ベクトル検索アルゴリズムは HNSW でパラメータはデフォルト値。
ベクトルクォータ制限
ベクトルの次元数が上がる場合、ベクトルのサイズ上限について注意する必要があります。Azure AI Search には、パーティションあたりのベクトルクォータ (GB)制限があり、サービスが 2023年7月1日以降に作成されたかそうでないかによって、上限が異なります。
例えば S1 プランのパーティションあたりのベクトルクォータ (GB)は 1 GB → 3 GB へ拡張されます。あぁ、インデックス再構築か…
ベクトルインデックスのサイズ試算
内部ベクトルインデックスのサイズに影響を与える以下の因子をそれぞれ計算すればベクトルサイズを試算できます。
- 生のデータのサイズ
- 選択したアルゴリズムからのオーバーヘッド
- インデックス内のドキュメントの削除または更新によるオーバーヘッド
インデックスのベクトルサイズを取得する
GET https://[service name].search.windows.net/indexes/[index name]/stats?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
上のような REST API を呼ぶことにより、特定インデックスのベクトルサイズをバイトで取得できます。api-version
は 2023-07-01-Preview
以降である必要があります。
{
"documentCount": 5,
"storageSize": 162741,
"vectorIndexSize": 31440
}
Github
TBD