このページでは、自然言語理解を適用して検索クエリのフィルタを自動的に作成し、返される結果の品質を向上させる方法について説明します。
この機能は、構造化データストアに接続されている検索アプリで使用できます。
自然言語クエリの理解について
構造化データを含むカスタム検索アプリがある場合、ユーザーの自然言語クエリはフィルタされたクエリとして再フォーマットできます。これにより、クエリ文字列内の単語を検索するよりも検索結果の品質が向上します。
たとえば、"Find a coffee shop serving
banana bread" などの自然言語クエリは、
"query": "banana bread", "filter": "type": ANY(\"cafe\") というクエリとフィルタとして再フォーマットできます。
自然言語クエリの理解を使用すると、独自のフィルタ式を作成するよりも簡単で柔軟になります。フィルタ式の作成については、 構造化データまたは非構造化データのカスタム検索をフィルタするをご覧ください。
ハードフィルタとソフトフィルタ
自然言語クエリの理解に適用できるフィルタには、ハード フィルタとソフトフィルタの 2 種類があります。
ハード 。デフォルトでは、抽出されたフィルタは、結果が返されるために満たす必要のある必須条件として適用されます。
動作は、
filterフィールドが 検索リクエストに似ています。ソフト 。ハードフィルタの代わりに、検索結果にブーストを適用することもできます。ブーストされた結果が返される可能性が高くなりますが、ブースト条件を満たさない結果も返される可能性があります。
動作は、
boostSpecフィールドが 検索リクエストに似ています。
どちらのタイプのフィルタも試すことができます。検索で十分な結果が返されない場合は、ハードフィルタではなくソフトフィルタを試してください。
ソフトフィルタを適用する方法について詳しくは、下記のソフト フィルタで検索するをご覧ください。
例
この機能は、例で説明するのが最適です。
例: クエリからのフィールド抽出(ハードフィルタ)では、 クエリから抽出されたフィールド フィルタを示します。
例: 位置情報フィルタ(ハードフィルタ)では、 位置情報フィルタの特殊なケースについて説明します。
例: クエリからのフィールド抽出(ソフトフィルタ) では、統合アプリに対して行われたクエリから抽出されたソフトフィルタを示します。
例: クエリからのフィールド抽出(ハードフィルタ)
この自然言語クエリ理解機能は、ホテルの検索の例で説明されています。
ホテル サイトの構造化データストアに対して行われた次のクエリを考えてみましょう。「1 泊 300 未満で、4 つ星以上の子供連れ向けホテルを探してください。犬を連れて行きたいですし、無料 Wi-Fi が必要です。」
自然言語クエリの理解がない場合、検索アプリはクエリ内の単語を含むドキュメントを探します。
自然言語クエリの理解と適切に構造化されたデータにより、クエリ内の自然言語の一部をフィルタに置き換えることで、検索の効率性が向上します。構造化データに star_rating(数値)、price(数値)、amenities(文字列)のフィールドがある場合、クエリは次のフィルタを含むように作成できます。
{
"star_rating": >=4,
"price": <=300,
"amenities": "Wifi", "Pets Allowed"
}
例: 位置情報フィルタ(ハードフィルタ)
この例は、抽出されたフィルタの特殊な種類である位置情報フィルタが含まれている点を除いて、前の例と似ています。 Agent Search には、クエリ内の場所を認識し、その場所の近接フィルタを作成する機能があります。
州全体のビジネス サイトに対して行われた次のクエリを考えてみましょう。 「サンフランシスコにある、4 つ星以上のシックでスタイリッシュなホテルを探してください。」
自然言語クエリの理解と位置情報フィルタにより、検索は、4 つ星以上の評価でサンフランシスコから 10 km 以内のホテルに対する次のフィルタを含むように再定義されます。
{
"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
}
}
}
この場合、評価の低いホテルやペット不可のホテルが返される可能性があります。
ブーストの強度は、ドキュメントが一致する構造化フィルタの数によって異なります。3 つの条件が抽出され、ドキュメントが 1 つの条件のみに一致する場合、ドキュメントには小さなブーストが適用されます。 一方、ドキュメントが 3 つの条件すべてに一致する場合は、強力なブーストが適用されます。
制限事項
自然言語クエリの理解には、次の制限が適用されます。
自然言語クエリの理解は、統合検索アプリには適用できません。統合検索アプリで自然言語クエリの理解を使用すると、エラーが発生します。
自然言語クエリの理解は、構造化データストアを使用するカスタム検索アプリでのみ機能します。
自然言語クエリの理解を使用するとレイテンシが増加するため、レイテンシが問題になる場合は使用しないことを選択できます。
位置情報の場合は、場所を明示的に記述する必要があります。「近く」や「自宅」などの場所は使用できません。
位置情報の半径は 10 km で、構成できません。
ブール値フィールドはフィルタで使用できません。たとえば、クエリが「禁煙のホテルを探してください」の場合、
"non_smoking": trueのようなブール値フィールドは役に立ちませんが、"non_smoking": "YES"のような文字列フィールドはフィルタの一部にできます。
始める前に
自然言語クエリの理解の使用を開始する前に、使用する予定のアプリに接続されている構造化データストアで有効にする必要があります。
自然言語クエリの理解を有効にする手順は次のとおりです。
REST
データストア ID を確認します。データストア ID がすでにある場合は、次のステップに進みます。
コンソールで、[**AI アプリケーション**] ページに移動し、ナビゲーション メニューで [**データストア**] をクリックします。 Google Cloud
データストアの名前をクリックします。
データストアの [データ] ページで、データストア ID を取得します。
次の 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/v1/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: Agent Search データストアの ID。
データストアごとにステップ 1 と 2 を繰り返します。
約 24 時間待ちます。
データストアの準備が整う前に自然言語クエリの理解を使用しようとすると、
filterExtractionConditionがDISABLEDに設定されている場合と同じレスポンスが返されます。
自然言語クエリをフィルタに変換して検索する
自然言語のクエリで検索し、自然言語クエリに最適化された結果を取得するには、次の操作を行います。
REST
searchメソッドを呼び出す次の curl コマンドを実行します。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: クエリする Agent Search アプリの ID。アプリは、構造化データを含むデータストアに接続されている必要があります。統合検索アプリは 使用できません。QUERY: 自然言語で記述されたクエリ。
クエリ内の場所を位置情報フィルタに変換して検索する
自然言語のクエリで検索し、場所の近接性を含む自然言語クエリに最適化された結果を取得するには、次の操作を行います。
REST
searchメソッドを呼び出す次の curl コマンドを実行します。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: クエリする Agent Search アプリの ID。アプリは、構造化データを含むデータストアに接続されている必要があります。統合検索アプリは 使用できません。QUERY: 自然言語で記述されたクエリ。GEO_FIELD_NAME_1, GEO_FIELD_NAME_N: 型の値のリスト。geolocation値の型がgeolocationでない場合、このフィールドは無視されます。
ソフトフィルタで検索する
ソフトフィルタを適用するには、次の操作を行います。
REST
アプリ ID を調べます。アプリ ID をすでに保有している場合は、次のステップに進みます。
コンソールで、[AI アプリケーション] ページに移動します。 Google Cloud
[アプリ] ページで、アプリの名前を見つけ、[ID] 列からアプリの ID を取得します。
searchメソッドを呼び出す次の curl コマンドを実行します。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: 自然言語のクエリ。
自然言語クエリのフィールドを指定する
自然言語クエリの理解でフィールドをフィルタとして使用するには、スキーマでインデックス可能としてマークする必要があります。(スキーマの表示と編集に関する一般的な情報については、スキーマを更新するをご覧ください)。
Agent Search は、スキーマ内のインデックス可能なフィールドのうち、自然言語クエリの理解フィルタで使用するのに適したフィールドを判断します。ただし、不要なフィールドが含まれている場合は、使用できるフィールドを指定する許可リストを作成する必要があります。
ホテル予約サイトを考えてみましょう。amenities、id、price_per_night、rating、room_types などのフィールドがあります。このうち、id が文字と数字の文字列である場合、Agent Search は自然言語クエリの理解に使用されるフィールドから除外する可能性があります。
ただし、Agent 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
アプリ ID を調べます。アプリ ID をすでに保有している場合は、次のステップに進みます。
コンソールで、[AI アプリケーション] ページに移動します。 Google Cloud
[アプリ] ページで、アプリの名前を見つけ、[ID] 列からアプリの ID を取得します。
searchメソッドを呼び出す次の curl コマンドを実行します。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: 自然言語クエリの理解に使用できる スキーマ内のインデックス可能なフィールド。