Azure Cognitive Search × Azure OpenAI Service エコシステム

# はじめに
[Azure OpenAI Developers セミナー第2回](https://www.youtube.com/watch?v=cEynsEWpXdA)でも語らせていただきました、Azure Cognitive Search が今アツいということで、そのエコシステムをまとめます。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/2c3f4201-781a-1f59-e085-fcfe3544f48c.png)
上図のように、Blob ストレージ上に置かれたドキュメントは Azure Cognitive Search エンリッチメント パイプラインがドキュメント中から様々な AI 機能を用いてナレッジを抽出し、検索インデックスを作成します。作成した検索インデックスはあらゆる AI オーケストレーターやプラグインから呼び出すことができます。うーんアツイですコレ。

# 1. データソース
Azure Cognitive Search が対応しているデータソースは [Azure Blob Storage](https://learn.microsoft.com/azure/search/search-blob-storage-integration) や [Azure Data Lake Storage Gen2](https://learn.microsoft.com/azure/search/search-howto-index-azure-data-lake-storage) 等の Blob Storage だけでなく、[NoSQL 用 Azure Cosmos DB](https://learn.microsoft.com/azure/search/search-howto-index-cosmosdb)、[Azure SQL Database](https://learn.microsoft.com/azure/search/search-howto-connecting-azure-sql-database-to-azure-search-using-indexers) に GA 対応しています。それ以外にも、[様々なデータソース](https://learn.microsoft.com/azure/search/search-data-sources-gallery#generally-available-data-sources-by-cognitive-search)にプレビュー対応していますし、サードパーティーコネクターによる拡張も可能です。もし対応していなくても、[プッシュ型の API](https://learn.microsoft.com/azure/search/search-what-is-data-import#pushing-data-to-an-index) により直接インデックスへデータを登録することもできます。

対応するファイル形式は[こちら](https://learn.microsoft.com/azure/search/search-blob-metadata-properties#supported-document-formats)です。画像ファイルや解析不可の画像 PDF も [OCR スキル](https://learn.microsoft.com/azure/search/cognitive-search-skill-ocr)を利用してインデックス化ができますし、例えば JSON ファイルはファイルの中身を解析し、同名のインデックスフィールドに[マッピングする機能](https://learn.microsoft.com/azure/search/search-howto-index-json-blobs)もあります。

社内に分散するあらゆるドキュメントや非構造化ファイルを検索可能にしましょう。

# 2. インジェストプロセス
AI 搭載全文検索サービスである Azure Cognitive Search にはもともと組み込みで Azure Cognitive Services の AI 機能を簡単にONする[スキル](https://learn.microsoft.com/azure/search/cognitive-search-predefined-skills)が組み込まれています。さらにここには[カスタムスキル](https://learn.microsoft.com/ja-jp/azure/search/cognitive-search-custom-skill-interface)といって、インデクサーというクローラーがドキュメントから抽出したデータを外部 WebAPI に出力する機能があります。これによって、外部にご自分で開発した文章分類モデルなどの推論結果を検索インデックスのフィールドに追加することで、より高度なフィルタリングが可能になったりします。

## 2.1. [Embeddings Skill](https://github.com/Azure-Samples/azure-search-power-skills/tree/main/Vector/EmbeddingGenerator)
こちらにすでに公開されいるカスタムスキルのリポジトリを載せておきます。こちらはテキストチャンカーとエンベディング変換をパイプラインで自動化するスキルです。これ、チャンク分割も含めて自動化できるというスキルは使えるんじゃないでしょうか。

## 2.2. [Summarize Skill](https://github.com/MaheshSQL/cognitive-semantic-search-openai-accelerator)
ここに Azure OpenAI を組み合わせると、さらに高度なことができるのではないでしょうか。すでに、要約機能を組み込んでいる[企業](https://customers.microsoft.com/ja-jp/story/1501304071775762777-carmax-retailer-azure-openai-service)もあります。

## 2.3. [Form Recognizer Skill](https://learn.microsoft.com/training/modules/build-form-recognizer-custom-skill-for-azure-cognitive-search/)
帳票認識や表の構造化などの高度な OCR 機能を実装したい場合は、[Azure Form Recognizer](https://azure.microsoft.com/products/form-recognizer) と連携します。

## 2.3. カスタムスキルの作り方
- [Azure Cognitive Search のカスタムスキルを作成しよう](https://qiita.com/nohanaga/items/986887b82cf76dc7b0a9)
- [Azure Cognitive Search のデバッグセッションを使ってカスタムスキルを追加しよう](https://qiita.com/nohanaga/items/26355ffba58ba4c71c6e)

# 3. インデックス w/OpenAI
Azure Cognitive Search はクラシカルなキーワード検索のインデックスだけでなく[ベクトル検索](https://qiita.com/nohanaga/items/f710cac82072b63bc73f)とハイブリッド検索にも対応しており、Azure OpenAI Service の text-embedding-ada-002 で生成した Embeddings を格納可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/e51622f2-c37b-977b-0d48-6ff51641b0b2.png)

## ベクトル検索サンプル
日本語データセットをチャンク分割し、Embeddings に変換して Azure Cognitive Search のベクトルインデックスに登録するサンプルはこちらにあります。

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

## ベクトル検索とハイブリッド検索の比較デモ
https://qiita.com/nohanaga/items/e156d8be60622b42e8eb

## 3.1. [Semantic Kernel](https://github.com/microsoft/semantic-kernel/blob/main/FEATURE_MATRIX.md)
Semantic Kernel (SK) は Microsoft が OSS として発表した、大規模言語モデル (LLM) をアプリにすばやく簡単に統合できる SDK です。Semantic Kernel では [Memory Connectors](https://github.com/microsoft/semantic-kernel/tree/main/dotnet/src/Connectors/Connectors.Memory.AzureCognitiveSearch), Vector storage として実装が進められていて、現在 C# で実装されています。

## 3.2. [LangChain](https://python.langchain.com/docs/modules/data_connection/retrievers/integrations/azure_cognitive_search)
LangChain では複数の方法で Azure Cognitive Search を呼び出すことができます。
- [AzureCognitiveSearchRetriever](https://python.langchain.com/docs/modules/data_connection/retrievers/integrations/azure_cognitive_search)
- [vectorstores.azuresearch](https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/azuresearch)

## 3.3. [Azure AI Studio](https://qiita.com/nohanaga/items/7c8b797f20ab8a3d5c92)
Azure Cognitive Search は Prompt flow にネイティブ対応しており、「[Vector DB Lookup](https://learn.microsoft.com/azure/machine-learning/prompt-flow/tools-reference/vector-db-lookup-tool?view=azureml-api-2)」ツールを利用してベクトル検索することができます。モデルが知らない内容を外部検索システムから検索した情報を付加して質問などに回答させる [Retrieval Augmented Generation(RAG)](https://arxiv.org/abs/2005.11401) を構築可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/eda21e27-dff1-4c31-8c9e-bf18567358e1.png)

## 3.4. [Azure OpenAI on your data](https://qiita.com/nohanaga/items/a3e236fdbb3ef5878012)
Microsoft Build 2023 で発表のあった Azure OpenAI on your data のパブリックプレビューが開始されています。「on your data」の名前の通り、Azure OpenAI Studio の Chat Playground 上で Azure Cognitive Search のデータを参照し、モデルが知らない内容を答えられるようにしてからノーコードでAzure AD 認証付きチャットアプリのデプロイまでやってしまうという機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/f9af2306-aab5-4597-50e5-f5a7e7aec888.png)

## 3.5. [ChatGPT Retrieval Plugin](https://qiita.com/nohanaga/items/afcff2bf4ab95089267d)
Azure Cognitive Search のベクトルインデックスを利用して Grounding するプラグインはすでに OpenAI 公式より、[ChatGPT Retrieval Plugin](https://github.com/openai/chatgpt-retrieval-plugin) が公開されていますし、Azure Cognitive Search も対応しましたので、さっそく開発をしていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/431c1f83-9858-9aaf-1638-b825db5684ce.png)

# 4. ナレッジストア
[ナレッジ ストア](https://learn.microsoft.com/azure/search/knowledge-store-concept-intro?tabs=portal)は、Cognitive Search エンリッチメント パイプラインによって作成されたデータ シンクで、Azure Storage のテーブルおよび Blob コンテナーに AI エンリッチされたコンテンツが保存されます。これにより、ナレッジ マイニングなどの検索以外のシナリオでインデクサーによって抽出されたナレッジを活用できます。PowerBI で[ナレッジベースを可視化](https://learn.microsoft.com/azure/search/knowledge-store-connect-power-bi)することもできます。

# 5. チャットUI
GPT モデルが知らない内容を外部検索システムから検索した情報を付加して質問などに回答させる Retrieval Augmented Generation(RAG) を簡単に構築可能なアーキテクチャがあります。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/4cac5da8-5265-2d8a-b5ce-79fe9ee78fcc.png)

このサンプルコードには ChatGPT を使ったプロンプトに Azure Cognitive Search の検索結果をコンテキストとして挿入する基本的な質問応答チャット機能が搭載されています。さらに、質問に対してどのような情報が欠けているのかを確認するために、質問を繰り返し評価し、すべての情報が揃ったところで回答を作成する ReAct アプローチも実装されています。元のコードは ChatGPT に Completion API を使っていて古いので、Chat Completion API に書き換えたものを私の方で[作っています]()。

# 7. アーキテクチャ
Azure OpenAI Service のエンタープライズアーキテクチャを以下にまとめています。

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

このようなプライベートエンドポイントを使った閉域網での構成も実現可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/500b6953-db8f-daa1-e9b1-cfbb91f711f6.png)

# 8. トレーニング
Azure Cognitive Search の全文検索を重点的に学習するワークショップを公開しています。

コンテンツは演習1～5まで用意してあります。演習用のデータセットや検索用 UI、Postman コレクションセットを含んでいます。以下のリンクをクリックしてください。所要時間は目安です。

- ノーコード全文検索インデックスの作成　所要時間:50分
- Postman を使って REST API 開発　所要時間:30分
- フルテキスト検索　所要時間:30分
- 豊富な検索機能を使いこなす　所要時間:30分
- デバッグセッションを使ってカスタムスキルを追加する (オプション)　所要時間:60分

https://qiita.com/nohanaga/items/2a90539f7667fa9e486a

## 8.1. Simple Cognitive Search Tester 
ベクトル検索機能の実装に合わせて、トレーニング・デモ用に公開している [Simple Cognitive Search Tester](https://github.com/nohanaga/Simple-Cognitive-Search-Tester) にベクトル検索クエリとハイブリッド検索クエリを追加しました。

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

## 8.2. Microsoft Learn
- [Azure Cognitive Search の概要](https://learn.microsoft.com/training/modules/intro-to-azure-search/)
- [Azure Cognitive Search でのナレッジ マイニングの実装](https://learn.microsoft.com/training/paths/implement-knowledge-mining-azure-cognitive-search/)

# おわりに
Azure Cognitive Search を始めるなら、今でしょ。