# 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](/pt-br/documentacao/produtos/ai/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](/pt-br/documentacao/produtos/guias/edge-sql-vector-search/) |
| Conheça o SQL Database da Azion e suas funcionalidades | [Referência do SQL Database](/pt-br/documentacao/produtos/store/sql-database/) |
| Integre com AI Inference | Saiba mais sobre as [capacidades do AI Inference](/pt-br/documentacao/produtos/ai/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.

:::tip
As Azion Libraries fornecem ferramentas para interagir com os serviços da Azion tanto dentro quanto fora do ambiente de Runtime da Azion. Explore o [repositório das Azion Libraries](https://github.com/aziontech/lib/tree/main) para saber mais.
:::

---

## 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:

```graphql
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):

```graphql
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: 

```graphql
SELECT name,
       vector_extract(stats_embedding),
       vector_distance_cos(stats_embedding, vector('[82, 25, 63]')) AS similarity
FROM teams
ORDER BY similarity ASC
LIMIT 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`.

```graphql
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:

```graphql
SELECT
  name,
  year,
  similarity
FROM
  teams
JOIN
  vector_top_k('teams_idx', '[4,5,6]', 3)
ON
  teams.rowid = id
WHERE
  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_BLOB` e `FLOAT64 | F64_BLOB`. O `FLOAT32` é 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 `0` indica que os vetores são quase idênticos ou exatamente correspondentes.
    - Uma distância próxima de `1` indica que os vetores são ortogonais (perpendiculares).
    - Uma distância próxima de `2` indica que os vetores estão apontando em direções opostas.
- 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](#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.