Creación de una consulta híbrida en Azure AI Search

La Búsqueda híbrida combina una o varias consultas de palabras clave con una o más consultas vectoriales en una sola solicitud de búsqueda. Las consultas se ejecutan en paralelo. Los resultados se combinan y se reordenan mediante las nuevas puntuaciones de búsqueda mediante la fusión de clasificación recíproca (RRF) para devolver un único conjunto de resultados clasificado.

En la mayoría de los casos, por pruebas de punto de referencia, las consultas híbridas con clasificación semántica devuelven los resultados más relevantes.

Para definir una consulta híbrida, use la API de REST 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, el explorador de búsqueda en Azure Portal o versiones más recientes de los SDK de Azure.

Requisitos previos

Ejecute una consulta híbrida en el Explorador de búsqueda

  1. En el Explorador de búsqueda, asegúrese de que la versión de la API sea 2023-10-01-preview o posterior.

  2. En Ver, seleccione vista JSON.

  3. Reemplace la plantilla de consulta predeterminada por una consulta híbrida, como la que comienza en la línea 539 del ejemplo de inicio rápido del vector. Por motivos de brevedad, el vector se trunca en este artículo.

    Una consulta híbrida tiene una consulta de texto especificada en search y una consulta vectorial especificada en vectorQueries.vector.

    La consulta de texto y la consulta vectorial deben ser equivalentes o al menos no entrar en conflicto. Si las consultas fueran diferentes, no se obtendrá la ventaja híbrida.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Seleccione Search.

Solicitud de consulta híbrida (API de REST)

Una consulta híbrida combina la búsqueda de texto y el vector de búsqueda, en la que el parámetro search toma una cadena de consulta y vectorQueries.vector toma la consulta vectorial. El motor de búsqueda ejecuta consultas de texto completo y vectores en paralelo. La unión de todas las coincidencias se evalúa por relevancia mediante la fusión de clasificación recíproca (RRF) y se devuelve un único conjunto de resultados en la respuesta.

Los resultados se devuelven en texto sin formato, incluyendo los vectores de los campos marcados como retrievable. Dado que los vectores numéricos no son útiles en los resultados de búsqueda, elija otros campos del índice como proxy para la coincidencia de vectores. Por ejemplo, si un índice tiene campos "descriptionVector" y "descriptionText", la consulta puede coincidir con "descriptionVector", pero el resultado de la búsqueda puede mostrar "descriptionText". Use el parámetro select para especificar solo campos legibles en los resultados.

En el ejemplo siguiente se muestra una configuración de consulta híbrida.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [{
        "vector": [
            -0.009154141,
            0.018708462,
            . . . 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "DescriptionVector",
        "kind": "vector",
        "exhaustive": true,
        "k": 10
    }],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": "10"
}

Puntos clave:

  • La cadena de consulta vectorial se especifica a través de la propiedad vectorQueries.vector. La consulta se ejecuta en el campo "DescriptionVector". Establezca kind en "vector" para indicar el tipo de consulta. Opcionalmente, establezca exhaustive en true para consultar el contenido completo del campo vectorial.

  • La búsqueda de palabras clave se especifica mediante la propiedad search. Se ejecuta en paralelo con la consulta vectorial.

  • k determina cuántas coincidencias de vecino más próximo se devuelven de la consulta vectorial y se proporcionan al clasificador de RRF.

  • top determina cuántas coincidencias se devuelven en la respuesta en total. En este ejemplo, la respuesta incluye 10 resultados, suponiendo que haya al menos 10 coincidencias en los resultados combinados.

Búsqueda híbrida con filtro

En este ejemplo, se agrega un filtro, que se aplica a los campos no vectoriales filterable del índice de búsqueda.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

Puntos clave:

  • Los filtros se aplican al contenido de los campos filtrables. En este ejemplo, el campo ParkingIncluded es un valor booleano y se marca como filterable en el esquema de índice.

  • En las consultas híbridas, los filtros se pueden aplicar antes de la ejecución de consultas para reducir la superficie de consulta o después de la ejecución de la consulta para recortar los resultados. "preFilter" es el valor predeterminado. Para usar postFilter, establezca el modo de procesamiento de filtros como se muestra en este ejemplo.

  • Cuando se posfiltran los resultados de la consulta, el número de resultados podría ser menor que el número superior n.

Suponiendo que habilitó la clasificación semántica y la definición de índice incluye una configuración semántica, formule una consulta que incluya el vector de búsqueda y la búsqueda de palabras clave con clasificación semántica sobre el conjunto de resultados combinado. Opcionalmente, agregue subtítulos y respuestas.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

