Bancos de dados vetoriais: introdução técnica [PDF]
(tge-data-web.nyc3.digitaloceanspaces.com)- À medida que aplicações de IA lidam com dados não estruturados e de alta dimensionalidade, os bancos de dados vetoriais se tornam importantes como sistemas especializados para armazenar e recuperar dados na forma de arrays numéricos
- O ponto central está em aproveitar o significado implícito ao conectar registros com base na similaridade entre atributos dos dados, em vez de linhas, colunas ou relações explícitas
- Ao codificar relações semânticas como vetores multidimensionais, é possível executar mais rapidamente tarefas analíticas como busca por similaridade, clustering e classificação
- Em IA generativa, são usados para gerenciar grandes volumes de dados de alta dimensionalidade e melhorar a velocidade de treinamento e inferência, além dos resultados personalizados, por meio da busca de vetores similares
- A indexação avançada reduz o tempo de busca ao restringir o alvo da pesquisa a subconjuntos mais relevantes, e permite consultas complexas que combinam similaridade com outras condições
Tipos de dados tratados por bancos de dados vetoriais
- Bancos de dados vetoriais são bancos especializados para armazenar, gerenciar e processar vetores, que são representações de dados de alta dimensionalidade
- Diferentemente dos bancos de dados tradicionais, que armazenam dados em linhas e colunas, bancos de dados vetoriais armazenam dados como vetores em um espaço multidimensional
- Cada vetor é um array numérico que representa as características ou atributos de um ponto de dados
Conexões baseadas em significado e similaridade
- Bancos de dados tradicionais estabelecem relações entre elementos com base em links ou hierarquias explícitas
- Bancos de dados vetoriais conectam registros algoritmicamente com base na similaridade dos atributos dos dados
- Essa abordagem pode criar conexões mais intuitivas com base no significado implícito dentro dos elementos do banco de dados
Estrutura voltada a consultas analíticas
- Quando os dados são codificados como vetores multidimensionais — ou seja, arrays numéricos — que refletem relações semânticas, tarefas analíticas avançadas podem ser executadas rapidamente
- As operações compatíveis incluem busca por similaridade, clustering e classificação
- O modelo computacional é adequado para detecção de padrões, análise preditiva e aplicações com altas exigências analíticas
Uso em IA e IA generativa
- A disseminação da IA e do aprendizado de máquina é um dos principais fatores por trás do crescimento da demanda por bancos de dados vetoriais
- No campo da IA generativa, bancos de dados vetoriais são projetados para armazenar e gerenciar com eficiência grandes volumes de dados de alta dimensionalidade
- Como permitem buscar e recuperar rapidamente vetores similares, podem acelerar significativamente os processos de treinamento e inferência de modelos de IA generativa
- Também são usados para ajudar sistemas de IA generativa a oferecer conteúdos mais personalizados e relevantes aos usuários
Indexação e condições de busca complexas
- Bancos de dados vetoriais usam técnicas avançadas de indexação para consultar e recuperar rapidamente vetores similares
- Os índices reduzem bastante o tempo de busca ao restringir o alvo da pesquisa a subconjuntos menores e mais relevantes de vetores
- Também conseguem processar consultas complexas que combinam condições de similaridade com outros critérios de busca
- Essa flexibilidade é importante em aplicações avançadas de IA que exigem recursos de busca sofisticados
1 comentários
Opiniões do Hacker News
A Comprehensive Survey on Vector Database: Storage and Retrieval Technique, Challenge: https://arxiv.org/abs/2310.11703
Survey of Vector Database Management Systems: https://arxiv.org/abs/2310.14021
What are Embeddings: https://raw.githubusercontent.com/veekaybee/what_are_embeddi...
Créditos: https://twitter.com/eatonphil/status/1745524630624862314 e https://twitter.com/ChristophMolnar/status/17457316026829826...
Também disponível como slides comentados e um vídeo de 38 minutos opcional
Artigo da Wikipedia: https://en.wikipedia.org/wiki/Vector_database
Vector Database 101: https://zilliz.com/learn/introduction-to-unstructured-data
Vizinhos mais próximos aproximados e busca por similaridade: https://vinija.ai/concepts/ann-similarity-search/
Bancos de dados distribuídos: https://15445.courses.cs.cmu.edu/fall2021/notes/21-distribut...
Era algo que eu também queria saber, então seria bom ter critérios ou regras práticas
Recentemente brinquei com embeddings usando a excelente ferramenta
llmdo Simon Willison, e a abordagem é a mais simples possível: armazenar embeddings no SQLite junto com algumas UDFs para cálculo de distânciaEssa simplicidade é atraente, mas quando o tráfego e os dados passam de certo nível provavelmente é preciso um banco de dados mais especializado; queria ter uma noção de onde fica esse limite
A busca era feita do jeito mais simples, varrendo tudo e comparando pela distância de Hamming (
xorepopcount), e em um único core de um MBP de 2011 eu conseguia escanear 200 mil hashes em menos de 10 ms para encontrar os itens mais parecidosEram cerca de 1.000 linhas de código, então no fim não precisei de um banco de dados vetorial externo
Mas, acima disso, opções razoáveis como Pinecone ficam complicadas, lentas e absurdamente caras
Até onde sei, a melhor opção é turbopuffer.com, que é cerca de 100 vezes mais barato que Pinecone e parece realmente escalar
Como não estava na lista de bancos de dados vetoriais recomendados nos slides, deixo como uma boa sugestão
https://news.ycombinator.com/item?id=38703943
A aula misturava teoria e demonstrações, cobrindo os conceitos básicos de vetores, bancos de dados vetoriais, índices e busca por similaridade, e terminava com demonstrações dos bancos de dados Pinecone e Weaviate
Nessa etapa, o julgamento humano entra de forma muito sutil, às vezes quase imperceptível, fazendo com que por fora pareça um sistema muito automatizado de “é só matemática”
Pegando áudio como exemplo: quais características extrair para criar um vetor N-dimensional? A resposta fácil poderia ser “o máximo possível”
Mas, primeiro, mesmo características que podem ser nomeadas facilmente talvez não tenham dados de caracterização acessíveis
Segundo, sem conhecimento profundo do domínio, talvez você nem saiba que existem características latentes que deveria usar
Terceiro, mesmo com conhecimento profundo do domínio, ainda assim talvez não saiba quais características latentes deveria usar
Por exemplo, digamos que você seja fã de música minimalista com defasagem de fase ao estilo Reich. Você consulta indiretamente um banco de dados vetorial tentando encontrar músicas parecidas com obras representativas desse gênero, como Piano Phase
O banco de dados usa várias características de áudio e música, como frequência dominante, intervalos entre inícios de notas, volume, características de timbre baseadas na distribuição de frequências, raiz e escala aparentes etc.
Mas se o conjunto de características do banco de dados não incluir “o intervalo entre as notas ao longo do tempo é constante”, a consulta pode até encontrar coisas parecidas em timbre, harmonia, melodia e ritmo, mas encontrar músicas que compartilhem a característica central — a fase relativa das duas linhas melódicas muda de forma constante — fica inteiramente por conta da sorte
Não é difícil criar exemplos semelhantes para qualquer tipo de dado: visual, texto, numérico etc.
Claro que isso não quer dizer que bancos de dados vetoriais e classificação de características sejam inúteis
Uma das primeiras perguntas a fazer ao encontrar, ou não encontrar, padrões correspondentes em um dataset específico é se há uma garantia forte de que o conjunto de características está completo; se não houver, como ele deve ser expandido
Bancos de dados vetoriais são voltados a busca e recuperação de resultados de busca
Normalmente, a forma de criar vetores é fazer fine-tuning de um grande modelo pré-treinado e extrair suas representações internas
Como o dataset contém consultas bem-sucedidas e resultados recuperados, basta usar as entradas brutas para otimizar a função de perda em relação ao objetivo de similaridade suportado pelo banco de dados vetorial
Em modalidades comuns como tabelas, texto, imagens e áudio, quase não entra julgamento humano na seleção de características; basta aplicar attention
A propósito, modelos texto-vetor modernos como o E5-Mistral nem sequer exigem curadoria humana no dataset
Você acertou bem o ponto de “não saber o que não se sabe”
É bom ver outro fã de Steve Reich, e fiquei curioso para receber recomendações de músicas parecidas com Music for 18 Musicians, de que gosto
É uma ótima visão geral, mas a última seção não aborda a pergunta óbvia de decidir entre um armazenamento vetorial, como Postgres+pgvector, e um banco de dados vetorial, como Pinecone
Eu gostaria de ver mais apresentações discutindo vários trade-offs — velocidade de consulta, velocidade de inserção e construção de índices, facilidade de uso etc. — para ajudar a escolher a opção certa para cada aplicação
PRs são sempre bem-vindos
Um banco de dados é um armazenamento com várias funcionalidades adicionadas
digitaloceanspaces.com é um provedor de hospedagem no estilo S3, então seria bom se o Hacker News tratasse isso de forma especial e, em vez de exibir o domínio simplesmente como digitaloceanspaces.com, mostrasse algo como tge-data-web.nyc3.digitaloceanspaces.com
Mas o S3 também parece ter o mesmo problema: https://news.ycombinator.com/item?id=38876761
Há precedentes em outros lugares. Sites em subdomínios x.github.io são tratados de forma especial aqui: https://news.ycombinator.com/from?site=lfranke.github.io
Este material parece bastante perigoso para um engenheiro usar como ponto de partida
Expressões como dizer que os dados são agrupados por significado ou que são otimizados para análise são questionáveis
O agrupamento depende dos embeddings calculados. Se você acredita que os embeddings aproximam bem o significado dos dados, talvez faça sentido pensar assim
Mas é fácil imaginar embeddings que quebrem isso. Por exemplo, se um arquivo de áudio e um arquivo de texto com o mesmo significado forem passados pelo mesmo processo de embedding, se ele não for multimodal, é provável que fiquem distantes no espaço vetorial de embeddings
Acho que certamente veremos embeddings que posicionam itens próximos no espaço vetorial de acordo com o modo de uso, mais do que com a similaridade semântica
Se você estiver criando um sistema de recomendação, não vai querer agrupar de perto várias variações de uma compra única
Por exemplo, semanticamente, os voos mais parecidos seriam outros voos para o mesmo destino em horários diferentes, ou voos para aeroportos próximos; mas, na prática, talvez você queira agrupar hotéis que as pessoas que compraram aquele voo costumam comprar junto
Bancos de dados vetoriais também podem incluir dimensões adicionais nos dados, como consciência temporal. Não é obrigatório usar vetores que codificam significado
Portanto, bancos de dados vetoriais são otimizados para consultas ou buscas baseadas em vetores de entrada, e não são semelhantes a consultas OLAP
Estão mais próximos do Elasticsearch do que do Snowflake. Se você pretende usar um banco de dados vetorial esperando relatórios ou análises em larga escala sobre o espaço vetorial, até onde sei não há hoje um produto realmente utilizável para isso
Entendo ir de uma foto de maçã para um vetor que representa “maçanidade”, e comparar esse vetor com outros vetores usando matemática comum
O que não entendo é quem/o quê recebe a imagem como entrada e produz o vetor como saída
O mesmo vale para documentos. Se eu quiser adicionar uma dimensão colocando mais um número no array, que parte do banco de dados vetorial preciso modificar para que essa dimensão seja incluída no cálculo vetorial?
Ou o processo de transformar documentos, imagens ou qualquer outra coisa em representações vetoriais acontece fora do banco de dados, por algum outro método?
Edit: o cálculo de embeddings parece ser trabalho de um algoritmo de machine learning, mas então esse algoritmo também precisa ser treinado antes. No fim, isso vira uma cadeia infinita de treinamento
Não entendo por que PQ foi listado como uma “estratégia de indexação”
PQ é uma técnica de compressão/quantização de vetores, não um meio de particionar o espaço de busca
Você pode codificar vetores com PQ em busca exaustiva/índice plano, índice IVF e HNSW, e no Faiss isso aparece respectivamente como IndexPQ, IndexIVFPQ e IndexHNSWPQ
Se quiser, também dá para usar com árvores k-D ou ANNOY
A frase “quando a velocidade de consulta é mais importante que a precisão, use HNSW ou Annoy para datasets muito grandes” também é problemática
Técnicas baseadas em grafos têm grande overhead de memória e custo de construção, e não são práticas para datasets na escala de 1 bilhão
Em geral elas são mais precisas e rápidas que técnicas IVF, porque para obter precisão parecida o IVF precisa visitar muitas células
Por outro lado, diferentemente de outras técnicas, o IVF consegue escalar até bancos de dados na escala de 1 trilhão sem grande overhead, oferecendo um trade-off razoável entre velocidade e precisão
Eu diria: “use quando a velocidade de consulta for importante, mas você também quiser alta precisão, e tiver um dataset de porte médio em que um índice plano/exaustivo seja impraticável”
Primeiro aplique PQ e depois execute KNN sobre os novos vetores discretos
Com isso, é possível comprimir o espaço de vocabulário para um tamanho fixo
Na tabela do slide 15, parece que as células de Indexing & Search Efficiency de Traditional Databases e Vector Databases foram trocadas
Há alguma recomendação de banco de dados de embeddings embutido, como o SQLite?
Seria para problemas de pequena escala, mas seria bom se fosse mais prático que LMDB + FAISS
Ele pode rodar dentro de um processo Python, armazena o conteúdo no SQLite e oferece suporte a armazenar vetores de embedding em formatos de índice vetorial local (Faiss, HNSW, Annoy)
Só para constar, sou o principal autor do txtai
https://github.com/patricktrainer/hackernews-comment-search
llmdo Simon Willison usa apenas SQLite e algumas UDFsEssa simplicidade é atraente, mas não tenho uma boa noção de quando e por que ela deixa de ser suficiente
Para Go, recentemente comecei a criar o chromem-go, inspirado na interface do Chroma: https://github.com/philippgille/chromem-go
Ainda não é para recursos avançados nem uso em grande escala, mas demos de RAG funcionam
[1] https://github.com/chroma-core/chroma