Procedimiento para habilitar y usar pgvector en Azure Cosmos DB for PostgreSQL

SE APLICA A: Azure Cosmos DB for PostgreSQL (con tecnología de la extensión de base de datos de Citus en PostgreSQL)

La extensión pgvector agrega una búsqueda de similitud vectorial de código abierto a PostgreSQL.

En este artículo se presentan funcionalidades adicionales habilitadas por pgvector. Se describen los conceptos de similitud de vectores e inserciones, y se proporcionan instrucciones sobre cómo habilitar la extensión pgvector. Verá cómo crear, almacenar y consultar los vectores. Es posible que también quiera consultar el archivo LÉAME oficial del proyecto.

Habilitación de una extensión

Para poder usar las extensiones de PostgreSQL, es preciso habilitarlas en la base de datos. Para habilitar la extensión, ejecute el comando desde la herramienta psql para cargar los objetos empaquetados en la base de datos.

SELECT CREATE_EXTENSION('vector');

Nota:

Para deshabilitar una extensión, use drop_extension()

Conceptos

Similitud de vectores

La similitud de vectores es un método que se usa para medir la similitud de dos elementos mediante su representación como vectores, que son series de números. Los vectores se usan a menudo para representar puntos de datos, donde cada elemento del vector representa una característica o atributo del punto de datos.

La similitud de vectores se calcula normalmente mediante métricas de distancia, como la similitud de Euclidean distance o cosine. La distancia euclidiana mide la distancia en línea recta entre dos vectores en el espacio unidimensional, mientras que la similitud coseno mide el coseno del ángulo entre dos vectores. Los valores de las métricas de similitud suelen oscilar entre 0 y 1, con valores higher que indican una mayor similitud entre los vectores.

La similitud de vectores se usa ampliamente en varias aplicaciones, como las de sistemas de recomendación, clasificación de texto, reconocimiento de imágenes y agrupación en clústeres. Por ejemplo, en los sistemas de recomendaciones, la similitud vectorial se puede usar para identificar elementos similares en función de las preferencias del usuario. En la clasificación de texto, la similitud vectorial se puede usar para determinar la similitud entre dos documentos u oraciones en función de sus representaciones vectoriales.

Inserciones

Una inserción es una técnica para evaluar la "relación" de texto, imágenes, vídeos u otros tipos de información. La evaluación permite que los modelos de Machine Learning identifiquen eficazmente las relaciones y similitudes entre los datos, lo que permite a los algoritmos identificar patrones y realizar predicciones precisas. Por ejemplo, en una tarea de análisis de sentimiento, es posible que las palabras con inserciones similares tengan puntuaciones de opinión similares.

Introducción

Cree un tblvector de tabla con una columna embedding de tipo vector(3) que represente un vector tridimensional.

CREATE TABLE tblvector(
    id bigserial PRIMARY KEY,
    embedding vector(3)
    );

Una vez que haya generado una inserción mediante un servicio como la API de OpenAI, puede almacenar el vector resultante en la base de datos. La definición de un vector como vector(3) designa [x,y,z] coordinates en el plano tridimensional. El comando inserta cinco filas nuevas en la tabla tblvector con las inserciones proporcionadas.

INSERT INTO tblvector (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]'), (3, '[5,4,6]'), (4, '[3,5,7]'), (5, '[7,8,9]');

Al usar la instrucción INSERT INTO ... ON CONFLICT, puede especificar una acción alternativa, como actualizar registros que coincidan con los criterios. Le permite controlar posibles conflictos de una manera más eficaz.

INSERT INTO tblvector (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]')
ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding;

El comando DELETE quita las filas de una tabla especificada según las condiciones especificadas en la cláusula WHERE. Cuando la cláusula WHERE no está presente, se eliminan todas las filas de la tabla.

DELETE FROM tblvector WHERE id = 1;

Para recuperar vectores y calcular la similitud, use instrucciones SELECT y los operadores vectoriales integrados. Por ejemplo, la consulta calcula la distancia euclidiana (distancia L2) entre el vector especificado y los vectores almacenados en la tabla tblvector, ordena los resultados por la distancia calculada y devuelve los cinco elementos más similares más cercanos.

SELECT * FROM tblvector 
ORDER BY embedding <-> '[3,1,2]' 
LIMIT 5;

La consulta usa el operador "<->", que es el "operador de distancia" que se usa para calcular la distancia entre dos vectores en un espacio multidimensional. La consulta devuelve todas las filas con una distancia de menos de 6 con respecto al vector [3,1,2].

SELECT * FROM tblvector WHERE embedding <-> '[3,1,2]' < 6;

El comando recupera el valor medio de la columna "embedding" de la tabla "tblvector". Por ejemplo, si la columna "embedding" contiene inserciones de palabras para un modelo de lenguaje, el valor medio de estas inserciones se podría usar para representar toda la oración o documento.

SELECT AVG(embedding) FROM tblvector;

Operadores vectoriales

pgvector presenta seis nuevos operadores que se pueden usar en vectores:

Operador Descripción
+ adición por elementos
- resta por elementos
* multiplicación por elementos
<-> Distancia euclidiana
<#> producto interno negativo
<=> distancia de coseno

Funciones vectoriales

cosine_distance

Calcula la distancia de coseno entre dos vectores.

cosine_distance(vector, vector)

Argumentos

vector

Primero vector.

vector

Segundo vector.

Tipo de valor devuelto

double precision como distancia entre los dos vectores proporcionados.

inner_product

Calcula el producto interno de dos vectores.

inner_product(vector, vector)

Argumentos

vector

Primero vector.

vector

Segundo vector

Tipo de valor devuelto

double precision como producto interno de los dos vectores.

l2_distance

Calcula la distancia euclidiana (también conocida como L2) entre dos vectores.

l2_distance(vector, vector)

Argumentos

vector

Primero vector.

vector

Segundo vector

Tipo de valor devuelto

double precision como la distancia euclidiana entre los dos vectores.

l1_distance

Calcula la distancia del taxista (también conocida como L1) entre dos vectores.

l1_distance(vector, vector)

Argumentos

vector

Primero vector.

vector

Segundo vector

Tipo de valor devuelto

double precision como la distancia del taxista entre los dos vectores.

vector_dims(vector)

Devuelve las dimensiones de un vector determinado.

Argumentos

vector

Un objeto vector.

Tipo de valor devuelto

integer representa el número de dimensiones del vector especificado.

vector_norms(vector)

Calcula la norma euclidiana de un vector determinado.

Argumentos

vector

Un objeto vector.

Tipo de valor devuelto

double precision representa la norma euclidiana del vector especificado.

Agregados vectoriales

AVG

Calcula el promedio de los vectores procesados.

Argumentos

vector

Un objeto vector.

Tipo de valor devuelto

vector representa el promedio de vectores procesados.

SUM

Argumentos

vector

Un objeto vector.

Tipo de valor devuelto

vector representa la suma de vectores procesados.

Pasos siguientes

Obtenga más información sobre el rendimiento, la indexación y las limitaciones con pgvector.