使用自然语言理解功能进行过滤

本页介绍了如何应用自然语言理解功能,自动为搜索查询创建过滤条件,从而提高返回结果的质量。

您可以将此功能与连接到结构化数据存储区的搜索应用搭配使用。

自然语言查询理解简介

如果您有一个使用结构化数据的自定义搜索应用,则可以将用户的自然语言查询重新格式化为过滤后的查询。与搜索查询字符串中的字词相比,这种方法可以提供质量更高的搜索结果。

例如,自然语言查询“"Find a coffee shop serving banana bread"”可能会重新表述为查询和过滤条件:"query": "banana bread", "filter": "type": ANY(\"cafe\")

与自行编写过滤表达式相比,使用自然语言查询理解功能更简单、更灵活。如需了解如何编写过滤表达式,请参阅过滤结构化或非结构化数据的自定义搜索结果

硬过滤条件和软过滤条件

您可以应用两种类型的过滤器来实现自然语言查询理解:过滤器和过滤器。

  • 困难。默认情况下,提取的过滤条件会作为强制性条件应用,结果必须满足这些条件才能返回。

    行为类似于 SearchRequest 消息中的 filter 字段。

  • 柔和。除了硬过滤条件之外,还可以对搜索结果应用加权。系统更有可能返回加权结果,但也会返回不符合加权条件的结果。

    行为类似于 SearchRequest 消息中的 boost_spec 字段。

您可以尝试使用这两种类型的过滤条件。如果搜索结果不够多,请尝试使用软过滤条件,而不是硬过滤条件。

如需详细了解如何应用软过滤条件,请参阅下文中的使用软过滤条件进行搜索

示例

此功能最好通过示例来解释:

示例:从查询中提取字段(硬过滤)

我们将通过搜索酒店的示例来介绍此自然语言查询理解功能。

以下是针对酒店网站的结构化数据存储区提出的查询: “帮我找一家至少四星级、每晚费用低于 300 美元、允许携带宠物狗入住且提供免费 Wi-Fi 的家庭友好型酒店。”

如果没有自然语言查询理解功能,搜索应用会查找包含查询中字词的文档。

借助自然语言查询理解功能和适当的结构化数据,系统可以通过将查询中的部分自然语言替换为过滤条件,从而提高搜索效率。 如果结构化数据包含 star_rating(数字)、price(数字)和 amenities(字符串)字段,则可以制定查询来包含以下过滤条件:

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

示例:使用地理位置过滤条件(硬过滤条件)

此示例与上一个示例类似,不同之处在于它包含一个地理定位过滤条件,这是一种特殊的提取过滤条件。Vertex AI Search 能够识别查询中的位置,并为这些位置创建邻近度过滤条件。

以向州级商家网站提出的以下查询为例:“帮我找一家至少 4 星级的时尚酒店,位于旧金山。”

借助自然语言查询理解功能和地理位置过滤条件,系统会将搜索重新表述为包含以下过滤条件,以搜索旧金山方圆 10 公里范围内至少评为 4 星级的酒店:

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

在此示例中,GEO_DISTANCE 是一个地址,但在其他查询中,即使原始查询包含地址,GEO_DISTANCE 也可能会写成纬度和经度。

示例:从查询中提取字段(软过滤)

此自然语言查询理解功能通过一个示例进行说明,该示例展示了搜索酒店但显示了一些不符合所有条件的搜索结果。

以向旅游网站提出的以下查询为例: “帮我找一家至少四星级、每晚费用低于 300 美元且允许我携带狗狗入住的酒店。”

借助自然语言查询理解功能和适当的结构化数据,系统会用软过滤条件替换查询中的部分自然语言,从而提高搜索效果。如果结构化数据包含 star_rating(数字)、price(数字)和 amenities(字符串)字段,则可以将查询重写为以下提升:

从自然语言查询中提取的提升条件:

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

在这种情况下,系统可能会返回一些评分较低的酒店或不允许携带宠物的酒店。

限制

以下限制适用于自然语言查询理解:

  • 自然语言查询理解功能无法应用于混合搜索应用。如果您尝试在混合搜索应用中使用自然语言查询理解功能,则会收到错误消息。

  • 自然语言查询理解功能仅适用于使用结构化数据存储区的自定义搜索应用。

  • 使用自然语言查询理解功能会增加延迟时间,因此如果延迟时间是个问题,您可能选择不使用此功能。

  • 对于地理位置信息,必须明确描述位置。您无法使用“我附近”或“家”等位置。

  • 地理位置的半径为 10 公里,且无法配置。

  • 布尔值字段不能用于过滤条件。例如,如果查询是“帮我找一间禁烟酒店客房”,那么布尔值字段(如 "non_smoking": true)就没用了,但字符串字段(如 "non_smoking": "YES")可以作为过滤条件的一部分。

准备工作

在开始使用自然语言查询理解功能之前,您必须为与您计划使用的应用相关联的结构化数据存储区启用该功能。

如需启用自然语言查询理解功能,请按以下步骤操作:

REST

  1. 查找您的数据存储区 ID。如果您已有数据存储区 ID,请跳至下一步。

    1. 在 Google Cloud 控制台中,前往 AI Applications 页面,然后在导航菜单中点击数据存储区

      前往“数据存储区”页面

    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 小时。

    如果您尝试在数据存储区准备就绪之前使用自然语言查询理解,则收到的响应与将 filterExtractionCondition 设置为 DISABLED 时收到的响应相同。

搜索,将自然语言查询转换为过滤条件

如需使用自然语言查询进行搜索并获得针对自然语言查询优化的结果,请执行以下操作:

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:架构中可用于自然语言查询理解的可编入索引的字段。