Esegui una ricerca ibrida sulla similarità vettoriale

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.

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 esempio my-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 esempio my-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 dati vector.

  • 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 indice ScaNN.

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 utilizzando to_tsvector e to_tsquery, calcolando la pertinenza con ts_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 un FULL 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.

Passaggi successivi