Execute uma pesquisa de similaridade vetorial híbrida

Realize pesquisas híbridas no AlloyDB for PostgreSQL, que combinam a pesquisa de texto, a correspondência de palavras-chave, a pesquisa vetorial e a similaridade semântica, através da extensão vector, que é uma extensão padrão do pgvector PostgreSQL personalizada para o AlloyDB.

Para melhorar a relevância da pesquisa, pode fazer uma pesquisa híbrida que combine a pesquisa de similaridade vetorial com a pesquisa de texto. O AlloyDB permite-lhe criar índices invertidos generalizados (GIN) para a pesquisa de texto e índices de vizinhos mais próximos escaláveis (ScaNN) para a pesquisa vetorial. Em seguida, pode combinar os resultados de ambas as pesquisas e reclassificá-los através da fusão de classificações recíprocas (RRF), um algoritmo que combina várias listas de resultados da pesquisa numa única lista classificada, para obter resultados altamente relevantes com base em correspondências exatas de palavras-chave e na semelhança semântica.

Para fazer uma pesquisa híbrida no AlloyDB for PostgreSQL, tem de criar um índice vetorial e um índice de pesquisa de texto na sua tabela. Em seguida, combina os resultados de ambas as pesquisas e reclassifica-os para apresentar as informações mais relevantes.

Crie um índice GIN

Um índice invertido generalizado (GIN) é um tipo de índice especializado otimizado para a pesquisa em valores compostos, como matrizes, JSONB e dados de pesquisa de texto integral.

Para criar um índice GIN nos seus dados de texto para fazer uma pesquisa de texto completo, execute o seguinte:

CREATE INDEX INDEX_NAME ON TABLE USING GIN (to_tsvector('english', COLUMN_NAME));

Substitua o seguinte:

  • INDEX_NAME: o nome do índice que quer criar, por exemplo, my-gin-index.

  • TABLE: a tabela à qual adicionar o índice.

  • COLUMN_NAME: a coluna que armazena os dados de texto que quer pesquisar.

Crie um índice ScaNN

Para aplicar um índice de árvore de dois níveis usando o algoritmo ScaNN a uma coluna que contenha incorporações de vetores armazenadas, execute a seguinte consulta DDL:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE);

Substitua o seguinte:

  • INDEX_NAME: o nome do índice que quer criar, por exemplo, my-scann-index. Os nomes dos índices são partilhados na sua base de dados. Certifique-se de que cada nome de índice é exclusivo para cada tabela na sua base de dados.

  • TABLE: a tabela à qual adicionar o índice.

  • EMBEDDING_COLUMN: uma coluna que armazena vector dados.

  • DISTANCE_FUNCTION: a função de distância a usar com este índice. Selecione uma das seguintes opções:

    • Distância L2: l2

    • Produto escalar: dot_product

    • Distância do cosseno: cosine

  • NUM_LEAVES_VALUE: o número de partições a aplicar a este índice. Defina qualquer valor entre 1 e 1048576. Para mais informações sobre como decidir este valor, consulte o artigo Ajuste um índice ScaNN.

Para saber mais acerca das diferentes configurações do índice ScaNN, consulte o artigo Crie um índice ScaNN. Também pode criar um índice HNSW.

Realize uma pesquisa híbrida com a fusão de classificações recíprocas

A pesquisa híbrida envolve a realização de pesquisas vetoriais e de texto separadas e, em seguida, a combinação e a reclassificação dos resultados através da Reciprocal Rank Fusion (RRF). RRF é um algoritmo baseado na classificação que combina várias listas classificadas de resultados da pesquisa numa única lista classificada, atribuindo uma pontuação a cada documento. Esta pontuação baseia-se na classificação recíproca da RRF em todas as listas contribuintes, sendo que os documentos com uma classificação mais elevada recebem uma maior contribuição. Use a seguinte consulta SQL para combinar a pesquisa de texto completo e a pesquisa híbrida, e reclassificar os resultados:

        WITH vector_search AS (
            SELECT id,
                RANK () OVER (ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT')) AS rank
                FROM TABLE
                ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT') LIMIT 10
        ),
        text_search AS (
            SELECT id,
                RANK () OVER (ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc)
            FROM TABLE
            WHERE to_tsvector('english', COLUMN_NAME) @@ to_tsquery(KEYWORD)
            ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc
            LIMIT 10
        )
        SELECT
            COALESCE(vector_search.id, text_search.id) AS id,
            COALESCE(1.0 / (60 + vector_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
        FROM vector_search FULL OUTER JOIN text_search ON vector_search.id = text_search.id
        ORDER BY rrf_score DESC
        LIMIT 5;

Substitua o seguinte:

  • MODEL_ID: o ID do modelo a consultar.

    Se estiver a usar o Model Garden da Vertex AI, especifique text-embedding-005 como o ID do modelo. Estes são os modelos baseados na nuvem que o AlloyDB pode usar para incorporações de texto. Para mais informações, consulte o artigo Incorporações de texto.

  • TABLE: a tabela que contém os seus dados.

  • TEXT: o texto a traduzir numa incorporação vetorial.

  • KEYWORD: a palavra-chave que quer pesquisar.

  • COLUMN_NAME: uma coluna que armazena os dados de texto que quer pesquisar.

Explicação da consulta de pesquisa híbrida e da expressão de tabela comum (CTE) relacionada:

  • vector_search CTE: executa uma pesquisa de semelhança vetorial padrão, ordena os resultados pela distância de cosseno e atribui uma classificação. Recupera os 10 produtos mais semelhantes semanticamente.
  • text_search CTE: executa uma pesquisa de texto usando to_tsvector e to_tsquery, calculando a relevância com ts_rank e obtendo as 10 correspondências de texto mais relevantes.
  • Final SELECT Statement CTE: junta os resultados da pesquisa de vetores e de texto usando um FULL OUTER JOIN, seleciona o ID do produto, calcula a pontuação RRF, ordena por pontuação e obtém os 5 principais resultados.

Faça uma pesquisa híbrida com o LangChain

A pesquisa híbrida com o arquivo vetorial do AlloyDB melhora a precisão da pesquisa combinando duas estratégias de pesquisa diferentes: pesquisa vetorial de incorporação densa e pesquisa baseada em palavras-chave. AlloyDBVectorStore é uma classe de armazenamento de vetores do LangChain que usa o LangChain atuando como uma implementação específica da classe VectorStore do LangChain. Saiba como usar o AlloyDB para armazenar incorporações vetoriais com a classe AlloyDBVectorStore.

Pode ativar e configurar esta pesquisa híbrida através da classe HybridSearchConfig quando configurar o seu AlloyDBVectorStore.

A pesquisa híbrida com o arquivo vetorial do AlloyDB executa simultaneamente uma pesquisa semântica para compreender o significado e o contexto de uma consulta, e uma pesquisa de palavras-chave para encontrar correspondências lexicais exatas. Os resultados de ambas as pesquisas são, em seguida, unidos para fornecer um conjunto de resultados mais abrangente.

O que se segue?