【朗報】Azure AI Search の価格レベルの変更とサービスのアップグレードが可能に　ほか

Microsoft は 4/11 に Azure AI Search の機能アップデートを発表しました。今回のアップデートは開発者があったらいいのになと思っていたようなプレビュー機能が追加されています。

- **価格レベルの変更**:ポータルまたは管理プレーンの REST API を介して、既存の Azure AI Search サービスのレベルを変更できるように
- **セルフサービスアップグレード**:検索サービスをアップグレードすると、2024 年 4 月にリリースされた新しいストレージ制限など、これまでは新しいサービスでのみ利用可能だった機能が有効に
- **階層ファセット、集計、ファセット フィルター**:
    - 階層ファセット: 複数レベルのナビゲーションツリーを作成し、検索カテゴリをより整理されたビューで表示できる
    - ファセットフィルタリング: 正規表現を使用して表示されるファセット値を絞り込める
    - ファセット合計: ファセット内の数値データを集計できる

- **バイナリ量子化で再スコアリング**: バイナリ量子化のための新しい再スコアリング手法をサポート。フル精度ベクトルを使用したクエリとの組み合わせで利用できる
- **プレリリースのセマンティックランキングモデル**: 自分のリージョンにプレリリース版のセマンティック ランキング モデルがデプロイされている場合、必要に応じてインデックスを構成してプレリリース版のセマンティック ランキング モデルを使用できるように
- API Version `2025-03-01-preview` 以降で利用可能


# 価格レベルの変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/e28b05c8-d94c-4c80-bc7c-0d572a35f937.png)


- ベーシック、S1、S2、S3 の価格帯を変更できます。
- S3 HD、L1、または L2 サービスの階層の変更はサポートされていません。
- 無料レベルのサービスは、有料サービスレベルに変更することはできません。
- 注意: リリース時点では価格帯を上げることしかできません。今後のアップデートで価格帯を下げることができるようになります。

https://learn.microsoft.com/en-us/azure/search/search-capacity-planning#change-your-pricing-tier

# セルフサービスアップグレード
Azure AI Search は 2024年4月 に一部リージョンの Basic と Standard プランの新しいサービスで以下のような拡張を行いましたが、アップグレード機能を使用すると、2024年4月2日以前に作成された**既存の検索サービスを再作成することなく**、これらの拡張ストレージ容量を簡単に利用できます。

https://qiita.com/nohanaga/items/d0922a812a41af2c7f64

- パーティションごとの合計ストレージがプランに応じて 3 倍〜6 倍に増加
- パーティションあたりのベクトル インデックス サイズが 5 倍〜11 倍に増加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/c821740b-f960-4e32-a201-05c94dbac5be.png)

今回、**対象のリージョンにあるリソースでアップグレードボタン**が有効になります。 **アップグレード**をクリックし、操作を確定すれば完了です。アップグレード操作は非同期的に開始されます。他のスケール操作と同様に、サービスは引き続きご利用いただけます。アップグレードが完了すると、 [使用状況]タブで、合計ストレージ容量とベクターインデックスのクォータの両方の値が増加していることを確認できます。

- 現在利用可能なアップグレードは、ストレージ容量の上限引き上げのみです。
- サービスアップグレードは、開始時点では一部の地域（East US, North Central US, West Central US, UK South）で利用できます。今後のリリースでは、その他の地域もサポートされる予定です。日本リージョンが待ち遠しいですね

https://learn.microsoft.com/en-us/azure/search/search-how-to-upgrade

# 階層ファセット、集計、ファセットフィルター
ファセット機能のアップデートによって検索ナビゲーション体験を向上させることができます。EC サイトにおける商品検索や社内ファイル検索システムにおいて効果を発揮します。

## 階層ファセットによるサブカテゴリーの表示
```json
POST https://[service-name].search.windows.net/indexes/product-catalog/docs/search?api-version=2025-03-01-Preview
{
    "facets": [ "Category > Subcategory" ]
}
```

```json
{
"@search.facets": {
    "Category": [
      {
        "value": "Electronics",
        "count": 2,
        "@search.facets": {
          "Subcategory": [
            {
              "value": "Computers",
              "count": 1
            },
...
```

## ファセットフィルター
正規表現を使用してこれらのファセットをさらに絞り込むことができます。ファセットは、`includeTermFilter` 演算子を使用して含めるか、`excludeTermFilter` 演算子を使用して除外することができます。

```json
POST https://[service-name].search.windows.net/indexes/product-catalog/docs/search?api-version=2025-03-01-Preview
{
    "facets": [ "(Category, includeTermFilter: /Electronics/) > (Subcategory, excludeTermFilter: /Televisions/)" ]
}
```

## ファセット集計
ファセット集計を使用すると、メトリック演算子を使用してすべての検索結果を取得することなく、単一の検索クエリでファセット値を合計できます。
```json
POST https://[service-name].search.windows.net/indexes/product-catalog/docs/search?api-version=2025-03-01-Preview
{
  "facets": [ "Category > (Price, metric: sum)" ]
}
```

