Índice
Una característica clave de Qdrant es la combinación efectiva de índices vectoriales e índices tradicionales. Esto es crucial porque simplemente tener un índice vectorial no es suficiente para habilitar una búsqueda eficiente de vectores bajo condiciones de filtrado. En términos simples, el índice vectorial acelera la búsqueda de vectores, mientras que el índice de carga útil acelera el filtrado.
El índice dentro de un párrafo existe de forma independiente, pero los parámetros del índice mismo se configuran para todo el conjunto.
No todos los párrafos tienen índices automáticamente. Esto depende de los requisitos de la configuración de optimización y generalmente depende del número de puntos almacenados.
Índice de Carga Útil
El índice de carga útil en Qdrant es similar al índice en una base de datos orientada a documentos tradicional. Este índice se construye para campos y tipos específicos, utilizados para recuperar rápidamente puntos basados en condiciones de filtro correspondientes.
También se utiliza para estimar con precisión la cardinalidad de condiciones de filtro, lo que ayuda al planificador de consultas a elegir estrategias de búsqueda.
Crear un índice requiere recursos computacionales y memoria adicionales, por lo que es crucial elegir cuidadosamente los campos que se van a indexar. Qdrant no toma esta decisión por ti, sino que la delega al usuario.
Para marcar un campo como indexable, se puede usar el siguiente método:
PUT /colecciones/{nombre_de_colección}/índice
{
"nombre_campo": "nombre del campo a indexar",
"esquema_campo": "palabra clave"
}
Los tipos de campo disponibles son:
-
palabra clave
- para carga útil de palabras clave, que afecta las condiciones de filtro coincidentes. -
entero
- para carga útil de enteros, que afecta las condiciones de filtro coincidentes y de rango. -
flotante
- para carga útil de números flotantes, que afecta las condiciones de filtro de rango. -
booleano
- para carga útil booleana, que afecta las condiciones de filtro coincidentes (disponible a partir de la versión 1.4.0 en adelante). -
geo
- para carga útil geográfica, que afecta las condiciones de filtro de cuadro delimitador geográfico y de radio geográfico. -
texto
- un tipo de índice especial adecuado para carga útil de palabras clave/cadena, que afecta las condiciones de filtro de búsqueda de texto completo.
Los índices de carga útil pueden consumir memoria adicional, por lo que se recomienda indexar solo los campos utilizados en condiciones de filtro. Si necesitas filtrar en función de muchos campos, y las limitaciones de memoria no permiten indexar todos, es recomendable elegir los campos que más limiten los resultados de búsqueda. Por lo general, cuantos más valores únicos tenga un valor de carga útil, más efectivo será el uso del índice.
Índice de texto completo
Disponible a partir de la versión 0.10.0
Qdrant admite la búsqueda de texto completo para cargas útiles de cadena. El índice de texto completo te permite filtrar puntos en función de la presencia de palabras o frases en el campo de carga útil.
Configurar un índice de texto completo es ligeramente complejo porque puedes especificar parámetros de tokenización. La tokenización es el proceso de dividir una cadena en tokens y luego indexar estos tokens en un índice invertido.
Para crear un índice de texto completo, puedes usar el siguiente método:
PUT /colecciones/{nombre_de_colección}/índice
{
"nombre_campo": "nombre del campo a indexar",
"esquema_campo": {
"tipo": "texto",
"tokenizador": "palabra",
"longitud_token_min": 2,
"longitud_token_max": 20,
"minúsculas": true
}
}
Los métodos de tokenización disponibles son:
-
palabra
- Separa la cadena en función de espacios, puntuación y caracteres especiales. -
espacio en blanco
- Separa la cadena en función de espacios. -
prefijo
- Separa la cadena en función de espacios, puntuación y caracteres especiales, luego crea un índice de prefijo para cada palabra. Por ejemplo,hola
se indexará comoh
,he
,hel
,hell
,hello
. -
multilingüe
- Un tipo especial de tokenización basado en el paquete charabia. Permite la tokenización y lematización correctas de varios idiomas, incluidos idiomas con alfabetos no latinos y separadores que no son espacios. Consulta la documentación de charabia para obtener una lista completa de idiomas admitidos y opciones de normalización. En la configuración de compilación predeterminada, qdrant no incluye soporte para todos los idiomas, ya que aumentaría el tamaño de los archivos binarios. El chino, japonés y coreano no están habilitados de forma predeterminada, pero se pueden habilitar compilando qdrant a partir del código fuente utilizando las banderas--features multiling-chinese, multiling-japanese, multiling-korean
.
Consulta los ejemplos de coincidencia de texto completo para ver un ejemplo de uso de un índice de texto completo para consultas.
Indexación de vectores
La indexación de vectores es una estructura de datos basada en vectores, construida a través de modelos matemáticos específicos. Con la indexación de vectores, podemos consultar eficientemente varios vectores similares al vector objetivo.
Actualmente, Qdrant solo utiliza HNSW como índice de vectores.
HNSW (Gráfico Navegable Jerárquico de Mundo Pequeño) es un algoritmo de indexación basado en grafos. Según ciertas reglas, construye una estructura de navegación de capas múltiples para el grafo. En esta estructura, las capas superiores son más dispersas, con mayores distancias entre nodos. Las capas inferiores son más densas, con distancias más pequeñas entre nodos. La búsqueda comienza desde la capa superior, encontrando el nodo más cercano al objetivo en esa capa, y luego ingresando a la siguiente capa para otra búsqueda. Después de múltiples iteraciones, puede acercarse rápidamente a la posición objetivo.
Para mejorar el rendimiento, HNSW limita el grado máximo de nodos en cada capa del grafo a m
. Además, se puede especificar el rango de búsqueda utilizando ef_construct
(durante la construcción del índice) o ef
(mientras se busca el objetivo).
Estos parámetros se pueden configurar en el archivo de configuración:
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
Durante el proceso de creación de la colección, el parámetro ef
se puede configurar y es igual a ef_construct
de forma predeterminada.
HNSW fue elegido por varias razones. En primer lugar, HNSW es altamente compatible con permitir a Qdrant modificar filtros durante el proceso de búsqueda. En segundo lugar, según pruebas de referencia públicas, es uno de los algoritmos más precisos y rápidos.
Disponible a partir de la versión 1.1.1
Los parámetros HNSW también se pueden ajustar para colecciones y vectores nombrados para optimizar el rendimiento de la búsqueda mediante la configuración de hnsw_config
.
Índice Filtrable
Los índices de carga útil separados y los índices de vectores solos no pueden abordar completamente el uso de filtros para la búsqueda.
En casos en los que los filtros son débiles, se puede utilizar directamente el índice HNSW. En casos en los que los filtros son estrictos, se puede usar el índice de carga útil y volver a puntuar completamente. Sin embargo, en casos intermedios, este enfoque es ineficaz.
Por un lado, no podemos permitirnos realizar un escaneo completo en demasiados vectores. Por otro lado, al usar filtros demasiado estrictos, el grafo HNSW comienza a descomponerse.
Los bordes adicionales le permiten utilizar eficientemente el índice HNSW para buscar vectores vecinos y aplicar filtros durante la búsqueda en el grafo.
Este enfoque minimiza la sobrecarga de comprobaciones de condiciones, ya que solo es necesario calcular condiciones para una pequeña parte de los puntos que participan en la búsqueda.