Almacenar e insertar consultas con pgvector
Las incrustaciones vectoriales transforman texto, imágenes y otro contenido en representaciones numéricas que capturan el significado semántico. Azure Database for PostgreSQL admite el almacenamiento y la consulta de estas incrustaciones a través de la extensión pgvector, lo que le permite agregar funcionalidades de búsqueda vectorial a la base de datos postgreSQL existente sin administrar un almacén de vectores independiente.
En esta unidad se describe cómo habilitar la extensión pgvector, diseñar esquemas para el almacenamiento vectorial, insertar y actualizar inserciones y realizar consultas de similitud básicas. Estas operaciones fundamentales constituyen la base para crear características de recuperación y búsqueda semántica en las aplicaciones de inteligencia artificial.
Habilitación de la extensión pgvector
La extensión pgvector agrega tipos de datos vectoriales y operadores de búsqueda de similitud a PostgreSQL. Para poder almacenar incrustaciones, debe habilitar la extensión en la base de datos. Azure Database for PostgreSQL incluye pgvector como una de las extensiones admitidas, lo que hace que esté disponible sin instalación adicional.
Para habilitar pgvector, conéctese a la base de datos y ejecute el CREATE EXTENSION comando . Necesita los permisos adecuados para crear extensiones, que normalmente se conceden al administrador del servidor o a los usuarios con el azure_pg_admin rol .
CREATE EXTENSION IF NOT EXISTS vector;
Después de habilitar la extensión, puede comprobar que está disponible consultando las extensiones instaladas:
SELECT * FROM pg_extension WHERE extname = 'vector';
La extensión pgvector introduce el vector tipo de datos, que almacena incrustaciones como matrices de números de punto flotante de precisión sencilla. Cada vector tiene un número fijo de dimensiones que se especifican al crear una columna. La extensión también proporciona operadores para calcular distancias entre vectores y tipos de índice para una búsqueda rápida de similitud.
Diseñar esquemas para el almacenamiento vectorial
El diseño de esquema eficaz para el almacenamiento vectorial combina incrustaciones con los metadatos que la aplicación necesita para filtrar y mostrar. Al definir una columna vectorial, se especifica el número de dimensiones mediante la vector(n) sintaxis , donde n debe coincidir con la dimensión de salida del modelo de inserción.
Las dimensiones de inserción comunes varían según el modelo. Los modelos de transformador de frases suelen producir vectores 384 dimensionales. El modelo text-embedding-ada-002 de OpenAI genera 1.536 dimensiones, mientras que text-embedding-3-large puede producir hasta 3.072 dimensiones. El uso del recuento de dimensiones incorrecto provoca errores de inserción, por lo que debe comprobar la dimensión de salida del modelo antes de crear tablas.
En el ejemplo siguiente se crea una tabla que almacena documentos legales con incrustaciones junto con metadatos útiles para filtrar y mostrar:
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
category TEXT,
practice_area TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
embedding vector(1536)
);
Este esquema almacena la inserción de documentos en la misma fila que sus metadatos. Este enfoque simplifica las consultas porque no necesita combinaciones para recuperar los documentos similares y sus detalles. Para campos de contenido grandes, considere la posibilidad de almacenar el texto completo en una tabla independiente y mantener solo resúmenes o títulos en la tabla principal para reducir los datos transferidos durante las búsquedas de similitud.
Al diseñar para varios modelos de inserción o insertar diferentes tipos de contenido (como títulos frente al contenido completo), puede agregar varias columnas vectoriales:
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
title_embedding vector(384),
content_embedding vector(1536)
);
Inserción y actualización de inserciones
Después de crear el esquema, se insertan inserciones mediante instrucciones SQL INSERT estándar. Los vectores se representan como literales de cadena en formato de matriz y se convierten en el tipo vector. El código de la aplicación genera la inserción mediante una API de inserción (como Azure OpenAI) y la pasa a la base de datos como parámetro.
INSERT INTO documents (title, content, category, practice_area, embedding)
VALUES (
'Corporate Merger Agreement Template',
'This agreement outlines the terms and conditions for the merger of...',
'contracts',
'corporate',
'[0.0123, -0.0456, 0.0789, -0.0321, ...]'::vector
);
Para mejorar el rendimiento en las inserciones por lotes al cargar grandes conjuntos de datos, use instrucciones de varias filas INSERT o el comando COPY.
INSERT INTO documents (title, content, category, embedding)
VALUES
('Document 1', 'Content...', 'legal', '[...]'::vector),
('Document 2', 'Content...', 'legal', '[...]'::vector),
('Document 3', 'Content...', 'legal', '[...]'::vector);
Cuando cambie el contenido del documento, actualice la inserción para reflejar el nuevo significado semántico:
UPDATE documents
SET content = 'Updated document content...',
embedding = '[0.0234, -0.0567, ...]'::vector,
updated_at = NOW()
WHERE id = 42;
En el caso de las aplicaciones con actualizaciones frecuentes, considere la posibilidad de procesar por lotes la regeneración durante las horas de poca actividad en lugar de actualizar las inserciones de forma sincrónica con los cambios de contenido. Este enfoque reduce la latencia de las actualizaciones de contenido y consolida las llamadas a la API de inserción.
Vectores de consulta con operadores de distancia
La extensión pgvector proporciona tres operadores de distancia para medir la similitud entre vectores. Cada operador calcula un tipo de distancia diferente y elegir el adecuado depende del modelo de inserción y del caso de uso.
La distancia L2 (distancia euclidiana) mide la distancia de línea recta entre dos vectores en el espacio de inserción. Use el <-> operador para la distancia L2. Los valores más pequeños indican vectores más similares. Esta métrica funciona bien cuando la magnitud de los vectores tiene significado.
SELECT id, title, embedding <-> '[0.0123, -0.0456, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 10;
La distancia de coseno mide el ángulo entre dos vectores, ignorando sus magnitudes. Utilice el operador <=> para la distancia coseno. Los valores van de 0 (dirección idéntica) a 2 (direcciones opuestas). La distancia de coseno es la opción más común para las incrustaciones de texto porque se centra en la dirección del significado en lugar de la longitud del vector.
SELECT id, title, embedding <=> '[0.0123, -0.0456, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 10;
El producto interno negativo calcula el producto de punto de dos vectores y lo niega. Use el <#> operador . Esta métrica es útil para la búsqueda del máximo de productos internos, donde los productos de puntos más grandes indican vectores más similares. La negación la convierte a una distancia en la que los valores más pequeños son mejores, coincidendo con el comportamiento de los otros operadores.
SELECT id, title, embedding <#> '[0.0123, -0.0456, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 10;
La mayoría de los modelos de representación, incluidas las incrustaciones de OpenAI, están optimizados para la similitud de coseno. Compruebe la documentación del modelo de inserción para confirmar qué métrica de distancia recomienda.
Tipos de datos vectoriales y precisión
La extensión pgvector ofrece tres tipos de datos para almacenar vectores, cada uno con diferentes características de almacenamiento y rendimiento.
El tipo de vector almacena elementos como números de punto flotante de precisión única (32 bits). Este es el tipo estándar para la mayoría de los casos de uso y proporciona un buen equilibrio de precisión y eficiencia de almacenamiento. Un vector de 1536 dimensiones usa aproximadamente 6 KB de almacenamiento.
El tipo halfvec almacena elementos como números de punto flotante de precisión media (16 bits). Este tipo reduce el almacenamiento a la mitad en comparación con el vector, manteniendo una precisión suficiente para la mayoría de las tareas de búsqueda de similitud. Úselo halfvec cuando el almacenamiento es un problema y ha comprobado que la precisión reducida no afecta significativamente a la calidad de la búsqueda.
CREATE TABLE documents_compact (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
embedding halfvec(1536)
);
El tipo disperso almacena vectores dispersos donde la mayoría de los elementos son cero. En lugar de almacenar todas las dimensiones, solo almacena los valores distintos de cero y sus posiciones. Este tipo es útil para los modelos que producen incrustaciones dispersas, como determinadas representaciones de documento. Especifique el número máximo de dimensiones al crear la columna.
CREATE TABLE sparse_documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
embedding sparsevec(10000)
);
Nota:
Los índices de HNSW en columnas sparsevec admiten hasta 1.000 elementos distintos de cero. Si los vectores dispersos superan este límite, considere la posibilidad de reducir la dimensionalidad o estrategias de indexación alternativas.
Para la mayoría de las aplicaciones de IA que usan incrustaciones densas desde modelos como OpenAI o transformadores de oraciones, use el tipo estándar vector . Considere halfvec solo después de que la prueba comparativa confirme que la precisión media proporciona una calidad de búsqueda aceptable para su caso de uso específico.