Cómo Usar PostgreSQL como Base de Datos Vectorial (IA)

13 minuto(s)

Con la explosión de los Modelos de Lenguaje (LLMs) y los sistemas RAG (Retrieval-Augmented Generation), almacenar embeddings se volvió una necesidad crítica.

Aunque el mercado se llenó de bases de datos vectoriales nativas y dedicadas, la realidad de la ingeniería de producción es otra: mantener la consistencia de los datos, gestionar copias de seguridad distribuidas y pagar licencias duplicadas es un dolor de cabeza.

La base de datos PostgreSQL, gracias a la madurez de su extensión pgvector, nos permite unificar el mundo relacional y el vectorial bajo una misma infraestructura robusta y conocida.

1. Introducción y Conceptos importantes

Antes de ir a la parte técnica, es importante conocer ciertos puntos:

¿Qué pasa bajo el capó de un Vector en Postgres?

Un embedding no es más que una representación matemática de un texto, imagen o audio en forma de una lista ordenada de números de punto flotante (un array). La dimensión de este vector depende exclusivamente del modelo de Inteligencia Artificial que utilices. Por ejemplo, si usas un modelo local ligero como all-MiniLM-L6-v2 para priorizar la privacidad, trabajarás con 384 dimensiones. Si optas por modelos comerciales en la nube, la cifra ascenderá a 1536 dimensiones.

Para habilitar el soporte nativo de estos elementos en tu base de datos, solo necesitas ejecutar el siguiente bloque SQL para inicializar la extensión y definir tu primera tabla optimizada:

Búsquedas Secuenciales vs Búsquedas Indexadas

El verdadero problema cuando llevas una aplicación con IA a producción es la escala de datos. Si ejecutas una búsqueda semántica utilizando operadores de distancia tradicionales de pgvector (como <=> para la distancia del coseno), PostgreSQL realizará por defecto un Sequential Scan.


Cuando tu tabla posee unos pocos miles de filas, este cálculo matemático en tiempo real tarda microsegundos. Sin embargo, si almacenas millones de fragmentos de texto, la CPU se verá obligada a calcular la distancia geométrica fila por fila en cada petición, destruyendo por completo los tiempos de respuesta de tu API backend.

Infraestructura unificada para IA y RAG

Si tu aplicación necesita guardar datos comunes (usuarios, configuraciones, textos) y, además, los vectores de tu IA, PostgreSQL es la opción más robusta y confiable porque no necesitas mantener dos bases de datos separadas. Te permite hacer consultas complejas combinando datos relacionales y vectores en una sola línea de SQL (un JOIN de toda la vida).

Infografía profesional y minimalista sobre el uso de PostgreSQL y la extensión pgvector para aplicaciones de IA y RAG. Infografía profesional y minimalista sobre el uso de PostgreSQL y la extensión pgvector

Solo valdría la pena mirar opciones como Chroma o Qdrant si estás haciendo un proyecto donde únicamente vas a buscar vectores y no te importa la estructura relacional, o Redis si la velocidad de respuesta en memoria es tu prioridad absoluta.

La Solución Avanzada: Índices HNSW vs IVFFlat

Para evitar el colapso del servidor, es obligatorio implementar índices de búsqueda aproximada de vecinos más cercanos (ANN). En pgvector, se puede manejar dos estrategias principales con ventajas muy claras según tu infraestructura:

  • IVFFlat (Inverted File Flat): Funciona dividiendo el espacio de tus vectores en listas o clústeres. Su principal beneficio es que se construye de manera muy rápida y consume una cantidad mínima de memoria RAM. Su desventaja es que, si nuevos vectores se agrupan demasiado cerca en producción, puedes llegar a perder precisión en los resultados semánticos.
  • HNSW (Hierarchical Navigable Small World): Es el estándar de oro actual en la ingeniería de datos. Construye un grafo multicapa donde cada vector se conecta con sus vecinos más cercanos. Aunque requiere una mayor cantidad de memoria RAM y el tiempo inicial de creación del índice es más elevado, ofrece una velocidad de consulta increíblemente rápida y una precisión semántica implacable bajo alta concurrencia.

