Azure AI Search のベクトルフィールド上限が 3072 次元に拡張し精度の向上に対応

生成 AI 時代の全文検索・ベクトルデータベースとして生まれ変わった Azure AI Search ですが、2/21 にすべてのプランでベクトルフィールドの上限が 2,048 次元から **3,072 次元**に拡張されました。これは 2/23 に Azure OpenAI Service でも[一般提供が開始](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#embeddings-models)された次世代の Embeddings モデル `text-embedding-3-large` に合わせたものです。対応としてかなり早かったのではないでしょうか。Microsoft がベクトル検索機能に関する機能改善に注力していることがわかります。

これにより Azure AI Search は OpenAI の Embeddings モデルをフルサイズで格納することができます。※現在は Azure portal UI 上からは設定できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/987dcc4a-c13f-ceb6-b3be-ac1288bd43ca.png)
(* from [OpenAI Blog](https://openai.com/blog/new-embedding-models-and-api-updates))

# ベクトル検索の精度評価
今後は、`text-embedding-ada-002` と新モデルとの精度評価が行われることと思います。すでに OpenAI 社は以下のようなベンチマークを公開しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/ada3df2f-64fc-0845-44a1-e09cf89b436e.png)
(* from [OpenAI Blog](https://openai.com/blog/new-embedding-models-and-api-updates))

`text-embedding-ada-002` と `text-embedding-3-large` の比較では、MIRACL で平均スコアが 31.4% から 54.9% に増加しているのが分かります。[MIRACL データセット](https://huggingface.co/datasets/miracl/miracl)は 18 の異なる言語にわたる検索に焦点を当てた多言語検索データセットであるため、マルチリンガルでの検索能力が向上しています。では日本語の精度はどうなんでしょうか。

今回、私も MIRACL を利用して日本語ドキュメントの精度評価を行ってみたいと思います。MIRACL には日本語の質問(`query`)とWikipedia から取得されたトピックを手作業で判定した正例(`positive_passages`) ＋負例(`negative_passages`)が含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/57840502-2e84-8e31-38a5-4e786e0e14ad.png)

データはモデルのトレーニングに使用できるように Train/Dev に分割されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/4ce884ef-5437-2866-7da0-9b45e0e96b78.png)

**このトピックをすべて Azure AI Search に投入して精度の比較を行います。**

## データセットの入手
今回は `dev` のみを使用します。
```python
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日以降に作成されたかそうでないか**によって、[上限が異なります](https://learn.microsoft.com/ja-jp/azure/search/search-limits-quotas-capacity#services-created-before-july-1-2023)。

例えば S1 プランのパーティションあたりのベクトルクォータ (GB)は 1 GB → 3 GB へ拡張されます。あぁ、インデックス再構築か…

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/f8499ac6-079c-4eb5-3df4-df228b7296ff.png" width="300px"/>

## ベクトルインデックスのサイズ試算
内部ベクトルインデックスのサイズに影響を与える以下の因子をそれぞれ計算すればベクトルサイズを試算できます。
- 生のデータのサイズ
- 選択したアルゴリズムからのオーバーヘッド
- インデックス内のドキュメントの削除または更新によるオーバーヘッド

https://learn.microsoft.com/azure/search/vector-search-index-size

# インデックスのベクトルサイズを取得する

```yml
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` 以降である必要があります。

```json
{
    "documentCount": 5,
    "storageSize": 162741,
    "vectorIndexSize": 31440
}
```

# Github
TBD