Comparación de bases de datos vectoriales, bibliotecas de búsqueda vectorial y plugins de búsqueda vectorial
Hola - ¡Bienvenido de nuevo a Base de datos vectorial 101!
El auge de ChatGPT y otros grandes modelos lingüísticos (LLM) ha impulsado el crecimiento de las tecnologías de búsqueda vectorial, con bases de datos vectoriales especializadas como Milvus y Zilliz Cloud junto con bibliotecas como FAISS y plugins de búsqueda vectorial integrados en bases de datos convencionales.
En nuestro anterior post de la serie, profundizamos en los fundamentos de las bases de datos vectoriales. En este post, seguiremos explorando el intrincado reino de la búsqueda vectorial, comparando bases de datos vectoriales, plugins de búsqueda vectorial y bibliotecas de búsqueda vectorial.
¿Qué es la búsqueda vectorial?
La búsquedavectorial, también conocida como búsqueda de similitud vectorial, es una técnica para recuperar los resultados top-k más similares o semánticamente relacionados con un vector de consulta dado entre una extensa colección de datos vectoriales densos. Antes de realizar búsquedas de similitud, aprovechamos las redes neuronales para transformar datos no estructurados, como texto, imágenes, vídeos y audio, en vectores numéricos de alta dimensión denominados vectores de incrustación. Tras generar los vectores incrustados, los motores de búsqueda vectorial comparan la distancia espacial entre el vector de consulta de entrada y los vectores de los almacenes vectoriales. Cuanto más cerca estén en el espacio, más parecidos serán.
En el mercado existen múltiples tecnologías de búsqueda vectorial, incluidas bibliotecas de aprendizaje automático como NumPy de Python, bibliotecas de búsqueda vectorial como FAISS, plugins de búsqueda vectorial construidos sobre bases de datos tradicionales y bases de datos vectoriales especializadas como Milvus y Zilliz Cloud.
Bases de datos vectoriales frente a bibliotecas de búsqueda vectorial
Lasbases de datos vectoriales especializadas no son la única pila para las búsquedas de similitud. Antes de la aparición de las bases de datos vectoriales, se utilizaban muchas bibliotecas de búsqueda vectorial, como FAISS, ScaNN y HNSW, para la recuperación de vectores.
Las bibliotecas de búsqueda vectorial pueden ayudarle a construir rápidamente un prototipo de sistema de búsqueda vectorial de alto rendimiento. Por ejemplo, FAISS es una librería de código abierto desarrollada por Meta para la búsqueda eficiente de similitudes y la agrupación de vectores densos. FAISS puede manejar colecciones de vectores de cualquier tamaño, incluso aquellas que no pueden cargarse completamente en memoria. Además, FAISS ofrece herramientas de evaluación y ajuste de parámetros. Aunque está escrito en C++, FAISS proporciona una interfaz Python/NumPy.
Sin embargo, las bibliotecas de búsqueda vectorial no son más que bibliotecas RNA ligeras en lugar de soluciones gestionadas, y su funcionalidad es limitada. Si el conjunto de datos es pequeño y limitado, estas bibliotecas pueden ser suficientes para el procesamiento de datos no estructurados, incluso para sistemas que funcionan en producción. Sin embargo, a medida que aumenta el tamaño de los conjuntos de datos y se incorporan más usuarios, el problema de la escala se hace cada vez más difícil de resolver. Además, no permiten modificar sus datos índice y no pueden consultarse durante la importación de datos.
En cambio, las bases de datos vectoriales son una solución más óptima para el almacenamiento y la recuperación de datos no estructurados. Pueden almacenar y consultar millones o incluso miles de millones de vectores al tiempo que proporcionan respuestas en tiempo real; son altamente escalables para satisfacer las crecientes necesidades empresariales de los usuarios.
Además, las bases de datos vectoriales como Milvus tienen características mucho más fáciles de usar para datos estructurados/semi-estructurados: natividad en la nube, multi-tenancy, escalabilidad, etc. Estas características quedarán claras a medida que profundicemos en este tutorial.
También operan en una capa de abstracción totalmente diferente de las bibliotecas de búsqueda vectorial: las bases de datos vectoriales son servicios completos, mientras que las bibliotecas RNA están pensadas para integrarse en la aplicación que estás desarrollando. En este sentido, las bibliotecas RNA son uno de los muchos componentes sobre los que se construyen las bases de datos vectoriales, de forma similar a como Elasticsearch se construye sobre Apache Lucene.
Para dar un ejemplo de por qué esta abstracción es tan importante, veamos cómo insertar un nuevo elemento de datos no estructurados en una base de datos vectorial. Esto es súper fácil en Milvus:
from pymilvus import Collectioncollection = Collection('book')mr = collection.insert(data)
Es realmente tan fácil como eso - 3 líneas de código. Con una biblioteca como FAISS o ScaNN, no hay, por desgracia, ninguna manera fácil de hacer esto sin recrear manualmente todo el índice en ciertos puntos de control. Incluso si se pudiera, las bibliotecas de búsqueda vectorial seguirían careciendo de escalabilidad y multi-tenancy, dos de las características más importantes de las bases de datos vectoriales.
Bases de datos vectoriales frente a complementos de búsqueda vectorial para bases de datos tradicionales
Bien, ahora que hemos establecido la diferencia entre las bibliotecas de búsqueda vectorial y las bases de datos vectoriales, veamos en qué se diferencian las bases de datos vectoriales de los plugins de búsqueda vectorial.
Cada vez más bases de datos relacionales tradicionales y sistemas de búsqueda como Clickhouse y Elasticsearch incluyen complementos de búsqueda vectorial. Elasticsearch 8.0, por ejemplo, incluye funciones de inserción de vectores y búsqueda RNA que pueden invocarse a través de puntos finales de API restful. El problema con los plugins de búsqueda vectorial debería ser tan claro como la noche y el día: estas soluciones no adoptan un enfoque de pila completa para integrar la gestión y la búsqueda vectorial. En su lugar, estos plugins están pensados para ser mejoras sobre arquitecturas existentes, por lo que son limitados y no están optimizados. Desarrollar una aplicación de datos no estructurados sobre una base de datos tradicional sería como intentar colocar baterías de litio y motores eléctricos en el chasis de un coche de gasolina: ¡no es una buena idea!
Para ilustrarlo, volvamos a la lista de características que debería tener una base de datos vectorial (de la primera sección). Los plugins de búsqueda vectorial carecen de dos de estas características: capacidad de ajuste y API/SDK fáciles de usar. Seguiré utilizando el motor RNA de Elasticsearch como ejemplo; otros plugins de búsqueda vectorial funcionan de forma muy similar, por lo que no entraré mucho más en detalles. Elasticsearch admite el almacenamiento vectorial a través del tipo de campo de datos dense_vector
y permite la consulta a través de knnsearch endpoint
:
PUT index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 128,
"index": true,
"similarity": "l2_norm"
}
}
}
}
PUT index/_doc
{
"image-vector": [0.12, 1.34, ...]
}
GET index/_knn_search
{
"knn": {
"field": "image-vector",
"query_vector": [-0.5, 9.4, ...],
"k": 10,
"num_candidates": 100
}
}
El plugin ANN de Elasticsearch sólo admite un algoritmo de indexación: Hierarchical Navigable Small Worlds, también conocido como HNSW (me gusta pensar que su creador se adelantó a Marvel a la hora de popularizar el multiverso). Además, sólo se admite la distancia L2/Euclídea como métrica de distancia. Es un buen comienzo, pero comparémoslo con Milvus, una base de datos vectorial en toda regla. Utilizando pymilvus
:
>>> field1 = FieldSchema(name='id', dtype=DataType.INT64, description='int64', is_primary=True)
>>> field2 = FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, description='embedding', dim=128, is_primary=False)
>>> schema = CollectionSchema(fields=[field1, field2], description='hello world collection')
>>> collection = Collection(name='my_collection', data=None, schema=schema)
>>> index_params = {
'index_type': 'IVF_FLAT',
'params': {'nlist': 1024},
"metric_type": 'L2'}
>>> collection.create_index('embedding', index_params)
>>> search_param = {
'data': vector,
'anns_field': 'embedding',
'param': {'metric_type': 'L2', 'params': {'nprobe': 16}},
'limit': 10,
'expr': 'id_field > 0'
}
>>> results = collection.search(**search_param)
Aunque tanto Elasticsearch como Milvus tienen métodos para crear índices, insertar vectores incrustados y realizar búsquedas de vecinos más cercanos, está claro a partir de estos ejemplos que Milvus tiene una API de búsqueda vectorial más intuitiva (mejor API de cara al usuario) y un índice vectorial más amplio + soporte de métrica de distancia (mejor capacidad de ajuste). Milvus también planea soportar más índices vectoriales y permitir la consulta a través de sentencias SQL en el futuro, mejorando aún más tanto la capacidad de ajuste como la facilidad de uso.
Acabamos de pasar por alto una gran cantidad de contenido. Es cierto que esta sección era bastante larga, así que para aquellos que la hayan hojeado, aquí va un resumen rápido: Milvus es mejor que los plugins de búsqueda vectorial porque Milvus se construyó desde cero como una base de datos vectorial, lo que permite un conjunto más rico de características y una arquitectura más adecuada para los datos no estructurados.
¿Cómo elegir entre diferentes tecnologías de búsqueda vectorial?
No todas las bases de datos vectoriales son iguales; cada una posee características únicas que se adaptan a aplicaciones específicas. Las bibliotecas y plugins de búsqueda vectorial son fáciles de usar e ideales para manejar entornos de producción a pequeña escala con millones de vectores. Si el tamaño de sus datos es pequeño y sólo necesita una funcionalidad básica de búsqueda vectorial, estas tecnologías son suficientes para su negocio.
Sin embargo, una base de datos vectorial especializada debería ser su primera opción para las empresas con un uso intensivo de datos que manejan cientos de millones de vectores y exigen respuestas en tiempo real. Milvus, por ejemplo, gestiona sin esfuerzo miles de millones de vectores, ofreciendo velocidades de consulta ultrarrápidas y una gran funcionalidad. Además, las soluciones totalmente gestionadas como Zilliz resultan aún más ventajosas, ya que le liberan de los retos operativos y le permiten centrarse exclusivamente en sus actividades empresariales principales.
Eche un vistazo a los cursos Vector Database 101
- Introducción a los datos no estructurados
- ¿Qué es una base de datos vectorial?
- Comparación de bases de datos vectoriales, bibliotecas de búsqueda vectorial y complementos de búsqueda vectorial
- Introducción a Milvus
- Inicio rápido de Milvus
- Introducción a la búsqueda por similitud vectorial
- Conceptos básicos de índices vectoriales e índice de archivos invertido
- Cuantificación escalar y cuantificación de productos
- Pequeños mundos navegables jerárquicos (HNSW)
- Vecinos más próximos aproximados Oh, sí (ANNOY)
- Elección del índice vectorial adecuado para su proyecto
- DiskANN y el algoritmo Vamana
- ¿Qué es la búsqueda vectorial?
- Bases de datos vectoriales frente a bibliotecas de búsqueda vectorial
- Bases de datos vectoriales frente a complementos de búsqueda vectorial para bases de datos tradicionales
- ¿Cómo elegir entre diferentes tecnologías de búsqueda vectorial?
- Eche un vistazo a los cursos Vector Database 101
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word