Padrões de pesquisa vetorial e de texto completo híbridos

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.

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;

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.

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 coluna text_tokens contém o texto Green. 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

  1. Implemente um modelo de reclassificação (como um modelo do HuggingFace) num ponto final da Vertex AI.
  2. Crie um objeto MODEL do Spanner que aponte para o ponto final do Vertex AI. Por exemplo, no seguinte Reranker exemplo de modelo:

    • text ARRAY<string(max)> são os documentos.
    • text_pair ARRAY<string(max)> é o texto da consulta no exemplo.
    • score sã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 = '...'
    );
    
  3. 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?