Comparação de bases de dados vectoriais, bibliotecas de pesquisa vetorial e plug-ins de pesquisa vetorial
Olá - bem-vindo de volta ao Vetor Database 101!
O aumento do ChatGPT e de outros modelos de linguagem de grande porte (LLMs) impulsionou o crescimento das tecnologias de pesquisa vetorial, apresentando bancos de dados vetoriais especializados, como Milvus e Zilliz Cloud, juntamente com bibliotecas como FAISS e plug-ins de pesquisa vetorial integrados em bancos de dados convencionais.
Na publicação anterior da nossa série, analisámos os fundamentos das bases de dados vectoriais. Nesta publicação, continuaremos a explorar o complexo domínio da pesquisa vetorial, comparando bases de dados vectoriais, plug-ins de pesquisa vetorial e bibliotecas de pesquisa vetorial.
O que é pesquisa vetorial?
A pesquisa vetorial, também conhecida como pesquisa de similaridade vetorial, é uma técnica para recuperar os resultados top-k que são mais semelhantes ou semanticamente relacionados a um determinado vetor de consulta entre uma extensa coleção de dados vetoriais densos. Antes de efetuar pesquisas de semelhança, utilizamos redes neuronais para transformar dados não estruturados, como texto, imagens, vídeos e áudio, em vectores numéricos de elevada dimensão, denominados vectores de incorporação. Depois de gerar vectores de incorporação, os motores de pesquisa vetorial comparam a distância espacial entre o vetor de consulta de entrada e os vectores nos armazenamentos vectoriais. Quanto mais próximos estiverem no espaço, mais semelhantes são.
Estão disponíveis no mercado várias tecnologias de pesquisa vetorial, incluindo bibliotecas de aprendizagem automática como a NumPy do Python, bibliotecas de pesquisa vetorial como a FAISS, plug-ins de pesquisa vetorial criados em bases de dados tradicionais e bases de dados vectoriais especializadas como a Milvus e a Zilliz Cloud.
Bases de dados vectoriais vs. bibliotecas de pesquisa vetorial
Os bancos de dados vetoriais especializados não são a única pilha para pesquisas de similaridade. Antes do advento dos bancos de dados vetoriais, muitas bibliotecas de pesquisa de vetores, como FAISS, ScaNN e HNSW, eram usadas para recuperação de vetores.
As bibliotecas de pesquisa vetorial podem ajudá-lo a criar rapidamente um protótipo de sistema de pesquisa vetorial de elevado desempenho. Tomando o FAISS como exemplo, é de código aberto e foi desenvolvido pela Meta para uma pesquisa eficiente de semelhanças e agrupamento de vectores densos. O FAISS pode lidar com colecções de vectores de qualquer tamanho, mesmo aquelas que não podem ser totalmente carregadas na memória. Além disso, o FAISS oferece ferramentas para avaliação e ajuste de parâmetros. Embora escrito em C++, o FAISS fornece uma interface Python/NumPy.
No entanto, as bibliotecas de pesquisa vetorial são apenas bibliotecas ANN leves, em vez de soluções geridas, e têm uma funcionalidade limitada. Se o seu conjunto de dados for pequeno e limitado, estas bibliotecas podem ser suficientes para o processamento de dados não estruturados, mesmo para sistemas em produção. No entanto, à medida que o tamanho do conjunto de dados aumenta e mais utilizadores são integrados, o problema da escala torna-se cada vez mais difícil de resolver. Além disso, não permitem quaisquer modificações nos seus dados de índice e não podem ser consultadas durante a importação de dados.
Em contrapartida, as bases de dados vectoriais são uma solução mais adequada para o armazenamento e a recuperação de dados não estruturados. Podem armazenar e consultar milhões ou mesmo milhares de milhões de vectores, fornecendo simultaneamente respostas em tempo real; são altamente escaláveis para satisfazer as crescentes necessidades comerciais dos utilizadores.
Além disso, as bases de dados vectoriais como o Milvus têm caraterísticas muito mais fáceis de utilizar para dados estruturados/semi-estruturados: natividade da nuvem, multi-tenancy, escalabilidade, etc. Estas caraterísticas tornar-se-ão claras à medida que nos aprofundarmos neste tutorial.
Também operam numa camada de abstração totalmente diferente das bibliotecas de pesquisa vetorial - as bases de dados vectoriais são serviços completos, enquanto as bibliotecas ANN se destinam a ser integradas na aplicação que está a desenvolver. Neste sentido, as bibliotecas ANN são um dos muitos componentes sobre os quais as bases de dados vectoriais são construídas, da mesma forma que o Elasticsearch é construído sobre o Apache Lucene.
Para dar um exemplo do motivo pelo qual esta abstração é tão importante, vejamos como inserir um novo elemento de dados não estruturados numa base de dados vetorial. Isto é muito fácil no Milvus:
from pymilvus import Collectioncollection = Collection('book')mr = collection.insert(data)
É realmente tão fácil quanto isso - 3 linhas de código. Com uma biblioteca como a FAISS ou a ScaNN, não há, infelizmente, uma forma fácil de o fazer sem recriar manualmente todo o índice em determinados pontos de controlo. Mesmo que fosse possível, as bibliotecas de pesquisa vetorial continuam a não ter escalabilidade e multilocação, duas das caraterísticas mais importantes das bases de dados vectoriais.
Bases de dados vectoriais vs. plugins de pesquisa vetorial para bases de dados tradicionais
Ótimo, agora que já estabelecemos a diferença entre bibliotecas de pesquisa vetorial e bases de dados vectoriais, vamos ver como as bases de dados vectoriais diferem dos plugins de pesquisa vetorial.
Um número crescente de bancos de dados relacionais tradicionais e sistemas de pesquisa como o Clickhouse e o Elasticsearch estão incluindo plug-ins de pesquisa vetorial integrados. O Elasticsearch 8.0, por exemplo, inclui a inserção de vetores e a funcionalidade de pesquisa ANN que pode ser chamada por meio de pontos de extremidade de API restrita. O problema com os plug-ins de pesquisa vetorial deve ser claro como a noite e o dia - essas soluções não adotam uma abordagem de pilha completa para incorporar o gerenciamento e a pesquisa vetorial. Em vez disso, esses plug-ins devem ser aprimorados em arquiteturas existentes, o que os torna limitados e não otimizados. Desenvolver uma aplicação de dados não estruturados sobre uma base de dados tradicional seria como tentar encaixar baterias de lítio e motores eléctricos na estrutura de um carro a gasolina - não é uma boa ideia!
Para ilustrar esta situação, voltemos à lista de funcionalidades que uma base de dados vetorial deve implementar (da primeira secção). Os plugins de pesquisa vetorial carecem de duas destas caraterísticas - afinabilidade e APIs/SDKs fáceis de utilizar. Continuarei a utilizar o motor ANN do Elasticsearch como exemplo; outros plugins de pesquisa vetorial funcionam de forma muito semelhante, pelo que não entrarei muito em pormenores. O Elasticsearch suporta o armazenamento de vectores através do tipo de campo de dados dense_vector
e permite a consulta através do 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
}
}
O plug-in ANN do Elasticsearch suporta apenas um algoritmo de indexação: Hierarchical Navigable Small Worlds, também conhecido como HNSW (gosto de pensar que o criador estava à frente da Marvel quando se tratou de popularizar o multiverso). Para além disso, apenas a distância L2/Euclidiana é suportada como métrica de distância. É um bom começo, mas vamos compará-lo com o Milvus, uma base de dados vetorial completa. Usando 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)
Embora tanto o Elasticsearch quanto o Milvus tenham métodos para criar índices, inserir vetores de incorporação e executar a pesquisa de vizinho mais próximo, fica claro a partir desses exemplos que o Milvus tem uma API de pesquisa vetorial mais intuitiva (melhor API voltada para o usuário) e um índice vetorial mais amplo + suporte à métrica de distância (melhor ajuste). Milvus também planeia suportar mais índices vectoriais e permitir a consulta através de instruções do tipo SQL no futuro, melhorando ainda mais a afinação e a usabilidade.
Acabámos de passar por uma grande quantidade de conteúdo. Esta secção foi reconhecidamente bastante longa, por isso, para aqueles que a passaram despercebidos, aqui fica um tl;dr rápido: o Milvus é melhor do que os plugins de pesquisa vetorial porque o Milvus foi construído de raiz como uma base de dados vetorial, permitindo um conjunto mais rico de funcionalidades e uma arquitetura mais adequada a dados não estruturados.
Como escolher entre diferentes tecnologias de pesquisa vetorial?
Nem todas as bases de dados vectoriais são criadas da mesma forma; cada uma possui caraterísticas únicas que se adaptam a aplicações específicas. As bibliotecas e os plugins de pesquisa vetorial são fáceis de utilizar e ideais para lidar com ambientes de produção de pequena escala com milhões de vectores. Se a dimensão dos seus dados for pequena e apenas necessitar de uma funcionalidade básica de pesquisa de vectores, estas tecnologias são suficientes para a sua empresa.
No entanto, uma base de dados especializada em vectores deve ser a sua primeira escolha para empresas com grande volume de dados, que lidam com centenas de milhões de vectores e exigem respostas em tempo real. O Milvus, por exemplo, gere sem esforço milhares de milhões de vectores, oferecendo velocidades de consulta extremamente rápidas e uma funcionalidade rica. Além disso, as soluções totalmente geridas, como o Zilliz, revelam-se ainda mais vantajosas, libertando-o dos desafios operacionais e permitindo-lhe concentrar-se exclusivamente nas suas actividades principais.
Dê outra vista de olhos aos cursos Vetor Database 101
- Introdução aos dados não estruturados
- O que é uma Base de Dados Vetorial?
- Comparação entre Bases de Dados Vectoriais, Bibliotecas de Pesquisa Vetorial e Plugins de Pesquisa Vetorial
- Introdução ao Milvus
- Início rápido do Milvus
- Introdução à pesquisa de similaridade vetorial
- Noções básicas sobre o índice vetorial e o índice de arquivo invertido
- Quantização escalar e quantização de produtos
- Mundos pequenos navegáveis hierárquicos (HNSW)
- Vizinhos mais próximos aproximados Oh Yeah (ANNOY)
- Escolhendo o índice vetorial correto para seu projeto
- DiskANN e o Algoritmo Vamana
- O que é pesquisa vetorial?
- Bases de dados vectoriais vs. bibliotecas de pesquisa vetorial
- Bases de dados vectoriais vs. plugins de pesquisa vetorial para bases de dados tradicionais
- Como escolher entre diferentes tecnologias de pesquisa vetorial?
- Dê outra vista de olhos aos cursos Vetor 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