Azure AI Searchで文書検索をやってみた（LangChain使用）

## はじめに
Azure AI Searchで文書検索をやってみました。
　　
## 環境
- Windows 11
- Python 3.11.5
- LangChain
- Azure OpenAI
- Azure AI Search
　　
## ライブラリのインストール
以下のコマンドで必要なライブラリをインストールします。azure-search-documentsは11.4.0b8を指定しないとエラーが起きる場合があるため、注意してください。
```
pip install langchain openai azure-search-documents==11.4.0b8 azure-identity
```
　　
## 実装

### Azure AI Searchリソースの作成
[Azure Portal](https://portal.azure.com/)から「AI Search」のページに移動し、「作成」を選択します。

入力項目を埋め、「確認および作成」を選択します。

![記事投稿用 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/041ef491-dd40-5b63-977b-1dd9727cafdd.png)
　　
検証が完了したら、「作成」を選択します。

![記事投稿用 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/f728de4c-ad08-33cb-0215-12f6594564f6.png)

　　
デプロイが完了したら、「リソースに移動」を選択します。

![記事投稿用 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/5970588c-4d01-d453-415f-5422a04f42d7.png)

　　
「設定」の「キー」タブを選択し、プライマリー管理者キーをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/beaa00f9-89c6-f4b3-7571-a9da57d6fbd2.png)

　　
### インデックスの追加
以下のドキュメントをインデックスに追加します。

https://learn.microsoft.com/pdf?url=https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fazure%2Fai-services%2Ftoc.json

追加に使用するコードは以下のとおりです。環境変数はご自身の環境に合わせてください。

