Realizando una Búsqueda de Similitud de Vectores

Este tema presenta cómo usar Milvus para buscar entidades.

En Milvus, la búsqueda de similitud de vectores calcula la distancia entre el vector de consulta y los vectores en la colección (usando una medida de similitud especificada) y devuelve los resultados más similares. Puedes ejecutar búsquedas mixtas especificando una expresión booleana para filtrar campos escalares o de clave primaria.

El siguiente ejemplo muestra cómo realizar una búsqueda de similitud de vectores en un conjunto de datos que contiene 2000 filas de información, incluyendo ID de libro (clave primaria), recuento de palabras (campo escalar) y sinopsis del libro (campo vectorial), para simular la búsqueda de libros específicos basada en sus descripciones vectorizadas. Milvus devolverá los resultados más similares según el vector de consulta y los parámetros de búsqueda que definas.

Cargando la Colección

Todas las operaciones de búsqueda y consulta dentro de Milvus se ejecutan en memoria. Antes de realizar una búsqueda de similitud de vectores, carga la colección en memoria.

from pymilvus import Collection
colección = Collection("libro")      # Obtener la colección existente.
colección.load()

Preparación de los Parámetros de Búsqueda

Prepara los parámetros correspondientes para tu escenario de búsqueda. El siguiente ejemplo define los parámetros que la búsqueda utilizará para calcular la distancia usando la distancia euclidiana y recuperar vectores de los diez clústeres más cercanos construidos por el índice IVF_FLAT.

parámetros_de_búsqueda = {
    "tipo_métrica": "L2",
    "offset": 5,
    "ignorar_crecimiento": False,
    "parámetros": {"nprobe": 10}
}
Parámetro Descripción
tipo_métrica El método utilizado para medir la distancia entre vectores durante la búsqueda. Debe ser el mismo que el método especificado durante el proceso de construcción del índice. Consulta medidas de similitud para más información.
offset El número de entidades a omitir durante la búsqueda. La suma de este valor y el límite del método búsqueda debe ser menor que 16384. Por ejemplo, si deseas consultar los noveno y décimo vecinos más cercanos del vector de consulta, establece límite en 2 y offset en 8.
ignorar_crecimiento Indica si se deben ignorar los segmentos en crecimiento durante la búsqueda de similitud. El valor predeterminado es Falso, lo que indica que la búsqueda incluye segmentos en crecimiento.
parámetros Parámetros de búsqueda específicos para el tipo de índice especificado. Consulta el índice vectorial para obtener más información. Las opciones posibles incluyen: - nprobe indica el número de unidades de clustering a buscar. Este parámetro solo está disponible al configurar tipo_índice a IVF_FLAT, IVF_SQ8 o IVF_PQ. El valor debe ser menor que el valor nlist especificado durante el proceso de construcción del índice. - ef indica el rango de búsqueda. Este parámetro solo está disponible al configurar tipo_índice a HNSW. El valor debe estar entre top_k y 32768. - radio indica el ángulo donde se encuentran los vectores con la menor similitud. - filtro_rango indica el filtro utilizado para filtrar los valores de campo vectorial cuya similitud con el vector de consulta se encuentra dentro de un rango específico.

Realizando búsqueda de vectores

Utilice Milvus para la búsqueda de vectores. Para buscar dentro de una partición específica, especifique una lista de nombres de particiones.

Milvus admite el establecimiento de un nivel de consistencia para búsquedas. El ejemplo en este tema establece el nivel de consistencia en "Fuerte". También se puede establecer el nivel de consistencia en "Limitado", "Sesión" o "Eventual". Para obtener más información sobre los cuatro niveles de consistencia en Milvus, consulta Consistencia.

resultados = colección.buscar(
    datos=[[0.1, 0.2]], 
    campo_anns="book_intro", 
    param=parámetros_busqueda,
    límite=10,
    expr=None,
    campos_salida=['título'],
    nivel_consistencia="Fuerte"
)

resultados[0].ids

resultados[0].distancias

resultado = resultados[0][0]
resultado.entidad.obtener('título')
Parámetro Descripción
datos Vectores utilizados para la búsqueda.
campo_anns Nombre del campo a buscar.
param Parámetros de búsqueda específicos para el índice. Para obtener más información, consulta Índice Vectorial.
límite Número de resultados a devolver. Este valor, más el offset en param, debe ser menor que 16,384.
expr Expresión booleana para filtrar propiedades. Para obtener más información, consulta Reglas de Expresión Booleana.
campos_salida (opcional) Nombres de los campos a devolver. Los campos vectoriales actualmente no son compatibles.
nivel_consistencia (opcional) Nivel de consistencia para la búsqueda.

Verifica los valores de clave principal y las distancias de los vectores más similares.

resultados[0].ids
resultados[0].distancias

Una vez que la búsqueda esté completa, libera la colección cargada en Milvus para reducir el consumo de memoria.

colección.liberar()

Limitaciones

Característica Límite máximo
Longitud del nombre de colección 255 caracteres
Número de particiones en una colección 4,096
Número de campos en una colección 256
Número de fragmentos en una colección 256
Dimensión del vector 32,768
Top K 16,384
Vectores de entrada 16,384

Realizando búsqueda mixta

La búsqueda mixta es esencialmente una búsqueda de vectores con filtrado de atributos. Al especificar una expresión booleana utilizada para filtrar campos escalares o campos de clave principal, las búsquedas se pueden limitar bajo condiciones específicas.

El siguiente ejemplo demuestra cómo realizar una búsqueda mixta basada en la búsqueda de vectores regular. Digamos que deseas buscar ciertos libros basados en resúmenes vectorizados, pero solo deseas buscar dentro de un rango específico de recuento de palabras. Luego, puedes especificar una expresión booleana en los parámetros de búsqueda para filtrar el campo word_count. Milvus solo buscará vectores similares dentro de las entidades que coincidan con la expresión.

