Ejecuta una búsqueda de similitud de vectores

En este documento, se explica cómo realizar búsquedas de similitud de vectores en AlloyDB para PostgreSQL con la extensión pgvector. La búsqueda de similitud de vectores, también conocida como búsqueda de vecinos más cercanos, te permite encontrar los puntos de datos de tus datos que son más similares a un vector de consulta determinado.

Puedes consultar tu base de datos de AlloyDB para obtener vectores semánticamente similares después de almacenar y, luego, indexar los embeddings. Usa las funciones de consulta de pgvector para encontrar los vecinos más cercanos de un vector de embedding.

Para obtener más información sobre cómo almacenar embeddings de vectores y crear un índice, consulta Almacena embeddings de vectores y Crea índices, respectivamente.

Para ejecutar una búsqueda de similitud, especifica la tabla, la columna de incorporación, la función de distancia, la incorporación objetivo y la cantidad de filas que se devolverán. También puedes usar la función embedding() para traducir texto a un vector y, luego, comparar el vector con los embeddings almacenados usando operadores pgvector.

Para encontrar los vecinos semánticos más cercanos a un vector de embedding, puedes ejecutar la siguiente consulta de ejemplo, en la que estableces la misma función de distancia que usaste durante la creación del índice.

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

Reemplaza lo siguiente:

  • TABLE: la tabla que contiene la embedding con la que se compara el texto.

  • EMBEDDING_COLUMN: la columna que contiene las incorporaciones almacenadas.

  • DISTANCE_FUNCTION_QUERY: Es la función de distancia que se usará con esta consulta. Elige una de las siguientes opciones según la función de distancia que se usó para crear el índice:

    • Distancia de L2: <->

    • Producto interno: <#>

    • Distancia de coseno: <=>

  • EMBEDDING: Es el vector de incorporación del que deseas encontrar los vecinos semánticos almacenados más cercanos.

  • ROW_COUNT: cantidad de filas que se mostrarán.

    Especifica 1 si solo deseas la mejor coincidencia.

Para obtener más información sobre otros ejemplos de consultas, consulta Consultas.

También puedes usar la función embedding() para traducir el texto a un vector y encontrar las filas de la base de datos con las incorporaciones semánticamente más similares. La extensión pgvector de PostgreSQL estándar se personaliza para AlloyDB y se conoce como vector. Aplicas el vector a uno de los operadores de vecino más cercano pgvector, por ejemplo, <=> para la distancia del coseno.

Debido a que embedding() devuelve un array real, debes convertir de forma explícita la llamada embedding() en vector para usar estos valores con operadores pgvector.

  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <=> google_ml.embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT

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.

  • Opcional: VERSION_TAG: Es la etiqueta de la versión del modelo que se consultará. Agrega @ a la etiqueta.

    Si usas uno de los modelos en inglés text-embedding-005 con Vertex AI, especifica una de las etiquetas de versión (por ejemplo, text-embedding-005) que se indican en Versiones del modelo.

    Google recomienda enfáticamente que siempre especifiques la etiqueta de versión. Si no especificas la etiqueta de versión, AlloyDB usará la versión del modelo más reciente, lo que podría generar resultados inesperados.

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

Para acelerar la búsqueda de KNN filtrada, puedes usar el motor de columnas de AlloyDB. Para obtener más información, consulta Acelera tu búsqueda de vectores filtrada (Versión preliminar) y Configura el motor columnar.

¿Qué sigue?