```test.py
import os

os.environ["AZURE_OPENAI_API_KEY"] = "Azure OpenAIのキーを指定"
os.environ["AZURE_OPENAI_ENDPOINT"] = "Azure OpenAIのエンドポイントを指定"

vector_store_address: str = "Azure AI Searchのエンドポイントを指定"
vector_store_password: str = "Azure AI Searchのプライマリー管理者キーを指定"

from langchain.embeddings import AzureOpenAIEmbeddings
from langchain.vectorstores.azuresearch import AzureSearch

embeddings: AzureOpenAIEmbeddings = AzureOpenAIEmbeddings(
    deployment="text-embedding-ada-002", chunk_size=1
)
index_name: str = "ai-search-demo"
vector_store: AzureSearch = AzureSearch(
    azure_search_endpoint=vector_store_address,
    azure_search_key=vector_store_password,
    index_name=index_name,
    embedding_function=embeddings.embed_query,
)

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter

loader = PyPDFLoader("datasets/azure-ai-services.pdf")


documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

vector_store.add_documents(documents=docs)
```
Azure OpenAIでPDFドキュメントの内容をインデックス化し、Azure AI Searchにアップロードします。
　　
上記のファイルを実行すると、AI Searchのインデックスに以下のように追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/d3e49eb7-15a4-8696-481e-deedddc10557.png)

　　
### 類似性検索
類似性検索では、クエリ文から生成されたベクトルの応答結果がk個返されます。
以下は類似性検索の例です。
```test.py
import os

os.environ["AZURE_OPENAI_API_KEY"] = "Azure OpenAIのキーを指定"
os.environ["AZURE_OPENAI_ENDPOINT"] = "Azure OpenAIのエンドポイントを指定"

vector_store_address: str = "Azure AI Searchのエンドポイントを指定"
vector_store_password: str = "Azure AI Searchのプライマリー管理者キーを指定"

from langchain.embeddings import AzureOpenAIEmbeddings
from langchain.vectorstores.azuresearch import AzureSearch

embeddings: AzureOpenAIEmbeddings = AzureOpenAIEmbeddings(
    deployment="text-embedding-ada-002", chunk_size=1
)
index_name: str = "ai-search-demo"
vector_store: AzureSearch = AzureSearch(
    azure_search_endpoint=vector_store_address,
    azure_search_key=vector_store_password,
    index_name=index_name,
    embedding_function=embeddings.embed_query,
)

docs = vector_store.similarity_search(
    query="利用可能なAzure AIサービスは？",
    k=3,
    search_type="similarity",
)
print(docs[0].page_content)
```
similarity_searchメソッドを用いて、「利用可能なAzure AIサービスは？」というクエリを実行します。k=3で取得する検索結果の数を3個に指定しています。
　　
結果
```terminal
Azure AI サービスとは
[アーティクル ]•2023/11/22
Azure AI サービスは、開発者と組織が、すぐに使⽤できる事前構築済みのカスタマイズ
可能な  API とモデルを使⽤して、インテリジェントで最先端の市場対応の責任あるア
プリケーションを迅速に作成するのに役⽴ちます。  アプリケーションの例には、会
話、検索、監視、翻訳、⾳声、ビジョン、意思決定のための⾃然⾔語処理が含まれま
す。
ほとんどの  Azure AI サービスは、 REST API とクライアント  ライブラリ  SDK を通じ
て、⼀般的な開発⾔語で利⽤できます。  詳細については、各サービスのドキュメント
を参照してください。
以下の表からサービスを選択し、開発⽬標を達成するためにそれらがどのように役⽴つ
かを確認します。
サービス 説明
Anomaly Detector  (廃⽌ )潜在的な問題を早期に特定する
Azure AI Search AI を利⽤したクラウド検索をモバイル  アプリと  Web アプリで使
⽤できるようにします
Azure OpenAI さまざまな⾃然⾔語タスクを実⾏する
Bot Service ボットを作成して複数のチャネルにわたって接続します
Content Moderator  (廃⽌ )不快感を与える可能性がある、または望ましくないコンテンツを
検出する
Content Safety 望ましくないコンテンツを検出する  AI サービス
Custom Vision ビジネスに合わせて画像認識をカスタマイズする ヒント
Azure AI S tudio で、 Azure OpenAI 、 Content Safety 、 Speech 、 Vision などの  Azure
AI サービスをお試しください。  詳細については、「 Azur e AI S tudio とは」をご覧
ください。
利⽤可能な  Azure AI サービス
```
　　
### 類似性スコア付きの検索
類似性検索では、類似性スコア順に検索結果が並び替えられますが、そのスコアを取得することもできます。
以下は類似性検索のスコアまで取得する例です。
```test.py
import os

os.environ["AZURE_OPENAI_API_KEY"] = "Azure OpenAIのキーを指定"
os.environ["AZURE_OPENAI_ENDPOINT"] = "Azure OpenAIのエンドポイントを指定"

vector_store_address: str = "Azure AI Searchのエンドポイントを指定"
vector_store_password: str = "Azure AI Searchのプライマリー管理者キーを指定"

from langchain.embeddings import AzureOpenAIEmbeddings
from langchain.vectorstores.azuresearch import AzureSearch

embeddings: AzureOpenAIEmbeddings = AzureOpenAIEmbeddings(
    deployment="text-embedding-ada-002", chunk_size=1
)
index_name: str = "ai-search-demo"
vector_store: AzureSearch = AzureSearch(
    azure_search_endpoint=vector_store_address,
    azure_search_key=vector_store_password,
    index_name=index_name,
    embedding_function=embeddings.embed_query,
)

docs_and_scores = vector_store.similarity_search_with_relevance_scores(
    query="利用可能なAzure AIサービスは？",
    k=4,
    score_threshold=0.80,
)
from pprint import pprint

pprint(docs_and_scores)
```
similarity_search_with_relevance_scoresメソッドを用いて、クエリに対する検索結果をスコアと合わせて取得します。k=4で取得する検索結果の数を4個に指定しています。score_thresholdで取得するスコアの閾値を指定しています。
　　
結果
```terminal
[(Document(page_content='Azure AI サービスとは\n[アーティクル ]•2023/11/22\nAzure AI サービスは、開発者と組織が、すぐに使⽤できる事前構築済みのカスタマイズ\n可能な  API とモデルを使⽤して、インテリジェントで最先端の市場対応の責任あるア\nプリケーションを迅速に作成するのに役⽴ちます。  アプリケーションの例には、会\n話、検索、監視、翻訳、⾳声、ビジョン、意思決定のための⾃然⾔語処理が含まれま\nす。\nほとんどの  Azure AI サービスは、 REST API とクライアント  ライブラリ  SDK を通じ\nて、⼀般的な開発⾔語で利⽤できます。  詳細については、各サービスのドキュメント\nを参照してください。\n以下の表からサービスを選択し、開発⽬標を達成するためにそれらがどのように役⽴つ\nかを確認します。\nサービス 説明\nAnomaly Detector  (廃⽌ )潜在的な問題を早期に特定する\nAzure AI Search AI を利⽤したクラウド検索をモバイル  アプリと  Web アプリで使\n⽤できるようにします\nAzure OpenAI さまざまな⾃然⾔語タスクを実⾏する\nBot Service ボットを作成して複数のチャネルにわたって接続します\nContent Moderator  (廃⽌ )不快感を与える可能性がある、または望ましくないコンテンツを\n検出する\nContent Safety 望ましくないコンテンツを検出する  AI サービス\nCustom Vision ビジネスに合わせて画像認識をカスタマイズする\uea80 ヒント\nAzure AI S tudio で、 Azure OpenAI 、 Content Safety 、 Speech 、 Vision などの  Azure\nAI サービスをお試しください。  詳細については、「 Azur e AI S tudio とは」をご覧\nください。\n利⽤可能な  Azure AI サービス', metadata={'id': 'NzNhOWQ4ZDUtOTIwNi00NmE4LWE2NDAtZjFjOGNjMTM2ZGQ2', 'source': 'datasets/azure-ai-services.pdf', 'page': 3}),
  0.91115886),
 (Document(page_content='Azure と  Azure AI サービスを使⽤すると、広⼤なエコシステムを利⽤できます。以下\nはその例です。\nLogic Apps や  Power Automate のような⾃動化および統合ツール。\nAzure Functions や  App Service のようなデプロイ  オプション。\nセキュリティで保護されたアクセス⽤の  Azure AI サービス  Docker コンテナー。\nビッグ  データ  シナリオ⽤の  Apache Spark 、 Azure Databricks 、 Azure S ynapse\nAnalytics、 Azure Kubernetes Service などのツール。\n詳細については、「 Azure AI サービスのエコシステム 」を参照してください。\nAzure AI サービスの  API は、 Microsoft マネージド  データ  センターの拡⼤しているネ\nットワーク上でホストされます。  Azure リージョン⼀覧 で API ごとのリージョン別\nの提供状況がわかります。\nまだサポートされていないリージョンを探しているのですか。  UserV oice フォーラム\nに機能要求を記⼊してご連絡ください。\nAzure AI サービスでは、さまざまなカルチャ⾔語がサービス  レベルでサポートされて\nいます。  各  API で利⽤可能な⾔語は、 サポート対象の⾔語⼀覧 に関するページで検索\nできます。\nAzure AI サービスには、 Microsoft Entra 資格情報を使った 認証、有効なリソース  キ\nー、Azure 仮想ネットワーク を含む多層型のセキュリティ  モデルが⽤意されていま\nす。\nAzure AI サービスは  CSA ST AR Certification 、 FedRAMP Moderate 、 HIPAA BAA などの\n認定を受けています。  ⾃分で監査したり、セキュリティを確認する⽬的で認定資格を\nダウンロードできます。\nプライバシーやデータ管理については、 トラスト  センターを参照してください。エコシステム内の  Azure AI サービス\nリージョン別の提供状況\n⾔語のサポート\nSecurity\n認定資格とコンプライアンス', metadata={'id': 'MmY3MGYxZDAtZTY2My00MzYyLWI3NmQtYTJkOTc3MGY2YTcx', 'source': 'datasets/azure-ai-services.pdf', 'page': 7}),
  0.90952885),
 (Document(page_content='Azure AI サービスの価格 。関連項⽬', metadata={'id': 'ZTkyNjJjY2YtNGU4ZC00ZGRhLTgzMGYtNTUwNWE2MjRlOTk0', 'source': 'datasets/azure-ai-services.pdf', 'page': 63}),
  0.9082628),
 (Document(page_content='Azure AI サービスを安全に使⽤する⽅法については、「 Azur e AI サービスに対す\nる要求の認証」を参照してください。\nAzure AI サービスの⼀覧については、「 Azur e AI サービスとは ?」を参照してくだ\nさい。\nAzure AI サービスがサポートする⾃然⾔語の⼀覧を確認するには、「 ⾃然⾔語の\nサポート」を参照してください。\nAzure AI サービスをオンプレミスで使⽤する⽅法を確認するには、「 Azur e AI サ\nービスのコンテナーとしての使⽤ 」を参照してください。\nAzure AI サービスの使⽤コストを⾒積もるには、「 Azur e AI サービスのコストの\n計画および管理」を参照してください。関連項⽬', metadata={'id': 'ZGM0YTdlM2MtYzkyOS00N2QxLWI0MDctZGQ2MzE0NWIwNjM3', 'source': 'datasets/azure-ai-services.pdf', 'page': 22}),
  0.90784776)]
```

　　　
### ハイブリッド検索
ハイブリッド検索では、ベクトル検索とキーワード検索を組み合わせて処理することができます。
以下はハイブリッド検索の例です。
```test.py
import os

os.environ["AZURE_OPENAI_API_KEY"] = ""
os.environ["AZURE_OPENAI_ENDPOINT"] = ""

vector_store_address: str = ""
vector_store_password: str = ""

from langchain.embeddings import AzureOpenAIEmbeddings
from langchain.vectorstores.azuresearch import AzureSearch

embeddings: AzureOpenAIEmbeddings = AzureOpenAIEmbeddings(
    deployment="text-embedding-ada-002", chunk_size=1
)
index_name: str = "ai-search-demo"
vector_store: AzureSearch = AzureSearch(
    azure_search_endpoint=vector_store_address,
    azure_search_key=vector_store_password,
    index_name=index_name,
    embedding_function=embeddings.embed_query,
)

docs = vector_store.hybrid_search(
    query="利用可能なAzure AIサービスは？", k=3
)
print(docs[0].page_content)
```
hybrid_searchメソッドを用います。k=3で取得する検索結果の数を3個に指定しています.

　　
結果
```terminal
Azure AI サービスとは
[アーティクル ]•2023/11/22
Azure AI サービスは、開発者と組織が、すぐに使⽤できる事前構築済みのカスタマイズ
可能な  API とモデルを使⽤して、インテリジェントで最先端の市場対応の責任あるア
プリケーションを迅速に作成するのに役⽴ちます。  アプリケーションの例には、会
話、検索、監視、翻訳、⾳声、ビジョン、意思決定のための⾃然⾔語処理が含まれま
す。
ほとんどの  Azure AI サービスは、 REST API とクライアント  ライブラリ  SDK を通じ
て、⼀般的な開発⾔語で利⽤できます。  詳細については、各サービスのドキュメント
を参照してください。
以下の表からサービスを選択し、開発⽬標を達成するためにそれらがどのように役⽴つ
かを確認します。
サービス 説明
Anomaly Detector  (廃⽌ )潜在的な問題を早期に特定する
Azure AI Search AI を利⽤したクラウド検索をモバイル  アプリと  Web アプリで使
⽤できるようにします
Azure OpenAI さまざまな⾃然⾔語タスクを実⾏する
Bot Service ボットを作成して複数のチャネルにわたって接続します
Content Moderator  (廃⽌ )不快感を与える可能性がある、または望ましくないコンテンツを
検出する
Content Safety 望ましくないコンテンツを検出する  AI サービス
Custom Vision ビジネスに合わせて画像認識をカスタマイズする ヒント
Azure AI S tudio で、 Azure OpenAI 、 Content Safety 、 Speech 、 Vision などの  Azure
AI サービスをお試しください。  詳細については、「 Azur e AI S tudio とは」をご覧
ください。
利⽤可能な  Azure AI サービス
```

　　
## おわりに
お疲れ様でした！
以下で情報発信しています！

https://x.com/t___tatsuki

　　
## 参考資料
https://python.langchain.com/docs/integrations/vectorstores/azuresearch

https://github.com/Azure/azure-search-vector-samples/blob/main/demo-python/code/azure-search-vector-python-langchain-sample.ipynb