Renderz Studio
Academia
Proyectos
Servicios
Arsenal
Repo
Herramientas
Skills
El Oráculo
Guía Gratis
← El Arsenal
ArquitecturaAvanzado45 min

Embeddings y Búsqueda Semántica

Vectores · similitud · índices · búsqueda que entiende contexto

EmbeddingsSearchVectors
✓ Guía gratuita · Acceso completo

Mapa rápido · salta al paso que te interese

Qué son embeddings

Vectores que capturan significado

Generar embeddings

Con OpenAI y alternativas

Búsqueda por similitud

Cosine similarity y más

01

Embeddings: vectores que capturan significado

Un embedding es un vector de números (ej: 1536 dimensiones) que representa el significado de un texto. Textos similares tienen vectores similares, medido por distancia coseno.

ModeloDimensionesCosteUso recomendado
text-embedding-3-small1536$0.02/1M tokensBalance coste/calidad
text-embedding-3-large3072$0.13/1M tokensMáxima precisión
voyage-21024$0.10/1M tokensRetrieval optimizado
02

Generar embeddings con OpenAI

lib/embeddings/generate.ts
import OpenAI from 'openai'

const openai = new OpenAI()

export async function generateEmbedding(text: string): Promise<number[]> {
  const response = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: text,
  })
  return response.data[0].embedding
}

// Batch para eficiencia
export async function generateEmbeddings(texts: string[]): Promise<number[][]> {
  const response = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: texts,
  })
  return response.data.map(d => d.embedding)
}
03

Búsqueda por similitud coseno

lib/embeddings/search.ts
// Similitud coseno manual (para entender)
export function cosineSimilarity(a: number[], b: number[]): number {
  let dotProduct = 0
  let normA = 0
  let normB = 0

  for (let i = 0; i < a.length; i++) {
    dotProduct += a[i] * b[i]
    normA += a[i] * a[i]
    normB += b[i] * b[i]
  }

  return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))
}

// Búsqueda en array (para datasets pequeños)
export function searchSimilar(
  query: number[],
  documents: Array<{ id: string; embedding: number[]; content: string }>,
  topK: number = 5
) {
  const scored = documents.map(doc => ({
    ...doc,
    score: cosineSimilarity(query, doc.embedding),
  }))

  return scored
    .sort((a, b) => b.score - a.score)
    .slice(0, topK)
}
Con Supabase pgvector (para producción)
-- SQL para buscar similares en Supabase
select
  id,
  content,
  1 - (embedding <=> $1::vector) as similarity
from documents
order by embedding <=> $1::vector
limit 5;

Tip Pro

Para más de 10K documentos, usa un índice vectorial (pgvector, Pinecone, Weaviate). La búsqueda lineal no escala.

Guías relacionadas

RAG desde Cero

Embeddings aplicados a RAG

Supabase + IA

pgvector para embeddings

¿Quieres el sistema completo?

500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.

Curso Completo · €29

PayPal · Acceso inmediato

¿Hablamos?