🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Porquê e quando é que é necessária uma base de dados de vectores criada para o efeito?

Porquê e quando é que é necessária uma base de dados de vectores criada para o efeito?

  • Engineering
August 29, 2023
James Luan

Este artigo foi publicado originalmente no AIAI e é republicado aqui com permissão.

A crescente popularidade do ChatGPT e de outros modelos de linguagem de grande dimensão (LLMs) impulsionou o aumento das tecnologias de pesquisa vetorial, incluindo bases de dados vectoriais criadas para o efeito, como o Milvus e o Zilliz Cloud, bibliotecas de pesquisa vetorial, como o FAISS, e plug-ins de pesquisa vetorial integrados em bases de dados tradicionais. No entanto, escolher a melhor solução para as suas necessidades pode ser um desafio. Tal como escolher entre um restaurante de luxo e uma cadeia de fast-food, a seleção da tecnologia de pesquisa vetorial adequada depende das suas necessidades e expectativas.

Nesta publicação, apresentarei uma panorâmica geral da pesquisa vetorial e do seu funcionamento, compararei diferentes tecnologias de pesquisa vetorial e explicarei por que razão é crucial optar por uma base de dados vetorial criada para o efeito.

O que é a pesquisa vetorial e como funciona?

A pesquisa vetorial, também conhecida como pesquisa por semelhança de vectores, é uma técnica para recuperar os principais resultados que são mais semelhantes ou semanticamente relacionados com um determinado vetor de consulta entre uma extensa coleção de dados vectoriais 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. Por exemplo, podemos utilizar a rede neural convolucional ResNet-50 pré-treinada para transformar uma imagem de uma ave numa coleção de incorporação com 2.048 dimensões. Aqui, listamos os três primeiros e os três últimos elementos do vetor: [0.1392, 0.3572, 0.1988, ..., 0.2888, 0.6611, 0.2909].

A bird image by Patrice Bouchard Imagem de uma ave por Patrice Bouchard

Depois de gerar os 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.

Embedding arithmetic Aritmética de incorporaçã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.

Bibliotecas de aprendizagem automática

A utilização de bibliotecas de aprendizagem automática é a forma mais fácil de implementar pesquisas vectoriais. Por exemplo, podemos usar o NumPy do Python para implementar um algoritmo de vizinho mais próximo em menos de 20 linhas de código.

import numpy as np

# Function to calculate euclidean distance
def euclidean_distance(a, b):
return np.linalg.norm(a - b)

# Function to perform knn
def knn(data, target, k):
# Calculate distances between target and all points in the data
distances = [euclidean_distance(d, target) for d in data]
# Combine distances with data indices
distances = np.array(list(zip(distances, np.arange(len(data)))))

# Sort by distance
sorted_distances = distances[distances[:, 0].argsort()]

# Get the top k closest indices
closest_k_indices = sorted_distances[:k, 1].astype(int)

# Return the top k closest vectors
return data[closest_k_indices]

Podemos gerar 100 vectores bidimensionais e encontrar o vizinho mais próximo do vetor [0.5, 0.5].

# Define some 2D vectors
data = np.random.rand(100, 2)

# Define a target vector
target = np.array([0.5, 0.5])

# Define k
k = 3

# Perform knn
closest_vectors = knn(data, target, k)

# Print the result
print("The closest vectors are:")
print(closest_vectors)

As bibliotecas de aprendizagem automática, como a NumPy do Python, oferecem uma grande flexibilidade a um baixo custo. No entanto, têm algumas limitações. Por exemplo, só podem lidar com uma pequena quantidade de dados e não garantem a persistência dos dados.

Só recomendo a utilização do NumPy ou de outras bibliotecas de aprendizagem automática para pesquisa vetorial quando:

  • Necessita de uma prototipagem rápida.
  • Não se preocupa com a persistência dos dados.
  • O tamanho dos seus dados é inferior a um milhão e não necessita de filtragem escalar.
  • Não precisa de alto desempenho.

