Creación de una consulta vectorial en Azure AI Search

En Búsqueda de Azure AI, si tiene campos vectoriales en un índice de búsqueda, en este artículo se explica cómo:

En este artículo se usa REST para ilustrarlo. Para ver ejemplos de código en otros lenguajes, consulte el repositorio de GitHub azure-search-vector-samples para soluciones de un extremo a otro que incluyen consultas vectoriales.

Requisitos previos

Sugerencia

Para determinar rápidamente si el índice tiene vectores, busque campos de tipo Collection(Edm.Single), con un atributo dimensions y una asignación de vectorSearchProfile.

Conversión de una entrada de cadena de consulta en un vector

Para consultar un campo vectorial, la propia consulta debe ser un vector. Un enfoque para convertir la cadena de consulta de texto de un usuario en su representación vectorial es llamar a una biblioteca o API de inserción en el código de la aplicación. Como procedimiento recomendado, use siempre los mismos modelos de inserción usados para generar inserciones en los documentos de origen.

Puede encontrar ejemplos de código que muestran cómo generar inserciones en el repositorio azure-search-vector-samples.

Este es un ejemplo de API de REST de una cadena de consulta enviada a una implementación de un modelo de inserción de Azure OpenAI:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

La respuesta esperada es 202 para una llamada correcta al modelo implementado. El campo "inserción" en el cuerpo de la respuesta es la representación vectorial de la cadena de consulta "entrada". Con fines de prueba, copiaría el valor de la matriz de "inserción" en "vectorQueries.vector" en una solicitud de consulta, mediante la sintaxis que se muestra en las siguientes secciones.

La respuesta real de esta llamada POST al modelo implementado incluye 1536 inserciones, recortadas aquí a solo los primeros vectores para mejorar la legibilidad.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

En este enfoque, el código de la aplicación es responsable de conectarse a un modelo, generar inserciones y controlar la respuesta.

Sugerencia

Pruebe Consulta con vectorización integrada, actualmente en versión preliminar pública, para que Búsqueda de Azure AI controle las entradas y salidas de vectorización de consultas.

Solicitud de consulta vectorial

En esta sección se muestra la estructura básica de una consulta vectorial. Puede usar Azure Portal, las API de REST o los SDK de Azure para formular una consulta vectorial. Si migra desde 2023-07-01-Preview, hay cambios importantes. Consulte Actualización a la API de REST más reciente para obtener más información.

2023-11-01 es la versión estable de la API de REST para Search POST. Esta versión admite:

  • vectorQueries es la construcción para vector de búsqueda.
  • kind establecido en vector especifica que la consulta es una matriz vectorial.
  • vector es una consulta (una representación vectorial de texto o una imagen).
  • exhaustive (opcional) invoca el KNN exhaustivo en el momento de la consulta, incluso si el campo está indexado para HNSW.

En el ejemplo siguiente, el vector es una representación de esta cadena: "qué servicios de Azure admiten la búsqueda de texto completo". La consulta tiene como destino el campo contentVector. La consulta devuelve k resultados. El vector real tiene 1 536 incrustaciones, por lo que se recorta en este ejemplo para mejorar la legibilidad.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Respuesta de consulta vectorial

En Búsqueda de Azure AI, las respuestas de consulta constan de todos los campos retrievable de forma predeterminada. Sin embargo, es habitual limitar los resultados de búsqueda a un subconjunto de campos retrievable al enumerarlos en una instrucción select.

En una consulta vectorial, considere detenidamente si necesita campos vectoriales en una respuesta. Los campos vectoriales no son legibles por el usuario, por lo que si está insertando una respuesta a una página web, debe elegir campos no vectoriales que sean representativos del resultado. Por ejemplo, si la consulta se ejecuta en contentVector, podría devolver content en su lugar.

Si desea campos vectoriales en el resultado, este es un ejemplo de la estructura de respuesta. contentVector es una matriz de cadenas de inserciones, recortada aquí para mayor brevedad. La puntuación de búsqueda indica relevancia. Se incluyen otros campos no vectoriales para el contexto.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Puntos clave:

  • k determina cuántos resultados vecinos más cercanos se devuelven, en este caso, tres. Las consultas vectoriales siempre devuelven resultados k, suponiendo que existen al menos k documentos, incluso si hay documentos con poca similitud, ya que el algoritmo encuentra cualquiera de los k vecinos más próximos al vector de consulta.

  • @search.score viene determinado por el algoritmo de vector de búsqueda.

  • Los campos de los resultados de la búsqueda son todos campos retrievable o campos de una cláusula select. Durante la ejecución de la consulta vectorial, la coincidencia se realiza solo en los datos vectoriales. Sin embargo, una respuesta puede incluir cualquier campo retrievable en un índice. Dado que no hay ninguna facilidad para descodificar un resultado de campo vectorial, la inclusión de campos de texto no vectoriales es útil para sus valores legibles por humanos.

