Ejecuta una búsqueda híbrida de similitud de vectores

Realiza búsquedas híbridas en AlloyDB para PostgreSQL, que combinan la búsqueda de texto, la coincidencia de palabras clave, la búsqueda de vectores y la similitud semántica, con la extensión vector, que es una extensión estándar de pgvector PostgreSQL personalizada para AlloyDB.

Para mejorar la relevancia de la búsqueda, puedes realizar una búsqueda híbrida que combine la búsqueda de similitud de vectores con la búsqueda de texto. AlloyDB te permite crear índices invertidos generalizados (GIN) para la búsqueda de texto y índices de vecinos más cercanos escalables (ScaNN) para la búsqueda de vectores. Luego, puedes combinar los resultados de ambas búsquedas y volver a clasificarlos con la fusión de clasificación recíproca (RRF), un algoritmo que combina varias listas de resultados de búsqueda en una sola lista clasificada, para recuperar resultados muy relevantes basados en coincidencias exactas de palabras clave y similitud semántica.

Para realizar una búsqueda híbrida en AlloyDB para PostgreSQL, deberás crear un índice de vectores y un índice de búsqueda de texto en tu tabla. Luego, combinarás los resultados de ambas búsquedas y los volverás a clasificar para presentar la información más pertinente.

Crea un índice GIN

Un índice de índice invertido generalizado (GIN) es un tipo de índice especializado optimizado para la búsqueda dentro de valores compuestos, como arrays, JSONB y datos de búsqueda de texto completo.

Para crear un índice GIN en tus datos de texto y realizar una búsqueda en el texto completo, ejecuta lo siguiente:

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

Reemplaza lo siguiente:

  • INDEX_NAME: El nombre del índice que deseas crear, por ejemplo, my-gin-index.

  • TABLE: Es la tabla a la que se agregará el índice.

  • COLUMN_NAME: Es la columna que almacena los datos de texto que deseas buscar.

Crea un índice de ScaNN

Para aplicar un índice de árbol de dos niveles con el algoritmo ScaNN a una columna que contiene embeddings de vectores almacenadas, ejecuta la siguiente consulta DDL:

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

Reemplaza lo siguiente:

  • INDEX_NAME: El nombre del índice que deseas crear, por ejemplo, my-scann-index. Los nombres de los índices se comparten en toda la base de datos. Asegúrate de que cada nombre de índice sea único para cada tabla de tu base de datos.

  • TABLE: Es la tabla a la que se agregará el índice.

  • EMBEDDING_COLUMN: Es una columna que almacena datos vector.

  • DISTANCE_FUNCTION: Es la función de distancia que se usará con este índice. Elige una de estas opciones:

    • Distancia de L2: l2

    • Producto escalar: dot_product

    • Distancia de coseno: cosine

  • NUM_LEAVES_VALUE: Es la cantidad de particiones que se aplicarán a este índice. Se puede establecer en cualquier valor entre 1 y 1048576. Para obtener más información sobre cómo decidir este valor, consulta Cómo ajustar un índice de ScaNN.

Para obtener más información sobre las diferentes configuraciones de índices de ScaNN, consulta Crea un índice de ScaNN. También puedes crear un índice de HNSW.

Realiza una búsqueda híbrida con la fusión de clasificación recíproca

La búsqueda híbrida implica realizar búsquedas de vectores y de texto por separado, y, luego, combinar y volver a clasificar los resultados con la fusión de clasificación recíproca (RRF). El RRF es un algoritmo basado en el ranking que combina varias listas clasificadas de resultados de búsqueda en una sola lista clasificada asignando una puntuación a cada documento. Esta puntuación se basa en el rango recíproco del RRF en todas las listas que contribuyen, y los documentos con un rango más alto reciben una mayor contribución. Usa la siguiente consulta en SQL para combinar la búsqueda en el texto completo y la búsqueda híbrida, y volver a clasificar los 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;

Reemplaza lo siguiente:

  • MODEL_ID: el ID del modelo que se consultará.

    Si usas Vertex AI Model Garden, especifica text-embedding-005 como el ID del modelo. Estos son los modelos basados en la nube que AlloyDB puede usar para las incorporaciones de texto. Para obtener más información, consulta Incorporaciones de texto.

  • TABLE: Es la tabla que contiene tus datos.

  • TEXT: es el texto que se traducirá en una embedding de vector.

  • KEYWORD: Es la palabra clave que deseas buscar.

  • COLUMN_NAME: Es una columna que almacena los datos de texto que deseas buscar.

Explicación de la búsqueda híbrida y la expresión de tabla común (CTE) relacionada:

  • vector_search CTE: Realiza una búsqueda estándar de similitud de vectores, ordena los resultados por distancia de coseno y asigna un ranking. Recupera los 10 productos más similares semánticamente.
  • CTE text_search: Ejecuta una búsqueda de texto con to_tsvector y to_tsquery, calcula la relevancia con ts_rank y recupera las 10 coincidencias de texto más relevantes.
  • CTE de Final SELECT Statement: Une los resultados de la búsqueda vectorial y de texto con un FULL OUTER JOIN, selecciona el ID del producto, calcula la puntuación de RRF, ordena por puntuación y recupera los 5 resultados principales.

Realiza una búsqueda híbrida con LangChain

La búsqueda híbrida con el almacén de vectores de AlloyDB mejora la precisión de la búsqueda combinando dos estrategias de búsqueda diferentes: la búsqueda de vectores de embeddings densos y la búsqueda basada en palabras clave. AlloyDBVectorStore es una clase de almacén de vectores de LangChain que usa LangChain actuando como una implementación específica de la clase VectorStore de LangChain. Aprende a usar AlloyDB para almacenar embeddings de vectores con la clase AlloyDBVectorStore.

Puedes habilitar y configurar esta búsqueda híbrida con la clase HybridSearchConfig cuando configures tu AlloyDBVectorStore.

La búsqueda híbrida con el almacén de vectores de AlloyDB realiza simultáneamente una búsqueda semántica para comprender el significado y el contexto de una búsqueda, y una búsqueda de palabras clave para encontrar coincidencias léxicas exactas. Luego, se combinan los resultados de ambas búsquedas para proporcionar un conjunto de resultados más integral.

¿Qué sigue?