Guía para utilizar la extensión pgvector de PostgreSQL en ServBay
pgvector
es una potente extensión de terceros para la base de datos PostgreSQL que añade tipos de datos vectoriales y métodos de indexación de alto rendimiento, como IVFFlat y HNSW. Gracias a ello, PostgreSQL puede soportar de forma nativa el almacenamiento de vectores y búsquedas por similitud, lo que la convierte en una opción ideal para aplicaciones de IA, sistemas de recomendación, reconocimiento de imágenes y procesamiento de lenguaje natural que requieren manipular datos vectoriales de alta dimensión.
ServBay, como entorno de desarrollo web integrado, incluye de serie PostgreSQL y la extensión pgvector
, facilitando enormemente el proceso de habilitar y utilizar bases de datos vectoriales en tu entorno local. En este artículo encontrarás un tutorial detallado para usar pgvector
en ServBay.
¿Qué es pgvector y por qué es importante?
En muchos escenarios actuales, los datos ya no son solo texto estructurado y números. Especialmente con el auge de la inteligencia artificial y el aprendizaje automático, los datos suelen representarse como vectores de alta dimensión, conocidos como “embeddings”. Estos vectores capturan la semántica o las características de los datos —por ejemplo, los rasgos visuales de imágenes, el significado de textos o las preferencias de usuario.
La extensión pgvector
permite a PostgreSQL almacenar directamente estos vectores y realizar búsquedas eficientes de similitud (también llamadas “búsquedas de vecinos más cercanos”). Esto significa que puedes usar el lenguaje SQL para encontrar los elementos más parecidos a un vector dado, sin tener que recurrir a una base de datos vectorial separada, simplificando así tu stack tecnológico.
Requisitos previos
Antes de comenzar con pgvector
, asegúrate de cumplir estos requisitos:
- ServBay instalado y funcionando en macOS.
- El paquete PostgreSQL activado en la lista de "Packages" de ServBay. Si aún no está activado, localízalo en la interfaz de ServBay y cambia su estado a "Enabled".
Habilitar la extensión pgvector en PostgreSQL de ServBay
ServBay ya incluye los archivos de extensión correspondientes a pgvector
en el directorio de instalación de PostgreSQL. No necesitas descargar ni compilar nada manualmente; solo tendrás que activarlo en la base de datos donde desees utilizarlo.
Estos son los pasos para habilitar pgvector
en tu base de datos de PostgreSQL en ServBay:
Conéctate a la base de datos PostgreSQL: Puedes usar la herramienta de línea de comandos
psql
para conectarte a la instancia de PostgreSQL que ofrece ServBay. Por defecto, la configuración de PostgreSQL en ServBay permite conexiones locales, el usuario suele serpostgres
oservbay
, y el puerto por defecto es5432
. Si tienes una configuración diferente, revisa la documentación de ServBay para más detalles.Abre la terminal y conecta usando el siguiente comando (ajusta usuario y nombre de base de datos según tu entorno):
bashpsql -U servbay -d your_database_name -h localhost -p 5432
1-U servbay
: Especifica el usuario (servbay
opostgres
).-d your_database_name
: Nombre de la base de datos. Si no existe, crea una nueva (por ejemplo,CREATE DATABASE servbay_demo_db;
).-h localhost
: Indica que la conexión es local.-p 5432
: Puerto 5432 (por defecto en PostgreSQL de ServBay).
Crear la extensión
vector
: Una vez conectado, ejecuta el siguiente comando SQL desde el prompt depsql
para activar la extensión:sqlCREATE EXTENSION vector;
1Si la extensión ya existe, el comando mostrará un aviso.
Verifica la instalación: Puedes comprobar que
pgvector
está activo listando las extensiones instaladas:sql\dx
1En la salida deberías ver una extensión llamada
vector
con su versión correspondiente.List of installed extensions Name | Version | Schema | Description ----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language vector | 0.7.0 | public | vector data type and ivfflat and hnsw access methods (2 rows)
1
2
3
4
5
6(Nota: El número de versión puede variar según la versión de pgvector incluida por ServBay)
Configuración y uso de pgvector
Una vez habilitada la extensión, puedes empezar a crear y gestionar datos vectoriales.
Crear una tabla con datos vectoriales
Primero, crea una tabla para almacenar tus vectores. pgvector
introduce el tipo de datos VECTOR(dimensions)
, donde dimensions
indica la cantidad de dimensiones.
Ejemplo: creamos una tabla llamada embeddings
para vectores de 3 dimensiones:
sql
CREATE TABLE embeddings (
id SERIAL PRIMARY KEY,
-- Definimos una columna de vectores de 3 dimensiones
vector VECTOR(3)
);
1
2
3
4
5
2
3
4
5
Ahora puedes insertar algunos vectores de ejemplo:
sql
INSERT INTO embeddings (vector) VALUES
('[0.1, 0.2, 0.3]'),
('[0.4, 0.5, 0.6]'),
('[0.7, 0.8, 0.9]'),
('[0.15, 0.25, 0.35]'),
('[0.6, 0.5, 0.4]'); -- Agrega más datos para mejorar los ejemplos de consulta
1
2
3
4
5
6
2
3
4
5
6
Nota: Los valores de los vectores van entre corchetes []
y los elementos separados por comas.
Crear índices vectoriales para mejorar el rendimiento en consultas
Para tablas con muchos datos vectoriales, crear índices es clave para lograr búsquedas rápidas por similitud. pgvector
soporta dos tipos principales de índices: IVFFlat y HNSW. La elección depende de tus necesidades de velocidad, memoria, calidad de resultados, etc.
- IVFFlat (Índice invertido con compresión plana): Recomendado para datasets grandes con menores exigencias de recall. Se construye más rápido.
- HNSW (Hierarchical Navigable Small World): Ofrece mayor recall y velocidad, pero la construcción es más lenta y usa más memoria.
Ejemplo de creación de ambos índices para la columna vector
en la tabla embeddings
:
Crear índice IVFFlat:
sql-- Ejecuta ANALYZE para recolectar estadísticas antes de crear el índice ANALYZE embeddings; -- Crear índice IVFFlat -- WITH (lists = 100): Indica el número de listas invertidas. Ajusta según el tamaño del dataset. -- Más listas = mayor recall pero más lento construir/buscar. -- La recomendación oficial: lists = sqrt(número de filas). CREATE INDEX idx_ivfflat_vector ON embeddings USING ivfflat (vector) WITH (lists = 100);
1
2
3
4
5
6
7
8Crear índice HNSW:
sql-- Crear índice HNSW -- WITH (m = 16, ef_construction = 200): Parámetros del índice HNSW. -- m: Máximo número de conexiones por nodo. Impacta conectividad, eficiencia y memoria. -- ef_construction: Rango de búsqueda para construir el índice. Impacta tiempos, memoria y calidad (recall). -- Ajusta estos valores según tu dataset y requerimientos de rendimiento. CREATE INDEX idx_hnsw_vector ON embeddings USING hnsw (vector) WITH (m = 16, ef_construction = 200);
1
2
3
4
5
6Nota: Los parámetros de los índices (
lists
,m
,ef_construction
) influyen mucho en la velocidad y la calidad de los resultados. Analiza tus datos y consulta la documentación oficial de pgvector para una explicación detallada y sugerencias de ajuste.
Consultas vectoriales con pgvector
pgvector
ofrece varios operadores para calcular distancias entre vectores y realizar búsquedas por similitud. Los más utilizados son:
<->
: Distancia L2 (Euclídea). Mide distancia directa entre vectores.<#>
: Producto interno (Inner Product). Relacionado con la similitud de coseno; útil para comparar direcciones.<=>
: Distancia de coseno (1 - similitud de coseno
). Mide semejanza por dirección, independiente de la longitud.
Ejemplos de consultas:
Búsqueda de vecinos más cercanos (Nearest Neighbor Search)
Localiza los vectores más parecidos (menor distancia) a uno dado, usando ORDER BY
y el operador de distancia, con LIMIT
para restringir resultados.
- Buscar los 5 vectores más cercanos a
[0.2, 0.3, 0.4]
por distancia L2:sqlSELECT id, vector, -- Calcula la distancia L2 con el vector de consulta vector <-> '[0.2, 0.3, 0.4]' AS distance FROM embeddings ORDER BY distance -- Menor distancia = más parecido LIMIT 5;
1
2
3
4
5
6
7
8
9
10
Búsqueda por similitud (Similarity Search)
Similar a la anterior, pero centrada en mostrar la puntuación de similitud.
- Buscar los 5 vectores más cercanos a
[0.2, 0.3, 0.4]
por distancia de coseno:sqlSELECT id, vector, -- Calcula la distancia de coseno respecto al vector de consulta vector <=> '[0.2, 0.3, 0.4]' AS cosine_distance FROM embeddings ORDER BY cosine_distance -- Menor distancia = más parecido LIMIT 5;
1
2
3
4
5
6
7
8
9
10
Visualización de datos vectoriales (opcional)
Visualizar vectores de alta dimensión ayuda a entender su distribución y clusters. Para vectores de 2D o 3D puedes crear gráficas de dispersión directamente. Para dimensiones mayores, aplica técnicas de reducción de dimensiones (como PCA, t-SNE) y después grafica.
Aquí tienes un ejemplo sencillo para visualizar vectores 3D con Python y Matplotlib.
Preparar entorno Python: Necesitas Python instalado (puede ser interno o externo a ServBay). Si usas el paquete Python de ServBay, actívalo. Instala la librería para conectarte a PostgreSQL (
psycopg2
) y la de gráficas (matplotlib
):bash# Si usas el Python del sistema o uno propio pip install psycopg2 matplotlib # Con el paquete de Python de ServBay, usa la herramienta CLI de ServBay o el pip en su ruta bin # /Applications/ServBay/packages/python/bin/pip install psycopg2 matplotlib
1
2
3
4
5Ajusta el comando según la ruta de tu entorno Python.
Crear script Python: Crea un archivo llamado
visualize_vectors.py
y copia este código. Modifica los parámetros de conexión según la configuración de tu ServBay PostgreSQL (dbname
,user
,password
,host
,port
).pythonimport psycopg2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # Importa el módulo para gráficas 3D # Parámetros de conexión - Modifica según tu configuración de ServBay db_params = { "dbname": "your_database_name", # Cambia por el nombre de tu base de datos "user": "servbay", # Cambia por tu usuario servbay o postgres "password": "", # Cambia por tu contraseña (en local puede estar vacío) "host": "localhost", # ServBay PostgreSQL suele estar en localhost "port": "5432" # Puerto por defecto en PostgreSQL de ServBay } conn = None cur = None try: # Conecta con la base de datos PostgreSQL conn = psycopg2.connect(**db_params) cur = conn.cursor() # Consulta los datos vectoriales # Nota: psycopg2 interpreta los vectores '[x, y, z]' como strings. # Necesitas procesarlos manualmente o usar versiones compatibles de pgvector y psycopg2. # Aquí procesamos el string. cur.execute("SELECT vector FROM embeddings") vectors_raw = cur.fetchall() # Convierte los strings de vectores en listas numéricas vectors = [] for row in vectors_raw: # Elimina corchetes, separa por coma y convierte a float vec_str = row[0].strip('[]') coords = [float(c) for c in vec_str.split(',')] vectors.append(coords) if not vectors: print("No se encontraron datos vectoriales.") exit() # Extrae coordenadas # Asegura que todos los vectores tengan 3 dimensiones if any(len(v) != 3 for v in vectors): print("Advertencia: Las dimensiones de los vectores no son uniformes o no son 3D. Imposible graficar en 3D.") # Puedes optar por graficar en 2D o salir exit() x = [v[0] for v in vectors] y = [v[1] for v in vectors] z = [v[2] for v in vectors] # Crea el gráfico 3D de dispersión fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z) ax.set_xlabel('Dimensión 1') ax.set_ylabel('Dimensión 2') ax.set_zlabel('Dimensión 3') ax.set_title('Visualización 3D de Vectores') plt.show() except psycopg2.Error as e: print(f"Error de conexión o consulta a la base de datos: {e}") except Exception as e: print(f"Ocurrió un error: {e}") finally: # Cierra la conexión if cur: cur.close() if conn: conn.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74Ejecuta el script: Lanza el script en tu terminal:
bashpython visualize_vectors.py
1Se conectará a tu base de datos PostgreSQL, leerá los vectores y mostrará un gráfico 3D en pantalla con Matplotlib.
Preguntas frecuentes (FAQ)
- Pregunta: ¿Qué hago si no veo la extensión
vector
en la salida de\dx
? Respuesta: Verifica que ejecutaste correctamente el comandoCREATE EXTENSION vector;
sin errores. Si sigue sin aparecer, revisa que el paquete PostgreSQL de ServBay está instalado y habilitado. Los archivos de la extensiónpgvector
deben existir en el subdirectorioshare/extension
de PostgreSQL. Si faltan, prueba reinstalar o actualizar el paquete de PostgreSQL en ServBay. - Pregunta: ¿Cómo soluciono errores de autenticación al conectar con la base de datos? Respuesta: Revisa que usuario, contraseña, host y puerto en
psql
o tu script Python coincidan con la configuración de PostgreSQL en ServBay. Normalmente el usuario esservbay
opostgres
y puede no requerir contraseña para conexiones locales. - Pregunta: ¿Cómo elijo los parámetros de los índices vectoriales como
lists
,m
,ef_construction
? Respuesta: Estos parámetros tienen gran impacto en la velocidad y el recall, y no existe un valor óptimo universal. Realiza pruebas y ajustes según tamaño y características de tu dataset, expectativas de latencia y recall. Consulta la documentación oficial depgvector
para recomendaciones más detalladas.
Conclusión
pgvector
añade a PostgreSQL capacidad avanzada de base de datos vectorial, brindando a los desarrolladores un entorno potente y estable para crear aplicaciones IA y análisis vectorial de forma local. ServBay, al incluir y preconfigurar pgvector
, simplifica el setup considerablemente.
Siguiendo esta guía, puedes habilitar fácilmente pgvector
en PostgreSQL de ServBay, crear tablas para vectores, usar índices rápidos y ejecutar búsquedas por similitud. Combinando el entorno ServBay y sus herramientas, optimizas el desarrollo y testeo de tus aplicaciones web modernas y proyectos intensivos en datos.