Executar uma pesquisa híbrida de similaridade vetorial

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

Para melhorar a relevância da pesquisa, faça uma pesquisa híbrida que combine a pesquisa de similaridade de vetores com a pesquisa de texto. Com o AlloyDB, é possível criar índices invertidos generalizados (GIN) para pesquisa de texto e índices de vizinhos mais próximos escalonáveis (ScaNN) para pesquisa vetorial. Em seguida, é possível combinar os resultados das duas pesquisas e reclassificá-los usando a fusão de classificação recíproca (RRF), um algoritmo que combina várias listas de resultados de pesquisa em uma única lista classificada, para recuperar resultados altamente relevantes com base em correspondências exatas de palavras-chave e similaridade semântica.

Para realizar uma pesquisa híbrida no AlloyDB para PostgreSQL, crie um índice vetorial e um índice de pesquisa de texto na sua tabela. Em seguida, você vai combinar os resultados das duas pesquisas e reclassificá-los para apresentar as informações mais relevantes.

Criar um índice GIN

Um índice invertido generalizado (GIN, na sigla em inglês) é um tipo especializado otimizado para pesquisas em valores compostos, como matrizes, JSONB e dados de pesquisa de texto completo.

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

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

Substitua:

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

  • TABLE: a tabela em que o índice será adicionado.

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

Criar um índice do ScaNN

Para aplicar um índice de árvore de dois níveis usando o algoritmo ScaNN a uma coluna que contém embeddings de vetores armazenados, execute a seguinte consulta DDL:

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

Substitua:

  • INDEX_NAME: o nome do índice que você quer criar, por exemplo, my-scann-index. Os nomes de índice são compartilhados em todo o banco de dados. Verifique se cada nome de índice é exclusivo para cada tabela no banco de dados.

  • TABLE: a tabela em que o índice será adicionado.

  • EMBEDDING_COLUMN: uma coluna que armazena dados de vector.

  • DISTANCE_FUNCTION: a função de distância a ser usada com esse índice. Escolha uma destas opções:

    • Distância de L2: l2

    • Produto escalar: dot_product

    • Distância do cosseno: cosine

  • NUM_LEAVES_VALUE: o número de partições a serem aplicadas a esse índice. Definido como qualquer valor entre 1 e 1.048.576. Para mais informações sobre como decidir esse valor, consulte Ajustar um índice ScaNN.

Para saber mais sobre diferentes configurações de índice do ScaNN, consulte Criar um índice ScaNN. Também é possível criar um índice HNSW.

Fazer uma pesquisa híbrida usando a fusão de classificação recíproca

A pesquisa híbrida envolve a realização de pesquisas vetoriais e de texto separadas, depois a combinação e a reclassificação dos resultados usando a Fusão de classificação recíproca (RRF, na sigla em inglês). A RRF é um algoritmo baseado em classificação que combina várias listas classificadas de resultados da pesquisa em uma única lista classificada, atribuindo uma pontuação a cada documento. Essa pontuação é baseada na classificação recíproca do RRF em todas as listas contribuintes, e os documentos com classificação mais alta recebem uma contribuição maior. 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:

  • MODEL_ID: o ID do modelo a ser consultado.

    Se você estiver usando o Model Garden da Vertex AI, especifique text-embedding-005 como o ID do modelo. Esses são os modelos baseados na nuvem que o AlloyDB pode usar para embeddings de texto. Para mais informações, consulte Embeddings de texto.

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

  • TEXT: o texto a ser traduzido em um embedding de vetor.

  • KEYWORD: a palavra-chave que você quer pesquisar.

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

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

  • vector_search CTE: realiza uma pesquisa padrão de similaridade vetorial, ordena os resultados por distância de cosseno e atribui uma classificação. Ele recupera os 10 produtos mais semelhantes semanticamente.
  • text_search CTE: executa uma pesquisa de texto usando to_tsvector e to_tsquery, calcula a relevância com ts_rank e recupera as 10 correspondências de texto mais relevantes.
  • Final SELECT Statement CTE: une os resultados da pesquisa vetorial e de texto usando um FULL OUTER JOIN, seleciona o ID do produto, calcula a pontuação de RRF, ordena por pontuação e recupera os cinco principais resultados.

Fazer uma pesquisa híbrida usando o LangChain

A pesquisa híbrida com o repositório de vetores do AlloyDB aumenta a precisão da pesquisa combinando duas estratégias de pesquisa diferentes: pesquisa de vetor de embedding denso e pesquisa baseada em palavras-chave. AlloyDBVectorStore é uma classe de repositório de vetores do LangChain que usa o LangChain como uma implementação específica da classe VectorStore do LangChain. Saiba como usar o AlloyDB para armazenar embeddings de vetores com a classe AlloyDBVectorStore.

Você pode ativar e configurar essa pesquisa híbrida usando a classe HybridSearchConfig ao configurar seu AlloyDBVectorStore.

A pesquisa híbrida com o repositório de vetores do AlloyDB realiza simultaneamente uma pesquisa semântica para entender o significado e o contexto de uma consulta e uma pesquisa por palavra-chave para encontrar correspondências lexicais exatas. Os resultados das duas pesquisas são mesclados para fornecer um conjunto mais abrangente.

A seguir