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

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

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

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

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

独自のフィルタ式を記述するよりも、自然言語クエリの理解を使用するほうが簡単で柔軟です。フィルタ式の記述については、構造化データまたは非構造化データの一般的な検索をフィルタするをご覧ください。

この機能は例で説明するとわかりやすいです。

例: クエリからのフィールドの抽出

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

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

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

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

  • 自然言語クエリから抽出されたフィルタ:

    {
        "star_rating": ≥4,
        "price": ≤300,
        "amenities": "Wifi", "Pets Allowed"
    }
    
  • フィルタの抽出後に再定式化された残留クエリ:

    family-friendly

例: 位置情報フィルタを使用

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

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

自然言語クエリの理解と位置情報フィルタにより、検索はフィルタと残りのクエリとして再定義されます。

  • 自然言語クエリから抽出されたフィルタ。評価が 4 つ星以上で、サンフランシスコの半径 10 km 以内のもの:

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

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

  • フィルタの抽出後に再定式化された残留クエリ:

    chic and stylish in San Francisco

    位置情報フィルタが作成されても、地名は残留クエリに残ります。これは、star_rating などの他のフィルタとは異なります。

制限事項

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

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

  • 自然言語クエリの理解は、構造化データを使用している一般的な検索アプリで機能します。ただし、次の種類の構造化データでは、この機能の使用はおすすめしません。

    • メタデータを含む非構造化データ
    • 構造化データを含むウェブサイトのデータ

    通常、このような構造化データにはコンテンツではなく、コンテンツの性質に関する情報が含まれているため、この機能は良好な結果をもたらす可能性は低いです。

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

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

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

始める前に

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

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

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

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

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

    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。
    curl -X PATCH
    -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    -H "X-Goog-User-Project: my-project-123"
    "https://discoveryengine.googleapis.com/v1beta/projects/my-project-123/locations/global/collections/default_collection/dataStores/my-data-store?update_mask=natural_language_query_understanding_config.mode"
    -d '{
           "naturalLanguageQueryUnderstandingConfig": {
             "mode": "ENABLED"
           }
        }'
    
    { "name": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store", "displayName": "test_data_store", "industryVertical": "GENERIC", "createTime": "2024-07-10T18:50:01.673414Z", "solutionTypes": [ "SOLUTION_TYPE_SEARCH" ], "defaultSchemaId": "default_schema", "documentProcessingConfig": { "name": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/documentProcessingConfig", "defaultParsingConfig": { "digitalParsingConfig": {} } }, "servingConfigDataStore": {}, "naturalLanguageQueryUnderstandingConfig": { "mode": "ENABLED" } }
  3. データストアごとに手順 1 と 2 を繰り返します。

  4. 24 時間ほど待ちます。

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

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

自然言語でクエリを検索し、自然言語クエリ用に最適化された結果を取得するには、次の操作を行います。

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

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/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: クエリは自然言語で記述されています。
    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1beta/projects/123456
    /locations/global/collections/default_collection/engines/my-app/servingConfigs/default_search:search"
    -d '{
    "query": "Find me a family-friendly hotel with at least four stars that costs less than 300 a night, lets me bring my dog, and has free Wi-Fi.",
    "naturalLanguageQueryUnderstandingSpec": {
      "filterExtractionCondition": "ENABLED"}
    }'
    
    { "results": [ { "id": "b2617d862", "document": { "name": "projects/123456/locations/us/collections/default_collection/dataStores/my-data-store/branches/0/documents/b2617d862", ... } }, { "id": "a51841841", "document": { "name": "projects/123456/locations/us/collections/default_collection/dataStores/my-data-store/branches/0/documents/a51841841", ... } } ], "naturalLanguageQueryUnderstandingInfo": { "extractedFilters": "(amenities: ANY(\"Pets Allowed\") AND amenities: ANY(\"Wifi\") AND star_rating: >= 4 AND price: < 300)", "rewrittenQuery": "family-friendly", "extractedFilterStructured": { "expression": { "andExpr": { "expressions": [ { "numberConstraint": { "fieldName": "star_rating", "value": 4, "comparison": "GREATER_THAN_EQUALS", } }, { "numberConstraint": { "fieldName": "price", "value": 300, "comparison": "LESS_THAN", } }, { "stringConstraint": { "fieldName": "amenities", "any": ["Pets Allowed"] } }, { "stringConstraint": { "fieldName": "amenities", "any": ["Wifi"] } }, ] }

検索、クエリ内の場所を位置情報フィルタに変換

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

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

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/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 でない場合、このフィールドは無視されます。
    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1beta/projects/123456
    /locations/global/collections/default_collection/engines/my-app/servingConfigs/default_search:search"
    -d '{
    "query": "Find me a chic and stylish hotel with at least 4 stars that is in San Francisco.",
    "naturalLanguageQueryUnderstandingSpec": {
      "filterExtractionCondition": "ENABLED",
      "geoSearchQueryDetectionFieldNames": ["location"]}
    }'
    
    { "results": [ { "id": "b2617d862", "document": { "name": "projects/123456/locations/us/collections/default_collection/dataStores/my-data-store/branches/0/documents/b2617d862", ... } }, { "id": "a51841841", "document": { "name": "projects/123456/locations/us/collections/default_collection/dataStores/my-data-store/branches/0/documents/a51841841", ... } } ], "naturalLanguageQueryUnderstandingInfo": { "extractedFilters": "(star_rating: >= 4 AND GEO_DISTANCE("location", "San Francisco", 10000))", "rewrittenQuery": "chic and stylish", "extractedFilterStructured": { "expression": { "andExpr": { "expressions": [ { "numberConstraint": { "fieldName": "star_rating", "value": 4, "comparison": "GREATER_THAN_EQUALS", } }, { "geolocationConstraint": { "fieldName": "location", "address": "San Francisco", "radius_in_meters": 10000, } }, ] }