次の方法で共有


クイック スタート: .NET または Python を使用したセマンティック ランキング

Azure AI 検索のセマンティック ランク付けは、Microsoft の機械読解を使用して検索結果を再スコアリングして、セマンティック関連性が最も高い一致を一覧の最上位に昇格させる、クエリ側の機能です。 コンテンツとクエリに応じて、セマンティック 優先度付けは、 開発者の作業を最小限に抑えながら、検索の関連性を大幅に向上させることができます。

このクイックスタートでは、セマンティック ランカーを呼び出すインデックスとクエリの変更について説明します。

Note

ChatGPT 相互作用を使用した Azure AI 検索ソリューションの例については、このデモまたはこのアクセラレータを参照してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。

  • セマンティック ランカーが有効になっている Basic レベル以上の Azure AI 検索リソース。

  • API キーと検索サービス エンドポイント。 Azure portal にサインインし、ご利用の検索サービスを探します

    [概要] で URL をコピーし、後の手順のために保存します。 たとえば、エンドポイントは https://mydemo.search.windows.net のようになります。

    [キー] で、オブジェクトを作成および削除するための完全な権限を持つ管理キーをコピーして保存します。 キーには、プライマリとセカンダリの 2 つがあり、どちらでも同じように機能します どちらかを選択します。

    検索サービスの HTTP エンドポイントとアクセス キーを見つける場所を示すスクリーンショット。

セマンティック 優先度付けを追加する

セマンティック ランカーを使用するには、検索インデックスに "セマンティック構成" を追加し、クエリにパラメーターを追加します。 既存のインデックスがある場合は、検索可能なコンテンツの構造に影響がないため、コンテンツのインデックスを再作成しなくても、これらの変更を行うことができます。

  • セマンティック構成では、セマンティックの再ランク付けで使用されるタイトル、キーワード、コンテンツを提供するフィールドの優先順位を設定します。 フィールドの優先順位付けを行うと、処理を高速化できます。

  • セマンティック ランカーを呼び出すクエリには、クエリの種類、およびキャプションと回答が返されるかどうかを指定するパラメーターが含まれます。 これらのパラメーターは、既存のクエリ ロジックに追加できます。 他のパラメーターとの競合はありません。

Azure.Search.Documents クライアント ライブラリを使用してコンソール アプリケーションをビルドし、既存の検索インデックスにセマンティック ランク付けを追加します。

または、ソース コードをダウンロードして、完了したプロジェクトを開始することもできます。

環境を設定する

  1. Visual Studio を起動し、コンソール アプリ用の新しいプロジェクトを作成します。

  2. [ツール]>[NuGet パッケージ マネージャー] で、 [ソリューションの NuGet パッケージの管理] を選択します。

  3. [参照] を選択します。

  4. Azure.Search.Documents パッケージを検索し、最新の安定バージョンを選択します。

  5. [インストール] を選択して、プロジェクトとソリューションにアセンブリを追加します。

検索クライアントを作成する

  1. Program.cs で次の using ディレクティブを追加します。

    using Azure;
    using Azure.Search.Documents;
    using Azure.Search.Documents.Indexes;
    using Azure.Search.Documents.Indexes.Models;
    using Azure.Search.Documents.Models;
    
  2. 2 つのクライアントを作成します。SearchIndexClient はインデックスを作成するクライアントで、SearchClient は既存のインデックスを読み込んで照会するクライアントです。

    どちらのクライアントにも、作成と削除の権限による認証のためのサービス エンドポイントと管理者 API キーが必要です。 ただし、コードによって URI が構築されるため、serviceName プロパティには検索サービス名のみを指定します。 https:// または .search.windows.net は含めないでください。

     static void Main(string[] args)
     {
         string serviceName = "<YOUR-SEARCH-SERVICE-NAME>";
         string apiKey = "<YOUR-SEARCH-ADMIN-API-KEY>";
         string indexName = "hotels-quickstart";
    
    
         // Create a SearchIndexClient to send create/delete index commands
         Uri serviceEndpoint = new Uri($"https://{serviceName}.search.windows.net/");
         AzureKeyCredential credential = new AzureKeyCredential(apiKey);
         SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, credential);
    
         // Create a SearchClient to load and query documents
         SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, credential);
         . . . 
     }
    

