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
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.
| Modelo | Dimensiones | Coste | Uso recomendado |
|---|---|---|---|
| text-embedding-3-small | 1536 | $0.02/1M tokens | Balance coste/calidad |
| text-embedding-3-large | 3072 | $0.13/1M tokens | Máxima precisión |
| voyage-2 | 1024 | $0.10/1M tokens | Retrieval 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