Esegui ricerche ibride in AlloyDB per PostgreSQL, che combinano la ricerca di testo, la corrispondenza delle parole chiave, la ricerca vettoriale e la somiglianza semantica, utilizzando l'estensione vector
, che è un'estensione PostgreSQL pgvector
standard personalizzata per AlloyDB.
Per migliorare la pertinenza della ricerca, puoi eseguire una ricerca ibrida che combini la ricerca di similarità vettoriale con la ricerca di testo. AlloyDB ti consente di creare indici invertiti generalizzati (GIN) per la ricerca di testo e indici Scalable Nearest Neighbors (ScaNN) per la ricerca vettoriale. Puoi quindi combinare i risultati di entrambe le ricerche e riclassificarli utilizzando Reciprocal Rank Fusion (RRF), un algoritmo che combina più elenchi di risultati di ricerca in un unico elenco classificato, per recuperare risultati altamente pertinenti in base sia alle corrispondenze esatte delle parole chiave sia alla somiglianza semantica.
Esegui una ricerca di similarità con input di testo e vettoriale
Per eseguire una ricerca ibrida in AlloyDB per PostgreSQL, devi creare un indice vettoriale e un indice di ricerca di testo nella tabella. Dopodiché, combineremo i risultati di entrambe le ricerche e li riordiniamo per presentare le informazioni più pertinenti.
Crea un indice GIN
Un indice GIN (Generalized Inverted Index) è un tipo di indice specializzato ottimizzato per la ricerca all'interno di valori compositi, come array, JSONB e dati di ricerca full-text.
Per creare un indice GIN sui dati di testo per eseguire una ricerca full-text, esegui il comando seguente:
CREATE INDEX INDEX_NAME ON TABLE USING GIN (to_tsvector('english', COLUMN_NAME));
Sostituisci quanto segue:
INDEX_NAME
: il nome dell'indice che vuoi creare, ad esempiomy-gin-index
.TABLE
: la tabella a cui aggiungere l'indice.COLUMN_NAME
: la colonna che memorizza i dati di testo che vuoi cercare.
Crea un indice ScaNN
Per applicare un indice ad albero a due livelli utilizzando l'algoritmo ScaNN a una colonna contenente incorporamenti vettoriali archiviati, esegui la seguente query DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Sostituisci quanto segue:
INDEX_NAME
: il nome dell'indice che vuoi creare, ad esempiomy-scann-index
. I nomi degli indici sono condivisi nel database. Assicurati che ogni nome di indice sia univoco per ogni tabella del database.TABLE
: la tabella a cui aggiungere l'indice.EMBEDDING_COLUMN
: una colonna che memorizza i dativector
.DISTANCE_FUNCTION
: la funzione di distanza da utilizzare con questo indice. Scegli una delle opzioni seguenti:Distanza L2:
l2
Prodotto scalare:
dot_product
Distanza coseno:
cosine
NUM_LEAVES_VALUE
: il numero di partizioni da applicare a questo indice. Imposta un valore compreso tra 1 e 1048576. Per ulteriori informazioni su come decidere questo valore, vedi Ottimizzare un indiceScaNN
.
Per saperne di più sulle diverse configurazioni dell'indice ScaNN, consulta Creare un indice ScaNN
. Puoi anche creare un indice HNSW.
Eseguire una ricerca ibrida utilizzando la fusione del rango reciproco
La ricerca ibrida prevede l'esecuzione di ricerche vettoriali e testuali separate, quindi la combinazione e la riorganizzazione dei risultati utilizzando Reciprocal Rank Fusion (RRF). RRF è un algoritmo basato sul ranking che combina più elenchi classificati di risultati di ricerca in un unico elenco classificato assegnando un punteggio a ogni documento. Questo punteggio si basa sul rango reciproco di RRF in tutti gli elenchi che contribuiscono, con i documenti di rango superiore che ricevono un contributo maggiore. Utilizza la seguente query SQL per combinare la ricerca full-text e la ricerca ibrida e riordinare i risultati:
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;
Sostituisci quanto segue:
MODEL_ID
: l'ID del modello da interrogare.Se utilizzi Vertex AI Model Garden, specifica
text-embedding-005
come ID modello. Questi sono i modelli basati su cloud che AlloyDB può utilizzare per gli incorporamenti di testo. Per ulteriori informazioni, vedi Incorporamenti di testo.TABLE
: la tabella contenente i dati.TEXT
: il testo da tradurre in un embedding vettoriale.KEYWORD
: la parola chiave che vuoi cercare.COLUMN_NAME
: una colonna che contiene i dati di testo che vuoi cercare.
Spiegazione della query di ricerca ibrida e dell'espressione della tabella comune (CTE) correlata:
vector_search
CTE: esegue una ricerca standard di similarità vettoriale, ordinando i risultati in base alla distanza coseno e assegnando un ranking. Recupera i 10 prodotti semanticamente più simili.text_search
CTE: esegue una ricerca di testo utilizzandoto_tsvector
eto_tsquery
, calcolando la pertinenza conts_rank
e recuperando i 10 risultati di corrispondenza di testo più pertinenti.Final SELECT Statement
CTE: unisce i risultati della ricerca vettoriale e di testo utilizzando unFULL OUTER JOIN
, seleziona l'ID prodotto, calcola il punteggio RRF, ordina per punteggio e recupera i primi 5 risultati.
Eseguire una ricerca ibrida utilizzando LangChain
La ricerca ibrida con l'archivio vettoriale AlloyDB migliora l'accuratezza della ricerca combinando due diverse strategie di ricerca: ricerca vettoriale di embedding densi e ricerca basata su parole chiave. AlloyDBVectorStore
è una classe di archivio vettoriale LangChain che utilizza LangChain fungendo da implementazione specifica della classe VectorStore
di LangChain. Scopri
come utilizzare AlloyDB per archiviare vector embedding con la classe AlloyDBVectorStore.
Puoi attivare e configurare questa ricerca ibrida utilizzando la classe HybridSearchConfig
quando configuri AlloyDBVectorStore
.
La ricerca ibrida con l'archivio vettoriale AlloyDB esegue contemporaneamente una ricerca semantica per comprendere il significato e il contesto di una query e una ricerca per parole chiave per trovare corrispondenze lessicali esatte. I risultati di entrambe le ricerche vengono poi uniti per fornire un insieme più completo di risultati.