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

Búsqueda híbrida combina consultas de texto (palabra clave) y vectores en una sola solicitud de búsqueda. Todas las subconsultas de la solicitud se ejecutan en paralelo. Los resultados se combinan y se reordenan mediante nuevas puntuaciones de búsqueda, usando Fusion de clasificación recíproca (RRF) para devolver un conjunto de resultados unificado. En muchos casos, por pruebas comparativas, las consultas híbridas con clasificación semántica devuelven los resultados más relevantes.

En este artículo, aprenderá a:

  • Configuración de una solicitud básica
  • Formulación de consultas híbridas con más parámetros y filtros
  • Mejora de la relevancia mediante la clasificación semántica o los pesos de vector
  • Optimización de los comportamientos de consulta mediante el control de entradas de texto y vector

Nota:

Novedad de 2024-09-01-versión preliminar es la capacidad de dirigirse a filtros solo a las subconsultas vectoriales en una solicitud híbrida. Esto le proporciona más precisión sobre cómo se aplican los filtros. Para obtener más información, consulte los filtros de destino a subconsultas vectoriales en este artículo.

Requisitos previos

Elección de una API o herramienta

  • El Explorador de búsqueda en Azure Portal (admite la sintaxis de búsqueda de API estable y preliminar) tiene una vista JSON que le permite pegar una solicitud híbrida.

  • 2024-07-01 versión estable o una versión preliminar reciente de la API si usa características en versión preliminar como maxTextRecallSize y countAndFacetMode(versión preliminar).

    Para mejorar la legibilidad, se usan ejemplos de REST para explicar cómo funcionan las API. Puede usar un cliente REST como Visual Studio Code con la extensión REST para compilar consultas híbridas. Para obtener más información, consulte Inicio rápido: vector de búsqueda mediante las API de REST.

  • Paquetes estables o beta más recientes de los SDK de Azure (consulte los registros de cambios para la compatibilidad con características del SDK).

Configuración de una consulta híbrida en el Explorador de búsqueda

  1. En Explorador de búsqueda, asegúrese de que la versión de la API sea 2024-07-01 o una versión más reciente de la API en versión preliminar.

  2. En Ver, seleccione vista JSON para poder pegar una consulta vectorial.

  3. Reemplace la plantilla de consulta predeterminada por una consulta híbrida, como el ejemplo "Ejecutar una consulta híbrida" a partir de la línea 539 en el 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 pueden ser equivalentes o divergentes, pero es habitual que compartan la misma intención.

    {
        "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. Selecciona Search.

Sugerencia

Los resultados de la búsqueda son más fáciles de leer si oculta los vectores. En Opciones de consulta, active Ocultar valores vectoriales en los resultados de búsqueda.

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=2024-07-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
        },
        {
            "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=2024-07-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.

Búsqueda híbrida con filtros que tienen como destino subconsultas vectoriales (versión preliminar)

Con 2024-09-01-versión preliminar, puede invalidar un filtro global en la solicitud de búsqueda aplicando un filtro secundario que tenga como destino solo las subconsultas vectoriales en una solicitud híbrida.

Esta característica proporciona un control específico asegurándose de que los filtros solo influyen en los resultados de la vector de búsqueda, lo que deja los resultados de búsqueda basados en palabras clave no afectados.

El filtro de destino invalida completamente el filtro global, incluidos los filtros usados para el recorte de seguridad o la búsqueda geoespacial. En los casos en los que se requieren filtros globales, como el recorte de seguridad, debe incluir explícitamente estos filtros en el filtro de nivel superior y en cada filtro de nivel vectorial para garantizar que se apliquen de forma coherente la seguridad y otras restricciones.

Para aplicar filtros vectoriales de destino:

Este es un ejemplo de consulta híbrida que agrega una invalidación de filtro. El filtro global "Rating gt 3" se reemplaza en tiempo de ejecución por filterOvrride.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "filterOverride": "Address/City eq 'Seattle'",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City, Rating",
    "filter": "Rating gt 3"
    "debug": "vector",
    "top": 10
}

