Azure AI Search のベクトル
ベクトル検索とは、コンテンツの数値表現に対するインデックス付けとクエリの実行をサポートする情報取得のアプローチです。 コンテンツはプレーンテキストではなく数値であるため、照合はクエリ ベクトルに最も類似したベクトルに基づいて行われます。これにより、次のシナリオでの照合が可能になります。
- 意味的または概念的な類似性 ("dog" と "canine" は概念的には似ているが言語的には異なる)
- 多言語コンテンツ (英語では "dog"、ドイツ語では "hund")
- 複数のコンテンツ タイプ (プレーンテキストの "dog" と画像ファイル内の犬の写真)
この記事では、Azure AI 検索でのベクトルの概要について説明します。 また、他の Azure サービスとの統合についても説明し、ベクトル検索の開発に関連する用語と概念についても説明します。
最初にこの記事を読んで基礎知識を得ることをお勧めしますが、それはかまわないのですぐに使いたいという方は、これらの手順を実行してください。
- インデックス用の埋め込みを提供するか、インデクサー パイプラインで埋め込みを生成する
- ベクトル インデックスを作成する
- ベクトル クエリの実行
ベクトル クイックスタートまたは GitHub のコード サンプルを使用して開始することもできます。
ベクトル検索をサポートできるシナリオ
ベクトル検索には次のようなシナリオがあります。
類似性検索。 OpenAI 埋め込みなどの埋め込みモデルや SBERT などのオープン ソース モデルを使用してテキストをエンコードし、やはりベクトルとしてエンコードされたクエリを使用してドキュメントを取得します。
さまざまなコンテンツ タイプ (マルチモーダル) で検索します。 画像とテキストをマルチモーダル埋め込み (たとえば、Azure OpenAI の OpenAI CLIP や GPT-4 Turbo with Vision を使用) を使用してエンコードし、両方のコンテンツ タイプのベクトルで構成される埋め込みスペースをクエリします。
ハイブリッド検索。 Azure AI 検索のハイブリッド検索では、同じ要求でベクトルおよびキーワード クエリの実行を参照します。 ベクトル サポートはフィールド レベルで実装されており、ベクトル フィールドと検索可能なテキスト フィールドの両方を含むインデックスがあります。 クエリは並列で実行され、結果は 1 つの応答にマージされます。 必要に応じて、セマンティック ランク付けを追加して、Bing を動作させているのと同じ言語モデルを使用して、L2 の再ランク付けによって精度をさらに高めます。
多言語検索。 複数の言語でトレーニングされたモデルとチャット モデルを埋め込んで、ユーザーの母国語での検索エクスペリエンスを提供できます。 翻訳をより詳細に制御する必要がある場合は、ハイブリッド検索シナリオで Azure AI Search が非ベクトル コンテンツに対して提供する多言語機能を追加できます。
フィルター選択されたベクトル検索。 クエリ要求にはベクトル クエリとフィルター式を含めることができます。 フィルターはテキスト フィールドと数値フィールドに適用され、メタデータ フィルターに役立ち、フィルター条件に基づいて検索結果を含めたり除外したりするのに役立ちます。 ベクトル フィールド自体はフィルター処理できませんが、フィルター可能なテキスト フィールドまたは数値フィールドを設定できます。 検索エンジンは、ベクトル クエリの実行前または実行後にフィルターを処理できます。
ベクトル データベース。 Azure AI Search には、クエリを実行するデータが格納されます。 長期メモリやナレッジ ベース、あるいは取得拡張生成 (RAG) アーキテクチャやベクトルを使用するあらゆるアプリケーションの基礎データが必要な場合は、純粋なベクトル ストアとして使用します。
Azure AI Searchでのベクトル検索のしくみ
ベクトルのサポートには、検索インデックスからのベクトル埋め込みのインデックス作成、格納、クエリが含まれます。
次の図は、ベクトル検索のインデックス作成とクエリのワークフローを示しています。
インデックス作成側では、Azure AI Search はベクトル埋め込みを受け取り、最近傍 アルゴリズム を使用して、同様のベクトルをインデックス内の近い場所に配置します。 内部では、各ベクトル フィールドのベクトル インデックスが作成されます。
ソース コンテンツから Azure AI 検索に埋め込む方法は、Azure AI 検索のインデックス作成パイプライン内で作業を実行するか、外部で実行するかによって異なります。 Azure AI 検索はインデクサー パイプラインで統合されたデータ チャンクとベクトル化を提供します。 リソース (エンドポイントと Azure OpenAI への接続情報) は引き続き提供されますが、Azure AI Search はすべての呼び出しを行い、移行を処理します。 このアプローチには、インデクサー、サポートされているデータ ソース、チャンクと埋め込みを促進するスキルセットが必要です。 それ以外の場合は、すべてのベクトル化を個別に処理し、事前にベクトル化したコンテンツをベクトル ストア内のベクトル フィールドにプッシュすることができます。
クエリ側では、クライアント アプリケーションで、通常はプロンプト ワークフローを使用して、ユーザーからクエリ入力を収集します。 その後、入力をベクトルに変換するエンコード手順を追加し、Azure AI Search 上のインデックスにベクトル クエリを送信して類似性検索を行うことができます。 インデックス作成と同様に、垂直統合をデプロイして、質問をベクトルに変換できます。 どちらの方法でも、Azure AI Search では、要求された k
最近傍 (kNN) を含むドキュメントが結果に返されます。
Azure AI Search は、ベクトル検索とキーワード検索を並行して実行するハイブリッド シナリオをサポートしており、統合された結果セットを返しますが、これはしばしば、ベクトル検索やキーワード検索のみよりも優れた結果を提供します。 ハイブリッドの場合、ベクトル コンテンツと非ベクトル コンテンツは、並列して実行されるクエリに対して、同じインデックスに取り込まれます。
可用性と料金
ベクトル検索は、すべてのリージョンのすべての Azure AI Search レベルの一部として追加料金なしで利用できます。
2024 年 4 月 3 日以降に作成された新しいサービスでは、ベクトル インデックスのためにより高いクォータをサポートしています。
ベクトル検索は次で利用できます。
- Azure portal: データのインポートとベクトル化ウィザード
- Azure REST API
- .NET、Python、JavaScript 用の Azure SDK
- Azure AI Studio などのその他の Azure オファリング。
Note
2019 年 1 月 1 日より前に作成された一部の古い検索サービスは、ベクトル ワークロードをサポートしないインフラストラクチャにデプロイされています。 ベクトル フィールドをスキーマに追加しようとしてエラーが表示された場合、それはサービスが古いためです。 このような場合は、ベクトル機能を試すために新しい検索サービスを作成する必要があります。
Azure の統合と関連サービス
Azure AI Search は、Azure AI プラットフォーム全体で深く統合されています。 次の表に、ベクトル ワークロードで役立ついくつかの要素を示します。
Product | 統合 |
---|---|
Azure AI Studio | データ プレイグラウンドとのチャットで、[独自のデータを追加する] は、データの基盤と会話型検索のために Azure AI Search を使用します。 これは、データとチャットするための最も簡単かつ高速なアプローチです。 |
Azure OpenAI | Azure OpenAI には埋め込みモデルとチャットモデルが用意されています。 デモとサンプルでは、text-embedding-ada-002 を対象とします。 テキスト用の埋め込みを生成するには、Azure OpenAI をお勧めします。 |
Azure AI Services | Image Retrieval Vectorize Image API (プレビュー) では、画像コンテンツのベクトル化がサポートされます。 画像用の埋め込みを生成するには、この API をお勧めします。 |
Azure データ プラットフォーム: Azure Blob Storage、Azure Cosmos DB | インデクサーを使用してデータ インジェストを自動化し、垂直統合を使用して埋め込みを生成できます。 Azure AI Search では、Azure Blob インデクサーと Azure Cosmos DB for NoSQL インデクサーの 2 つのデータ ソースからベクトル データのインデックスを自動的に作成できます。 詳細については、「検索インデックスにベクトル フィールドを追加する」を参照してください。 |
これは、LangChain などのオープンソース フレームワークでも一般的に使用されています。
ベクトル検索の概念
ベクトルを初めて使用する場合、このセクションではいくつかの主要な概念について説明します。
ベクトル検索について
ベクトル検索は、ドキュメントとクエリがプレーン テキストではなくベクトルとして表現される場合の情報取得の方法です。 ベクトル検索では、機械学習モデルがソース入力 (テキスト、画像、その他のコンテンツ) のベクトル表現を生成します。 コンテンツの数学表現を使用することによって、検索シナリオの共通基盤が提供されます。 すべてがベクトルであれば、関連する元のコンテンツがクエリとは異なるメディアや言語であっても、クエリはベクトル空間で一致するものを見つけることができます。
ベクトル検索を使用する理由
検索可能なコンテンツがベクトルとして表されると、クエリは類似するコンテンツ内の近い一致を見つけることができます。 ベクトル生成に使用される埋め込みモデルは、どの単語と概念が類似しているかを認識し、結果のベクトルを埋め込み空間内で近くに配置します。 たとえば、"クラウド" と "霧" に関するベクトル化されたソース ドキュメントは、意味的に類似しているため、構文上の一致ではない場合も "霧" に関するクエリで表示される可能性が高くなります。
埋め込みベクトル化
"埋め込み" は、テキストのセマンティックな意味や画像などの他のコンテンツの表現を読み取る機械学習モデルによって作成された、コンテンツまたはクエリの特定の種類のベクトル表現です。 自然言語機械学習モデルは、単語間のパターンや関係を識別するために、大量のデータでトレーニングされます。 トレーニング中に、"エンコーダー" と呼ばれる中間ステップで、入力を実数のベクトルとして表現する方法を学習します。 トレーニングが完了すると、中間ベクトル表現がモデルの出力になるように、これらの言語モデルを変更できます。 結果として得られる埋め込みは高次元ベクトルであり、埋め込みの概要 (Azure OpenAI) に関する記事で説明されているように、同じような意味を持つ単語がベクトル空間で互いに近くなります。
関連する情報の取得におけるベクトル検索の有効性は、ドキュメントとクエリの意味を結果のベクトルに抽出する埋め込みモデルの有効性に依存します。 最適なモデルは、それらが代表するデータの種類によって適切にトレーニングされています。 Azure OpenAI text-embedding-ada-002 などの既存のモデルを評価したり、問題領域で直接トレーニングされた独自のモデルを使用したり、汎用モデルを微調整したりできます。 Azure AI Search では、選ぶモデルに制約が課されないため、データに最適なものを選んでください。
ベクトル検索に対して効果的な埋め込みを作成するには、入力サイズの制限を考慮することが重要です。 埋め込みを生成する前に、データをチャンクするためのガイドラインに従うことをお勧めします。 このベスト プラクティスのおかげで、埋め込みによって関連情報が正確に読み取られ、より効率的なベクトル検索が可能になります。
埋め込み空間とは
"埋め込み空間" は、ベクトル クエリのコーパスです。 検索インデックス内では、埋め込み空間は、同じ埋め込みモデルからの埋め込み値が設定されているすべてのベクトル フィールドです。 機械学習モデルでは、個々の単語、語句、またはドキュメント (自然言語処理の場合)、画像、またはその他の形式のデータを、高次元空間の座標を表す実数のベクトルで構成される表現にマッピングすることで、埋め込み空間を作成します。 この埋め込みスペースでは、類似項目は近くに配置され、異なる項目は離れた場所に配置されます。
たとえば、さまざまな種類の犬について説明するドキュメントは、埋め込み空間で互いに近くに集められます。 猫に関するドキュメントは互いに近くに集まりますが、犬のクラスターから遠く離れており、それでも動物としては近くになります。 クラウド コンピューティングなどの異なる概念は、はるかに遠く離れています。 実際には、これらの埋め込み空間は抽象的で、人間が解釈できる明確に定義された意味はありませんが、中核となる概念は同じです。
最近傍検索
ベクトル検索では、検索エンジンは埋め込みスペース内のベクトルをスキャンして、クエリ ベクトルに最も近いベクトルを識別します。 この手法は "最近傍検索" と呼ばれます。 最近傍は、項目間の類似性を定量化するのに役立ちます。 ベクトルの類似性が高い場合は、元のデータも同様であることを示します。 高速な最近傍検索を容易にするために、検索エンジンでは最適化を実行するか、データ構造およびデータ パーティション分割を使用して検索領域を削減します。 各ベクトル検索アルゴリズムは、最小待機時間、最大スループット、再現率、メモリを最適化する際に、最近傍の問題をさまざまな方法で解決します。 類似性を計算するために、類似性メトリックでは距離を計算するためのメカニズムを提供します。
Azure AI Search では現在、次のアルゴリズムがサポートされています。
Hierarchical Navigable Small World (HNSW): HNSW は、データ分散が不明であるか、頻繁に変更される可能性がある、高いリコールと待機時間の短い用途に最適化された主要な ANN アルゴリズムです。 高次元のデータ ポイントを階層グラフ構造に整理することで、高速でスケーラブルな類似性検索を可能にしながら、検索精度と計算コストのトレードオフを調整できます。 このアルゴリズムでは、高速ランダム アクセスのためにすべてのデータ ポイントがメモリ内に存在する必要があるため、このアルゴリズムではベクトル インデックス サイズのクォータが使用されます。
完全な K 最近傍 (KNN): クエリ ベクトルとすべてのデータ ポイントの間の距離を計算します。 計算負荷が高いので、小規模なデータセットに最適です。 このアルゴリズムではデータ ポイントの高速ランダム アクセスが不要なため、このアルゴリズムではベクトル インデックス サイズのクォータが使用されません。 ただし、このアルゴリズムでは最近傍のグローバル セットが提供されます。
これらのアルゴリズムを使用するには、アルゴリズム、ベクトル プロファイル、およびプロファイルの割り当てを指定する手順について、ベクトル フィールドの作成に関する記事を参照してください。
インデックスの作成時にインデックスの初期化に使用されるアルゴリズム パラメーターは不変であり、インデックスの作成後に変更することはできません。 ただし、クエリ時間の特性 (efSearch
) に影響を与えるパラメーターは変更することができます。
さらに、HNSW アルゴリズムを指定するフィールドは、クエリ要求パラメーター "exhaustive": true
を使用した完全な KNN 検索もサポートします。 ただし、その逆は当てはまりません。 exhaustiveKnn
に対してフィールドがインデックス付けされている場合、効率的な検索’を可能にする追加のデータ構造が存在しないため、クエリで HNSW を使用することはできません。
近似最近傍
近似最近傍 (ANN) 検索は、ベクトル空間で一致を検索するためのアルゴリズムの種類です。 この種類のアルゴリズムでは、検索空間を大幅に削減してクエリ処理を高速化するため、さまざまなデータ構造またはデータ パーティション分割方法が採用されます。
ANN アルゴリズムでは、精度がいくらか犠牲になりますが、近似最近傍をスケーラブルかつ迅速に取得できるため、最新の情報取得の用途で効率と精度のバランスを取るのに最適です。 アルゴリズムのパラメーターを調整して、検索用途のリコール、待機時間、メモリ、ディスク フットプリントの要件を微調整できます。
Azure AI Search では、ANN アルゴリズムに HNSW が使用されます。