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

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

Para mejorar la relevancia de las búsquedas, puedes realizar una búsqueda híbrida que combine la búsqueda por similitud de vectores con la búsqueda de texto. AlloyDB te permite crear índices invertidos generalizados (GIN) para la búsqueda de texto e índices vecinos más cercanos escalables (ScaNN) para la búsqueda de vectores. Después, puedes combinar los resultados de ambas búsquedas y volver a clasificarlos mediante 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 obtener resultados muy relevantes basados tanto en coincidencias exactas de palabras clave como en la similitud semántica.

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

Crear un índice GIN

Un índice GIN (índice invertido generalizado) es un tipo de índice especializado optimizado para buscar en 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 de texto completo, ejecuta lo siguiente:

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

Haz los cambios siguientes:

  • INDEX_NAME: el nombre del índice que quieras crear (por ejemplo, my-gin-index).

  • TABLE: la tabla a la que se va a añadir el índice.

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

Crear un índice de ScaNN

Para aplicar un índice de árbol de dos niveles con el algoritmo ScaNN a una columna que contenga incrustaciones 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);

Haz los cambios siguientes:

  • INDEX_NAME: el nombre del índice que quieras 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: la tabla a la que se va a añadir el índice.

  • EMBEDDING_COLUMN: una columna que almacena vector datos.

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

    • Distancia L2: l2

    • Producto escalar: dot_product

    • Distancia del coseno: cosine

  • NUM_LEAVES_VALUE: el número de particiones que se aplicarán a este índice. Puede ser cualquier valor entre 1 y 1048576. Para obtener más información sobre cómo decidir este valor, consulta Ajustar un índice de ScaNN.

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

Realizar una búsqueda híbrida con fusión de rango recíproco

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

Haz los cambios siguientes:

  • MODEL_ID: ID del modelo que se va a consultar.

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

  • TABLE: la tabla que contiene tus datos.

  • TEXT: el texto que se va a traducir a una incrustación de vector.

  • KEYWORD: la palabra clave que quieras buscar.

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

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

  • vector_search CTE: realiza una búsqueda de similitud de vectores estándar, ordena los resultados por distancia del coseno y asigna un rango. Devuelve los 10 productos más similares semánticamente.
  • text_search CTE: ejecuta una búsqueda de texto con to_tsvector y to_tsquery, calcula la relevancia con ts_rank y obtiene los 10 resultados de texto más relevantes.
  • Final SELECT Statement CTE: combina los resultados de búsqueda vectorial y de texto mediante una FULL OUTER JOIN, selecciona el ID del producto, calcula la puntuación de RRF, ordena los resultados por puntuación y obtiene los 5 mejores.

Hacer 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 incrustación densa 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. Consulta cómo usar AlloyDB para almacenar incrustaciones de vectores con la clase AlloyDBVectorStore.

Puedes habilitar y configurar esta búsqueda híbrida mediante 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 entender el significado y el contexto de una consulta, y una búsqueda por palabras clave para encontrar coincidencias léxicas exactas. Los resultados de ambas búsquedas se combinan para ofrecer un conjunto de resultados más completo.

Siguientes pasos