TechLead
Lección 9 de 18
5 min de lectura
LangChain

Bases de Datos Vectoriales y Embeddings

Aprende a usar bases de datos vectoriales y embeddings para almacenar, buscar y recuperar datos semánticos para aplicaciones RAG

¿Qué Son los Embeddings?

Los embeddings son representaciones numéricas de texto (o imágenes, audio, etc.) como vectores — arrays de números de punto flotante que capturan el significado semántico. Los textos con significado similar tienen vectores cercanos en el espacio vectorial, lo que permite la búsqueda semántica.

🧮 Por Qué Importan los Embeddings

  • Búsqueda Semántica: Encuentra contenido por significado, no solo por coincidencia de palabras clave
  • Base de RAG: Los embeddings impulsan la Generación Aumentada por Recuperación
  • Similitud: Compara documentos, encuentra duplicados, agrupa contenido
  • Recomendación: Construye sistemas de recomendación basados en similitud de contenido

Generando Embeddings con LangChain

LangChain proporciona una interfaz unificada para generar embeddings de múltiples proveedores.

import { OpenAIEmbeddings } from "@langchain/openai";

// Inicializar modelo de embeddings
const embeddings = new OpenAIEmbeddings({
  modelName: "text-embedding-3-small", // Rápido y económico
  // modelName: "text-embedding-3-large", // Mayor calidad
});

// Generar embedding para un solo texto
const vector = await embeddings.embedQuery(
  "¿Qué es el aprendizaje automático?"
);
console.log(vector.length); // 1536 dimensiones
console.log(vector.slice(0, 5)); // [0.012, -0.034, 0.089, ...]

// Generar embeddings para múltiples textos a la vez
const vectors = await embeddings.embedDocuments([
  "El aprendizaje automático es un subconjunto de la IA",
  "React es una biblioteca de JavaScript",
  "Docker ejecuta contenedores",
]);
console.log(vectors.length); // 3

¿Qué Es una Base de Datos Vectorial?

Una base de datos vectorial es una base de datos especializada diseñada para almacenar y consultar vectores de alta dimensionalidad de manera eficiente. A diferencia de las bases de datos tradicionales que buscan por coincidencias exactas, las bases de datos vectoriales encuentran los vectores más similares usando métricas de distancia como similitud coseno o distancia euclidiana.

Base de Datos Tipo Mejor Para Nivel Gratis
PineconeNube gestionadaProducción, escala✅ Sí
ChromaCódigo abiertoDev local, prototipado✅ Gratis
Supabase pgvectorExtensión PostgreSQLApps full-stack✅ Sí
WeaviateCódigo abierto / NubeBúsqueda multi-modal✅ Sí
QdrantCódigo abierto / NubeFiltrado + búsqueda✅ Sí
MemoryVectorStoreEn memoriaTesting, datasets pequeños✅ Incluido

Vector Store en Memoria (Inicio Rápido)

El MemoryVectorStore integrado de LangChain es perfecto para aprender y prototipar — no necesitas base de datos externa.

import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
import { Document } from "@langchain/core/documents";

// Crear documentos
const documents = [
  new Document({
    pageContent: "LangChain es un framework para construir apps con LLM",
    metadata: { source: "docs", topic: "langchain" },
  }),
  new Document({
    pageContent: "React es una biblioteca para construir interfaces de usuario",
    metadata: { source: "docs", topic: "react" },
  }),
  new Document({
    pageContent: "Las bases de datos vectoriales almacenan embeddings para búsqueda por similitud",
    metadata: { source: "docs", topic: "vectors" },
  }),
];

// Crear vector store desde documentos
const vectorStore = await MemoryVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings()
);

// Búsqueda por similitud
const results = await vectorStore.similaritySearch(
  "¿Cómo construyo aplicaciones de IA?",
  2
);

console.log(results[0].pageContent);
// "LangChain es un framework para construir apps con LLM"

Usando Pinecone

# Instalar integración de Pinecone
npm install @pinecone-database/pinecone @langchain/pinecone
import { Pinecone } from "@pinecone-database/pinecone";
import { PineconeStore } from "@langchain/pinecone";
import { OpenAIEmbeddings } from "@langchain/openai";

const pinecone = new Pinecone({
  apiKey: process.env.PINECONE_API_KEY!,
});

const index = pinecone.Index("mi-indice");

const vectorStore = await PineconeStore.fromExistingIndex(
  new OpenAIEmbeddings(),
  { pineconeIndex: index }
);

// Buscar con filtro de metadatos
const results = await vectorStore.similaritySearch(
  "frameworks de renderizado del servidor",
  3,
  { category: "frameworks" }
);

Usando como Retriever en RAG

import { ChatOpenAI } from "@langchain/openai";
import { createRetrievalChain } from "langchain/chains/retrieval";
import { createStuffDocumentsChain } from "langchain/chains/combine_documents";
import { ChatPromptTemplate } from "@langchain/core/prompts";

// Convertir vector store a retriever
const retriever = vectorStore.asRetriever({ k: 4 });

const prompt = ChatPromptTemplate.fromTemplate(`
Responde la pregunta basándote en el siguiente contexto:

Contexto: {context}

Pregunta: {input}

Respuesta:`);

const documentChain = await createStuffDocumentsChain({
  llm: new ChatOpenAI({ modelName: "gpt-4" }),
  prompt,
});

const retrievalChain = await createRetrievalChain({
  combineDocsChain: documentChain,
  retriever,
});

const response = await retrievalChain.invoke({
  input: "¿Cómo despliego con Docker?",
});
console.log(response.answer);

💡 Puntos Clave

  • • Los embeddings convierten texto en vectores numéricos que capturan significado semántico
  • • Las bases de datos vectoriales permiten búsqueda rápida por similitud entre millones de vectores
  • • MemoryVectorStore es ideal para prototipar; usa Pinecone/Supabase para producción
  • • Usa .asRetriever() para conectar vector stores a cadenas RAG
  • • Los scores de similitud ayudan a filtrar resultados por umbral de relevancia

Continuar aprendiendo