Reescritura de consultas con el clasificador semántico en la Búsqueda de Azure AI (versión preliminar)
Nota:
Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se ofrece sin contrato de nivel de servicio y no es aconsejable usarla para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.
La reescritura de consultas es el proceso de transformar la consulta de un usuario en una más eficaz, agregando más términos y refinando los resultados de búsqueda. El servicio de búsqueda envía la consulta de búsqueda (o una variación de ella) a un modelo generativo que genera consultas alternativas.
La reescritura de consultas mejora los resultados de la clasificación semántica mediante la corrección de errores tipográficos o ortográficos en las consultas del usuario y la expansión de consultas con sinónimos.
La búsqueda con reescritura de consultas funciona de la siguiente manera:
- La consulta del usuario se envía a través de la propiedad
search
de la solicitud. - El servicio de búsqueda envía la consulta de búsqueda (o una variación de ella) a un modelo generativo que genera consultas alternativas.
- El servicio de búsqueda usa la consulta original y las consultas reescritas para recuperar los resultados de la búsqueda.
La reescritura de consultas es una característica opcional. Sin reescritura de consultas, el servicio de búsqueda solo usa la consulta original para recuperar los resultados de la búsqueda.
Nota:
Es posible que las consultas reescritas no contengan todos los términos exactos que tenía la consulta original. Esto podría afectar a los resultados de búsqueda si la consulta fuera muy específica y requiriera coincidencias exactas de identificadores únicos o códigos de producto.
Requisitos previos
- Un servicio de búsqueda, nivel Básico o superior.
Nota:
La reescritura de consultas está disponible actualmente en las regiones Norte de Europa y Sudeste de Asia.
- El servicio de búsqueda debe tener habilitado el clasificador semántico. Revisa el artículo Clasificación semántica si necesitas conocer los aspectos generales de esta característica.
Importante
El clasificador semántico es necesario actualmente para la reescritura de consultas.
Un índice de búsqueda existente con una configuración semántica y contenido de texto enriquecido. Los ejemplos de esta guía usan los datos de muestra hotels-sample-index para demostrar la reescritura de consultas. Puede usar sus propios datos e índices para probar la reescritura de consultas.
Necesita un cliente web que admita solicitudes de API de REST. Los ejemplos de esta guía se probaron en Visual Studio Code con la extensión de Cliente de REST.
Sugerencia
El contenido que incluye explicaciones o definiciones funciona mejor para la clasificación semántica.
Realización de una solicitud de búsqueda con reescrituras de consultas
En este ejemplo de API de REST, usamos Buscar documentos para formular la solicitud. Para más información sobre las propiedades de solicitud y respuesta, consulte la documentación de referencia de la API.
Pegue la solicitud siguiente en un cliente web como plantilla.
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 }
Reemplace
search-service-name
por el nombre de su servicio de búsqueda.Reemplace
hotels-sample-index
por el nombre de su índice si es diferente.Establecemos la "search" en una consulta de búsqueda de texto completo. La propiedad de búsqueda es necesaria para reescribir consultas, a menos que especifique consultas vectoriales. Si especifica consultas vectoriales, el texto de "search" debe coincidir con la propiedad
"text"
del objeto"vectorQueries"
. La cadena de búsqueda puede admitir la sintaxis simple o la sintaxis completa de Lucene.Establecemos "semanticConfiguration" en una configuración semántica predefinida insertada en el índice.
Establecemos "queryType" en "semantic". Es necesario establecer "queryType" en "semantic" o incluir una propiedad "semanticQuery" no vacía en la solicitud. La clasificación semántica es necesaria para la reescritura de consultas.
Establecemos "queryRewrites" en "generative|count-5" para obtener hasta cinco reescrituras de consulta. Puede establecer el recuento en cualquier valor entre 1 y 10.
Puesto que solicitamos reescrituras de consultas estableciendo la propiedad "queryRewrites", debemos establecer "queryLanguage" en el lenguaje de texto de búsqueda. El servicio Search usa el mismo lenguaje para las reescrituras de consulta. En este ejemplo, usamos "en-US". Las configuraciones regionales admitidas son:
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
.Establecemos "debug" en "queryRewrites" para obtener las reescrituras de la consulta en la respuesta.
Sugerencia
Solo se establece
"debug": "queryRewrites"
con fines de prueba. Para mejorar el rendimiento, no use la depuración en producción.Establecemos "top" en 1 para devolver solo el primer resultado de la búsqueda.
Envíe la solicitud para ejecutar la consulta y devolver los resultados.
A continuación, se evalúan los resultados de búsqueda con las reescrituras de la consulta.
Evaluación de la respuesta
Este es un ejemplo de una respuesta que incluye reescrituras de consultas:
"@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
}
]
Estos son algunos puntos clave que se deben tener en cuenta:
- Dado que establecemos la propiedad "debug" en "queryRewrites" para las pruebas, la respuesta incluye un objeto
@search.debug
con la consulta de entrada de texto y las reescrituras de consultas. - Dado que establecemos la propiedad "queryRewrites" en "generative|count-5", la respuesta incluye hasta cinco reescrituras de consulta.
- El valor de
"inputQuery"
es la consulta enviada al modelo generativo para la reescritura de consultas. La consulta de entrada no siempre es la misma que la consulta de"search"
del usuario.
Este es un ejemplo de una respuesta sin reescrituras de consulta.
"@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
}
]
Consultas vectoriales con reescritura de consultas
Puede incluir consultas vectoriales en la solicitud de búsqueda para combinar la búsqueda de palabras clave y el vector de búsqueda en una sola solicitud y una respuesta unificada.
Este es un ejemplo de una consulta que incluye una consulta vectorial con reescrituras de consulta. Modificamos un ejemplo anterior para incluir una consulta vectorial.
- Agregamos un objeto "vectorQueries" a la solicitud. Este objeto incluye una consulta vectorial con "kind" establecido en "text".
- El valor de "text" es el mismo que el valor de "search". Estos valores deben ser idénticos para que la reescritura de consultas funcione.
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 respuesta incluye reescrituras de consultas para la consulta de texto y la una consulta vectorial.
Prueba de reescrituras de consulta con depuración
Debería probar sus reescrituras de consultas para garantizar que funcionan como se espera. Establezca la propiedad "debug": "queryRewrites"
en la solicitud de consulta para obtener las reescrituras de la consulta en la respuesta. La configuración "debug"
es opcional con fines de prueba. Para mejorar el rendimiento, no establezca esta propiedad en producción.
Motivos de respuesta parcial
Es posible que observe que la respuesta de depuración (prueba) incluye una matriz vacía para las propiedades text.rewrites
y 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
}
En el ejemplo anterior:
- La respuesta incluye una propiedad
@search.semanticPartialResponseReason
con un valor de "Transient". Este mensaje significa que al menos una de las consultas no se pudo completar. - La respuesta también incluye una propiedad
@search.semanticQueryRewriteResultType
con un valor de "OriginalQueryOnly". Este mensaje significa que las reescrituras de consultas no están disponibles. Solo se usa la consulta original para recuperar los resultados de la búsqueda.
Pasos siguientes
La clasificación semántica se puede usar en consultas híbridas que combinan la búsqueda de palabras clave y el vector de búsqueda en una sola solicitud y una respuesta unificada.