HNSW
El índice HNSW es un algoritmo de indexación basado en grafos que puede mejorar el rendimiento en la búsqueda de vectores flotantes de alta dimensión. Ofrece una excelente precisión de búsqueda y baja latencia, aunque requiere una gran sobrecarga de memoria para mantener su estructura de grafos jerárquicos.
Resumen
El algoritmo Hierarchical Navigable Small World (HNSW) construye un gráfico de varias capas, como un mapa con distintos niveles de zoom. La capa inferior contiene todos los puntos de datos, mientras que las capas superiores consisten en un subconjunto de puntos de datos muestreados de la capa inferior.
En esta jerarquía, cada capa contiene nodos que representan puntos de datos, conectados por aristas que indican su proximidad. Las capas superiores proporcionan saltos de larga distancia para acercarse rápidamente al objetivo, mientras que las capas inferiores permiten una búsqueda fina para obtener los resultados más precisos.
El funcionamiento es el siguiente
- Punto de entrada: La búsqueda comienza en un punto de entrada fijo en la capa superior, que es un nodo predeterminado del grafo.
- Búsqueda codiciosa: El algoritmo se desplaza ávidamente hacia el vecino más cercano en la capa actual hasta que no puede acercarse más al vector de consulta. Las capas superiores tienen un propósito de navegación, actuando como un filtro grueso para localizar posibles puntos de entrada para la búsqueda más fina en los niveles inferiores.
- Descenso de capas: Una vez alcanzado un mínimo local en la capa actual, el algoritmo salta a la capa inferior, utilizando una conexión preestablecida, y repite la búsqueda codiciosa.
- Refinamientofinal: Este proceso continúa hasta que se alcanza la capa inferior, donde un último paso de refinamiento identifica a los vecinos más cercanos.
HNSW
El rendimiento de HNSW depende de varios parámetros clave que controlan tanto la estructura del grafo como el comportamiento de la búsqueda. Estos parámetros son:
M
: El número máximo de aristas o conexiones que cada nodo puede tener en el grafo en cada nivel de la jerarquía. UnM
más alto da como resultado un gráfico más denso y aumenta la recuperación y la precisión, ya que la búsqueda tiene más caminos que explorar, lo que también consume más memoria y ralentiza el tiempo de inserción debido a las conexiones adicionales. Como se muestra en la imagen anterior, M = 5 indica que cada nodo del grafo HNSW está conectado directamente a un máximo de otros 5 nodos. Esto crea una estructura de grafos moderadamente densa en la que los nodos tienen múltiples caminos para llegar a otros nodos.efConstruction
: El número de candidatos considerados durante la construcción del índice. UnefConstruction
más alto suele dar como resultado un gráfico de mejor calidad, pero requiere más tiempo de construcción.ef
: El número de vecinos evaluados durante una búsqueda. Aumentaref
mejora la probabilidad de encontrar los vecinos más cercanos, pero ralentiza el proceso de búsqueda.
Para más información sobre cómo ajustar estos parámetros a sus necesidades, consulte Parámetros del índice.
Crear un índice
Para construir un índice HNSW
sobre un campo vectorial en Milvus, utilice el método add_index()
, especificando los parámetros index_type
, metric_type
, y adicionales para el índice.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="HNSW", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"M": 64, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 100 # Number of candidate neighbors considered for connection during index construction
} # Index building params
)
En esta configuración:
index_type
: El tipo de índice a construir. En este ejemplo, establezca el valorHNSW
.metric_type
: El método utilizado para calcular la distancia entre vectores. Los valores soportados incluyenCOSINE
,L2
, yIP
. Para más detalles, consulte Tipos de métricas.params
: Opciones de configuración adicionales para construir el índice.M
: Número máximo de vecinos a los que se puede conectar cada nodo.efConstruction
: Número de vecinos candidatos considerados para la conexión durante la construcción del índice.
Para conocer más parámetros de construcción disponibles para el índice
HNSW
, consulte Parámetros de construcción del índice.
Una vez configurados los parámetros del índice, puede crear el índice utilizando directamente el método create_index()
o pasando los parámetros del índice en el método create_collection
. Para más detalles, consulte Crear colección.
Búsqueda en el índice
Una vez creado el índice e insertadas las entidades, puede realizar búsquedas de similitud en el índice.
search_params = {
"params": {
"ef": 10, # Number of neighbors to consider during the search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=10, # TopK results to return
search_params=search_params
)
En esta configuración:
params
: Opciones de configuración adicionales para la búsqueda en el índice.ef
: Número de vecinos a considerar durante una búsqueda.
Para obtener más información sobre los parámetros de búsqueda disponibles para el índice
HNSW
, consulte Parámetros de búsqueda específicos del índice.
Parámetros del índice
En esta sección se ofrece una descripción general de los parámetros utilizados para crear un índice y realizar búsquedas en él.
Parámetros de creación de índices
La siguiente tabla enumera los parámetros que pueden configurarse en params
al crear un índice.
Parámetro | Descripción | Rango de valores | Sugerencia de ajuste |
---|---|---|---|
M | Número máximo de conexiones (o aristas) que puede tener cada nodo en el grafo, incluyendo tanto las aristas salientes como las entrantes. Este parámetro afecta directamente tanto a la construcción del índice como a la búsqueda. | Tipo: Entero Rango: [2, 2048] Valor por defecto: 30 (hasta 30 aristas salientes y 30 entrantes por nodo) | Un valor mayor de M conduce generalmente a una mayor precisión, pero aumenta la sobrecarga de memoria y ralentiza tanto la construcción del índice como la búsqueda.Considere la posibilidad de aumentar M para conjuntos de datos de alta dimensionalidad o cuando sea crucial una alta recuperación.Considere la posibilidad de reducir M cuando el uso de memoria y la velocidad de búsqueda sean las principales preocupaciones.En la mayoría de los casos, se recomienda establecer un valor dentro de este intervalo: [5, 100]. |
efConstruction | Número de vecinos candidatos considerados para la conexión durante la construcción del índice. Para cada nuevo elemento se evalúa un conjunto mayor de candidatos, pero el número máximo de conexiones realmente establecidas sigue estando limitado por M . | Tipo: Entero Rango: [1, int_max] Valor por defecto: 360 | Un valor más alto de efConstruction suele dar como resultado un índice más preciso, ya que se exploran más conexiones potenciales. Sin embargo, esto también conlleva un mayor tiempo de indexación y un mayor uso de memoria durante la construcción.Considere aumentar efConstruction para mejorar la precisión, especialmente en escenarios donde el tiempo de indexación es menos crítico.Considere la posibilidad de reducir efConstruction para acelerar la construcción del índice cuando las limitaciones de recursos sean un problema.En la mayoría de los casos, se recomienda establecer un valor dentro de este intervalo: [50, 500]. |
Parámetros de búsqueda específicos del índice
La siguiente tabla enumera los parámetros que pueden configurarse en search_params.params
al buscar en el índice.
Parámetro | Descripción | Rango de valores | Sugerencia de ajuste |
---|---|---|---|
ef | Controla la amplitud de la búsqueda durante la recuperación del vecino más próximo. Determina cuántos nodos son visitados y evaluados como vecinos más cercanos potenciales. Este parámetro sólo afecta al proceso de búsqueda y se aplica exclusivamente a la capa inferior del gráfico. | Tipo: Entero Rango: [1, int_max] Valor por defecto: limit (TopK vecinos más cercanos a devolver) | Un valor mayor de ef suele aumentar la precisión de la búsqueda, ya que se tienen en cuenta más vecinos potenciales. Sin embargo, esto también aumenta el tiempo de búsqueda.Considere la posibilidad de aumentar ef cuando sea fundamental lograr una alta recuperación y la velocidad de búsqueda sea menos importante.Considere la posibilidad de reducir ef para dar prioridad a las búsquedas más rápidas, especialmente en situaciones en las que sea aceptable una ligera reducción de la precisión.En la mayoría de los casos, se recomienda establecer un valor dentro de este rango: [K, 10K]. |