Consulta vectorial con filtro

Una solicitud de consulta puede incluir una consulta vectorial y una expresión defiltro. Los filtros se aplican a campos numéricos y de texto filterable, y son útiles para incluir o excluir documentos de búsqueda en función de los criterios de filtro. Aunque un campo vectorial no se puede filtrar por sí mismo, una consulta puede especificar filtros en otros campos del mismo índice.

En versiones más recientes de la API, puede establecer un modo de filtro para aplicar filtros antes o después de la ejecución de consultas vectoriales. Para obtener una comparación de cada modo y el rendimiento esperado en función del tamaño del índice, consulte Filtros en consultas vectoriales.

Sugerencia

Si no tiene campos de origen con valores numéricos o de texto, compruebe si hay metadatos de documento, como las propiedades LastModified o CreatedBy, que podrían resultar útiles en un filtro de metadatos.

2023-11-01 es la versión estable de esta API. Tiene:

  • vectorFilterMode para los modos de filtrado prefiltro (predeterminado) o postfiltro.
  • filter proporciona los criterios.

En el ejemplo siguiente, el vector es una representación de esta cadena de consulta: "qué servicios de Azure admiten la búsqueda de texto completo". La consulta tiene como destino el campo contentVector. El vector real tiene 1 536 incrustaciones, por lo que se recorta en este ejemplo para mejorar la legibilidad.

Los criterios de filtro se aplican a un campo de texto filtrable (category en este ejemplo) antes de que el motor de búsqueda ejecute la consulta vectorial.

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}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Varios campos vectoriales

Puede establecer la propiedad "vectorQueries.fields" en varios campos vectoriales. La consulta vectorial se ejecuta en cada campo vectorial que proporcione en la lista de fields. Al consultar varios campos vectoriales, asegúrese de que cada uno contiene inserciones del mismo modelo de inserción y de que la consulta también se genera a partir del mismo modelo de inserción.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Consultas de varios vectores

El vector de búsqueda de varias consultas envía varias consultas a través de varios campos vectoriales en el índice de búsqueda. Un ejemplo común de esta solicitud de consulta es cuando se usan modelos como CLIP para un vector de búsqueda multimodal en el que el mismo modelo puede vectorizar contenidos con imágenes y texto.

El siguiente ejemplo de consulta busca similitud en myImageVector y myTextVector, pero envía dos inserciones de consulta diferentes respectivamente, las cuales se ejecutan en paralelo. Esta consulta genera un resultado puntuado mediante la Fusión de clasificación recíproca (RRF).

  • vectorQueries proporciona una matriz de consultas vectoriales.
  • vector contiene los vectores de imagen y los vectores de texto en el índice de búsqueda. Cada instancia es una consulta independiente.
  • fields especifica el campo vectorial que se va a establecer como destino.
  • k es el número de coincidencias de vecino más próximo que se van a incluir en los resultados.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Los resultados de la búsqueda incluirían una combinación de texto e imágenes, suponiendo que el índice de búsqueda incluye un campo para el archivo de imagen (un índice de búsqueda no almacena imágenes).

Consulta con vectorización integrada (versión preliminar)

En esta sección se muestra una consulta vectorial que invoca la nueva característica de vectorización integrada de versión preliminar que convierte una consulta de texto en un vector. Use la API de REST2023-10-01-Preview o un paquete beta del SDK de Azure actualizado.

Un requisito previo es un índice de búsqueda que tiene un vectorizador configurado y asignado a un campo vectorial. El vectorizador proporciona información de conexión a un modelo de inserción que se usa en el momento de la consulta.

Las consultas proporcionan cadenas de texto en lugar de vectores:

  • kind debe establecerse en text.
  • text debe tener una cadena de texto. Se pasa al vectorizador asignado al campo vectorial.
  • fields es el campo vectorial que se va a buscar.

