自然言語理解でフィルタする

このページでは、自然言語理解を適用して検索クエリのフィルタを自動的に作成し、返される結果の品質を向上させる方法について説明します。

この機能は、構造化データストアに接続されている検索アプリで使用できます。

自然言語クエリの理解について

構造化データを含むカスタム検索アプリがある場合、ユーザーの自然言語クエリはフィルタされたクエリとして再フォーマットできます。これにより、クエリ文字列内の単語を検索するよりも質の高い検索結果が得られる可能性があります。

たとえば、"Find a coffee shop serving banana bread" などの自然言語クエリは、クエリとフィルタ "query": "banana bread", "filter": "type": ANY(\"cafe\") として再定義されることがあります。

自然言語クエリの理解を使用する方が、独自のフィルタ式を作成するよりも簡単で柔軟です。フィルタ式を作成する方法については、構造化データまたは非構造化データのカスタム検索をフィルタするをご覧ください。

ハードフィルタとソフトフィルタ

自然言語クエリ理解に適用できるフィルタには、ハードとソフトの 2 種類があります。

  • ハード。デフォルトでは、抽出されたフィルタは、結果が返されるために満たす必要のある必須条件として適用されます。

    動作は、SearchRequest メッセージの filter フィールドに似ています。

  • ソフト。ハードフィルタの代わりに、検索結果にブーストを適用することもできます。ブーストされた結果が返される可能性が高くなりますが、ブースト条件を満たさない結果も返される可能性があります。

    動作は、SearchRequest メッセージの boost_spec フィールドに似ています。

両方のタイプのフィルタを試すことができます。検索結果が十分に返されない場合は、ハード フィルタではなくソフト フィルタを試してください。

ソフト フィルタを適用する方法については、下記のソフト フィルタで検索するをご覧ください。

この機能は、例で説明するのが最適です。

例: クエリからのフィールド抽出(ハードフィルタ)

この自然言語クエリ理解機能は、ホテルの検索の例で説明されています。

ホテル サイトの構造化データストアに対して行われた次のクエリを考えてみましょう。「1 泊 300 未満で、4 つ星以上の子供連れ向けホテルを探してください。犬を連れて行きたいですし、無料 Wi-Fi が必要です。」

自然言語クエリの理解がない場合、検索アプリはクエリ内の単語を含むドキュメントを検索します。

自然言語クエリの理解と適切に構造化されたデータにより、クエリ内の自然言語の一部をフィルタに置き換えることで、検索の効率性が向上します。 構造化データに star_rating(数値)、price(数値)、amenities(文字列)のフィールドがある場合、クエリは次のフィルタを含むように作成できます。

   {
       "star_rating": >=4,
       "price": <=300,
       "amenities": "Wifi", "Pets Allowed"
   }

例: 位置情報フィルタ(ハードフィルタ)を使用する場合

この例は前の例と似ていますが、位置情報フィルタが含まれている点が異なります。これは、抽出されたフィルタの特殊な種類です。Vertex AI Search には、クエリ内の場所を認識し、その場所の近接フィルタを作成する機能があります。

州全体のビジネス サイトに対して行われた次のクエリを考えてみましょう。「サンフランシスコにある、4 つ星以上のシックでスタイリッシュなホテルを探してください。」

自然言語クエリの理解と位置情報フィルタにより、検索は、サンフランシスコから半径 10 km 以内にある 4 つ星以上のホテルを対象とする次のフィルタを含むように再定義されます。

   {
       "star_rating": >=4,
       "location": GEO_DISTANCE(\"San Francisco, CA\", 10000)
   }

この例では、GEO_DISTANCE は住所ですが、元のクエリに住所が含まれていても、他のクエリでは緯度と経度として記述されることがあります。

例: クエリからのフィールド抽出(ソフトフィルタ)

この自然言語クエリ理解機能は、ホテルの検索の例で説明されていますが、すべての条件を満たしていない結果も表示されます。

旅行サイトに対して行われた次のクエリを考えてみましょう。「1 泊 300 未満で、4 つ星以上の子供連れ向けホテルを探してください。犬を連れて行きたいです。」

自然言語クエリの理解と適切に構造化されたデータにより、クエリ内の自然言語の一部をソフトフィルタに置き換えることで、検索の効率性が向上します。構造化データに star_rating(数値)、price(数値)、amenities(文字列)のフィールドがある場合、クエリは次のブーストとして書き換えることができます。

自然言語クエリから抽出されたブースト条件:

{
  "boostSpec": {
    "conditionBoostSpecs": {
      "condition": "(star_rating >= 4.5) AND (price < 200) AND ANY(amenities, \"Pets Allowed\")",
      "boost": 0.7
    }
  }
}

この場合、評価の低いホテルやペット不可のホテルが返されることがあります。

制限事項

自然言語クエリの理解には次の制限が適用されます。

  • 自然言語クエリの理解は、統合検索アプリには適用できません。統合検索アプリで自然言語クエリの理解を使用すると、エラーが発生します。

  • 自然言語クエリの理解は、構造化データストアを使用するカスタム検索アプリでのみ機能します。

  • 自然言語クエリの理解を使用するとレイテンシが増加するため、レイテンシが問題になる場合は使用しないことを選択できます。

  • 位置情報の場合は、場所を明示的に記述する必要があります。「近くの」や「自宅」などの位置情報は使用できません。

  • 位置情報の半径は 10 km で、構成できません。

  • ブール値フィールドはフィルタでは使用できません。たとえば、クエリが「禁煙のホテルの部屋を探して」の場合、"non_smoking": true などのブール値フィールドは役に立ちませんが、"non_smoking": "YES" などの文字列フィールドはフィルタの一部として使用できます。

始める前に

自然言語クエリの理解の使用を開始する前に、使用する予定のアプリに接続されている構造化データストアで有効にする必要があります。

自然言語クエリの理解を有効にする手順は次のとおりです。

REST

  1. データストア ID を確認します。データストア ID がすでにある場合は、次のステップに進みます。

    1. Google Cloud コンソールで、[AI アプリケーション] ページに移動し、ナビゲーション メニューで [データストア] をクリックします。

      [データストア] ページに移動

    2. データストアの名前をクリックします。

    3. データストアの [データ] ページで、データストア ID を取得します。

  2. 次の curl コマンドを実行します。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID?update_mask=natural_language_query_understanding_config.mode" \
    -d '{
          "naturalLanguageQueryUnderstandingConfig": {
            "mode": "ENABLED"
          }
        }'
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • DATA_STORE_ID: Vertex AI Search データストアの ID。
  3. データストアごとに手順 1 と 2 を繰り返します。

  4. 約 24 時間待ちます。

    データストアの準備が整う前に自然言語クエリの理解を使用しようとすると、filterExtractionConditionDISABLED に設定されている場合と同じレスポンスが返されます。

検索、自然言語クエリをフィルタに変換する

自然言語のクエリで検索し、自然言語クエリ用に最適化された結果を取得する手順は次のとおりです。

REST

  1. 次の curl コマンドを実行します。このコマンドは search メソッドを呼び出します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
      -d '{
            "query": "QUERY",
            "naturalLanguageQueryUnderstandingSpec": {
              "filterExtractionCondition": "ENABLED"
            }
          }'
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • APP_ID: クエリする Vertex AI Search アプリの ID。アプリは、構造化データを含むデータストアに接続されている必要があります。統合検索アプリは使用できません。
    • QUERY: 自然言語で記述されたクエリ。

