21 pontos por GN⁺ 2024-10-25 | 1 comentários | Compartilhar no WhatsApp
  • É 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

 
halfenif 2024-10-27

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.)