Azure Cognitive Search にベクトル検索機能が搭載されプライベートプレビューが開始

# はじめに

[ついに](https://youtu.be/tFgqdHKsOME?t=4663)この時が来ましたね。

Azure Cognitive Search にベクトル検索機能が実装され、近似最近傍探索（ANN）が可能になります。これによって、Azure OpenAI Serivce の Embeddings API で生成したベクトルの永続的なフルマネージド**ベクトルデータベース**として利用できるだけでなく、既存の BM25 ベースの全文検索との**ハイブリッド検索**が可能になります。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/f78c2ff4-0406-4025-c3f8-cd56fc5caeab.png)

# 2023/11/15 GA

https://qiita.com/nohanaga/items/0637ea6fe8e01a98e4fc

どなたでもお使いいただけます。

# ポイント
- **ベクトルデータベース**
Azure OpenAI の [Embeddings モデル](https://learn.microsoft.com/azure/cognitive-services/openai/tutorials/embeddings) text-embedding-ada-002(1,536 次元) や Computer Vision ([Vectorize Image API](https://learn.microsoft.com/azure/cognitive-services/computer-vision/concept-image-retrieval)) で生成した画像ベクトルなどの保管先にできる
- **ハイブリッド検索**
キーワード検索とベクトル検索を組み合わせた検索ができる。
- **セマンティックハイブリッド検索**
Microsoft の Turing モデルを利用した [Re-ranker](https://qiita.com/nohanaga/items/59e07f5e00a4ced1e840#%E3%83%A9%E3%83%B3%E3%82%AB%E3%83%BC%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3) で結果を並べ替えることでさらに精度が高まります。
- **フィルタリング**
ベクトル検索を行う前にドキュメント検索をフィルタリングできるので、カテゴリーを絞ったり、ユーザーに応じて[ドキュメントを出し分け](https://learn.microsoft.com/azure/search/search-security-trimming-for-azure-search)たりすることができます。パフォーマンス面での利点もあります。
- **Azure AI Studio との統合**
Build 2023 で [Azure AI Studio](https://www.youtube.com/watch?v=DaIYrlMOj7I) と統合され、Grounding のデータソースとして選択できるようになりました。
- **[ChatGPT Retrieval Plugin](https://github.com/openai/chatgpt-retrieval-plugin) との統合**
ChatGPT の [Plugin](https://openai.com/blog/chatgpt-plugins) として Azure Cognitive Search のベクトルインデックスを呼び出せます。さらにハイブリッド検索やセマンティックハイブリッド検索も使用できます。
- **LangChain の [Vectorstore](https://python.langchain.com/en/latest/modules/indexes/vectorstores/examples/azuresearch.html) に追加**
LangChain の Vectorstore から Azure Cognitive Search のベクトルインデックスに対してベクトル検索やハイブリッド検索を実行できます。

※Azure Cognitive Search で使用する「[セマンティック検索](https://learn.microsoft.com/azure/search/semantic-search-overview)」という用語は既存の Microsoft Turing モデルによって実現される [Re-ranker](https://qiita.com/nohanaga/items/59e07f5e00a4ced1e840#%E3%83%A9%E3%83%B3%E3%82%AB%E3%83%BC%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3) とセマンティックキャプション、セマンティックアンサー等の機能のことを指し、今回の新機能を「ベクトル検索」と表現して区別します。

# アーキテクチャ
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/dfeff616-e670-8315-5898-cf4ef9dab88a.png)

Azure Cognitive Search がベクトルデータベースになったことで、Azure Cognitive Search を組織内のナレッジベースとしたシンプルなアーキテクチャが実現。単一のインデックスに対してユーザーのドキュメントの性質に応じた柔軟なクエリーの使い分けが可能になりました。

# 条件

- Basic 以上のレベル (SKU) のAzure Cognitive Search の価格プラン
- セマンティックハイブリッド検索の利用には Standard レベル (S1、S2、S3) およびストレージ最適化 (L1、L2) が必要となります

# プレビュー制限事項
- 保存できる最大次元数: **2,048**
- プレビュー機能は、サービスレベル契約なしの[追加使用条件](https://azure.microsoft.com/support/legal/preview-supplemental-terms/)の下で提供され、本番ワークロードには推奨されません。

他にも制限事項がありますので、[Docs](https://learn.microsoft.com/azure/search/vector-search-index-size) を参照してください

# ベクトル検索手順解説
## インデックスの作成
### ベクトルフィールド
インデックスにベクトル用フィールド `Collection(Edm.Single)` が追加されました。また、`dimensions` フィールドと `vectorSearchConfiguration` フィールドが必要になります。
```json
{
            "name": "contentVector",
            "type": "Collection(Edm.Single)",
            "searchable": true,
            "retrievable": true,
            "dimensions": 1536,
            "vectorSearchConfiguration": "vectorConfig"
}
```
### ベクトル検索構成
`vectorSearch` 構成にはアルゴリズムを定義します。このプレビューでは `hnsw` アルゴリズムのみがサポートされています。Hierarchical Navigable Small World(HNSW) を使用した効率的で堅牢な近似最近傍検索の実装です。これによりクエリーベクトルをインデックス内のすべてのベクトルと比較する必要がなくなります。

```json
"vectorSearch": {
        "algorithmConfigurations": [
            {
                "name": "vectorConfig",
                "kind": "hnsw"
                "hnswParameters": {
                    "m": 4,
                    "efConstruction": 400,
                    "efSearch": 500,
                    "metric": "cosine"
                }
            }
        ]
    },
```

### セマンティック検索設定
さらに、Azure Cognitive Search の既存機能であるセマンティック検索と組み合わせる場合、`semantic.configurations` を追加します。

## ドキュメントのアップロード
プレビュー版ドキュメントの追加 REST API または Python/.NET SDK がベクトルフィールドに対応しているためこれを使用して直接ドキュメントをプッシュします。埋め込みがデータを最大限にカバーできるように、データをチャンク化することをお勧めします。

私がデモに使っている戦国武将の Wikipedia をチャンク化して Embeddings に変換して Azure Cognitive Search のベクトルインデックスに登録するサンプルノートブックを置いておきます。

https://github.com/nohanaga/busho-index/blob/main/TextChunking_Embeddings_RegisterIndex.ipynb

## クエリの実行例
ベクトル検索の追加によって、以下の検索が可能になります。
- 単一ベクトル検索
- フィルターを使用した単一ベクトル検索
- シンプルなハイブリッド検索
- フィルターを使用したシンプルなハイブリッド検索
- セマンティックハイブリッド検索
- フィルターを使用したセマンティックハイブリッド検索

### フィルターを使用した単一ベクトル検索
このようにベクトルクエリーとフィルターを組み合わせることで、クエリー実行前にカテゴリなどの分類で検索対象を絞ることができます。ベクトル検索すべきドキュメントをユーザーごとに出し分けるセキュリティフィルターとしても利用できます。
```json
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version={{api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vector": {
        "value": [
            -0.009154141,
            0.018708462,
            ... 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "contentVector",
        "k": 10
    },
    "select": "title, category",
    "filter": "category eq 'Databases'"
}
```

### シンプルなハイブリッド検索
ハイブリッド検索は、検索インデックスのベクトルインデックスと BM25 インデックスの両方を検索するように指示します。ハイブリッドクエリーは、インデックスにベクトルフィールドと通常の検索フィールド（文字列、数値データ、地理座標など）の両方が含まれている場合に機能します。

検索スコアによる上位 10 件が含まれます。ベクトルクエリとテキストクエリの両方に検索スコアが割り当てられます。2 種類の異なるスコアは Reciprocal Rank Fusion (RRF) を使用してマージされ、ランク上の位置の逆数で各ドキュメントに重み付けされます。


```json
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version={{api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vector": {
        "value": [
            -0.009154141,
            0.018708462,
            ...
            -0.02178128,
            -0.00086512347
        ],
        "fields": "contentVector",
        "k": 10
    },
    "search": "what azure services support full text search",
    "select": "title, content, category",
    "top": "10"
}
```

### セマンティックハイブリッド検索
[セマンティック検索](https://learn.microsoft.com/azure/search/semantic-search-overview#enable-semantic-search)を有効にしており、インデックス定義に[セマンティック構成](https://learn.microsoft.com/azure/search/semantic-how-to-query-request?tabs=portal%2Cportal-query)が含まれている場合、ベクトル検索に加えて、セマンティック ランキング、キャプション、回答、スペル チェックを使用したキーワード検索を含むクエリを作成できます。

```json
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version={{api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vector": {
        "value": [
            -0.009154141,
            0.018708462,
            ...
            -0.02178128,
            -0.00086512347
        ],
        "fields": "contentVector",
        "k": 10
    },
    "search": "what azure services support full text search",
    "select": "title, content, category",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "queryLanguage": "en-us",
    "captions": "extractive",
    "answers": "extractive",
    "top": "10"
}
```
Azure Cognitive Search の機能を総動員した検索クエリーです。ハイブリッド検索結果をセマンティック検索による Re-ranker で結果を並び変えます。さらに、[セマンティックキャプション](https://qiita.com/nohanaga/items/08ad56fd989f474b5f8a#%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%82%AD%E3%83%A3%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)や[セマンティックアンサー](https://qiita.com/nohanaga/items/08ad56fd989f474b5f8a#%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%82%A2%E3%83%B3%E3%82%B5%E3%83%BC)を用いた抽出的要約を検索結果に付加します。

# ベクトル検索対応 UI
Web UI から検索クエリをテストする場合はこちらを利用できます。

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

# ChatGPT Retrieval Plugin との統合
ChatGPT 規格のプラグインである [ChatGPT Retrieval Plugin](https://github.com/openai/chatgpt-retrieval-plugin) に Azure Cognitive Search が統合され、ブラウザ版 GPT-4 や様々な Copilot から呼び出せるようになりました。

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

# お願い
プレビューに参加していただいたエンジニアの皆様には、この期間に様々な検証を実施いただき、問題点等をフィードバックいただけると幸いです。

# さいごに
今回待望のベクトル検索機能が実装されただけではなく、Azure AI Studio と統合されたことで、Azure Cognitive Search の利用がさらに活発になると期待しています。

https://www.youtube.com/watch?v=DaIYrlMOj7I