- É possível criar uma "busca híbrida" no aplicativo usando a extensão nativa de busca de texto completo (FTS5) do SQLite junto com a busca semântica do
sqlite-vec
- Os resultados podem ser combinados de várias formas, como prioridade para palavras-chave, reordenação por "semântica" e fusão recíproca de rankings
- Acima de tudo, como tudo está incluído no SQLite, é possível fazer experimentos e protótipos de forma barata e fácil, sem precisar de serviços externos
- O principal caso de uso do
sqlite-vec e de outras ferramentas de busca vetorial é oferecer "busca semântica" para dados de texto
- A busca de texto completo (busca por palavras-chave) nem sempre entrega bons resultados
- Ao buscar por "climate change", ela não retorna documentos como "global warming"
- Com busca semântica, é possível recuperar resultados pelo "sentido" e obter respostas mais ricas em significado
- Mas usar apenas "busca semântica" pode ser prejudicial para a aplicação
Demonstração: manchetes da NBC News
- Uso de um conjunto de dados com mais de 14.500 manchetes de janeiro a agosto de 2024
- Um conjunto de dados muito pequeno, com 4,3 MB de texto no total
Criando uma tabela FTS5
- Criação da tabela virtual de busca de texto completo
fts_headlines
- Declaração da coluna
headline
- Configuração das opções
content= e content_rowid=
INSERT INTO direto a partir da tabela base articles
- Para consultar a tabela FTS5, basta uma única instrução
SELECT
Construindo busca vetorial com sqlite-vec
- O
sqlite-vec fornece armazenamento e comparação de vetores, mas não gera embeddings
- Neste exemplo, são usados a extensão
sqlite-lembed e o modelo Snowflake Artic Embed 1.5
- O texto é transformado em embedding com
lembed() e armazenado em uma tabela virtual vec0
- Para fazer uma consulta KNN, basta uma única instrução
SELECT
Abordagem híbrida 1: "prioridade para palavras-chave"
- Primeiro retorna os resultados da busca de texto completo e depois complementa o restante com busca vetorial
- Pode ser implementada com CTE
- Os resultados são combinados com
UNION ALL
Abordagem híbrida 2: fusão recíproca de rankings (RRF)
- Atribui ranking aos resultados do FTS5 e das correspondências vetoriais
- Pode ser implementada com uma única consulta
SELECT e CTE
- É possível ranquear os resultados de FTS5/vetor de forma diferente alterando
:weight_fts ou :weight_vec
Abordagem híbrida 3: reranqueamento por significado
- Faz apenas a busca FTS5, mas reordena os resultados com base na distância vetorial
- Retorna apenas resultados com correspondência de palavras-chave, mas coloca no topo os que têm melhor correspondência semântica
- Ajuda a compensar limitações do BM25
Qual abordagem escolher?
- Depende da aplicação e do caso de uso
- Ao construir um mecanismo de busca para uma caixa de entrada de e-mail, a prioridade para palavras-chave pode ser mais adequada
- Ao construir RAG sobre documentos internos de uma empresa, RRF é uma boa opção
- Ao criar um recurso de "postagens duplicadas" em um webapp, o reranqueamento por significado funciona bem
Melhorias futuras
- Consultas FTS5 podem mostrar as partes correspondentes no documento com "highlight", mas o
sqlite-vec retorna apenas a distância L2/cosseno entre o vetor da consulta e o documento
- As consultas FTS5 têm outros recursos, como frases, consultas
NEAR e operadores booleanos, mas usá-los com busca vetorial pode ser estranho
- Escalar a busca híbrida com FTS5 +
sqlite-vec pode ser algo desconfortável
- Tabelas FTS5 fazem uma busca completa em todo o conjunto de dados a cada vez, então não oferecem suporte a filtragem por metadados nem a um único índice FTS5
- O mesmo vale para
sqlite-vec, mas suporte a particionamento e filtragem por metadados deve chegar em breve
Opinião do GN⁺
- A busca híbrida com SQLite parece útil para várias aplicações por facilitar experimentação e prototipagem. Entre as vantagens estão: dados armazenados em um único arquivo, possibilidade de testar várias consultas com uma única instrução
SELECT, ausência de custo, funcionamento em qualquer linguagem de programação e implementação simples com poucas linhas de código
- Ainda assim, há pontos a melhorar entre FTS5 e
sqlite-vec. O FTS5 pode destacar trechos correspondentes no documento, enquanto o sqlite-vec retorna apenas a distância entre o vetor da consulta e o documento. Além disso, usar recursos avançados do FTS5 em combinação com busca vetorial pode ser algo pouco natural
- Apesar dessas limitações, a busca híbrida com SQLite é uma solução poderosa para aproveitar tanto as vantagens da busca por palavras-chave quanto da busca semântica, independentemente do tamanho dos dados e do tipo de aplicação
- Em um cenário em que extrair informação de dados não estruturados e transformá-la em algo pesquisável se torna cada vez mais importante, combinar busca por palavras-chave como FTS5 com busca vetorial como
sqlite-vec permite uma busca sofisticada que considera tanto correspondência de termos quanto relevância contextual
- Vale considerar a busca híbrida baseada em SQLite tanto ao adicionar
sqlite-vec a um sistema de busca existente quanto ao desenvolver uma nova aplicação de busca. Em especial, a possibilidade de personalizar o próprio modelo de embeddings é uma grande vantagem
1 comentários
No projeto, executei uma tarefa de inserir e processar mais de 1 milhão de registros no SQLite.
Se a quantidade de dados for grande, acredito que é preciso um bom SSD. (Como usei um SSD SATA, tive a impressão de que isso aumentou um pouco o tempo de processamento.)