Creación de una consulta vectorial en Azure AI Search
En Búsqueda de Azure AI, si tiene un índice vectorial 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.
También puede usar el Explorador de búsqueda en Azure Portal.
Requisitos previos
Azure AI Search, en cualquier región y en cualquier nivel.
Un índice vectorial en Azure AI Search. Busque una sección de
vectorSearch
en el índice para confirmar un índice vectorial.Opcionalmente, agregue un vectorizador al índice para la conversión integrada de texto a vector o de imagen a vector durante las consultas.
Visual Studio Code con un cliente REST y datos de ejemplo si desea ejecutar estos ejemplos por su cuenta. Para empezar a trabajar con el cliente REST, consulte Inicio rápido: Azure AI Search mediante REST.
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.
Un segundo enfoque es mediante vectorización integrada, actualmente en versión preliminar pública, para que Azure AI Search controle las entradas y salidas de vectorización de consultas.
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.
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.
2024-07-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.vectorQueries.kind
se establece envector
para una matriz de vectores o se establece entext
si la entrada es una cadena y tiene un vectorizador.vectorQueries.vector
es una consulta (una representación vectorial de texto o una imagen).vectorQueries.weight
(opcional) especifica el peso relativo de cada consulta vectorial incluida en las operaciones de búsqueda (consulte Ponderación de vectores).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=2024-07-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",
"weight": 0.5,
"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 resultadosk
, suponiendo que existen al menosk
documentos, incluso si hay documentos con poca similitud, ya que el algoritmo encuentra cualquiera de losk
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áusulaselect
. Durante la ejecución de la consulta vectorial, la coincidencia se realiza solo en los datos vectoriales. Sin embargo, una respuesta puede incluir cualquier camporetrievable
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.
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=2024-07-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
En esta sección se muestra una consulta vectorial que invoca la vectorización integrada que convierte una consulta de texto o de una imagen en un vector. Se recomienda la API REST estable 2024-07-01, el Explorador de búsqueda o los paquetes más recientes del SDK de Azure para esta característica.
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.
El Explorador de búsqueda admite la vectorización integrada en el momento de la consulta. Si el índice contiene campos vectoriales y tiene un vectorizador, puede usar la conversión de texto a vector integrada.
Inicie sesión en Azure Portal con su cuenta de Azure y vaya al servicio de Azure AI Search.
En el menú de la izquierda, expanda Índices de administración> de búsqueda y seleccione el índice. El Explorador de búsqueda es la primera pestaña de la página de índice.
Compruebe Los perfiles de vector para confirmar que tiene un vectorizador.
En el Explorador de búsqueda, puede escribir una cadena de texto en la barra de búsqueda predeterminada en la vista de consulta. El vectorizador integrado convierte la cadena en un vector, realiza la búsqueda y devuelve resultados.
Como alternativa, puede seleccionar Ver>vista JSON para ver o modificar la consulta. Si los vectores están presentes, el Explorador de búsqueda configura automáticamente una consulta vectorial. Puede usar la vista JSON para seleccionar campos usados en la búsqueda y en la respuesta, agregar filtros o construir consultas más avanzadas como híbridas. Se proporciona un ejemplo de JSON en la pestaña API REST de esta sección.
Número 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).
Ponderación de vectores
Agregue un parámetro de consulta weight
para especificar los pesos relativos de cada consulta vectorial incluida en las operaciones de búsqueda. Este valor se usa al combinar los resultados de varias listas de clasificación generadas por dos o más consultas vectoriales en la misma solicitud, o desde la parte vectorial de una consulta híbrida.
El valor predeterminado es 1.0 y el valor debe ser un número positivo mayor que cero.
Los pesos se usan al calcular las puntuaciones de fusión de rango recíproca de cada documento. El cálculo es multiplicador del weight
valor con respecto a la puntuación de clasificación del documento dentro de su conjunto de resultados respectivo.
El ejemplo siguiente es una consulta híbrida con dos cadenas de consulta vectoriales y una cadena de texto. Los pesos se asignan a las consultas vectoriales. La primera consulta es 0,5 o la mitad del peso, lo que reduce su importancia en la solicitud. La segunda consulta vectorial es el doble de importante.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-07-01
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my_first_vector_field",
"k": 10,
"weight": 0.5
},
{
"kind": "vector",
"vector": [4.0, 5.0, 6.0],
"fields": "my_second_vector_field",
"k": 10,
"weight": 2.0
}
],
"search": "hello world"
}
La ponderación de vectores solo se aplica a los vectores. La consulta de texto de este ejemplo ("hola mundo") tiene un peso implícito de 1,0 o peso neutro. Sin embargo, en una consulta híbrida, puede aumentar o disminuir la importancia de los campos de texto estableciendo maxTextRecallSize.
Establezca límites para excluir los resultados con puntuaciones bajas (vista previa)
Dado que la búsqueda de vecino más próximo siempre devuelve los vecinos k
solicitados, es posible obtener varias coincidencias de puntuación baja como parte de cumplir el requisito de número de k
en los resultados de búsqueda. Para excluir el resultado de búsqueda de puntuación baja, puede agregar un threshold
parámetro de consulta que filtre los resultados en función de una puntuación mínima. El filtrado se produce antes de fusionar los resultados de diferentes conjuntos de recuperación.
Este parámetro todavía está en versión preliminar. Se recomienda la versión preliminar de la API REST 2024-05-01-preview.
En este ejemplo, todas las coincidencias con una puntuación inferior a 0,8 se excluyen de los resultados del vector de búsqueda, aunque el número de resultados sea inferior a k
.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my-cosine-field",
"threshold": {
"kind": "vectorSimilarity",
"value": 0.8
}
}
]
}
MaxTextSizeRecall para la búsqueda híbrida (vista previa)
Las consultas vectoriales se suelen usar en construcciones híbridas que incluyen campos no vectores. Si detecta que los resultados clasificados por BM25 están por encima o por debajo de representados en los resultados de una consulta híbrida, puede establecer maxTextRecallSize
para aumentar o reducir los resultados clasificados por BM25 proporcionados para la clasificación híbrida.
Solo puede establecer esta propiedad en solicitudes híbridas que incluyan componentes "search" y "vectorQueries".
Este parámetro todavía está en versión preliminar. Se recomienda la versión preliminar de la API REST 2024-05-01-preview.
Para obtener más información, vea Establecer maxTextRecallSize: Creación de una consulta híbrida.
Pasos siguientes
Como paso siguiente, revise los ejemplos de código de consulta vectorial en Python, C# o JavaScript.