En esta página se describe cómo realizar búsquedas híbridas de texto completo y de vectores en Spanner. La búsqueda híbrida combina la precisión de la concordancia con palabras clave (búsqueda de texto completo) con la recuperación de la concordancia semántica (búsqueda vectorial) para producir resultados de búsqueda muy relevantes.
Spanner admite los siguientes patrones de búsqueda híbrida, que se dividen en tres categorías principales:
| Categoría | Descripción | Objetivo principal |
| Fusion | Fusion recupera y clasifica documentos de forma independiente mediante la búsqueda por palabras clave y la búsqueda vectorial, y, a continuación, combina los resultados. | Consigue la máxima cobertura y relevancia combinando varias señales de puntuación. |
| Filtrado | Las palabras clave filtran o acotan el espacio de búsqueda. | Asegúrate de que la concordancia de palabras clave sea un requisito y, al mismo tiempo, aprovecha la relevancia semántica. |
| Reclasificación con aprendizaje automático | Un modelo de aprendizaje automático refina un conjunto inicial de candidatos para obtener una clasificación final más precisa. | Consigue la mayor precisión posible para un pequeño conjunto final de resultados. |
Búsqueda combinada
La búsqueda fusionada implica ejecutar la búsqueda de texto completo y la búsqueda vectorial de forma independiente en el mismo corpus de datos. Después, combina los resultados para crear una lista clasificada única, unificada y muy relevante.
Aunque puedes ejecutar consultas independientes en el lado del cliente, la búsqueda híbrida en Spanner ofrece las siguientes ventajas:
- Simplifica la lógica de las aplicaciones gestionando las solicitudes paralelas y la combinación de resultados en el servidor.
- Evita transferir al cliente conjuntos de resultados intermedios potencialmente grandes.
Puedes usar SQL para crear métodos de fusión en Spanner. En esta sección se proporcionan ejemplos de fusión de orden recíproco y fusión de puntuación relativa. Sin embargo, le recomendamos que evalúe diferentes estrategias de fusión para determinar cuál se adapta mejor a los requisitos de su aplicación.
Fusión basada en el ranking
Usa la fusión basada en el ranking cuando las puntuaciones de relevancia de diferentes métodos de recuperación (como las puntuaciones de FTS y las distancias vectoriales) sean difíciles de comparar o normalizar porque se miden en espacios diferentes. Este método usa la posición de cada documento de cada buscador para generar una puntuación y una clasificación finales.
La fusión de rango recíproco (RRF) es una función de fusión basada en el rango. La puntuación RRF de un documento es la suma de las recíprocas de sus rangos de varios buscadores y se calcula de la siguiente manera:
\[ score\ (d\epsilon D)\ =\ \sum\limits_{r\epsilon R}^{}(1\ /\ (\ 𝑘\ +\ ran{k}_{r}\ (𝑑)\ )\ )\ \]
Donde:
- d es el documento.
- R es el conjunto de recuperadores (búsqueda de texto completo y de vectores).
- k es una constante (a menudo, se establece en 60) que se usa para moderar la influencia de los documentos con un rango muy alto.
- w es el rango del documento del recuperador r.
Implementar RRF en una consulta de Spanner
Las métricas vectoriales (como APPROX_DOT_PRODUCT) y las puntuaciones de búsqueda de texto (como SCORE_NGRAMS) operan en escalas incompatibles. Para solucionar este problema, en el siguiente ejemplo se implementa RRF para normalizar los datos en función de la posición en el ranking en lugar de las puntuaciones sin procesar.
La consulta usa UNNEST(ARRAY(...) WITH OFFSET) para asignar un ranking a los 100 candidatos principales de cada método. A continuación, calcula una puntuación estandarizada mediante la inversa de esas clasificaciones y agrega los resultados para devolver las cinco coincidencias principales.
SELECT SUM(1 / (60 + rank)) AS rrf_score, key
FROM (
(
SELECT rank, x AS key
FROM UNNEST(ARRAY(
SELECT key
FROM hybrid_search
WHERE embedding IS NOT NULL
ORDER BY APPROX_DOT_PRODUCT(@vector, embedding,
OPTIONS => JSON '{"num_leaves_to_search": 50}') DESC
LIMIT 100)) AS x WITH OFFSET AS rank
)
UNION ALL
(
SELECT rank, x AS key
FROM UNNEST(ARRAY(
SELECT key
FROM hybrid_search
WHERE SEARCH_NGRAMS(text_tokens_ngrams, 'foo')
ORDER BY SCORE_NGRAMS(text_tokens_ngrams, 'foo') DESC
LIMIT 100)) AS x WITH OFFSET AS rank
)
)
GROUP BY key
ORDER BY rrf_score DESC
LIMIT 5;
Fusión basada en la puntuación
La fusión basada en puntuaciones es eficaz cuando las puntuaciones de relevancia de los diferentes métodos son comparables o se pueden normalizar, lo que puede permitir una clasificación más precisa que incorpore el peso de relevancia real de cada método.
La fusión de puntuaciones relativas (RSF) es un método basado en puntuaciones que normaliza las puntuaciones de diferentes métodos en relación con las puntuaciones más altas y más bajas de cada método. Normalmente, se utilizan las funciones MIN() y MAX(). La puntuación de RSF de un documento obtenido por un conjunto de recuperadores se calcula de la siguiente manera:
\[ score(d\epsilon D)\ =\ \sum\limits_{r\epsilon R}^{}({w}_{r}*(scor{e}_{r}(d)\ -\ mi{n}_{r})\ /\ (ma{x}_{r\ }-mi{n}_{r})\ ) \]
Donde:
- d es el documento.
- R es el conjunto de recuperadores (búsqueda de texto completo y de vectores).
- w es el peso asignado a un retriever específico.
Implementar RSF en una consulta de Spanner
Para implementar RSF, debe normalizar las puntuaciones del vector y de FTS a una escala común. En el siguiente ejemplo se calculan las puntuaciones mínima y máxima en cláusulas WITH independientes para obtener los factores de normalización. A continuación, combina los resultados mediante un FULL OUTER JOIN, sumando las puntuaciones normalizadas de la búsqueda del vecino más cercano aproximado (ANN) (convertidas de cosine_distance) y la búsqueda de texto completo (FTS).
WITH ann AS (
SELECT key, APPROX_COSINE_DISTANCE(@vector, embedding,
OPTIONS => JSON '{"num_leaves_to_search": 50}') AS cosine_distance,
FROM hybrid_search
WHERE embedding IS NOT NULL
ORDER BY cosine_distance
LIMIT 100
),
fts AS (
SELECT key, SCORE_NGRAMS(text_tokens_ngrams, 'Green') AS score,
FROM hybrid_search
WHERE SEARCH_NGRAMS(text_tokens_ngrams, 'Green')
ORDER BY score DESC
LIMIT 100
),
ann_min AS (
SELECT MIN(1 - cosine_distance) AS min
FROM ann
),
ann_max AS (
SELECT MAX(1 - cosine_distance) AS max
FROM ann
),
fts_min AS (
SELECT MIN(score) AS min
FROM fts
),
fts_max AS (
SELECT MAX(score) AS max
FROM fts
)
SELECT IFNULL(ann.key, fts.key),
IFNULL(((1 - ann.cosine_distance) - ann_min.min) /
(ann_max.max - ann_min.min), 0) +
IFNULL((fts.score - fts_min.min) /
(fts_max.max - fts_min.min), 0) AS score
FROM ann
FULL OUTER JOIN fts
ON ann.key = fts.key
CROSS JOIN ann_min
CROSS JOIN ann_max
CROSS JOIN fts_min
CROSS JOIN fts_max
ORDER BY score DESC
LIMIT 5;
Búsqueda filtrada
Las búsquedas filtradas usan FTS para crear un filtro que reduce el conjunto de documentos que se tienen en cuenta en una búsqueda vectorial de k vecinos más cercanos (KNN). También puede usar una ordenación previa para limitar el tamaño del conjunto de resultados.
Implementar una búsqueda filtrada en una consulta de Spanner
En la búsqueda de ejemplo de esta sección se siguen estos pasos para acotar el espacio de búsqueda vectorial al subconjunto de datos que coinciden con las palabras clave:
- Usa
SEARCH (text_tokens, 'Green')para buscar filas en las que la columnatext_tokenscontenga el textoGreen. Las 1000 primeras filas se devuelven en el orden de reorganización definido por el índice de búsqueda. - Usa una función vectorial,
DOT_PRODUCT(@vector, embedding), para calcular la similitud entre el vector de consulta (@vector) y el vector de documento almacenado (incrustación). Después, ordena los resultados y devuelve las 10 mejores coincidencias finales.
SELECT key
FROM (
SELECT key, embedding
FROM hybrid_search
WHERE SEARCH (text_tokens, 'Green')
ORDER BY presort
LIMIT 1000)
ORDER BY DOT_PRODUCT(@vector, embedding) DESC
LIMIT 10;
Reclasificación con aprendizaje automático
El reordenamiento basado en aprendizaje automático es un enfoque muy preciso, aunque requiere muchos recursos computacionales. Aplica un modelo de aprendizaje automático a un pequeño conjunto de candidatos que se ha reducido mediante la búsqueda de texto completo, la búsqueda vectorial o una combinación de ambas. Para obtener más información sobre la integración de Spanner con Vertex AI, consulta la descripción general de la integración de Spanner con Vertex AI.
Puedes integrar la función de reordenación de aprendizaje automático mediante la función de Spanner
ML.PREDICT
con un modelo de Vertex AI desplegado.
Implementar la función de volver a clasificar basada en aprendizaje automático
- Despliega un modelo de reclasificación (por ejemplo, de HuggingFace) en un endpoint de Vertex AI.
Crea un objeto
MODELde Spanner que apunte al endpoint de Vertex AI. Por ejemplo, en el siguiente ejemplo de modeloReranker:text ARRAY<string(max)>son los documentos.text_pair ARRAY<string(max)>es el texto de la consulta del ejemplo.scoreson las puntuaciones de relevancia asignadas por el modelo de aprendizaje automático a los pares de textos de entrada.
CREATE MODEL Reranker INPUT (text ARRAY<string(max)>, text_pair ARRAY<string(max)>) OUTPUT (score FLOAT32) REMOTE OPTIONS ( endpoint = '...' );Usa una subconsulta para obtener los candidatos iniciales (como los 100 resultados principales de una búsqueda de ANN) y pásalos a
ML.PREDICT. La función devuelve una nueva columna de puntuación para la ordenación final.SELECT key FROM ML.PREDICT( MODEL Reranker, ( SELECT key, text, "gift for 8-year-old" AS text_pair FROM hybrid_search WHERE embedding IS NOT NULL ORDER BY APPROX_DOT_PRODUCT(@vector, embedding, options=>JSON '{"num_leaves_to_search": 50}') DESC LIMIT 100) ) ORDER BY score DESC LIMIT 3;
Siguientes pasos
- Personaliza tu buscador con la búsqueda híbrida basada en IA en Spanner.
- Más información sobre la búsqueda de texto completo