Bibliotecas de pesquisa vetorial

As bibliotecas de pesquisa vetorial podem ajudá-lo a construir rapidamente um protótipo de sistema de pesquisa vetorial de elevado desempenho. O FAISS é um exemplo típico. É de código aberto e foi desenvolvida pela Meta para 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++, FAISS fornece uma interface Python/NumPy.

Abaixo está o código de um exemplo de pesquisa vetorial baseado no FAISS:

import numpy as np
import faiss

# Generate some example data
dimension = 64 # dimension of the vector space
database_size = 10000 # size of the database
query_size = 100 # number of queries to perform
np.random.seed(123) # make the random numbers predictable

# Generating vectors to index in the database (db_vectors)
db_vectors = np.random.random((database_size, dimension)).astype('float32')

# Generating vectors for query (query_vectors)
query_vectors = np.random.random((query_size, dimension)).astype('float32')

# Building the index
index = faiss.IndexFlatL2(dimension) # using the L2 distance metric
print(index.is_trained) # should return True

# Adding vectors to the index
index.add(db_vectors)
print(index.ntotal) # should return database_size (10000)

# Perform a search
k = 4 # we want to see 4 nearest neighbors
distances, indices = index.search(query_vectors, k)

# Print the results
print("Indices of nearest neighbors: \n", indices)
print("\nL2 distances to the nearest neighbors: \n", distances)

As bibliotecas de pesquisa vetorial como o FAISS são fáceis de utilizar e suficientemente rápidas para lidar com ambientes de produção em pequena escala com milhões de vectores. É possível melhorar o desempenho da consulta utilizando quantização e GPUs e reduzindo as dimensões dos dados.

No entanto, essas bibliotecas têm algumas limitações quando usadas na produção. Por exemplo, o FAISS não suporta adição e exclusão de dados em tempo real, chamadas remotas, vários idiomas, filtragem escalar, escalabilidade ou recuperação de desastres.

Diferentes tipos de bases de dados vectoriais

As bases de dados vectoriais surgiram para dar resposta às limitações das bibliotecas acima referidas, fornecendo uma solução mais abrangente e prática para aplicações de produção.

Há quatro tipos de bases de dados vectoriais disponíveis no campo de batalha:

  • Bases de dados relacionais ou colunares existentes que incorporam um plugin de pesquisa vetorial. O PG Vetor é um exemplo.
  • Motores de pesquisa tradicionais de índice invertido com suporte para indexação vetorial densa. O ElasticSearch é um exemplo.
  • Bases de dados vectoriais leves baseadas em bibliotecas de pesquisa vetorial. Chroma é um exemplo.
  • Bases de dados vectoriais criadas para fins específicos. Este tipo de base de dados foi especificamente concebido e optimizado para a pesquisa vetorial de baixo para cima. As bases de dados vectoriais específicas oferecem normalmente funcionalidades mais avançadas, incluindo computação distribuída, recuperação de desastres e persistência de dados. O Milvus é um exemplo importante.

Nem todas as bases de dados vectoriais são criadas da mesma forma. Cada pilha tem vantagens e limitações únicas, o que as torna mais ou menos adequadas para diferentes aplicações.

Prefiro bases de dados vectoriais especializadas a outras soluções porque são a opção mais eficiente e conveniente, oferecendo inúmeras vantagens únicas. Nas secções seguintes, utilizarei o Milvus como exemplo para explicar as razões da minha preferência.

Principais vantagens das bases de dados vectoriais criadas para fins específicos

O Milvus é uma base de dados de vectores de código aberto, distribuída e criada para o efeito, que pode armazenar, indexar, gerir e recuperar milhares de milhões de vectores de incorporação. É também uma das bases de dados vectoriais mais populares para a geração aumentada de recuperação LLM. Como exemplo de bases de dados vectoriais criadas para o efeito, o Milvus partilha muitas vantagens únicas com as suas congéneres.

Persistência de dados e armazenamento económico

