Bases de Datos Vectoriales
Una base de datos vectorial es especializada para un tipo específico de consulta: "dame los K elementos más parecidos a este vector". Una BD SQL normal busca por igualdad exacta (WHERE nombre = "Juan"); una BD vectorial busca por similitud semántica ("dame los 5 documentos más parecidos a esta pregunta").
Esto es radicalmente distinto y requiere estructuras de datos especiales —como el índice HNSW (Hierarchical Navigable Small World)— para ser eficiente con millones de vectores.
Para elegir la herramienta correcta: Chroma es perfecta para desarrollo local (se instala en segundos, guarda en disco o en RAM); Pinecone es la opción managed más popular para producción (sin infraestructura que gestionar, pero tiene costo); pgvector es una extensión de PostgreSQL que convierte tu base de datos existente en vectorial (ideal si ya usas Postgres, no necesitas otra infra).
Supabase (que usa pgvector internamente) es la opción favorita para proyectos que quieren SQL + vectores en un solo servicio.
// Bases de datos vectoriales para producción
// Opción 1: Pinecone (managed, serverless)
import { Pinecone } from "@pinecone-database/pinecone";
const pc = new Pinecone({ apiKey: process.env.PINECONE_API_KEY });
const indice = pc.index("mi-base-conocimiento");
// Insertar embeddings
await indice.upsert([
{ id: "doc-1", values: embedding1, metadata: { texto: "React hooks...", fuente: "docs.md" } },
{ id: "doc-2", values: embedding2, metadata: { texto: "useState...", fuente: "tutorial.md" } },
]);
// Buscar similar (top 5 más relevantes)
const resultados = await indice.query({
vector: embeddingDePregunta,
topK: 5,
includeMetadata: true,
});
const contexto = resultados.matches.map(m => m.metadata.texto).join("\n");
// Opción 2: Supabase + pgvector (SQL + vectores)
// CREATE EXTENSION vector;
// CREATE TABLE documentos (
// id BIGSERIAL PRIMARY KEY,
// contenido TEXT,
// embedding VECTOR(1536) -- Dimensión de text-embedding-3-small
// );
// Buscar con pgvector:
// SELECT id, contenido, 1 - (embedding <=> $1::vector) AS similitud
// FROM documentos
// ORDER BY similitud DESC
// LIMIT 5;
// Opción 3: Chroma (local, para desarrollo)
import { ChromaClient } from "chromadb";
const chroma = new ChromaClient();
const coleccion = await chroma.createCollection({ name: "docs" });
await coleccion.add({
ids: ["1", "2"],
embeddings: [embedding1, embedding2],
documents: ["texto1", "texto2"],
});
Practica esta lección
Resuelve los ejercicios del curso de IA para Devs en la app, gratis y con corrección automática.
Empezar a practicar