Añadir búsqueda semántica a tu app con pgvector y un modelo de embeddings
Tres cambios mínimos: una columna de vectores, una llamada a la API y una consulta de distancia. El resto es llave de OpenAI.

Añadir búsqueda semántica a una aplicación existente es más barato de lo que suena. Según el desarrollador Carlogino, solo requiere tres modificaciones: añadir una columna de vectores a la base de datos, enviar el texto a un modelo de embeddings al crear cada fila y comparar las distancias en el motor de consultas al buscar.
De la búsqueda por subcadenas a la semántica
El punto de partida es una app de tareas simple en Next.js con Postgres. La búsqueda original era una verificación de subcadenas: si escribías "groceries", no encontrabas "Comprar manzanas" porque las palabras no coinciden literales. Al usar embeddings, el texto se convierte en un vector de números (1536 dimensiones en el caso de text-embedding-3-small de OpenAI). Textos con significado similar quedan cerca en ese espacio vectorial, y la base de datos hace la aritmética de medir esa cercanía.
No es magia: es una llamada HTTP POST que devuelve una lista de floats. El modelo se entrena con texto masivo y esa geometría resultante permite que "hacer la colada" esté cerca de "limpieza" sin que nadie haya programado esa relación.
Implementación con pgvector
La primera pieza es instalar la extensión pgvector en Postgres. En Supabase viene incluida pero hay que activarla; si corre localmente, la imagen Docker estándar de Postgres no la trae, así que hay que usar la imagen específica del proyecto.
La migración añade la columna vector(1536) a la tabla. Debe ser nullable porque las filas existentes no tienen embedding y porque puede haber un retardo entre la inserción de la fila y la generación del vector si el proveedor falla.
La consulta de búsqueda es directa: se envía la frase a buscar, se obtiene su vector y se piden las filas ordenadas por distancia. Todo el "IA" vive en ese único endpoint de OpenAI; el resto es estándar. El código está disponible en GitHub en dos ramas: una con la app base y otra con la búsqueda semántica implementada.
Si ya tienes Postgres y quieres dejar de depender de coincidencias exactas, esto es lo mínimo que hay que tocar. No necesitas un vector database dedicado para empezar, aunque sí conviene decidir bien el tamaño del vector, porque cambiarlo después implica regenerar todo el índice.


