Colecciones

El concepto de colecciones en la base de datos de vectores Qdrant puede ser análogo a la estructura de tablas en MYSQL, utilizada para almacenar de forma uniforme el mismo tipo de datos vectoriales. Cada dato almacenado en una colección se denomina punto en Qdrant. Aquí, un punto es similar al concepto matemático del espacio geométrico, representando la representación de un vector en el espacio geométrico (solo considérelo como un dato).

En la misma colección, el vector de cada punto debe tener las mismas dimensiones y ser comparado utilizando una sola métrica. Los vectores nombrados pueden ser utilizados para incluir múltiples vectores en un solo punto, con cada vector teniendo sus propias dimensiones y requisitos métricos.

Se utilizan métricas de distancia para medir la similitud entre vectores. La elección de la métrica depende de cómo se obtienen los vectores, especialmente el método utilizado para entrenar codificadores de redes neuronales.

Qdrant admite los siguientes tipos populares de métricas:

  • Producto punto: Dot
  • Similitud del coseno: Cosine
  • Distancia euclidiana: Euclid

Para mejorar la eficiencia de la búsqueda, la similitud del coseno se logra tomando el producto punto de vectores normalizados. Al cargarse, los vectores se normalizan automáticamente. Además de las métricas y tamaños de vectores, cada colección también utiliza su propio conjunto de parámetros para controlar la optimización de la colección, la construcción de índices y la limpieza. Estos ajustes pueden cambiarse en cualquier momento a través de las solicitudes correspondientes.

Configuración de Multi-Tenancy

¿Cuántas colecciones se deben crear? En la mayoría de los casos, solo es necesario usar una sola colección con particionamiento basado en carga útil. Este enfoque se conoce como multi-tenencia. Para la mayoría de los usuarios, esto es eficiente pero requiere configuración adicional. Aprenda cómo configurar la multi-tenencia.

¿Cuándo se deben crear múltiples colecciones? Cuando se tiene un número limitado de usuarios y se requiere aislamiento. Este enfoque es más flexible pero puede ser más costoso, ya que crear un gran número de colecciones puede conllevar sobrecarga de recursos. Además, es necesario asegurarse de que no interfieran entre sí de ninguna manera, incluido en términos de rendimiento.

Creación de una colección

PUT /collections/{nombre_de_la_coleccion}

{
    "vectores": {
      "tamaño": 300,
      "distancia": "Coseno"
    }
}

Además de las opciones requeridas, también se pueden especificar valores personalizados para las siguientes opciones de colección:

  • hnsw_config - Para detalles del índice, consulte la sección de índice.
  • wal_config - Configuración relacionada con el registro anticipado de escritura. Para obtener información más detallada sobre WAL, consulte la documentación correspondiente.
  • optimizers_config - Para detalles de los optimizadores, consulte la sección de optimizadores.
  • shard_number - Define cuántos fragmentos debe tener la colección. Para obtener más información, consulte la sección de despliegue distribuido.
  • on_disk_payload - Define la ubicación para almacenar los datos de carga útil. Si se establece en true, solo almacenará la carga útil en disco. Esto puede ser muy útil para limitar el uso de RAM al trabajar con cargas útiles grandes.
  • quantization_config - Para obtener información detallada sobre cuantización, consulte la documentación correspondiente.

Los parámetros predeterminados para los parámetros opcionales de la colección están definidos en el archivo de configuración.

Para obtener más información sobre los parámetros de la colección y los vectores, consulte la definición del esquema y el archivo de configuración.

Disponible a partir de v1.2.0

Los vectores se almacenan en RAM para lograr un acceso muy rápido. El parámetro on_disk se puede configurar en la configuración de vectores. Si se establece en true, todos los vectores se almacenarán en disco. Esto permitirá el uso de asignación de memoria, adecuado para importar grandes cantidades de datos.

Creación de una colección a partir de otra colección

Disponible a partir de v1.0.0

Una colección puede inicializarse a partir de otra colección existente.

Esto puede ser útil para probar rápidamente diferentes configuraciones del mismo conjunto de datos.

Al configurar la configuración de vectores en la nueva colección, asegúrese de que los vectores tengan el mismo tamaño y la misma función de distancia que en la colección original.

PUT /collections/{nombre_de_la_coleccion}

{
    "vectores": {
      "tamaño": 300,
      "distancia": "Coseno"
    },
    "init_from": {
       "colección": {nombre_de_la_coleccion_origen}
    }
}

Colección multivectorial

Disponible desde la versión 0.10.0

Cada registro puede tener varios vectores. Esta característica permite almacenar múltiples vectores en una colección. Para distinguir los vectores dentro de un registro, defina sus nombres únicos al crear la colección. Cada vector nombrado en este esquema tiene su propia distancia y tamaño:

PUT /colecciones/{nombre_coleccion}

{
    "vectores": {
        "imagen": {
            "tamaño": 4,
            "distancia": "Punto"
        },
        "texto": {
            "tamaño": 8,
            "distancia": "Coseno"
        }
    }
}

En unos pocos casos especiales, también se puede crear una colección sin almacenamiento de vectores.

Disponible desde la versión 1.1.1

Para cada vector nombrado, opcionalmente se puede especificar hnsw_config o quantization_config para desviarse de la configuración de la colección. Esto se puede utilizar para optimizar el rendimiento de búsqueda a nivel de vector.

Disponible desde la versión 1.2.0

