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.
Ejecutar una búsqueda por similitud con texto y vectores
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 almacenavector
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 deScaNN
.
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 conto_tsvector
yto_tsquery
, calcula la relevancia conts_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 unaFULL 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.