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.
Execute uma pesquisa de semelhanças com texto e entrada vetorial
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 armazenavector
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 índiceScaNN
.
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 usandoto_tsvector
eto_tsquery
, calculando a relevância comts_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 umFULL 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.