検索。クエリ内の位置情報を位置情報フィルタに変換します

自然言語のクエリで検索し、自然言語クエリに最適化された結果(場所の近接性など)を取得するには、次の操作を行います。

REST

  1. 次の curl コマンドを実行します。このコマンドは search メソッドを呼び出します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
      -d '{
            "query": "QUERY",
            "naturalLanguageQueryUnderstandingSpec": {
              "filterExtractionCondition": "ENABLED",
              "geoSearchQueryDetectionFieldNames": ["GEO_FIELD_NAME_1", "GEO_FIELD_NAME_N"]"
            }
          }'
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • APP_ID: クエリする Vertex AI Search アプリの ID。アプリは、構造化データを含むデータストアに接続されている必要があります。統合検索アプリは使用できません。
    • QUERY: 自然言語で記述されたクエリ。
    • GEO_FIELD_NAME_1, GEO_FIELD_NAME_N: geolocation 型の値のリスト。値の型が geolocation でない場合、このフィールドは無視されます。

ソフト フィルタで検索する

ソフト フィルタを適用する手順は次のとおりです。

REST

  1. アプリ ID を調べます。アプリ ID をすでに保有している場合は、次のステップに進みます。

    1. Google Cloud コンソールで、[AI Applications] ページに移動します。

      [アプリ] に移動

    2. [アプリ] ページで、アプリの名前を見つけ、[ID] 列からアプリの ID を取得します。

  2. 次の curl コマンドを実行します。このコマンドは search メソッドを呼び出します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
      -d '{
            "query": "QUERY",
            "naturalLanguageQueryUnderstandingSpec": {
              "filterExtractionCondition": "ENABLED",
              "extractedFilterBehavior": "SOFT_BOOST"
            }
          }'
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • APP_ID: 検索アプリの ID。アプリは、構造化データを含むデータストアに接続されている必要があります。統合検索アプリは使用できません。
    • QUERY: 自然言語のクエリ。