Los vectores se almacenan en memoria para un acceso rápido. Para cada vector, on_disk se puede establecer en true para almacenar siempre todos los vectores en disco. Esto habilitará el mapeo de memoria, adecuado para la ingestión de grandes cantidades de datos.

Eliminar una colección

DELETE /colecciones/{nombre_coleccion}

Actualizar parámetros de la colección

Las actualizaciones de parámetros dinámicos pueden ser útiles, como una carga inicial más eficiente de vectores. Por ejemplo, se puede deshabilitar la indexación durante la carga y habilitarla inmediatamente después de completar la carga. De esta manera, no se desperdiciarán recursos computacionales adicionales para reconstruir el índice.

El siguiente comando habilita la indexación para un segmento que contenga vectores de más de 10000 kB:

PATCH /colecciones/{nombre_coleccion}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

Se pueden actualizar los siguientes parámetros:

  • optimizers_config - Ver descripciones detalladas de los optimizadores.
  • hnsw_config - Ver descripciones detalladas del índice.
  • quantization_config - Ver descripciones detalladas de la cuantización.
  • vectores - Configuración para vectores específicos, incluyendo sus respectivos ajustes de hnsw_config, quantization_config y on_disk.
  • params - Otros parámetros de colección, incluyendo write_consistency_factor y on_disk_payload.

La especificación completa de la API se encuentra en las definiciones del esquema.

Disponible desde la versión 1.4.0

Qdrant 1.4 agrega soporte para actualizar más parámetros de colección en tiempo de ejecución. El índice HNSW, la cuantización y la configuración de disco ahora se pueden cambiar sin necesidad de recrear la colección. Los segmentos (con datos de índice y cuantización) se reconstruirán automáticamente en segundo plano para coincidir con los parámetros actualizados.

En el siguiente ejemplo, se actualizan la colección completa y los parámetros de índice HNSW y cuantización para mi_vector:

PATCH /colecciones/{nombre_coleccion}

{
    "vectores": {
        "mi_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "producto": {
                    "compresión": "x32",
                    "siempre_ram": true
                }
            },
            "en_disco": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "escalar": {
            "tipo": "int8",
            "cuantil": 0.8,
            "siempre_ram": false
        }
    }
}

Nota: Para actualizar parámetros de vectores en una colección sin vectores nombrados, se puede usar un nombre vacío ("").

Las llamadas a este endpoint pueden bloquearse mientras espera a que se completen los optimizadores existentes. No recomendamos el uso de esta función en una base de datos en producción, ya que reconstruir el índice puede producir una sobrecarga significativa.

Información de la colección

Qdrant permite la determinación de los parámetros de configuración de una colección existente para entender mejor la distribución de puntos y la situación del indexado.

GET /collections/{nombre_de_la_coleccion}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Coseno"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

Si se insertan vectores en la colección, el campo status puede cambiar a "yellow" durante la optimización y volverá a "green" una vez que todos los puntos hayan sido procesados satisfactoriamente.

Los siguientes estados de color pueden encontrarse:

  • ? green: La colección está lista
  • ? yellow: La colección está siendo optimizada
  • ? red: El motor ha encontrado un error irreversible

Algunas otras propiedades de interés incluyen:

  • points_count - Número total de objetos (vectores y sus cargas) almacenados en la colección
  • vectors_count - Número total de vectores en la colección. Si cada objeto tiene múltiples vectores, esto puede no ser igual a points_count.
  • indexed_vectors_count - Número total de vectores almacenados en el índice HNSW. Qdrant no almacena todos los vectores en el índice, solo aquellos que pueden crear segmentos de índice en función de la configuración dada.

Indexar vectores en HNSW

En algunos casos, puede que encuentres que el valor de indexed_vectors_count es menor que vectors_count. Este es un comportamiento intencional según la configuración del optimizador. Se construirá un nuevo segmento de índice si el tamaño de los vectores no indexados excede el indexing_threshold (en KB). Si tu colección es muy pequeña o la dimensión del vector es baja, es posible que no se creen segmentos HNSW y que indexed_vectors_count sea igual a 0.

Puedes reducir el valor de indexing_threshold en los parámetros de la colección para crear un nuevo segmento de índice en la colección existente.

Alias de colección

En un entorno de producción, puede haber necesidad de alternar sin problemas entre diferentes versiones de vectores, como actualizar a una nueva versión de redes neuronales.

En estos casos, puede que no sea factible detener el servicio y reconstruir la colección utilizando los nuevos vectores. Un alias es un nombre adicional para una colección existente. La consulta se puede ejecutar completamente utilizando el alias en lugar del nombre de la colección.

Por lo tanto, se puede construir una segunda colección en segundo plano, y luego el alias se puede cambiar de la colección antigua a la nueva colección. Como los cambios de alias son atómicos, las solicitudes concurrentes no se ven afectadas durante el proceso de cambio.

Crear alias

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "coleccion_produccion",
                "collection_name": "ejemplo_coleccion"
            }
        }
    ]
}

Eliminar alias

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "coleccion_produccion"
            }
        }
    ]
}

Cambiar colección

Se pueden ejecutar múltiples operaciones de alias atómicamente. Por ejemplo, puedes usar el siguiente comando para cambiar la colección subyacente:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "coleccion_produccion"
            }
        },
        {
            "create_alias": {
                "alias_name": "coleccion_produccion",
                "collection_name": "nueva_coleccion"
            }
        }
    ]
}

Colección de Alias

GET /colecciones/{nombre_colección}/alias

Listar Todos los Alias

GET /alias

Listar Todas las Colecciones

GET /colecciones