Relevancia en la búsqueda de vectores

Durante la ejecución de consultas vectoriales, el motor de búsqueda busca vectores similares para encontrar los mejores candidatos para devolver en los resultados de búsqueda. Dependiendo de cómo hayas indexado el contenido vectorial, la búsqueda de coincidencias pertinentes es exhaustiva o restringida a vecinos cercanos para un procesamiento más rápido. Una vez encontrados los candidatos, las métricas de similitud se usan para puntuar cada resultado en función de la intensidad de la coincidencia.

En este artículo se explican los algoritmos usados para determinar la relevancia y las métricas de similitud usadas para la puntuación. También ofrece sugerencias para mejorar la relevancia si los resultados de búsqueda no cumplen las expectativas.

Los algoritmos de vector de búsqueda incluyen el valor k vecinos más próximos (KNN) exhaustivo y el mundo pequeño navegable jerárquico (HNSW).

Solo se usan campos de vector marcados como searchable en el índice o como searchFields en la consulta para la búsqueda y la puntuación.

Cuándo usar KNN exhaustivo

KNN exhaustivo calcula las distancias entre todos los pares de puntos de datos y busca los k vecinos más próximos exactos para un punto de consulta. Está diseñado para escenarios en los que la recuperación alta es de suma importancia y los usuarios están dispuestos a aceptar las ventajas y desventajas en la latencia de las consultas. Dado que es de gran uso computacional, usa KNN exhaustivo para conjuntos de datos entre pequeños y medianos o cuando los requisitos de precisión superen las consideraciones de rendimiento de las consultas.

Un uso secundario es crear un conjunto de datos para evaluar la coincidencia aproximada del algoritmo vecino más próximo. KnN exhaustivo se puede usar para construir el conjunto verdadero principal de los vecinos más próximos.

Cuándo usar HNSW

Durante la indexación, HNSW crea estructuras de datos adicionales para una búsqueda más rápida, organizando puntos de datos en una estructura jerárquica de grafos. HNSW tiene varios parámetros de configuración que se pueden ajustar para lograr los objetivos de rendimiento, latencia y coincidencia de la aplicación de búsqueda. Por ejemplo, en el momento de la consulta, puedes especificar opciones para una búsqueda exhaustiva, incluso si el campo vectorial está indexado para HNSW.

Durante la ejecución de consultas, HNSW permite consultas rápidas de vecinos al navegar por el grafo. Este enfoque tiene un equilibrio entre la precisión de la búsqueda y la eficacia computacional. Se recomienda HNSW para la mayoría de los escenarios debido a su eficacia al buscar en conjuntos de datos más grandes.

Cómo funciona la búsqueda de vecinos más próximos

Las consultas vectoriales se ejecutan en un espacio de inserción que consta de vectores generados a partir del mismo modelo de inserción. Por lo general, el valor de entrada dentro de una solicitud de consulta se introduce en el mismo modelo de Machine Learning que generó incrustaciones en el índice de vectores. El resultado es un vector en el mismo espacio de inserción. Dado que los vectores similares se agrupan en clústeres, buscar coincidencias equivale a buscar los vectores más próximos al vector de consulta y devolver los documentos asociados como resultado de búsqueda.

Por ejemplo, si una solicitud de consulta es sobre hoteles, el modelo asigna la consulta a un vector que existe en algún lugar del clúster de vectores que representa documentos sobre hoteles. Identificar qué vectores son los más similares a la consulta, en función de una métrica de similitud, determina qué documentos son los más relevantes.

Cuando los campos vectoriales se indexan para un KNN exhaustivo, la consulta se ejecuta en "todos los vecinos". En el caso de los campos indexados para HNSW, el motor de búsqueda usa un grafo HNSW para buscar en un subconjunto de nodos dentro del índice vectorial.

Creación del grafo HNSW

Durante la indexación, el servicio de búsqueda construye el gráfico HNSW. El objetivo de indexar un nuevo vector en un grafo HNSW es agregarlo a la estructura del grafo de una manera que permita una búsqueda de vecinos más eficaz. El proceso se resume en los pasos siguientes:

  1. Inicialización: comienza con un grafo HNSW vacío o el grafo HNSW existente si no es un nuevo índice.

  2. Punto de entrada: este es el nivel superior del grafo jerárquico y actúa como punto inicial para la indexación.

  3. Agregar al grafo: diferentes niveles jerárquicos representan diferentes granularidades del grafo, donde los niveles más altos son más globales y los niveles más bajos son más granulares. Cada nodo del grafo representa un punto vectorial.

    • Cada nodo está conectado a hasta m vecinos próximos. Este es el parámetro m.

    • El número de puntos de datos que se consideran conexiones candidatas se rige por el parámetro efConstruction. Esta lista dinámica forma el conjunto de puntos más cercanos en el grafo existente para que el algoritmo la tenga en cuenta. Los valores de efConstruction más altos dan lugar a que se consideren más nodos, lo que a menudo conduce a vecindarios locales más densos para cada vector.

    • Estas conexiones usan la similitud configurada metric para determinar la distancia. Algunas conexiones son conexiones de "larga distancia" que se conectan entre distintos niveles jerárquicos, de modo que crean accesos directos en el grafo que mejoran la eficacia de la búsqueda.

  4. Eliminación y optimización de grafos: esto puede ocurrir después de indexar todos los vectores y mejora la navegabilidad y la eficacia del grafo HNSW.

