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 |