Al especificar una expresión booleana, puedes filtrar campos escalares de entidades durante la búsqueda de vectores. El siguiente ejemplo limita el alcance de búsqueda a vectores dentro del rango de valores word_count especificado.

También se pueden utilizar campos dinámicos en la expresión de filtrado y utilizar campos de salida en la solicitud de búsqueda. Por ejemplo, consulta el patrón dinámico.

param_busqueda = {
  "datos": [[0.1, 0.2]],
  "campo_anns": "book_intro",
  "param": {"tipo_métrica": "L2", "parámetros": {"nprobe": 10}, "offset": 0},
  "límite": 10,
  "expr": "word_count <= 11000",
}
res = colección.buscar(**param_busqueda)

Verifica los resultados devueltos.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- Total de resultados: {len(hits)}, ids de resultados: {hits.ids} ")
print(f"- Top1 id de resultado: {hits[0].id}, distancia: {hits[0].distancia}, puntuación: {hits[0].puntuación} ")

Realizando búsqueda de rango

La búsqueda de rango es un método para filtrar los resultados de búsqueda basado en la distancia entre el vector de consulta y los valores del campo vectorial. Se pueden utilizar diferentes métricas de distancia para medir la distancia.

Al realizar una búsqueda de rango, Milvus primero realiza una búsqueda de similitud de vectores. Luego, ejecuta un filtrado de vectores basado en las condiciones de distancia especificadas y devuelve los vectores cuya distancia se encuentra dentro de un rango específico.

El siguiente ejemplo demuestra cómo realizar una búsqueda de rango basada en una búsqueda regular de vectores.

Cargando la colección

Todas las operaciones de búsqueda y consulta en Milvus se ejecutan en memoria. Antes de realizar una búsqueda de similitud de vectores, la colección debe cargarse en memoria.

from pymilvus import Colección
colección = Colección("book")      # Obtener una colección existente
colección.cargar()

Configuración de los intervalos de filtrado de vectores

En comparación con la búsqueda de vectores regulares, la búsqueda en rango en Milvus se controla mediante la introducción de dos nuevos parámetros, radio y filtro_de_rango, para obtener los resultados de búsqueda deseados dentro de un rango específico de búsqueda.

El parámetro radio especifica el ángulo mínimo en el que los vectores se consideran similares. Se puede utilizar un filtro_de_rango opcional junto con el radio para filtrar los valores del campo vectorial en función de la similitud al vector de consulta dentro de un rango específico. Tanto los parámetros radio como filtro_de_rango tienen un tipo de dato de FLOAT. El ajuste de estos dos parámetros equilibra efectivamente la precisión y la eficiencia de la búsqueda.

Típicamente, la similitud se mide por la distancia entre el valor del campo vectorial y el vector de consulta. La elección de diferentes métricas de distancia tendrá un impacto significativo en la configuración de radio y filtro_de_rango.

Por ejemplo, en el caso de la distancia L2, los resultados de la búsqueda deben filtrarse según los valores del campo vectorial con una distancia menor que radio. Esto se debe a que en la distancia L2, distancias menores indican mayor similitud. Con este conocimiento, si desea filtrar algunos de los vectores más similares, puede especificar un valor efectivo de filtro_de_rango que sea menor que radio.

search_params = {
    "metric_type": "L2",
    "params": {
        "radio": 10.0,
        "filtro_de_rango" : 5.0
    }
}

En el caso de la distancia IP, el escenario es diferente. Con la distancia IP, una distancia mayor significa mayor similitud. Por lo tanto, en contraste con la distancia L2, los valores de radio y filtro_de_rango en la distancia IP son opuestos. En otras palabras, al usar filtro_de_rango para filtrar algunos de los vectores más similares basados en la distancia IP, el valor efectivo de filtro_de_rango debe ser mayor que radio, y la distancia de los vectores resultantes debe ser mayor que radio pero menor o igual a filtro_de_rango.

search_params = {
    "metric_type": "IP",
    "params": {
        "radio": 0.8,
        "filtro_de_rango" : 1.0
    }
}

Realización de la búsqueda en rango

Al especificar radio y filtro_de_rango basados en el tipo de medición de distancia, puede definir el rango de vectores de resultado que se devolverán.

Realice búsqueda en rango sobre la similitud dentro del rango de 5.0 y 10.0 basado en la distancia L2:

search_param = {
  "data": [[0.1, 0.2]], # Vector de consulta
  "anns_field": "book_intro", # Campo a ser buscado
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radio": 10.0, "filtro_de_rango" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Campos a ser devueltos
}

res = collection.search(**search_param)

Realice búsqueda en rango sobre la similitud dentro del rango de 1.0 y 0.8 basado en la distancia IP:

search_param = {
  "data": [[0.1, 0.2]], # Vector de consulta
  "anns_field": "book_intro", # Campo a ser buscado
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radio": 0.8, "filtro_de_rango" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Campos a ser devueltos
}

res = collection.search(**search_param)

Resumen

En Milvus, la búsqueda en rango puede devolver resultados de vectores que son similares dentro del rango de distancia especificado. Esta funcionalidad se habilita al especificar radio y filtro_de_rango en los parámetros de búsqueda. La tabla a continuación resume la configuración de estos dos parámetros para diferentes tipos de medición de distancia.

Tipo de Medición de Distancia Configuración
Distancias L2 y otras filtro_de_rango <= distancia < radio
Distancias IP y coseno radio < distancia <= filtro_de_rango