Azure Cognitive Search のベクトル検索とハイブリッド検索をデモ UI に追加

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

私はこれまで、[Azure-Cognitive-Search-Workshop](https://github.com/nohanaga/Azure-Cognitive-Search-Workshop) などを通して、Azure Cognitive Search によるノーコードナレッジマイニングソリューションの開発支援をしてきましたが、今回、ベクトル検索機能の実装に合わせて、トレーニング・デモ用に公開している [Simple Cognitive Search Tester](https://github.com/nohanaga/Simple-Cognitive-Search-Tester) にベクトル検索クエリとハイブリッド検索クエリを追加しました。


# ベクトル検索 × Azure OpenAI 
新たに追加した Vector Search UI では Azure OpenAI の [Embeddings API](https://learn.microsoft.com/azure/cognitive-services/openai/tutorials/embeddings?tabs=command-line) と統合することにより、自然言語でクエリを入力した後、「Get Embeddings」ボタンで事前に設定しておいた Embeddings モデルを使用してクエリをベクトルに変換します。次にこのベクトルをそのまま Azure Cognitive Search のベクトル検索クエリとして送信します。右ペインでは送信されたリクエストパラメータを確認することができます。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/883de9ae-f92c-c652-78c3-833696617420.png)
Vector Search UI では以下のすべてのクエリパターンを試すことができます。

- 単一ベクトル検索
- フィルターを使用した単一ベクトル検索
- シンプルなハイブリッド検索
- フィルターを使用したシンプルなハイブリッド検索
- セマンティックハイブリッド検索
- フィルターを使用したセマンティックハイブリッド検索

# 単一ベクトル検索
一つの UI でハイブリッド検索を実現するため、使用するクエリはチェックボックスで選択できるようにしてあります。ベクトル検索ボックスのみにチェックを入れると単一ベクトル検索になります。`vector.fields` にベクトル検索対象の `Collection(Edm.Single)` フィールドを、`vector.k` に返却する最近傍のトップ k を指定します。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/7a280999-8f53-0928-d758-728763e72306.png)
ベクトル検索のスコアはコサイン類似度であり -1 から 1 の区間を取ります。1 なら「最も似ている（同じベクトル）」、-1 なら「最も似ていない（反対向き）」という性質を持ちます。

# シンプルなハイブリッド検索
クラシックなキーワード検索とベクトル検索のハイブリッド検索を行う場合は、両方のボックスにチェックしてください。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/445c143d-5a1d-4ec0-b601-92132e737230.png)
ベクトルクエリとテキストクエリの両方に検索スコアが割り当てられます。2 種類の異なるスコアは Reciprocal Rank Fusion (RRF) を使用してマージされ、ランク上の位置の逆数で各ドキュメントに重み付けされます。

# フィルターを使用したセマンティックハイブリッド検索
`queryType` を `semantic` に変更し、`semanticConfiguration` を設定することによってベクトル検索に加えて、セマンティック ランキング、キャプション、回答、スペル チェックを使用したキーワード検索を含むクエリを作成できます。`filter` パラメータを指定することでクエリの実行前にドキュメントを含めたり除外したりできます。
![008_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/ce845bd6-a297-c935-ffeb-1c784adb0207.png)

# Azure OpenAI Service 設定
Azure OpenAI Service の Embeddings API と連携するには、「Settings」メニューから以下の情報を入力して保存してください。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/b18897ef-8410-e6da-843d-49b397b3a4c4.png)

- AZURE_OPENAI_SERVICE: Azure OpenAI Service のリソース名
- AZURE_OPENAI_GPT_EMBED_DEPLOYMENT: Embeddings モデルのデプロイ名
- AZURE_OPENAI_GPT_KEY: Azure OpenAI Service の API キー

# テストデータ
[こちら](https://qiita.com/nohanaga/items/59e07f5e00a4ced1e840)の記事で使用した MovieLens のデータ。Azure Cognitive Search のベクトルインデックスの構築については、[プライベートプレビュー](https://aka.ms/VectorSearchSignUp)へ申し込みください。

## 最低限必要なインデックスフィールド
ベクトルインデックスの構築サンプルに含まれているフィールドと同じです。
- id: インデックスのキー
- title: コンテンツのタイトル
- content: コンテンツの本文、ベクトルの元テキストチャンク
- category: カテゴリ値(Collection(Edm.String))
- contentVector: ベクトル値(Collection(Edm.Single))

# カスタマイズ
ローカルに開発環境を必要としないシンプルな HTML で作成しているので、デフォルト値などは HTML ファイルを直接編集できます。

# ダウンロード
https://github.com/nohanaga/Simple-Cognitive-Search-Tester

# 参考
https://qiita.com/nohanaga/items/f710cac82072b63bc73f