Esta página descreve como realizar pesquisas híbridas de texto completo e vetoriais no Spanner. A pesquisa híbrida combina a precisão da correspondência de palavras-chave (pesquisa de texto integral, FTS) com a capacidade de obtenção da correspondência semântica (pesquisa vetorial) para produzir resultados de pesquisa altamente relevantes.
O Spanner suporta os seguintes padrões de pesquisa híbrida, que estão divididos em três categorias principais:
| Categoria | Descrição | Objetivo principal |
| Fusion | O Fusion obtém e classifica documentos de forma independente através da pesquisa de palavras-chave e vetorial e, em seguida, combina (une) os resultados. | Alcance a máxima capacidade de memorização e relevância combinando vários sinais de pontuação. |
| Filtrado | As palavras-chave filtram ou refinam o espaço de pesquisa. | Garantir que a correspondência de palavras-chave é um requisito enquanto tira partido da relevância semântica. |
| Reclassificação com ML | Um modelo de aprendizagem automática refina um conjunto inicial de candidatos para uma classificação final mais precisa. | Alcançar a precisão mais elevada possível para um pequeno conjunto final de resultados. |
Pesquisa de fusão
A pesquisa de fusão envolve a execução da FTS e da pesquisa vetorial de forma independente no mesmo corpus de dados. Em seguida, une os resultados para criar uma única lista classificada, unificada e altamente relevante.
Embora possa executar consultas independentes no lado do cliente, a pesquisa híbrida no Spanner oferece as seguintes vantagens:
- Simplifica a lógica da aplicação ao gerir pedidos paralelos e a união de resultados no servidor.
- Evita a transferência de conjuntos de resultados intermédios potencialmente grandes para o cliente.
Pode usar SQL para criar métodos de fusão no Spanner. Esta secção apresenta exemplos de fusão de classificações recíprocas e fusão de pontuações relativas. No entanto, recomendamos que avalie diferentes estratégias de fusão para determinar qual se adequa melhor aos requisitos da sua aplicação.
Fusão baseada na classificação
Use a união baseada na classificação quando as pontuações de relevância de diferentes métodos de obtenção (como pontuações FTS e distâncias vetoriais) forem difíceis de comparar ou normalizar porque são medidas em espaços diferentes. Este método usa a posição de classificação de cada documento de cada motor de obtenção para gerar uma pontuação e uma classificação finais.
A fusão de classificação recíproca (RRF) é uma função de fusão baseada na classificação. A pontuação RRF de um documento é a soma dos recíprocos das respetivas classificações de vários motores de obtenção, calculada da seguinte forma:
\[ score\ (d\epsilon D)\ =\ \sum\limits_{r\epsilon R}^{}(1\ /\ (\ 𝑘\ +\ ran{k}_{r}\ (𝑑)\ )\ )\ \]
Onde:
- d é o documento.
- R é o conjunto de motores de obtenção (FTS e pesquisa vetorial).
- k é uma constante (frequentemente definida como 60) usada para moderar a influência de documentos com uma classificação muito elevada.
- w é a classificação do documento do motor de obtenção r.
Implemente o RRF numa consulta do Spanner
As métricas vetoriais (como APPROX_DOT_PRODUCT) e as pontuações de pesquisa de texto (como SCORE_NGRAMS) operam em escalas incompatíveis. Para resolver este problema, o exemplo seguinte
implementa o RRF para normalizar os dados com base na posição da classificação em vez das pontuações não processadas.
A consulta usa UNNEST(ARRAY(...) WITH OFFSET) para atribuir uma classificação aos 100 principais candidatos de cada método. Em seguida, calcula uma pontuação padronizada usando o inverso dessas classificações e agrega os resultados para devolver as cinco principais correspondências.
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;
Combinação baseada em pontuação
A união baseada em pontuações é eficaz quando as pontuações de relevância de diferentes métodos são comparáveis ou pode normalizá-las, o que pode permitir uma classificação mais precisa que incorpore o peso de relevância real de cada método.
A fusão de pontuações relativas (RSF) é um método baseado em pontuações que normaliza as pontuações de diferentes métodos em relação às pontuações mais altas e mais baixas em cada método, normalmente através das funções MIN() e MAX(). A pontuação RSF de um documento obtido por um conjunto de motores de obtenção é calculada da seguinte forma:
\[ score(d\epsilon D)\ =\ \sum\limits_{r\epsilon R}^{}({w}_{r}*(scor{e}_{r}(d)\ -\ mi{n}_{r})\ /\ (ma{x}_{r\ }-mi{n}_{r})\ ) \]
Onde:
- d é o documento.
- R é o conjunto de motores de obtenção (FTS e pesquisa vetorial).
- w é o peso atribuído a um motor de obtenção específico.
Implemente o RSF numa consulta do Spanner
Para implementar o RSF, tem de normalizar as pontuações do vetor e do FTS numa escala comum. O exemplo seguinte calcula as pontuações mínima e máxima em cláusulas WITH separadas para derivar os fatores de normalização. Em seguida, combina os resultados usando um FULL OUTER JOIN, somando as classificações normalizadas da pesquisa de vizinho mais próximo aproximado (ANN) (convertidas de cosine_distance) e da 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;
Pesquisa filtrada
As pesquisas filtradas usam a FTS para criar um filtro que reduz o conjunto de documentos considerados para uma pesquisa de vetores de k-vizinhos mais próximos (KNN). Opcionalmente, pode usar uma pré-ordenação para limitar o tamanho do conjunto de resultados.
Implemente a pesquisa filtrada numa consulta do Spanner
A pesquisa de exemplo nesta secção segue os seguintes passos para restringir o espaço de pesquisa vetorial ao subconjunto de dados que correspondem às palavras-chave:
- Usa
SEARCH (text_tokens, 'Green')para encontrar linhas em que a colunatext_tokenscontém o textoGreen. As 1000 linhas principais são devolvidas por uma ordem de reordenamento definida pelo índice de pesquisa. - Usa uma função vetorial,
DOT_PRODUCT(@vector, embedding), para calcular a semelhança entre o vetor de consulta (@vector) e o vetor de documento armazenado (incorporação). Em seguida, ordena os resultados e devolve as 10 principais correspondências finais.
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;
Reclassificação de aprendizagem automática
A reclassificação baseada em ML é uma abordagem computacionalmente intensiva, mas altamente precisa. Aplica um modelo de aprendizagem automática a um pequeno conjunto de candidatos que foi reduzido pela FTS, pela pesquisa vetorial ou por uma combinação de ambas. Para mais informações sobre a integração do Spanner com o Vertex AI, consulte a vista geral da integração do Spanner com o Vertex AI.
Pode integrar a reclassificação de ML através da função Spanner
ML.PREDICT
com um modelo do Vertex AI implementado.
Implemente a reclassificação baseada em ML
- Implemente um modelo de reclassificação (como um modelo do HuggingFace) num ponto final da Vertex AI.
Crie um objeto
MODELdo Spanner que aponte para o ponto final do Vertex AI. Por exemplo, no seguinteRerankerexemplo de modelo:text ARRAY<string(max)>são os documentos.text_pair ARRAY<string(max)>é o texto da consulta no exemplo.scoresão as classificações de relevância atribuídas pelo modelo de AA para os pares de textos introduzidos.
CREATE MODEL Reranker INPUT (text ARRAY<string(max)>, text_pair ARRAY<string(max)>) OUTPUT (score FLOAT32) REMOTE OPTIONS ( endpoint = '...' );Use uma subconsulta para obter os candidatos iniciais (como os 100 principais resultados de uma pesquisa ANN) e transmiti-los para
ML.PREDICT. A função devolve uma nova coluna de pontuação para a ordenação 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;
O que se segue?
- Personalize o seu motor de pesquisa com a pesquisa híbrida com tecnologia de IA no Spanner.
- Saiba mais sobre a pesquisa de texto integral.