Una consulta vectorial navega por la estructura jerárquica del grafo para buscar coincidencias. A continuación se resumen los pasos del proceso:

  1. Inicialización: el algoritmo inicia la búsqueda en el nivel superior del grafo jerárquico. Este punto de entrada contiene el conjunto de vectores que sirven como puntos de partida para la búsqueda.

  2. Recorrido: a continuación, recorre el nivel de grafo por nivel, navegando desde el nivel superior hasta los niveles inferiores, seleccionando nodos candidatos que están más cerca del vector de consulta en función de la métrica de distancia configurada, como la similitud de coseno.

  3. Eliminación: para mejorar la eficacia, el algoritmo elimina el espacio de búsqueda solo teniendo en cuenta los nodos que probablemente contengan vecinos más próximos. Esto se logra manteniendo una cola de prioridad de posibles candidatos y actualizándola a medida que avanza la búsqueda. El parámetro efSearch configura la longitud de esta cola.

  4. Refinamiento: a medida que el algoritmo se mueve a niveles más bajos y granulares, HNSW considera más vecinos cerca de la consulta, lo que permite refinar el conjunto candidato de vectores y mejorar la precisión.

  5. Finalización: la búsqueda se completa cuando se ha identificado el número deseado de vecinos más próximos o cuando se cumplen otros criterios de detención. Este número deseado de vecinos más próximos se rige por el parámetro en tiempo de consulta k.

Métricas de similitud usadas para medir la proximidad

El algoritmo busca vectores candidatos para evaluar la similitud. Para realizar esta tarea, un cálculo de métricas de similitud compara el vector candidato con el vector de consulta y mide la similitud. El algoritmo realiza un seguimiento del conjunto ordenado de vectores más similares que se encuentran, que forma el conjunto de resultados clasificados cuando el algoritmo ha finalizado.

Métrica Descripción
cosine Esta métrica mide el ángulo entre dos vectores y no se ve afectada por longitudes de vector diferentes. Matemáticamente, calcula el ángulo entre dos vectores. Coseno es la métrica de similitud que usa modelos de inserción de Azure OpenAI, por lo que si usas Azure OpenAI, debes especificarcosine en la configuración de vectores.
dotProduct Esta métrica mide la longitud de cada par de dos vectores y el ángulo entre ellos. Matemáticamente, calcula los productos de las magnitudes de los vectores y el ángulo entre ellos. En el caso de los vectores normalizados, esto es idéntico a la similitud cosine, pero ligeramente más eficaz.
euclidean (también conocida como l2 norm) Esta métrica mide la longitud de la diferencia vectorial entre dos vectores. Matemáticamente, calcula la distancia euclidiana entre dos vectores, que es la norma l2 de la diferencia de los dos vectores.

Puntuaciones en los resultados del vector de búsqueda

Las puntuaciones se calculan y asignan a cada coincidencia, con las coincidencias más altas que se devuelven como resultados k. La propiedad @search.score contiene la puntuación. En la tabla siguiente, se muestra el intervalo dentro del cual se producirá una puntuación.

Método de búsqueda Parámetro Métrica de puntuación Range
vector de búsqueda @search.score Coseno 0,333-1,00

En el caso de la métrica cosine, es importante tener en cuenta que el @search.score calculado no es el valor de coseno entre el vector de consulta y los vectores del documento. En su lugar, Azure AI Search aplica transformaciones de forma que la función de puntuación disminuye de forma monotónica, lo que significa que los valores de puntuación siempre disminuirán en el valor a medida que la similitud empeore. Esta transformación garantiza que las puntuaciones de búsqueda se puedan usar con fines de clasificación.

Hay algunos matices con las puntuaciones de similitud:

  • La similitud de coseno se define como el coseno del ángulo entre dos vectores.
  • La distancia de coseno se define como 1 - cosine_similarity.

Para crear una función de reducción monotónica, el @search.score se define como 1 / (1 + cosine_distance).

Los desarrolladores que necesitan un valor coseno en lugar del valor sintético pueden usar una fórmula para volver a convertir la puntuación de búsqueda en la distancia coseno:

double ScoreToSimilarity(double score)
{
    double cosineDistance = (1 - score) / score;
    return  -cosineDistance + 1;
}

Tener el valor de coseno original puede ser útil en soluciones personalizadas que configuran umbrales para recortar los resultados de baja calidad.

Sugerencias para el ajuste de relevancia

Si no obtiene resultados relevantes, experimente con cambios en la configuración de la consulta. No hay características de ajuste específicas, como un perfil de puntuación, un campo o un aumento de términos, para consultas vectoriales:

  • Experimente con el tamaño del fragmento y la superposición. Intente aumentar el tamaño del fragmento y asegurarse de que hay suficiente superposición para conservar el contexto o la continuidad entre los fragmentos.

  • En el caso de HNSW, pruebe diferentes niveles de efConstruction para cambiar la composición interna del gráfico de proximidad. El valor predeterminado es 400. El rango va de 100 a 1000.

  • Aumente los k resultados para alimentar más resultados de la búsqueda en un modelo de chat, si usa uno.

  • Pruebe las consultas híbridas con clasificación semántica. En las pruebas comparativas, esta combinación produjo de forma coherente los resultados más relevantes.

Pasos siguientes