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 から「AI Search」のページに移動し、「作成」を選択します。

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

記事投稿用 (11).png

検証が完了したら、「作成」を選択します。

記事投稿用 (12).png

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

記事投稿用 (13).png

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

image.png

インデックスの追加

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

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

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

類似性検索

類似性検索では、クエリ文から生成されたベクトルの応答結果がk個返されます。

以下は類似性検索の例です。

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個に指定しています。

結果

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 サービス

類似性スコア付きの検索

類似性検索では、類似性スコア順に検索結果が並び替えられますが、そのスコアを取得することもできます。

以下は類似性検索のスコアまで取得する例です。

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)

similaritysearchwithrelevancescoresメソッドを用いて、クエリに対する検索結果をスコアと合わせて取得します。k=4で取得する検索結果の数を4個に指定しています。score_thresholdで取得するスコアの閾値を指定しています。

結果

[(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)]

ハイブリッド検索

ハイブリッド検索では、ベクトル検索とキーワード検索を組み合わせて処理することができます。

以下はハイブリッド検索の例です。

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個に指定しています.

結果

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 サービス

おわりに

お疲れ様でした!

以下で情報発信しています!

参考資料

この記事を書いた人

azure-recipe-user