Para optimizar un entorno de producción exigente, la implementación recomendada de un índice HNSW ajustando los hiperparámetros críticos (m para las conexiones máximas por nodo y ef_construction para el esfuerzo de exploración del grafo) se realiza de la siguiente manera:

Configuración y Tuning del Servidor

La construcción de grafos vectoriales es una tarea que consume recursos intensivos a nivel de hardware. Si dejas la configuración por defecto de PostgreSQL, el comando de indexación fallará o tardará horas. Modifica los siguientes parámetros directamente en tu archivo postgresql.conf para acelerar los despliegues:

  • maintenance_work_mem: Eleva temporalmente este valor (por ejemplo, a 512MB o 1GB). La creación de grafos HNSW se realiza enteramente en la memoria RAM asignada a tareas de mantenimiento; si el espacio es insuficiente, Postgres paginará en disco, ralentizando el proceso.
  • max_parallel_maintenance_workers: pgvector tiene la capacidad nativa de compilar índices utilizando múltiples núcleos en paralelo. Asigna 2 o 4 núcleos dedicados a este proceso según la capacidad de tu droplet o servidor cloud para reducir el tiempo de indexación a unos pocos minutos.

¿Cómo saber si tu índice está funcionando?

Una trampa común en la que caen muchos desarrolladores es crear el índice HNSW y asumir que todo está solucionado. En producción, necesitas medir el Index Hit Rate (la tasa de éxito del índice). Si realizas búsquedas semánticas y PostgreSQL sigue recurriendo a lecturas secuenciales en disco, tu optimización no está sirviendo de nada.

Puedes verificar el estado real de tus índices vectoriales ejecutando la siguiente consulta de diagnóstico:


Si el valor de busquedas_indexadas se mantiene en cero después de lanzar tus pruebas de estrés, significa que el planificador de consultas de PostgreSQL decidió que es más “barato” hacer un escaneo secuencial. Esto ocurre habitualmente por dos razones: la tabla contiene muy pocos datos para justificar el uso del grafo, o el parámetro work_mem del servidor es tan bajo que el índice no cabe en la memoria de trabajo durante la ejecución del query.

2. Cómo Usar PostgreSQL como Base de Datos Vectorial (IA)

Estoy usando PostgreSQL 17.10 en Windows 11 via Docker Desktop.


Tu puedes usar PostgreSQL de la manera que mejor te paresca.

Paso 1: Instalar pgvector

Ejecuta los siguientes comandos en tu PowerShell de Windows (uno por uno). Esto entrará al contenedor como superusuario (root) e instalará el paquete oficial de pgvector para PostgreSQL 17:

Paso 2: Entrar a Postgres y crear la tabla

Una vez que termine de instalarse pgvector, necesitamos una tabla para guardar nuestros datos vectoriales.

Ingresa a tu consola de Postgres:


Ejecuta los comandos:


Con esto, el tipo de dato vector quedará registrado globalmente en la base de datos.

Paso 3: Instalación de modelo de IA

Ahora vamos a instalar nuestro modelo via la herramienta Ollama.

Intente usar modelos como Gemma, pero son puramente modelos de generación de texto y chat (Text-Generation). No están entrenados ni exponen la arquitectura matemática necesaria para generar vectores de similitud (Embeddings). Si intentas llamar al endpoint /api/embeddings usando ese modelo, Ollama siempre te rechazará la petición.

Para solucionarlo de forma profesional, debemos usar un modelo diseñado específicamente para esta tarea. El estándar de oro en Ollama para embeddings es el modelo nomic-embed-text.

En tu PowerShell de Windows, ejecuta el siguiente comando para bajarte el modelo especializado (solo pesa unos 274 MB):

Paso 4: Creación de proyecto en Node JS

En aplicaciones de inteligencia artificial con datos vectoriales, también se pueden hacer tareas CRUD de la forma habitual.

Instalamos Express, PostgreSQL y Ollama para Node.js:


