Renderz.Studio
El Arsenal
ArquitecturaAvanzado45 minGratis

Embeddings y Búsqueda Semántica

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

EmbeddingsSearchVectors
Guía gratuita · Acceso completo
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.

¿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 · €29PayPal · Acceso inmediato
¿Hablamos?