Búsqueda híbrida con SQLite: vector + texto completo
Posted on Sun 06 October 2024 in Programación
Simon Willison presenta una aproximación fascinante para combinar búsqueda vectorial y tradicional búsqueda de texto completo en SQLite, usando una técnica llamada Reciprocal Rank Fusion (RRF).
El problema central
Cuando tenemos búsquedas vectoriales (basadas en similitud semántica) y búsquedas de texto completo (FTS), cada una devuelve puntuaciones en escalas completamente diferentes:
- FTS devuelve puntuaciones de relevancia
- Búsqueda vectorial devuelve distancias de similitud
¿Cómo combinar estos resultados de manera efectiva?
La solución: Reciprocal Rank Fusion
La técnica RRF evita comparar puntuaciones incompatibles y en su lugar se basa en el ranking de cada resultado dentro de su respectivo método de búsqueda.
SELECT
content,
1.0 / (:rrf_k + coalesce(fts_rank, 999)) * :fts_weight +
1.0 / (:rrf_k + coalesce(vec_rank, 999)) * :vec_weight as combined_rank
FROM (
-- Subconsulta FTS con row_number()
SELECT *, row_number() OVER (ORDER BY rank) as fts_rank
FROM fts_search(:query)
) fts
FULL OUTER JOIN (
-- Subconsulta vectorial con row_number()
SELECT *, row_number() OVER (ORDER BY distance) as vec_rank
FROM vector_search(:query, :k)
) vec ON fts.id = vec.id
ORDER BY combined_rank DESC;
Ventajas del enfoque híbrido
- Flexibilidad: Permite ajustar pesos entre FTS y búsqueda vectorial
- Robustez: Los resultados pueden aparecer en uno o ambos métodos
- Escalabilidad: No requiere normalización compleja de puntuaciones
- Simplicidad: Una sola consulta SQL maneja toda la lógica
SQLite como plataforma unificada
Con extensiones como sqlite-vec, SQLite se convierte en una plataforma poderosa para:
- Búsqueda de texto completo (FTS5 nativo)
- Búsqueda vectorial de embeddings
- Combinación híbrida de ambas técnicas
Esta aproximación democratiza las técnicas avanzadas de búsqueda, haciéndolas accesibles sin infraestructura compleja.
Artículo original: Hybrid full-text search and vector search with SQLite