¿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 |
|---|---|---|---|
| Pinecone | Nube gestionada | Producción, escala | ✅ Sí |
| Chroma | Código abierto | Dev local, prototipado | ✅ Gratis |
| Supabase pgvector | Extensión PostgreSQL | Apps full-stack | ✅ Sí |
| Weaviate | Código abierto / Nube | Búsqueda multi-modal | ✅ Sí |
| Qdrant | Código abierto / Nube | Filtrado + búsqueda | ✅ Sí |
| MemoryVectorStore | En memoria | Testing, 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