Capítulo 1: ¿Qué son los Embeddings?
Introducción
Los embeddings son representaciones vectoriales densas de texto que capturan el significado semántico. Permiten que las computadoras comprendan y comparen el significado del texto, no solo las palabras.
El concepto
Piense en los embeddings como coordenadas en un "espacio de significado":
"happy" → [0.2, 0.8, -0.1, 0.5, ...]
"joyful" → [0.21, 0.79, -0.12, 0.48, ...] // ¡Similar!
"sad" → [-0.3, 0.1, 0.7, -0.4, ...] // ¡Diferente!
Significados similares = Vectores similares = Cercanos en el espacio
¿Cómo funcionan los Embeddings?
1. Texto a vector
from openai import OpenAI
client = OpenAI()
# El texto se convierte en un vector
text = "Machine learning is fascinating"
response = client.embeddings.create(
input=text,
model="text-embedding-3-small"
)
embedding = response.data[0].embedding
# Resultado: [0.023, -0.891, 0.156, ..., 0.342]
# 1536 dimensiones
2. Cálculo de similitud
import numpy as np
def cosine_similarity(vec1, vec2):
"""Calculate cosine similarity between two vectors"""
dot_product = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot_product / (norm1 * norm2)
# Ejemplo
similarity = cosine_similarity(
embed("What is RAG?"),
embed("Explain Retrieval Augmented Generation")
)
# Resultado: ~0.92 (¡muy similar!)
similarity = cosine_similarity(
embed("What is RAG?"),
embed("How to cook pasta")
)
# Resultado: ~0.15 (no similar)
Dimensiones de los Embeddings
| Modelo | Dimensiones | Tamaño del vector |
|---|---|---|
| text-embedding-3-small | 1536 | 6KB |
| text-embedding-3-large | 3072 | 12KB |
| Cohere embed-v3 | 1024 | 4KB |
| BGE-small | 384 | 1.5KB |
| BGE-large | 1024 | 4KB |
Por qué importan las dimensiones
- Más dimensiones = Representaciones más matizadas
- Menos dimensiones = Búsqueda más rápida, menor almacenamiento
- Equilibrio entre calidad y eficiencia
Métricas de similitud
Similitud coseno
La más común para embeddings de texto:
# Rango: -1 a 1
# 1 = dirección idéntica
# 0 = ortogonal (no relacionado)
# -1 = dirección opuesta
cosine_sim = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
Distancia euclidiana
Mide la distancia en línea recta:
# Menor = más similar
euclidean_dist = np.linalg.norm(a - b)
Producto punto
Cuando los vectores están normalizados:
# Para vectores normalizados, igual que la similitud coseno
dot_product = np.dot(a, b)
Visualización de embeddings
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# Reducir a 2D para visualización
texts = ["cat", "dog", "car", "truck", "happy", "sad"]
embeddings = [embed(t) for t in texts]
tsne = TSNE(n_components=2, random_state=42)
reduced = tsne.fit_transform(embeddings)
plt.scatter(reduced[:, 0], reduced[:, 1])
for i, text in enumerate(texts):
plt.annotate(text, (reduced[i, 0], reduced[i, 1]))
plt.show()
Agrupamientos esperados:
- "cat", "dog" → Agrupamiento de animales
- "car", "truck" → Agrupamiento de vehículos
- "happy", "sad" → Agrupamiento de emociones
Propiedades clave de buenos embeddings
| Propiedad | Descripción |
|---|---|
| Similitud semántica | Significados similares → Vectores cercanos |
| Composicionalidad | Frases codificadas de manera significativa |
| Cross-lingual | El mismo concepto es similar entre idiomas |
| Denso | Todas las dimensiones tienen significado |
Embeddings en RAG
Resumen
- Los embeddings convierten texto en vectores numéricos
- Significados similares producen vectores similares
- La similitud coseno es la métrica estándar
- Las dimensiones afectan la calidad frente a la eficiencia
- Los embeddings permiten la búsqueda semántica en RAG
Próximos pasos
Continúe a Capítulo 2: Modelos de Embeddings para explorar las opciones disponibles.