# バイナリ量子化で再スコアリング
[Azure OpenAI Developers Seminar 2025](https://youtu.be/jHW6zcIzm7g?feature=shared&t=6157) でベクトル最適化戦略を話したばかりだったのですが、さらに面白い機能が出てきました。本来ベクトル量子化の再スコアリングは内部に保持された非圧縮ベクトルデータを用いて行うのですが、 `
rescoreStorageMethod: discardOriginals` に設定したとしても `binaryQuantization` ならば再スコアリングができるようになりました！

![スクリーンショット 2025-04-15 11.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/04a3f424-f08d-4104-b9a2-bafb0ac82aab.png)

では非圧縮ベクトルデータが存在しないのになぜ再スコアリングができるのでしょうか。今回実装された手法は以下のようなプロセスで実行されます。

- ベクトルクエリを圧縮されたベクトルフィールドに対して実行する
- ベクトルクエリは、上位 k 個のオーバーサンプリングされた候補を返す
- オーバーサンプリングされた k 個の候補を **バイナリ量子化のドット積**を使用して再スコアリング
- 再スコアリング後、より関連性の高い一致が最初に表示されるように結果が調整される

注目すべきは、**完全精度クエリとインデックス内のバイナリ量子化データのドット積**によって再スコアリングするという点です。

## float × bit ドット積 Step by step 計算例
2 つのベクトル  
**A = [a₁, a₂, ..., aₙ]**  
**B = [b₁, b₂, ..., bₙ]**

のドット積は、次のように計算します：

```math
\text{dot}(A, B) = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n = \sum_{i=1}^{n} a_i b_i
```

```python
Q_float = [0.9, -0.5, 0.8, -0.4]

# 文書ベクトル例
D1 = [0.8, -0.4, 0.7, -0.3]   ← クエリと非常に近い
D2 = [-0.2, 0.9, -0.6, 0.5]   ← クエリとはほぼ逆
D3 = [0.9, 0.1, 0.8, 0.1]     ← 正の部分だけ似てる
```

### 1. 正解データ（float × float のドット積）
```python
Q_D1 = (0.9×0.8) + (-0.5×-0.4) + (0.8×0.7) + (-0.4×-0.3)
       = 0.72 + 0.2 + 0.56 + 0.12 = 1.60

Q_D2 = (0.9×-0.2) + (-0.5×0.9) + (0.8×-0.6) + (-0.4×0.5)
       = -0.18 + (-0.45) + (-0.48) + (-0.20) = -1.31

Q_D3 = (0.9×0.9) + (-0.5×0.1) + (0.8×0.8) + (-0.4×0.1)
       = 0.81 + (-0.05) + 0.64 + (-0.04) = 1.36
```

###  2. float クエリ × bit 文書ベクトル（bitは 1 if >0）
```python
D1_bit = [1, 0, 1, 0] → Q[0] + Q[2] = 0.9 + 0.8 = 1.7
D2_bit = [0, 1, 0, 1] → Q[1] + Q[3] = (-0.5) + (-0.4) = -0.9
D3_bit = [1, 1, 1, 1] → 全部加算 → 0.9 + (-0.5) + 0.8 + (-0.4) = 0.8
```

###  3. bit クエリ × bit 文書（1 and 1 の一致数）
```python
Q_bit = [1, 0, 1, 0]

D1_bit = [1, 0, 1, 0] → 一致 = 2
D2_bit = [0, 1, 0, 1] → 一致 = 0
D3_bit = [1, 1, 1, 1] → 一致 = 2
```


| 文書 | 正解（float×float） | float×bit | bit×bit |
|------|----------------------|-----------|---------|
| D1   | 1.60                 | 1.7       | 2       |
| D2   | -1.31                | -0.9      | 0       |
| D3   | 1.36                 | 0.8       | 2       |

非圧縮ベクトルを使わずに、圧縮されたバイナリデータとクエリベクトル（非量子化）との間でドット積（dot product）を利用しての類似度計算が可能となり、float × bit は一番正解（float×float）に近いスコアになりやすいのが分かります。float の値を bit（1）の位置だけ加算する」ことは、近似的な類似性メトリクスとして利用できます。

https://learn.microsoft.com/en-us/azure/search/vector-search-how-to-quantization?tabs=2024-07-01%2Cquery-2024-07-01#recommended-rescoring-techniques

# プレリリースのセマンティックランキングモデル
最新のセマンティックランキングモデルを試用したい場合、**オプトイン**することで試せる機能が実装されました。`flightingOptIn: true` をインデックスのセマンティック構成セクションで設定します。次期セマンティックランキングモデルでもしっかりとオプトインやバージョン管理して欲しいところです。

https://learn.microsoft.com/en-us/azure/search/semantic-how-to-configure?tabs=portal#opt-in-for-prerelease-semantic-ranking-models

# 参考
https://techcommunity.microsoft.com/blog/azure-ai-services-blog/new-scale-options-in-azure-ai-search-change-your-pricing-tier-and-service-upgrad/4402617

https://techcommunity.microsoft.com/blog/Azure-AI-Services-blog/new-enhanced-navigation-in-azure-ai-search/4403093