你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure AI 搜索中使用语义排序器重写查询(预览版)

注意

此功能目前处于公开预览状态。 此预览版没有附带服务级别协议,建议不要用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

查询重写是将用户的查询转换为更有效的查询、添加更多字词和优化搜索结果的过程。 搜索服务将搜索查询(或其变体)发送到生成替代查询的生成式模型。

查询重写通过更正用户查询中的错别字或拼写错误以及使用同义词扩展查询来提高语义排名的结果。

使用查询重写进行搜索的工作原理如下:

  • 通过请求中的 search 属性发送用户查询。
  • 搜索服务将搜索查询(或其变体)发送到生成替代查询的生成式模型。
  • 搜索服务使用原始查询和已重写的查询来检索搜索结果。

查询重写是一个可选功能。 如果不进行查询重写,搜索服务只能使用原始查询来检索搜索结果。

注意

重写的查询可能不包含原始查询的所有确切字词。 如果查询高度具体且需要与唯一标识符或产品代码完全匹配,则这可能会影响搜索结果。

先决条件

  • 基本层或更高层的搜索服务。

注意

查询重写功能目前已在欧洲北部和东南亚区域推出。

重要

目前,查询重写需要语义排序器。

  • 具有语义配置的现有搜索索引和富文本内容。 本指南中的示例使用 hotels-sample-index 示例数据来演示查询重写。 可以使用自己的数据和索引测试查询重写。

  • 需要支持 REST API 请求的 Web 客户端。 本指南中的示例使用 Visual Studio CodeREST Client 扩展进行测试。

提示

包含解释或定义的内容最适合用于语义排名。

使用查询重写发出搜索请求

在此 REST API 示例中,使用搜索文档表述请求。 有关请求和响应属性的详细信息,请参阅 API 参考文档

  1. 将以下请求作为模板粘贴到 Web 客户端中。

    POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-11-01-preview
    {
        "search": "newer hotel near the water with a great restaurant",
        "semanticConfiguration":"en-semantic-config",
        "queryType":"semantic",
        "queryRewrites":"generative|count-5",
        "queryLanguage":"en-US",
        "debug":"queryRewrites",
        "top": 1
    }
    
    • search-service-name 替换为搜索服务名称。

    • 如果不同,请将 hotels-sample-index 替换为索引名称。

    • 我们将“search”设置为全文搜索查询。 除非指定矢量查询,否则需要有搜索属性才能进行查询重写。 如果指定矢量查询,则“search”文本必须与 "vectorQueries" 对象的 "text" 属性匹配。 搜索字符串可支持简单语法,也可支持完整 Lucene 语法

    • 我们将“semanticConfiguration”设置为嵌入在索引中的预定义语义配置

    • 我们将“queryType”设置为“semantic”。 我们需要将“queryType”设置为“semantic”,或者在请求中包含非空的“semanticQuery”属性。 查询重写需要进行语义排名

    • 我们将“queryRewrites”设置为“generative|count-5”,以获取最多 5 次查询重写。 可以将计数设置为 1 到 10 的任意值。

    • 由于我们已通过设置“queryRewrites”属性请求查询重写,因此必须将“queryLanguage”设置为搜索文本语言。 搜索服务对查询重写使用相同的语言。 在此示例中,我们使用“en-US”。 支持的区域设置如下:en-AUen-CAen-GBen-INen-USar-EGar-JOar-KWar-MAar-SAbg-BGbn-INca-EScs-CZda-DKde-DEel-GRes-ESes-MXet-EEeu-ESfa-AEfi-FIfr-CAfr-FRga-IEgl-ESgu-INhe-ILhi-INhr-BAhr-HRhu-HUhy-AMid-IDis-ISit-ITja-JPkn-INko-KRlt-LTlv-LVml-INmr-INms-BNms-MYnb-NOnl-BEnl-NLno-NOpa-INpl-PLpt-BRpt-PTro-ROru-RUsk-SKsl-SLsr-BAsr-MEsr-RSsv-SEta-INte-INth-THtr-TRuk-UAur-PKvi-VNzh-CNzh-TW

    • 我们将“debug”设置为“queryRewrites”,以获取响应中的查询重写。

      提示

      设置 "debug": "queryRewrites" 仅用于测试目的。 为了提高性能,请勿在生产环境中进行调试。

    • 我们将“top”设置为“1”,以仅返回最靠前的搜索结果。

  2. 发送请求以执行查询并返回结果。

接下来,我们使用查询重写来评估搜索结果。

评估响应

下面是包含查询重写的响应的示例:

"@search.debug": {
  "semantic": null,
  "queryRewrites": {
    "text": {
      "inputQuery": "newer hotel near the water with a great restaurant",
      "rewrites": [
        "new waterfront hotels with top-rated eateries",
        "new waterfront hotels with top-rated restaurants",
        "new waterfront hotels with excellent dining",
        "new waterfront hotels with top-rated dining",
        "new water-side hotels with top-rated restaurants"
      ]
    },
    "vectors": []
  }
},
"value": [
  {
    "@search.score": 58.992092,
    "@search.rerankerScore": 2.815633535385132,
    "HotelId": "18",
    "HotelName": "Ocean Water Resort & Spa",
    "Description": "New Luxury Hotel for the vacation of a lifetime. Bay views from every room, location near the pier, rooftop pool, waterfront dining & more.",
    "Description_fr": "Nouvel h\u00f4tel de luxe pour des vacances inoubliables. Vue sur la baie depuis chaque chambre, emplacement pr\u00e8s de la jet\u00e9e, piscine sur le toit, restaurant au bord de l'eau et plus encore.",
    "Category": "Luxury",
    "Tags": [
      "view",
      "pool",
      "restaurant"
    ],
    "ParkingIncluded": true,
    "LastRenovationDate": "2020-11-14T00:00:00Z",
    "Rating": 4.2,
    "Location": {
      "type": "Point",
      "coordinates": [
        -82.537735,
        27.943701
      ],
      "crs": {
        "type": "name",
        "properties": {
          "name": "EPSG:4326"
        }
      }
    },
    //... more properties redacted for brevity
  }
]

下面是需要注意的一些要点:

  • 由于我们将“debug”属性设置为“queryRewrites”进行测试,因此响应包含一个具有文本输入查询和查询重写的 @search.debug 对象。
  • 由于我们将“queryRewrites”属性设置为“generative|count-5”,因此响应最多包括五次查询重写。
  • "inputQuery" 值是发送到生成式模型进行查询重写的查询。 输入查询并不总是与用户的 "search" 查询相同。

下面是不进行查询重写的响应的示例。

"@search.debug": {
  "semantic": null,
  "queryRewrites": {
    "text": {
      "inputQuery": "",
      "rewrites": []
    },
    "vectors": []
  }
},
"value": [
  {
    "@search.score": 7.774868,
    "@search.rerankerScore": 2.815633535385132,
    "HotelId": "18",
    "HotelName": "Ocean Water Resort & Spa",
    "Description": "New Luxury Hotel for the vacation of a lifetime. Bay views from every room, location near the pier, rooftop pool, waterfront dining & more.",
    "Description_fr": "Nouvel h\u00f4tel de luxe pour des vacances inoubliables. Vue sur la baie depuis chaque chambre, emplacement pr\u00e8s de la jet\u00e9e, piscine sur le toit, restaurant au bord de l'eau et plus encore.",
    "Category": "Luxury",
    "Tags": [
      "view",
      "pool",
      "restaurant"
    ],
    "ParkingIncluded": true,
    "LastRenovationDate": "2020-11-14T00:00:00Z",
    "Rating": 4.2,
    "Location": {
      "type": "Point",
      "coordinates": [
        -82.537735,
        27.943701
      ],
      "crs": {
        "type": "name",
        "properties": {
          "name": "EPSG:4326"
        }
      }
    },
    //... more properties redacted for brevity
  }
]

使用查询重写的矢量查询

可以在搜索请求中包含矢量查询,从而将关键字搜索和矢量搜索合并到单个请求和统一响应中。

下面是包含具有查询重写的矢量查询的查询示例。 我们修改了上一个示例以包含矢量查询。

  • 我们在请求中添加了一个“vectorQueries”对象。 此对象包括一个矢量查询,其中“kind”设置为“text”。
  • “text”值与“search”值相同。 若要使查询重写能够正常工作,这些值必须相同。
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-11-01-preview
{
    "search": "newer hotel near the water with a great restaurant",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "newer hotel near the water with a great restaurant",
            "k": 50,
            "fields": "Description",
            "queryRewrites": "generative|count-3"
        }
    ],
    "semanticConfiguration":"en-semantic-config",
    "queryType":"semantic",
    "queryRewrites":"generative|count-5",
    "queryLanguage":"en-US",
    "top": 1
}

响应包括文本查询和矢量查询的查询重写。

使用调试测试查询重写

应测试查询重写,以确保它们按预期方式正常运行。 在查询请求中设置 "debug": "queryRewrites" 属性,以获取响应中的查询重写。 进行测试时,设置 "debug" 是可选的。 为了提高性能,请勿在生产环境中设置此属性。

部分响应原因

你可能会发现调试(测试)响应包含 text.rewritesvectors 属性的空数组。

{
  "@odata.context": "https://demo-search-svc.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
  "@search.debug": {
    "semantic": null,
    "queryRewrites": {
      "text": {
        "rewrites": []
      },
      "vectors": []
    }
  },
  "@search.semanticPartialResponseReason": "Transient",
  "@search.semanticQueryRewriteResultType": "OriginalQueryOnly",
  //... more properties redacted for brevity
}

在上面的示例中:

  • 响应包含值为“Transient”的 @search.semanticPartialResponseReason 属性。 此消息表示至少有一个查询无法完成。
  • 响应还包含值为“OriginalQueryOnly”的 @search.semanticQueryRewriteResultType 属性。 此消息表示查询重写不可用。 仅使用原始查询来检索搜索结果。

后续步骤

语义排序可用于将关键字搜索和矢量搜索合并到单个请求和统一响应的混合查询。