Embora a prevenção da perda de dados seja o requisito mínimo para uma base de dados, muitas bases de dados vectoriais leves e de máquina única não dão prioridade à fiabilidade dos dados. Por outro lado, as bases de dados vectoriais distribuídas criadas para o efeito, como a Milvus, dão prioridade à resiliência do sistema, à escalabilidade e à persistência dos dados, separando o armazenamento e a computação.

Além disso, a maioria das bases de dados vectoriais que utilizam índices ANN (approximate nearest neighbor) necessitam de muita memória para efetuar pesquisas vectoriais, uma vez que carregam os índices ANN exclusivamente na memória. No entanto, o Milvus suporta índices em disco, tornando o armazenamento dez vezes mais económico do que os índices em memória.

Desempenho ótimo das consultas

Uma base de dados vetorial especializada fornece um desempenho de consulta ótimo em comparação com outras opções de pesquisa vetorial. Por exemplo, o Milvus é dez vezes mais rápido no tratamento de consultas do que os plugins de pesquisa vetorial. O Milvus utiliza o algoritmo ANN em vez do algoritmo de pesquisa brutal KNN para uma pesquisa vetorial mais rápida. Além disso, fragmenta os seus índices, reduzindo o tempo necessário para construir um índice à medida que o volume de dados aumenta. Esta abordagem permite ao Milvus lidar facilmente com milhares de milhões de vectores com adições e eliminações de dados em tempo real. Em contrapartida, outros add-ons de pesquisa vetorial só são adequados para cenários com menos de dezenas de milhões de dados e adições e eliminações pouco frequentes.

O Milvus também suporta a aceleração por GPU. Testes internos mostram que a indexação vetorial acelerada por GPU pode atingir mais de 10.000 QPS ao pesquisar dezenas de milhões de dados, o que é pelo menos dez vezes mais rápido do que a indexação tradicional por CPU para o desempenho de consultas numa única máquina.

Confiabilidade do sistema

Muitas aplicações utilizam bases de dados vectoriais para consultas online que requerem uma baixa latência de consulta e um elevado rendimento. Essas aplicações exigem failover de máquina única no nível do minuto, e algumas até exigem recuperação de desastres entre regiões para cenários críticos. As estratégias de replicação tradicionais baseadas em Raft/Paxos sofrem de um grave desperdício de recursos e necessitam de ajuda para pré-distribuir os dados, o que leva a uma fraca fiabilidade. Em contrapartida, o Milvus tem uma arquitetura distribuída que aproveita as filas de mensagens do K8s para uma elevada disponibilidade, reduzindo o tempo de recuperação e poupando recursos.

Operacionalidade e observabilidade

Para melhor servir os utilizadores empresariais, as bases de dados vectoriais devem oferecer uma gama de caraterísticas de nível empresarial para uma melhor operabilidade e observabilidade. O Milvus suporta vários métodos de implementação, incluindo K8s Operator e Helm chart, docker-compose e pip install, tornando-o acessível a utilizadores com diferentes necessidades. O Milvus também fornece um sistema de monitorização e alarme baseado em Grafana, Prometheus e Loki, melhorando a sua observabilidade. Com uma arquitetura distribuída nativa da nuvem, o Milvus é o primeiro banco de dados vetorial do setor a oferecer suporte ao isolamento de vários locatários, RBAC, limitação de cotas e atualizações contínuas. Todas essas abordagens tornam o gerenciamento e o monitoramento do Milvus muito mais simples.

Começar a utilizar o Milvus em 3 passos simples em 10 minutos

Construir uma base de dados vetorial é uma tarefa complexa, mas utilizar uma é tão simples como utilizar Numpy e FAISS. Mesmo os estudantes não familiarizados com a IA podem implementar a pesquisa vetorial com base no Milvus em apenas dez minutos. Para experimentar serviços de pesquisa vetorial altamente escaláveis e de elevado desempenho, siga estes três passos:

Like the article? Spread the word

Continue Lendo