Puntos clave:

  • La clasificación semántica acepta hasta 50 resultados de la respuesta combinada. Establezca "k" y "top" en 50 para la representación por igual de ambas consultas.

  • Se requieren "queryType" y "semanticConfiguration".

  • "captions" y "answers" son opcionales. Los valores se extraen del texto textual en los resultados. Solo se devuelve una respuesta si los resultados incluyen contenido que tiene las características de una respuesta a la consulta.

Búsqueda híbrida semántica con filtro

Esta es la última consulta de la colección. Es la misma consulta híbrida semántica que el ejemplo anterior, pero con un filtro.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

Puntos clave:

  • El modo de filtro puede afectar al número de resultados disponibles para el reclasificador semántico. Como procedimiento recomendado, es inteligente proporcionar al clasificador semántico el número máximo de documentos (50). Si los prefiltros o postfiltros son demasiado selectivos, es posible que no esté utilizando correctamente el clasificador semántico al proporcionarle menos de 50 documentos con los que trabajar.

  • El prefiltro se aplica antes de la ejecución de la consulta. Si el prefiltro redujese el área de búsqueda a 100 documentos, la consulta vectorial se ejecutará en el campo "DescriptionVector" para esos 100 documentos, devolviendo las mejores coincidencias k=50. Esos 50 documentos coincidentes pasan a RRF para obtener resultados combinados y, a continuación, al clasificador semántico.

  • El postfiltro se aplica después de la ejecución de la consulta. Si k=50 devuelve 50 coincidencias en el lado de la consulta vectorial, el filtro posterior se aplica a las 50 coincidencias, lo que reduce los resultados que cumplen los criterios de filtro y le deja con menos de 50 documentos para pasar al clasificador semántico.

Configuración de una respuesta de consulta

Al configurar la consulta híbrida, piense en la estructura de respuesta. La respuesta es un conjunto de filas planas. Los parámetros de la consulta determinan qué campos están en cada fila y cuántas filas están en la respuesta. El motor de búsqueda clasifica los documentos coincidentes y devuelve los resultados más relevantes.

Campos de una respuesta

Los resultados de la búsqueda se componen de campos retrievable del índice de búsqueda. Un resultado es:

  • Todos los campos retrievable (valor predeterminado de la API de REST).
  • Los campos se muestran explícitamente en un parámetro "select" de la consulta.

Los ejemplos de este artículo usaron una instrucción "select" para especificar campos de texto (no vectoriales) en la respuesta.

Nota:

Los vectores no están diseñados de forma inversa en texto legible para humanos, por lo que evite devolverlos en la respuesta. En su lugar, elija campos no vectoriales que sean representativos del documento de búsqueda. Por ejemplo, si la consulta tuviera como destino un campo "DescriptionVector", devuelva un campo de texto equivalente si tuviera uno ("Description") en la respuesta.

Número de resultados

Una consulta puede coincidir con cualquier número de documentos, tanto como con todos ellos si los criterios de búsqueda son débiles (por ejemplo, "buscar=*" para una consulta null). Dado que rara vez resulta práctico devolver resultados sin enlazar, debería especificar un máximo para la respuesta:

  • "k": n resultados para consultas de solo vector
  • "top": n resultados de consultas híbridas que incluyen un parámetro "search"

Tanto "k" como "top" son opcionales. Sin especificar, el número predeterminado de resultados en una respuesta es 50. Puede establecer "top" y "skip" en paginar por los demás resultados o cambiar el valor predeterminado.

Si usa la clasificación semántica, se recomienda establecer "k" y "top" en al menos 50. El clasificador semántico puede aceptar hasta 50 resultados. Al especificar 50 para cada consulta, se obtiene la misma representación de ambos subsistemas de búsqueda.

Clasificación

Se crean varios conjuntos para consultas híbridas, con o sin reordenación semántica opcional. La clasificación de los resultados se calcula mediante la fusión de clasificación recíproca (RRF).

En esta sección, compare las respuestas entre la búsqueda de vector único y la búsqueda híbrida simple para obtener el resultado superior. Los diferentes algoritmos de clasificación, la métrica de similitud de HNSW y la RRF en este caso, producen puntuaciones que tienen diferentes magnitudes. Este comportamiento es una característica del diseño de la aplicación. Las puntuaciones de RRF pueden parecer bastante bajas, incluso con una coincidencia de similitud alta. Las puntuaciones inferiores son una característica del algoritmo RRF. En una consulta híbrida con RRF, se incluye más de la recíproca de los documentos clasificados en los resultados, dada la puntuación relativamente más pequeña de los documentos clasificados de RRF, en lugar del vector de búsqueda puro.

Vector de búsqueda único: @search.score para resultados ordenados por similitud de coseno (función de distancia de similitud de vector predeterminada).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Búsqueda híbrida: @search.score para los resultados híbridos clasificados mediante la fusión de clasificación recíproca.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Pasos siguientes

Como siguiente paso, recomendamos revisar el código de demostración para Python, C# o JavaScript.