pgVector

pgVector: PostgreSQL como Base de Datos Vectorial

Por Carlos Montiel | Arquitecto de Soluciones IA Empresarial | guatemalia.com
✍️ Carlos Montiel 📂 pgVector ⌛ 11 min de lectura
Guía completa de pgVector: instalación, configuración, almacenamiento de embeddings y búsqueda semántica directamente en PostgreSQL.

¿Qué es pgVector?

pgVector es una extensión open-source de PostgreSQL para vectores de alta dimensión y búsqueda por similitud. Permite usar PostgreSQL como base de datos vectorial sin sistemas adicionales como Pinecone o Weaviate.

¿Por qué importa? La mayoría de empresas ya tiene PostgreSQL en producción. Con pgVector, implementan RAG y búsqueda semántica sin añadir complejidad operacional ni costos adicionales de infraestructura.

Capacidades:

Instalación en Docker y Ubuntu

Docker (más rápido):
docker run -e POSTGRES_PASSWORD=password -p 5432:5432 ankane/pgvector

Ubuntu/Debian:
sudo apt install postgresql-15-pgvector
psql -c "CREATE EXTENSION IF NOT EXISTS vector;"

Operadores de distancia vectorial

pgVector usa operadores especiales para búsqueda:

La distancia coseno es la más apropiada para embeddings de texto porque mide dirección del vector, no magnitud.

Índice HNSW: búsqueda rápida a escala

Para colecciones grandes (>100K vectores), el índice HNSW permite búsquedas aproximadas en milisegundos:

Parámetros clave:

Para producción con 1M+ vectores: m=16, ef_construction=128 es un buen punto de partida.

Ejemplo de código

-- pgVector: crear tabla y buscar embeddings similares
CREATE EXTENSION IF NOT EXISTS vector;

-- Tabla de documentos con embeddings
CREATE TABLE documentos (
    id         BIGSERIAL PRIMARY KEY,
    titulo     TEXT NOT NULL,
    contenido  TEXT,
    categoria  VARCHAR(50),
    embedding  vector(1536),
    creado_en  TIMESTAMPTZ DEFAULT NOW()
);

-- Indice HNSW para busqueda rapida
CREATE INDEX ON documentos
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 128);

-- Busqueda semantica: top-5 mas similares filtrando por categoria
SELECT titulo, categoria,
       1 - (embedding <=> '[0.031, -0.401, ...]'::vector) AS similitud
FROM documentos
WHERE categoria = 'RRHH'
ORDER BY embedding <=> '[0.031, -0.401, ...]'::vector
LIMIT 5;

-- Python: insertar embedding generado con OpenAI
import psycopg2
from openai import OpenAI

def indexar_documento(titulo, contenido, categoria, conn):
    client = OpenAI()
    embedding = client.embeddings.create(
        model="text-embedding-3-small",
        input=contenido
    ).data[0].embedding

    with conn.cursor() as cur:
        cur.execute(
            "INSERT INTO documentos (titulo, contenido, categoria, embedding) VALUES (%s,%s,%s,%s)",
            (titulo, contenido, categoria, embedding)
        )
    conn.commit()

¿Necesitas implementar esto en tu empresa?

Carlos Montiel es arquitecto de soluciones IA empresarial con experiencia en LLMs, Agentes, RAG y orquestación en Guatemala y Latinoamérica.

Contactar a Carlos Montiel
Carlos Montiel
Arquitecto de Soluciones IA Empresarial · guatemalia.com

Especialista en LLMs, Agentes IA, RAG, LangChain y LangGraph para empresas en Guatemala y Latinoamérica. Para consultas de implementación: guatemalia.com/#contacto