自然言語クエリのフィールドを指定する

自然言語クエリ理解でフィールドをフィルタとして使用するには、スキーマでインデックス登録可能としてマークされている必要があります。(スキーマの表示と編集に関する一般的な情報については、スキーマを更新するをご覧ください)。

Vertex AI Search は、スキーマ内のインデックス登録可能なフィールドのうち、自然言語クエリ理解フィルタで使用するのに適したフィールドを特定します。ただし、不要なフィールドが含まれている場合は、使用できるフィールドを指定する許可リストを作成する必要があります。

ホテル予約サイトを考えてみましょう。このサイトには、amenitiesidprice_per_nightratingroom_types などのフィールドがあります。このうち、id が文字と数字の文字列である場合、Vertex AI Search は自然言語クエリの理解に使用されるフィールドから除外する可能性があります。

ただし、Vertex AI Search が除外する必要のあるフィールドを除外していないために、クエリ結果の品質が低い場合は、使用できるフィールドを指定する必要があります。たとえば、ホテル スキーマに renovation_status のフィールドがあり、顧客にとって有用ではなく、ホテル チェーンにとって都合の悪い情報が含まれている場合は、許可されるフィールドのリストから除外できます。

ホテルデータの構造化データストアのレコードの例。

{
  "title": "Miller-Jones",
  "rating": 1.7,
  "price_per_night": 115.16,
  "id": 2902,
    
  ],
  "amenities": [
    "Spa",
    "Parking",
    "Restaurant"
    
  ],
  "renovation_status": "Restaurant and spa renovation planned for 2027"
}

この例のフィールドに適した許可リストは ["amenities", "price_per_night", "rating", "title"] です。リストに renovation_status がありません。

検索の自然言語クエリ理解で使用できるフィールドの許可リストを指定するには、次の操作を行います。

REST

  1. アプリ ID を調べます。アプリ ID をすでに保有している場合は、次のステップに進みます。

    1. Google Cloud コンソールで、[AI Applications] ページに移動します。

      [アプリ] に移動

    2. [アプリ] ページで、アプリの名前を見つけ、[ID] 列からアプリの ID を取得します。

  2. 次の curl コマンドを実行します。このコマンドは search メソッドを呼び出します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
      -d '{
            "query": "QUERY",
            "naturalLanguageQueryUnderstandingSpec": {
              "allowedFieldNames": ["FIELD_1", "FIELD_2"],
        }
      }'
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • APP_ID: 検索アプリの ID。アプリは、構造化データを含むデータストアに接続されている必要があります。統合検索アプリは使用できません。
    • QUERY: 自然言語のクエリ。
    • FIELD_N: 自然言語クエリの理解に使用できるスキーマ内のインデックス可能なフィールド。