検索クエリとドキュメントの埋め込みを作成する

Note

Azure AI 検索は、Azure ポータル、REST API、およびAzure SDKから使用できます。 また、Foundry IQ は、エンタープライズ コンテンツを、Microsoft Foundry ポータルのエージェントの再利用可能なアクセス許可に対応したナレッジ ベースに変換するマネージド ナレッジ レイヤーです。

Azure AI 検索 では埋め込みモデルがホストされないため、クエリの入力と出力用のベクトルを作成する必要があります。 次のいずれかの方法を使用します:

方法 説明
統合ベクトル化 Azure AI 検索 で組み込みのデータ チャンクとベクトル化を使用します。 このアプローチでは、インデクサー、スキルセット、Microsoft Foundry などの外部埋め込みモデルを指す組み込みまたはカスタム スキルに依存します。
手動ベクトル化 データ チャンクとベクトル化を自分で管理します。 インデックス作成の場合は、事前ベクトル化されたドキュメントを検索インデックスのベクトル フィールドにプッシュします。 クエリの場合は、事前計算されたベクトルを検索エンジンに提供します。 この方法のデモについては、azure-search-vector-samples GitHub リポジトリを参照してください。

ほとんどのシナリオでは、統合ベクトル化をお勧めします。 サポートされている埋め込みモデルは使用できますが、この記事では Azure OpenAI モデルを使用して説明します。

ベクトル クエリでの埋め込みモデルの使用方法

埋め込みモデルは、クエリ入力とクエリ出力の両方のベクトルを生成します。 クエリ入力には、次のものが含まれます:

  • クエリ処理中にベクトルに変換されるテキストまたは画像。 統合ベクトル化の一環として、ベクトル化によってこのタスクが実行されます。

  • 事前計算されたベクトル。 クエリ入力を任意の埋め込みモデルに渡すことで、これらのベクトルを生成できます。 レート制限を回避するために、ワークロードで再試行ロジックを実装できます。 Microsoft の Python デモでは、tenacity を使用します。

検索エンジンは、クエリ入力に基づいて、検索インデックスから一致するドキュメントを取得します。 これらのドキュメントはクエリ出力です。

検索インデックスには、埋め込みによって設定された 1 つ以上のベクトル フィールドを含むドキュメントが既に含まれている必要があります。 これらの埋め込みは、統合ベクトル化または手動ベクトル化を使用して作成できます。 正確な結果を得るには、インデックス作成とクエリに同じ埋め込みモデルを使用します。

モデル統合を埋め込むためのヒント

  • ユース ケースを特定します。 ベクトル検索機能の埋め込みモデル統合によって検索ソリューションに価値が追加される特定のユース ケースを評価します。 これには、マルチモーダル検索、または画像コンテンツとテキスト コンテンツの照合、多言語検索、または類似性検索などが含まれます。

  • チャンク戦略を設計する。 埋め込みモデルでは、受け入れるトークンの数に制限があるため、大きなファイルにはデータのチャンクが必要です。

  • 最適化されたコストとパフォーマンス。 ベクトル検索はリソースを集中的に消費し、上限に従うので、セマンティックな意味を含むフィールドのみをベクトル化します。 ベクトル サイズを小さくして、同じ価格でより多くのベクトルを格納します。

  • 適切な埋め込みモデルを選択します。 テキストベースの検索用の単語埋め込みや視覚的な検索用の画像埋め込みなど、ユース ケースのモデルを選択します。 OpenAI の text-embedding-ada-002 や Foundry Tools の Azure Vision からの画像取得 REST API など、事前トレーニング済みのモデルを検討してください。

  • ベクトルの長さを正規化します。 類似性検索の精度とパフォーマンスを向上させるには、ベクトルの長さを正規化してから検索インデックスに格納します。 ほとんどの事前トレーニング済みモデルは既に正規化されています。

  • モデルを微調整します。 必要に応じて、モデルをドメイン固有のデータで微調整すると、検索アプリケーションのパフォーマンスと関連性が向上します。

  • テストして繰り返します。 埋め込みモデルの統合を継続的にテストして調整し、目的の検索パフォーマンスとユーザー満足を実現します。

すべてのリソースを同じリージョンに作成します。

Azure OpenAI 埋め込みモデルとの統合ベクター化では、リソースを同じリージョンに含める必要はありませんが、同じリージョンを使用すると、パフォーマンスが向上し、待機時間が短縮されます。

リソースに同じリージョンを使用するには:

  1. テキスト埋め込みモデルのリージョン別の可用性を確認します。

  2. Azure AI 検索 のリージョンの可用性を確認します。

  3. 同じリージョンに Azure OpenAI リソースと Azure AI 検索 サービスを作成します。

ヒント

AI エンリッチメントのカスタム スキルで、ハイブリッド クエリまたは機械学習モデルにセマンティック ランク付けを使用しますか? これらの機能を提供する Azure AI 検索 リージョンを選択します。

Foundry で埋め込みモデルを選択する

Foundry ポータルでエージェント ワークフローにナレッジを追加する場合は、検索インデックスを作成するオプションがあります。 ウィザードが手順を案内します。

1 つの手順で、埋め込みモデルを選択してプレーン テキスト コンテンツをベクトル化します。 次のモデルがサポートされています。

  • text-embedding-3-small
  • text-embedding-3-large
  • text-embedding-ada-002
  • Cohere-embed-v3-英語
  • Cohere-embed-v3-多言語

モデルは既にデプロイされている必要があり、それにアクセスするためのアクセス許可が必要です。 詳細については、「 Foundry モデルのデプロイの概要」を参照してください。

アドホック クエリの埋め込みを生成する

統合ベクトル化を使用しない場合は、埋め込みを手動で生成し、ベクトル クエリの vectorQueries.vector プロパティに貼り付けることができます。 詳細については、「Azure AI 検索 でベクトル クエリを作成する」を参照してください。

次の例では、text-embedding-ada-002 モデルを想定しています。 YOUR-API-KEY と YOUR-OPENAI-RESOURCE を Azure OpenAI リソースの詳細に置き換えます。

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

class Program
{
    static async Task Main(string[] args)
    {
        var apiKey = "YOUR-API-KEY";
        var apiBase = "https://YOUR-OPENAI-RESOURCE.openai.azure.com";
        var apiVersion = "2024-02-01";
        var engine = "text-embedding-ada-002";

        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

        var requestBody = new
        {
            input = "How do I use C# in VS Code?"
        };

        var response = await client.PostAsync(
            $"{apiBase}/openai/deployments/{engine}/embeddings?api-version={apiVersion}",
            new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json")
        );

        var responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseBody);
    }
}

出力は、1,536 次元のベクトル配列です。