インデックスを作成する

SemanticConfiguration を含むようにインデックス スキーマを作成または更新します。 既存のインデックスを更新する場合、ドキュメントの構造は変更されないため、この変更ではインデックスの再作成は必要ありません。

// Create hotels-quickstart index
private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{

    FieldBuilder fieldBuilder = new FieldBuilder();
    var searchFields = fieldBuilder.Build(typeof(Hotel));

    var definition = new SearchIndex(indexName, searchFields);
    var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
    definition.Suggesters.Add(suggester);
    definition.SemanticSearch = new SemanticSearch
    {
        Configurations =
        {
            new SemanticConfiguration("my-semantic-config", new()
            {
                TitleField = new SemanticField("HotelName"),
                ContentFields =
                {
                    new SemanticField("Description"),
                    new SemanticField("Description_fr")
                },
                KeywordsFields =
                {
                    new SemanticField("Tags"),
                    new SemanticField("Category")
                }
            })
        }
    };

    adminClient.CreateOrUpdateIndex(definition);
}

次のコードで、検索サービスにインデックスを作成します。

// Create index
Console.WriteLine("{0}", "Creating index...\n");
CreateIndex(indexName, adminClient);

SearchClient ingesterClient = adminClient.GetSearchClient(indexName);

ドキュメントを読み込む

Azure AI Search は、サービスに保存されているコンテンツを検索します。 ドキュメントをアップロードするコードは C# 用のフルテキスト検索のクイック スタートと同じであるため、ここで複製する必要はありません。 名前、住所、説明を含む 4 つのホテルが必要です。 ソリューションには、ホテルと住所の種類が必要です。

インデックスを検索する

パラメーターを指定するための検索オプションを使用してセマンティック ランカーを呼び出すクエリを次に示します。

Console.WriteLine("Example of a semantic query.");

options = new SearchOptions()
{
    QueryType = Azure.Search.Documents.Models.SearchQueryType.Semantic,
    SemanticSearch = new()
    {
        SemanticConfigurationName = "my-semantic-config",
        QueryCaption = new(QueryCaptionType.Extractive)
    }
};
options.Select.Add("HotelName");
options.Select.Add("Category");
options.Select.Add("Description");

// response = srchclient.Search<Hotel>("*", options);
response = srchclient.Search<Hotel>("what hotel has a good restaurant on site", options);
WriteDocuments(response);

比較のために、用語の頻度と近接度に基づいて、既定の BM25 ランク付けを使用するクエリの結果を次に示します。 "what hotel has a good restaurant on site (良い館内レストランがあるホテルはどこか)" というクエリを指定すると、BM25 ランク付けアルゴリズムは、次のスクリーンショットの順序で一致を返します。

BM25 でランク付けされた一致を示すスクリーンショット。

これに対し、セマンティック ランク付けが同じクエリ ("what hotel has a good restaurant on site (良い館内レストランがあるホテルはどこか)") に適用されている場合、クエリに対するセマンティック関連性に基づいて結果が再ランク付けされます。 今回の上位の結果は、ユーザーの期待により合致したレストランのあるホテルです。

セマンティック ランクに基づいてランク付けされたマッチを示すスクリーンショット。

プログラムを実行する

F5 キーを押して、アプリをリビルドし、プログラム全体を実行します。

出力には、Console.WriteLine からのメッセージに加え、クエリの情報と結果が表示されます。

リソースをクリーンアップする

独自のサブスクリプションを使用している場合は、プロジェクトの最後に、作成したリソースがまだ必要かどうかを確認してください。 リソースを実行したままにすると、お金がかかる場合があります。 リソースは個別に削除することも、リソース グループを削除してリソースのセット全体を削除することもできます。

ポータルの左側のナビゲーション ウィンドウにある [すべてのリソース] または [リソース グループ] リンクを使って、リソースを検索および管理できます。

次のステップ

このクイック スタートでは、既存のインデックスにセマンティック 優先度付けを呼び出す方法について説明しました。 次の手順として、独自のインデックスでセマンティック 優先度付けを試すことをお勧めします。 デモを続行する場合は、次のリンクを参照してください。