Creamos una archivo server.js en donde realizaremos tareas CRUD (Create, Read, Update y Delete) y agregemos lo siguiente:


Iniciamos el servidor de Node JS:

Paso 5: Tareas CRUD con datos vectoriales en PostgreSQL

Ahora que la base de datos entiende el tipo vector(768) y Ollama tiene listo el modelo nomic-embed-text, vamos a ejecutar el CRUD Semántico completo en Postman.

1. CREATE: Insertar un artículo con su Embedding (POST)

Vamos a registrar el primer artículo técnico. La API enviará el contenido a Ollama, este generará un vector de 768 dimensiones y Node lo guardará en Postgres.

Método: POST

URL: http://localhost:3000/api/articulos

Body (raw -> JSON):


Respuesta esperada (201 Created):

Artículo creado con su Embedding

Aprovecha e inserta un segundo artículo con este contenido para tener más variedad en las pruebas:

Otro artículo creado con su Embedding

2. READ: Búsqueda Semántica por Conceptos (POST)

Aquí viene la magia de la IA. Vamos a buscar algo utilizando palabras que no existen en el texto original, para comprobar cómo Postgres recupera el artículo por su “significado” matemático.

Método: POST

URL: http://localhost:3000/api/articulos/buscar

Body (raw -> JSON):


Respuesta esperada (200 OK):

Verás que te devuelve el artículo de “Optimización del Rendimiento Backend” en primer lugar, acompañado de una propiedad distancia. Al usar el operador <=> (distancia del coseno), mientras más cercano a 0 sea el valor, más idéntico es el concepto.

Búsqueda Semántica por Conceptos

3. UPDATE: Actualizar Contenido y Re-calcular Vector (PUT)

Si el contenido de un artículo cambia, su significado conceptual cambia; por lo tanto, tenemos que actualizar tanto el texto como el embedding en la base de datos.

Método: PUT

URL: http://localhost:3000/api/articulos/3 (Asegúrate de que el ID coincida)

Body (raw -> JSON):


Respuesta esperada (200 OK):

Actualizar Contenido y Re-calcular Vector

4. DELETE: Eliminar de la Base de Datos (DELETE)

Esta operación remueve por completo tanto los datos relacionales como el vector asociado, limpiando el espacio en disco.

Método: DELETE

URL: http://localhost:3000/api/articulos/3

Respuesta esperada (200 OK):

Eliminar de la Base de Datos

3. Escalabilidad en Producción: El impacto de los índices Vectoriales

Cuando trabajamos con un par de registros en desarrollo, la base de datos responde de forma instantánea. Sin embargo, en un entorno de producción real, con miles de artículos, logs o interacciones, calcular el álgebra lineal de vectores de 768 dimensiones en cada consulta puede ahogar por completo la CPU de tu servidor.

Para demostrarlo, realizaremos una prueba de estrés comparando una búsqueda semántica cruda frente a una optimizada con grafos HNSW (Hierarchical Navigable Small World).

El Script de Pruebas de Estrés (Benchmark)

Para medir los resultados con precisión de milisegundos en tu máquina, puedes utilizar este script automatizado que insertará 50,000 vectores de alta densidad en tu tabla para evaluar el comportamiento del motor de bases de datos:

Creamos un archivo llamado test.js y agregamos lo siguiente:

Resultados Reales del Benchmark en Producción

Al ejecutar este volumen de datos bajo la arquitectura de PostgreSQL 17 en contenedores, los datos de rendimiento demuestran de manera contundente la necesidad de la indexación:

Análisis de Resultados Reales Actual Benchmark Results in Production

Correr una arquitectura de alta dimensión (768 dimensiones con nomic-embed-text) sobre un entorno local controlado (PostgreSQL 17.10 en Docker bajo Windows 11) nos ofrece una radiografía exacta del comportamiento del hardware:

Métrica Analizada / Estrategia Escenario A: Consulta Cruda (Sin Índice) Escenario B: Consulta Indexada (HNSW) Impacto Real en la Infraestructura
Tiempo de Respuesta (Latencia) 203.75 ms 7.43 ms 27.4x Veces más rápido
Carga de CPU del Servidor 100% (Saturación de núcleo por cálculo lineal) < 3% (Búsqueda optimizada por punteros) Liberación crítica del Event Loop
Tipo de Escaneo (Postgres) Sequential Scan (Álgebra exhaustiva) Index Scan (Navegación por grafo) Evita el colapso por concurrencia
Tiempo de Creación del Índice N/A 50.96 segundos Proceso intensivo en RAM y CPU

Análisis Técnico: ¿Qué significan estos números para tu API?

Analicemos fríamente el impacto de este benchmark:

  1. El peligro de los 203.75 ms: En el desarrollo web tradicional, una consulta a la base de datos que tarda más de 50 ms ya se considera un problema. Si dejas tu sistema RAG sin índices, un solo usuario realizando una búsqueda semántica mantendrá ocupado un núcleo de la CPU durante más de 200 milisegundos calculando la distancia del coseno (<=>) fila por fila entre los 50,000 registros. Si 10 usuarios buscan al mismo tiempo, tu API backend empezará a encolar peticiones, destruyendo la experiencia de usuario.
  2. HNSW a 7.43 ms: Al construir el índice Hierarchical Navigable Small World (que en nuestro entorno tomó 50.96 segundos de procesamiento intensivo), PostgreSQL estructuró los vectores en un grafo de múltiples capas. En lugar de hacer 50,000 operaciones matemáticas complejas, el motor ahora salta entre los nodos vecinos más cercanos en tiempo logarítmico (O(log N)). La latencia cae a 7.43 ms, permitiendo al servidor soportar alta concurrencia sin pestañear.

Externalizar tu arquitectura de datos hacia proveedores de nicho o bases de datos vectoriales dedicadas solo por la necesidad de manejar embeddings suele ser una decisión prematura que introduce complejidad técnica, configuraciones extra de red y costos innecesarios en la nube. La madurez que ha alcanzado la extensión pgvector en versiones modernas como PostgreSQL 17 demuestra que puedes unificar el mundo relacional y el vectorial de forma profesional.

La clave del éxito en producción no radica únicamente en almacenar los vectores, sino en entender el costo de la escala. Al dominar la implementación de grafos indexados como HNSW, no solo blindas el rendimiento de tu API backend, sino que mantienes la consistencia e integridad de tus datos bajo un mismo motor robusto, conocido, unificado y altamente escalable.

Conclusión

Externalizar tu arquitectura de datos hacia proveedores de nicho solo por la necesidad de manejar vectores suele ser una decisión prematura que introduce complejidad técnica y costos innecesarios en la nube. La madurez que ha alcanzado pgvector, sumada a la capacidad de implementar grafos indexados mediante HNSW, demuestra que PostgreSQL está perfectamente capacitado para soportar cargas de trabajo de nivel empresarial en sistemas RAG y búsqueda semántica.

La clave del éxito en entornos de producción reales no radica únicamente en almacenar los vectores, sino en saber tunear los parámetros de mantenimiento del servidor (maintenance_work_mem), configurar la exploración del grafo (ef_search) y monitorear constantemente que las consultas aprovechen la indexación aproximada. Al dominar estas optimizaciones de infraestructura, no solo blindas el rendimiento y la latencia de tu API backend, sino que mantienes la consistencia e integridad de tus datos relacionales y vectoriales bajo un mismo motor robusto, unificado y altamente escalable.

Bases de Datos 02-06-2026 16-06-2026 Crear un PostEventos DevsForo

Sobre el Autor

Juan Castro

Juan Castro — Ingeniero de Software con más de 17 años de experiencia en desarrollo, ia, ml, devops, data science, ciberseguridad y tecnología.

Certificados oficiales:
Certificado Microsoft Azure Fundamentals Certificado AWS Designing Event-Driven Architectures Certificado Google Desarrollo de Aplicaciones Móviles

Ver más

IA