Suponiendo que habilitó el clasificador semántico 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=2024-07-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:

  • El clasificador semántico acepta hasta 50 resultados de la respuesta combinada.

  • 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=2024-07-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, lo que le deja con menos de 50 documentos para pasar al clasificador semántico.

Establecer maxTextRecallSize y countAndFacetMode (versión preliminar)

En esta sección se explica cómo ajustar las entradas a una consulta híbrida mediante el control de la cantidad de resultados clasificados por BM25 que fluyen al modelo de clasificación híbrida. El control de la entrada clasificada por BM25 proporciona más opciones para el ajuste de relevancia en escenarios híbridos.

Se recomienda la versión preliminar de la API REST 2024-05-01-preview.

Sugerencia

Otra opción que se debe tener en cuenta es una técnica complementaria o de reemplazo, es ponderación de vectores, lo que aumenta la importancia de las consultas vectoriales en la solicitud.

  1. Use Search - POST o Search - GET en 2024-05-01-preview para especificar estos parámetros.

  2. Agregue un objeto de parámetro de consulta hybridSearch para establecer el número máximo de documentos recuperados a través de los resultados clasificados por BM25 de una consulta híbrida. Tiene dos propiedades:

    • maxTextRecallSize especifica el número de resultados clasificados de BM25 que se van a proporcionar al clasificador de Fusión de clasificación recíproca (RRF) usando en consultas híbridas. El valor predeterminado es 1000. El máximo es de 10 000.

    • countAndFacetMode notifica los recuentos de los resultados clasificados por BM25 (y para facetas si los usa). El valor predeterminado es todos los documentos que coinciden con la consulta. Opcionalmente, puede definir el ámbito "count" en el maxTextRecallSize.

  3. Reduzca maxTextRecallSize si la búsqueda de similitud vectorial suele superar el rendimiento del lado de texto de la consulta híbrida.

  4. Genere maxTextRecallSize si tiene un índice grande y el valor predeterminado no captura un número suficiente de resultados. Con un conjunto de resultados de clasificación BM25 mayor, también puede establecer top, skip, y next para recuperar partes de esos resultados.

En los ejemplos REST siguientes se muestran dos casos de uso para establecer maxTextRecallSize.

En el primer ejemplo se reduce maxTextRecallSize a 100, lo que limita el lado de texto de la consulta híbrida a solo 100 documentos. También establece countAndFacetMode para incluir solo los resultados de maxTextRecallSize.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

El segundo ejemplo genera maxTextRecallSize a 5000. También usa top, skip y next para extraer resultados de grandes conjuntos de resultados. En este caso, la solicitud extrae los resultados clasificados de BM25 a partir de la posición 1 500 a 2 000 como contribución de la consulta de texto al conjunto de resultados compuesto de RRF.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

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, debe especificar un máximo para el respuesta general:

  • "top": n resultados para consultas de solo palabras clave (sin vector)
  • "k": n resultados para consultas de solo vector
  • "top": n resultados para consultas híbridas (con o sin semántica) 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.

Nota:

Si usa la búsqueda híbrida en la API 2024-05-01-versión preliminar, puede controlar el número de resultados de la consulta de palabras clave mediante maxTextRecallSize. Combine esto con un valor para "k" para controlar la representación de cada subsistema de búsqueda (palabra clave y vector).

Resultados del clasificador semántico

Nota:

El clasificador semántico puede aceptar hasta 50 resultados.

Si está utilizando el clasificador semántico en la versión 2024-05-01-preview de la API, es una buena práctica configurar «k» y «maxTextRecallSize» para que sumen al menos 50 en total. A continuación, puede restringir los resultados devueltos al usuario con el parámetro "top".

Si está usando el clasificador semántico en APIs anteriores haga lo siguiente:

  • si realiza la búsqueda de solo palabras clave (sin vector) establece "top" en 50
  • si la búsqueda híbrida establece "k" en 50, para asegurarse de que el clasificador semántico obtiene al menos 50 resultados.

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": "Swirling Currents 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": "Swirling Currents 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.