Vector Search do SQL Database
Vector Search é um recurso do SQL Database da Azion que permite aos clientes implementar mecanismos de busca semântica. Enquanto os modelos de busca tradicionais visam encontrar correspondências exatas, como correspondências de palavras-chave, os modelos de busca vetorial usam algoritmos especializados para identificar itens semelhantes com base em suas representações matemáticas, ou embeddings vetoriais.
Ao usar o Vector Search, você pode implementar vários casos de uso:
- Melhorar sistemas de busca e oferecer recomendações personalizadas, encontrando itens com características semelhantes ou com base nas preferências dos usuários, como produtos relacionados em e-commerce ou conteúdo em plataformas de streaming.
- Criar embeddings de texto para buscar texto semanticamente semelhante, onde palavras ou frases são representadas como vetores.
- Construir aplicações baseadas em IA, aproveitando o Processamento de Linguagem Natural (NLP) para assistentes de voz e chatbots, com integração nativa ao AI Inference que habilita aplicações poderosas de Retrieval-Augmented Generation (RAG) usando frameworks como LangChain e LangGraph diretamente no edge.
Distribuído pela rede global de edge da Azion, esse recurso permite resultados de busca mais relevantes, recomendações em tempo real e insights, reduzindo drasticamente a latência e melhorando a satisfação do usuário. Tudo isso enquanto mantém a localidade dos dados e reduz a dependência do banco de dados centralizado.
Implementação
| Escopo | Recurso | 
|---|---|
| Implemente o Vector Search | Guia explicando os fundamentos da implementação do Vector Search | 
| Conheça o SQL Database da Azion e suas funcionalidades | Referência do SQL Database | 
| Integre com AI Inference | Saiba mais sobre as capacidades do AI Inference | 
Bancos de dados e armazenamento
Ao aproveitar o SQL Database, os bancos de dados de busca vetorial são otimizados para lidar com dados vetoriais de alta dimensão no edge. Isso permite processamento rápido e localizado, bem como redução de latência, permitindo que tarefas complexas para aplicações avançadas e intensivas em dados sejam executadas de forma eficiente.
O SQL Database implementa Main/Replicas, distribuídos dentro da Global Infrastructure da Azion, para permitir consultas de ultra-baixa latência no edge. Essa abordagem permite que seja acessado de qualquer edge location, facilitando o processamento em tempo real e a análise de dados, garantindo disponibilidade e tolerância a falhas. O SQL Database usa o dialeto do SQLite.
Colunas
Para armazenar vetores em um banco de dados de busca vetorial, você pode adicionar uma coluna especificamente para os dados vetoriais.
Por exemplo, usando o modelo text-embedding-3-small e uma dimensão de 1536, essa coluna deve ser declarada para conter um array de números de ponto flutuante de 32 bits como um tipo de objeto binário grande (BLOB). O (3) no exemplo especifica o número de elementos de ponto flutuante de 32 bits (F32) no vetor, indicando um vetor de 3 dimensões:
CREATE TABLE teams (  name TEXT,  year INT,  stats_embedding F32_BLOB(3));Em seguida, você pode inserir dados na tabela, incluindo embeddings vetoriais (neste exemplo, representando as estatísticas da equipe para a temporada de 2023):
INSERT INTO teams (name, year, stats_embedding)VALUES  (    'Red',    2023,    vector('[80, 30, 60]')  ),  (    'Blue',    2023,    vector('[85, 25, 65]')  ),  (    'Yellow',    2023,    vector('[78, 28, 62]')  ),  (    'Green',    2023,    vector('[90, 20, 70]')  );Embeddings
Embeddings são representações vetoriais numéricas de dados complexos (como palavras ou imagens) que capturam características essenciais, permitindo buscas baseadas em similaridade. No exemplo, dado um embedding de [80, 30, 60] para uma equipe, uma consulta pode recuperar outras equipes com embeddings semelhantes, ajudando a identificar equipes com estatísticas de desempenho comparáveis.
Usando embeddings, você pode consultar para encontrar informações semelhantes entre as equipes. Por exemplo, equipes com estatísticas semelhantes a 82 gols marcados, 25 gols sofridos e 63% de posse de bola:
SELECT name,       vector_extract(stats_embedding),       vector_distance_cos(stats_embedding, vector('[82, 25, 63]')) AS similarityFROM teamsORDER BY similarity ASCLIMIT 3;Indexação
Considerando que o Vector Search usa bancos de dados e conjuntos de dados maiores, ele suporta indexação através de Vizinhos Aproximados Mais Próximos (ANN), usando SQL, envolvendo a coluna vetorial na função libsql_vector_idx.
CREATE INDEX teams_idx ON teams ( libsql_vector_idx(embedding) );Para usar adequadamente o índice, você pode modificar sua consulta para garantir que o índice seja consultado. Usar o índice não é automático, uma vez que ele é representado internamente como uma tabela diferente. Para a consulta do exemplo anterior, podemos modificá-la ligeiramente para garantir que o índice seja consultado:
SELECT  name,  year,  similarityFROM  teamsJOIN  vector_top_k('teams_idx', '[4,5,6]', 3)ON  teams.rowid = idWHERE  year >= 2023;Limites e considerações
- O Vector Search utiliza libSQL.
- O LibSQL usa a classe de armazenamento BLOB nativa do SQLite para colunas vetoriais, definida de acordo com o número de bits usados para representar cada número de ponto flutuante no vetor.
- Tipos de vetor suportados: FLOAT1BIT | F1BIT_BLOB,FLOAT8 | F8_BLOB,FLOATB16 | FB16_BLOB,FLOAT16 | F16_BLOB,FLOAT32 | F32_BLOBeFLOAT64 | F64_BLOB. OFLOAT32é recomendado como ponto de partida.
- A função vector_distance_cos calcula a distância cosseno, que é definida como: Distância Cosseno = 1 — Similaridade Cosseno.- A distância cosseno varia de 0 a 2, onde:
- Uma distância próxima de 0indica que os vetores são quase idênticos ou exatamente correspondentes.
- Uma distância próxima de 1indica que os vetores são ortogonais (perpendiculares).
- Uma distância próxima de 2indica que os vetores estão apontando em direções opostas.
 
- Uma distância próxima de 
 
- A distância cosseno varia de 0 a 2, onde:
- A distância euclidiana não é suportada para vetores FLOAT1BIT de 1 bit.
- O LibSQL só pode operar em vetores com no máximo 65536 dimensões.
- O LibSQL implementa o algoritmo DiskANN para acelerar consultas de vizinhos mais próximos aproximados para tabelas com colunas vetoriais. Consulte a seção Indexação para mais informações.
- Para consultar um índice vetorial, você deve usar a função vector_top_k(idx_name, q_vector, k), que encontra os k vizinhos mais próximos e retorna seu ROWID ou PRIMARY KEY (chave primária).
- O índice vetorial funciona apenas para tabelas com ROWID ou com CHAVE PRIMARY KEY singular. Chaves primárias compostas sem ROWID não são suportadas.