Partager via


Réécrire des requêtes avec un classeur sémantique dans Recherche Azure AI (préversion)

Remarque

Cette fonctionnalité est actuellement disponible en préversion publique. Cette préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail de production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.

La réécriture de requête est le processus de transformation de la requête d’un utilisateur en une requête plus efficace, en y ajoutant plus de termes et en affinant les résultats de la recherche. Le service de recherche envoie la requête de recherche (ou une variante) à un modèle génératif qui génère d’autres requêtes.

La réécriture de requête améliore les résultats du classement sémantique en corrigeant les fautes de frappe ou d’orthographe dans les requêtes des utilisateurs, et en développant les requêtes avec des synonymes.

La recherche avec la réécriture des requêtes fonctionne comme suit :

  • La requête utilisateur est envoyée via la propriété search dans la requête.
  • Le service de recherche envoie la requête de recherche (ou une variante) à un modèle génératif qui génère d’autres requêtes.
  • Le service de recherche utilise la requête d’origine et les requêtes réécrites pour récupérer les résultats de la recherche.

La réécriture des requêtes est une fonctionnalité facultative. Sans réécriture de requête, le service de recherche utilise simplement la requête d’origine pour récupérer les résultats de la recherche.

Remarque

Les requêtes réécrites peuvent ne pas contenir tous les termes exacts de la requête d’origine. Ceci peut avoir un impact sur les résultats de la recherche si la requête était très spécifique et exigeait des correspondances exactes pour les identificateurs uniques ou les codes de produit.

Prérequis

  • Un service de recherche avec le niveau De base ou supérieur.

Remarque

La réécriture des requêtes est actuellement disponible dans les régions Europe Nord et Asie Sud-Est.

Important

Le classeur sémantique est actuellement requis pour la réécriture des requêtes.

  • Un index de recherche existant avec une configuration sémantique et du contenu de texte enrichi. Les exemples de ce guide utilisent les exemples de données hotels-sample-index pour illustrer la réécriture des requêtes. Vous pouvez utiliser vos propres données et index pour tester la réécriture des requêtes.

  • Vous avez besoin d’un client web qui prend en charge les requêtes d’API REST. Les exemples de ce guide ont été testés avec Visual Studio Code avec l’extension Client REST.

Conseil

Le contenu qui comprend des explications ou des définitions est le mieux adapté au classement sémantique.

Effectuer une requête de recherche avec des réécritures de requête

Dans cet exemple d’API REST, nous utilisons les Documents de recherche pour formuler la requête. Pour plus d’informations sur les propriétés de requête et de réponse, consultez la documentation de référence de l’API.

  1. Collez la requête suivante dans un client web en tant que modèle.

    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
    }
    
    • Vous remplacez search-service-name par le nom de votre service de recherche.

    • Vous remplacez hotels-sample-index par votre nom d’index s’il est différent.

    • Nous définissons « search » sur une requête de recherche en texte intégral. La propriété de recherche est requise pour la réécriture des requêtes, sauf si vous spécifiez des requêtes vectorielles. Si vous spécifiez des requêtes vectorielles, le texte « search » doit correspondre à la propriété "text" de l’objet "vectorQueries". Votre chaîne de recherche peut prendre en charge la syntaxe simple ou la syntaxe Lucene complète.

    • Nous définissons « semanticConfiguration » sur une configuration sémantique prédéfinie incorporée dans votre index.

    • Nous définissons « queryType » sur « semantic ». Nous devons définir « queryType » sur « semantic » ou inclure une propriété nonempty « semanticQuery » dans la requête. Le classement sémantique est requis pour la réécriture des requêtes.

    • Nous définissons « queryRewrites » sur « générative|count-5 » pour obtenir jusqu’à cinq réécritures de requête. Vous pouvez définir le nombre sur n’importe quelle valeur comprise entre 1 et 10.

    • Comme nous avons demandé des réécritures de requête en définissant la propriété « queryRewrites », nous devons définir « queryLanguage » sur la langue du texte de la recherche. Le service de recherche utilise la même langue pour les réécritures de requête. Dans cet exemple, nous utilisons « en-US ». Les paramètres régionaux pris en charge sont : en-AU, en-CA, en-GB, en-IN, en-US, ar-EG, ar-JO, ar-KW, ar-MA, ar-SA, bg-BG, bn-IN, ca-ES, cs-CZ, da-DK, de-DE, el-GR, es-ES, es-MX, et-EE, eu-ES, fa-AE, fi-FI, fr-CA, fr-FR, ga-IE, gl-ES, gu-IN, he-IL, hi-IN, hr-BA, hr-HR, hu-HU, hy-AM, id-ID, is-IS, it-IT, ja-JP, kn-IN, ko-KR, lt-LT, lv-LV, ml-IN, mr-IN, ms-BN, ms-MY, nb-NO, nl-BE, nl-NL, no-NO, pa-IN, pl-PL, pt-BR, pt-PT, ro-RO, ru-RU, sk-SK, sl-SL, sr-BA, sr-ME, sr-RS, sv-SE, ta-IN, te-IN, th-TH, tr-TR, uk-UA, ur-PK, vi-VN, zh-CN, zh-TW.

    • Nous définissons « debug » sur « queryRewrites » pour obtenir les réécritures de requête dans la réponse.

      Conseil

      Définissez "debug": "queryRewrites" seulement à des fins de test. Pour de meilleures performances, n’utilisez pas de débogage en production.

    • Nous définissons « top » sur 1 pour renvoyer uniquement le résultat de recherche supérieur.

  2. Envoyez la demande d’exécution de la requête et retournez les résultats.

