21 puntos por GN⁺ 2024-10-25 | 1 comentarios | Compartir por WhatsApp
  • Se puede crear una "búsqueda híbrida" en una aplicación usando la extensión básica de búsqueda de texto completo (FTS5) de SQLite junto con la búsqueda semántica de sqlite-vec
    • Es posible combinar resultados con varios métodos, como prioridad por palabras clave, reranqueo por "semantic" y fusión recíproca de rangos
    • Sobre todo, como todo está incluido en SQLite, es barato y fácil hacer experimentos y prototipos sin necesidad de servicios externos
  • El principal caso de uso de sqlite-vec y otras herramientas de búsqueda vectorial es ofrecer "búsqueda semántica" sobre datos de texto
    • La búsqueda de texto completo (búsqueda por palabras clave) no siempre da buenos resultados
      • Si se busca "climate change", no devuelve documentos como "global warming"
      • Con la búsqueda semántica se pueden encontrar resultados por la "idea" general y devolver resultados más ricos y con más significado
    • Pero usar solo "búsqueda semántica" puede ser perjudicial para una aplicación

Demo: titulares de NBC News

  • Se usa un dataset con más de 14,500 titulares entre enero y agosto de 2024
  • En total son 4.3 MB de datos de texto, un dataset muy pequeño

Crear una tabla FTS5

  • Crear la tabla virtual de búsqueda de texto completo fts_headlines
  • Declarar la columna headline
  • Configurar las opciones content= y content_rowid=
  • Hacer INSERT INTO directamente desde la tabla base articles
  • Para consultar la tabla FTS5 solo se necesita una sola sentencia SELECT

Construir búsqueda vectorial con sqlite-vec

  • sqlite-vec ofrece almacenamiento y comparación de vectores, pero no genera embeddings
  • En este ejemplo se usa la extensión sqlite-lembed y el modelo Snowflake Artic Embed 1.5
  • El texto se convierte en embeddings con lembed() y se almacena en una tabla virtual vec0
  • Para hacer consultas KNN solo se necesita una sola sentencia SELECT

Enfoque híbrido 1: "prioridad por palabras clave"

  • Primero devuelve los resultados de búsqueda de texto completo y luego complementa el resto con búsqueda vectorial
  • Se puede implementar con CTE
  • Los resultados se combinan con UNION ALL

Enfoque híbrido 2: fusión recíproca de rangos (RRF)

  • Asigna ranking a los resultados de coincidencias de FTS5 y de vectores
  • Puede implementarse con una sola consulta SELECT y CTE
  • Se puede cambiar :weight_fts o :weight_vec para rankear de forma distinta los resultados de FTS5/vector

Enfoque híbrido 3: reranquear según el significado

  • Solo realiza la búsqueda FTS5, pero reordena los resultados según la distancia vectorial
  • Obtiene solo resultados con coincidencia por palabras clave, pero las mejores coincidencias semánticas suben al tope
  • Ayuda a resolver las desventajas de BM25

¿Qué enfoque conviene elegir?

  • Depende de la aplicación y del caso de uso
  • Si se construye un motor de búsqueda para una bandeja de entrada de correo, la prioridad por palabras clave puede ser más adecuada
  • Si se construye un RAG sobre documentos internos de una empresa, RRF es una buena opción
  • Si se crea una función de "publicaciones duplicadas" en una web app, reranquear según el significado funciona bien

Mejoras futuras

  • Las consultas FTS5 pueden mostrar las coincidencias dentro de un documento con "resaltado", pero sqlite-vec solo devuelve la distancia L2/coseno entre el vector de consulta y el documento
  • Las consultas FTS5 también tienen otras funciones como frases, consultas NEAR y operadores booleanos, pero usarlas con búsqueda vectorial puede resultar incómodo
  • Ampliar la búsqueda híbrida con FTS5 + sqlite-vec puede ser algo incómodo
  • Las tablas FTS5 realizan una búsqueda completa sobre todo el dataset cada vez, por lo que no permiten filtrado por metadatos ni soporte para un solo índice FTS5
  • Con sqlite-vec pasa algo similar, pero pronto habrá soporte para particionado y filtrado por metadatos

Opinión de GN⁺

  • La búsqueda híbrida con SQLite parece útil para muchas aplicaciones porque facilita la experimentación y el prototipado. Sus ventajas son que los datos se guardan en un solo archivo, se pueden probar varias consultas con una sola sentencia SELECT, no tiene costo, funciona en todos los lenguajes de programación y se implementa fácilmente con unas pocas líneas de código
  • Aun así, todavía hay aspectos por mejorar entre FTS5 y sqlite-vec. FTS5 puede resaltar las coincidencias en un documento, pero sqlite-vec solo devuelve la distancia entre el vector de consulta y el documento. Además, al usar funciones avanzadas de FTS5, combinarlo con búsqueda vectorial puede resultar incómodo
  • A pesar de estas limitaciones, la búsqueda híbrida con SQLite es una solución potente para aprovechar tanto la búsqueda por palabras clave como la búsqueda semántica, sin importar el tamaño de los datos ni el tipo de aplicación
  • En un contexto donde extraer información de datos no estructurados y volverla searchable es cada vez más importante, combinar búsqueda por palabras clave como FTS5 con búsqueda vectorial como sqlite-vec permite búsquedas sofisticadas que consideran tanto coincidencias de palabras clave como relevancia contextual
  • Ya sea agregando sqlite-vec a un sistema de búsqueda existente o al desarrollar una nueva aplicación de búsqueda, vale la pena considerar la búsqueda híbrida basada en SQLite. En especial, poder personalizar el propio modelo de embeddings es una gran ventaja

1 comentarios

 
halfenif 2024-10-27

En el proyecto, realicé una tarea de procesar datos cargando más de 1 millón de registros en SQLite.

Si la cantidad de datos es grande, creo que hace falta un buen SSD. (Como usé un SSD SATA, tuve la impresión de que el tiempo de procesamiento aumentó un poco).