Embeddings y Similitud
Los embeddings convierten texto en vectores de tamaño fijo donde la similitud semántica corresponde a la cercanía geométrica. Potencian la búsqueda semántica, la agrupación y la recuperación en RAG.
Busca en todas las páginas de la documentación
Los embeddings convierten texto en vectores de tamaño fijo donde la similitud semántica corresponde a la cercanía geométrica. Potencian la búsqueda semántica, la agrupación y la recuperación en RAG.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
from openai import OpenAI
import numpy as np
client = OpenAI()
emb = client.embeddings.create(model="text-embedding-3-small", input=["texto de consulta"])
vec = np.array(emb.data[0].embedding)
# similitud del coseno
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))Cuándo usar esto:
"""embeddings_similarity.py - generar embeddings, indexar y buscar documentos."""
from __future__ import annotations
import numpy as np
from openai import OpenAI
client = OpenAI()
MODEL = "text-embedding-3-small"
documents = [
"FastAPI es un framework web moderno de Python para construir APIs.",
"PyTorch es un framework de aprendizaje profundo con grafos de cómputo dinámicos.",
"pandas 2.2 proporciona operaciones de DataFrame para el análisis de datos tabulares.",
"pytest es el framework de pruebas estándar para proyectos de Python.",
]
def embed_texts(texts: list[str]) -> np.ndarray:
response = client.embeddings.create(model=MODEL, input=texts)
vectors = [item.embedding for item in response.data]
arr = np.array(vectors, dtype=np.float32)
norms = np.linalg.norm(arr, axis=1, keepdims=True)
return arr / norms # Normalización L2 para similitud del coseno mediante producto punto
doc_embeddings = embed_texts(documents)
query = "¿Cómo pruebo mi código de Python?"
query_vec = embed_texts([query])[0]
scores = doc_embeddings @ query_vec # similitud del coseno (normalizada)
ranked = sorted(zip(scores, documents), reverse=True)
for score, doc in ranked:
print(f"{score:.3f} {doc}")Lo que esto demuestra:
text-embedding-3-small.| Modelo | Dims | Proveedor | Uso |
|---|---|---|---|
| text-embedding-3-small | 1536 | OpenAI | Propósito general, rentable |
| text-embedding-3-large | 3072 | OpenAI | Mayor calidad |
| all-MiniLM-L6-v2 | 384 | Local (sentence-transformers) | Sin conexión, rápido |
| voyage-3 | 1024 | Voyage AI | Optimizado para recuperación |
# Embeddings locales con sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
vectors = model.encode(documents, normalize_embeddings=True)| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Embeddings de API (OpenAI) | Sin GPU, alta calidad | Los datos no pueden salir de su red |
| sentence-transformers | Local/sin conexión, gratis | Necesita la máxima calidad de recuperación |
| Búsqueda por palabras clave BM25 | Coincidencia exacta de términos | Se necesita coincidencia semántica/parafraseada |
| Híbrido (BM25 + denso) | RAG en producción | Prototipo simple con pocos documentos |
client.embeddings.create(model="text-embedding-3-small", input=texts, dimensions=512)Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026