Ensuite, nous évaluons les résultats de la recherche avec les réécritures de requête.

Évaluer la réponse

Voici un exemple de réponse qui inclut des réécritures de requête :

"@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
  }
]

Voici quelques points clés à noter :

  • Comme nous définissons la propriété « debug » sur « queryRewrites » pour les tests, la réponse inclut un objet @search.debug avec la requête d’entrée de texte et les réécritures de requête.
  • Étant donné que nous définissons la propriété « queryRewrites » sur « générative|count-5 », la réponse inclut jusqu’à cinq réécritures de requête.
  • La valeur "inputQuery" est la requête envoyée au modèle génératif pour la réécriture des requêtes. La requête d’entrée n’est pas toujours la même que la requête "search" de l’utilisateur.

Voici un exemple de réponse sans réécriture de requête.

"@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
  }
]

Requêtes vectorielles avec réécriture de requête

Vous pouvez inclure des requêtes vectorielles dans votre requête de recherche pour combiner la recherche de mots clés et la recherche vectorielle dans une seule requête et une réponse unifiée.

Voici un exemple de requête qui inclut une requête vectorielle avec des réécritures de requête. Nous modifions un exemple précédent pour inclure une requête vectorielle.

  • Nous ajoutons un objet « vectorQueries » à la requête. Cet objet inclut une requête vectorielle avec « kind » défini sur « text ».
  • La valeur « text » est identique à la valeur « search ». Ces valeurs doivent être identiques pour que la réécriture des requêtes fonctionne.
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
}

La réponse inclut les réécritures de requête pour la requête de texte et la requête vectorielle.

Tester les réécritures de requête avec débogage

Vous devez tester vos réécritures de requête pour vous assurer qu’elles fonctionnent comme prévu. Définissez la propriété "debug": "queryRewrites" dans votre demande de requête pour obtenir les réécritures de requête dans la réponse. La propriété "debug" est facultative pour les tests. Pour de meilleures performances, ne définissez pas cette propriété en production.

Raisons des réponses partielles

Vous pouvez observer que la réponse (de test) de débogage inclut un tableau vide pour les propriétés text.rewrites et vectors.

{
  "@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
}

Dans l'exemple précédent :

  • La réponse inclut une propriété @search.semanticPartialResponseReason avec la valeur « Transient ». Ce message signifie qu’au moins une des requêtes n’a pas pu être terminée.
  • La réponse inclut également une propriété @search.semanticQueryRewriteResultType avec la valeur « OriginalQueryOnly ». Ce message signifie que les réécritures de requête ne sont pas disponibles. Seule la requête d’origine est utilisée pour récupérer les résultats de la recherche.

Étapes suivantes

Le classement sémantique peut être utilisé dans des requêtes hybrides qui combinent la recherche par mot clé et la recherche vectorielle dans une seule requête et une réponse unifiée.