Este es un ejemplo sencillo de una consulta que se vectoriza en el momento de la consulta. La cadena de texto se vectoriza y, a continuación, se usa para consultar el campo descriptionVector.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Esta es una consulta híbrida que usa la vectorización integrada de consultas de texto. Esta consulta incluye varios campos vectoriales de consulta, varios campos no vectoriales, un filtro y una clasificación semántica. De nuevo, las diferencias son el kind de consulta vectorial y la cadena text en lugar de vector.

En este ejemplo, el motor de búsqueda realiza tres llamadas de vectorización a los vectorizadores asignados a descriptionVector, synopsisVector y authorBioVector en el índice. Los vectores resultantes se usan para recuperar documentos en sus respectivos campos. El motor de búsqueda también ejecuta una búsqueda de palabras clave en la consulta search, "novela de misterio ambientada en Londres".

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

Los resultados puntuados de las cuatro consultas se fusionan mediante la clasificación de RRF. La clasificación semántica secundaria se invoca sobre los resultados de la búsqueda fusionada, pero solo sobre los searchFields, potenciando los resultados más alineados semánticamente con "search":"mystery novel set in London".

Nota:

Los vectorizadores se usan durante la indexación y la consulta. Si no necesita fragmentación y vectorización de datos en el índice, puede omitir pasos como la creación de un indizador, un conjunto de aptitudes y un origen de datos. En este escenario, el vectorizador solo se usa en el momento de la consulta para convertir una cadena de texto en una inserción.

Cantidad de resultados clasificados en una respuesta de consulta vectorial

Una consulta vectorial especifica el parámetro k, que determina cuántas coincidencias se devuelven en los resultados. El motor de búsqueda siempre devuelve un número k de coincidencias. Si k es mayor que el número de documentos del índice, el número de documentos determina el límite superior de lo que se puede devolver.

Si estás familiarizado con la búsqueda de texto completo, sabrás que no se obtienen cero resultados si el índice no contiene un término o frase. Sin embargo, en la búsqueda vectorial, la operación de búsqueda identifica los vecinos más próximos y siempre devolverá k resultados incluso si los vecinos más próximos no son tan similares. Por lo tanto, es posible obtener resultados para consultas sin sentido o que no se corresponden con el tema, especialmente si no usa avisos para establecer límites. Los resultados menos relevantes tienen una puntuación de similitud peor, pero siguen siendo los vectores "más próximos" si no hay nada más cerca. Por lo tanto, una respuesta sin resultados significativos todavía puede devolver k resultados, pero la puntuación de similitud de cada resultado sería baja.

Un enfoque híbrido que incluye la búsqueda de texto completo puede mitigar este problema. Otra mitigación consiste en establecer un umbral mínimo en la puntuación de búsqueda, pero solo si la consulta es una consulta de vector único puro. Las consultas híbridas no son propicias para los umbrales mínimos porque los rangos de RRF son mucho más pequeños y volátiles.

Los parámetros de consulta que afectan al recuento de resultados incluyen:

  • "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.

Algoritmos de clasificación usados en una consulta vectorial

La clasificación de los resultados se calcula mediante:

  • Métrica de similitud
  • Fusión de clasificación recíproca (RRF) si hay varios conjuntos de resultados de búsqueda.

Métrica de similitud

Métrica de similitud especificada en la sección de índice vectorSearch para una consulta de solo vector. Los valores válidos son cosine, euclidean y dotProduct.

Los modelos de inserción de Azure OpenAI usan similitud de coseno, por lo que si usa modelos de inserción de Azure OpenAI, cosine es la métrica recomendada. Otras métricas de clasificación admitidas incluyen euclidean y dotProduct.

Uso de RRF

Se crean varios conjuntos si la consulta tiene como destino varios campos vectoriales, ejecuta varias consultas vectoriales en paralelo o si la consulta es un híbrido de búsqueda de vectores y texto completo, con o sin clasificación semántica.

Durante la ejecución de la consulta, una consulta vectorial solo puede tener como destino un índice de vector interno. Así, para múltiples campos vectoriales y múltiples consultas vectoriales, el motor de búsqueda genera múltiples consultas que tienen como destino los respectivos índices vectoriales de cada campo. La salida es un conjunto de resultados clasificados para cada consulta, que se fusionan mediante RRF. Para obtener más información, consulte Puntuación de relevancia mediante la fusión de clasificación recíproca (RRF).

Pasos siguientes

Como paso siguiente, revise los ejemplos de código de consulta vectorial en Python, C# o JavaScript.