Capítulo 3: Selección del Modelo de Embedding Adecuado
Introducción
Seleccionar el modelo de embedding adecuado depende de sus requisitos específicos: calidad, costo, latencia, soporte de idiomas y restricciones de despliegue.
Marco de Decisión
Benchmarks MTEB
El Massive Text Embedding Benchmark (MTEB) es el estándar para comparar modelos de embedding:
Tabla de Clasificación (Mejores Modelos)
| Puesto | Modelo | Puntaje Promedio | Dimensiones |
|---|---|---|---|
| 1 | text-embedding-3-large | 64.59 | 3072 |
| 2 | Cohere embed-v3 | 64.47 | 1024 |
| 3 | BGE-large-en-v1.5 | 64.23 | 1024 |
| 4 | E5-large-v2 | 62.25 | 1024 |
| 5 | text-embedding-3-small | 62.26 | 1536 |
Rendimiento por Tarea
| Modelo | Recuperación | STS | Clasificación |
|---|---|---|---|
| text-embedding-3-large | 59.2 | 65.4 | 71.2 |
| Cohere embed-v3 | 58.9 | 64.8 | 70.1 |
| BGE-large | 57.8 | 63.9 | 69.5 |
Análisis de Costos
Por Millón de Tokens
def calculate_monthly_cost(
docs_per_month: int,
avg_tokens_per_doc: int,
model: str
):
prices = {
"text-embedding-3-small": 0.02,
"text-embedding-3-large": 0.13,
"cohere-embed-v3": 0.10,
"self-hosted": 0.0 # Infrastructure costs separate
}
total_tokens = docs_per_month * avg_tokens_per_doc
millions = total_tokens / 1_000_000
return millions * prices[model]
# Example: 1M documents, 500 tokens each
cost = calculate_monthly_cost(1_000_000, 500, "text-embedding-3-small")
# Result: $10/month for embedding
Comparación de Costos Totales
| Escala | OpenAI Small | OpenAI Large | Self-Hosted |
|---|---|---|---|
| 100K docs | $1 | $6.50 | ~$50/mes (infra) |
| 1M docs | $10 | $65 | ~$100/mes |
| 10M docs | $100 | $650 | ~$200/mes |
Consideraciones de Latencia
Latencia de API
| Modelo | Latencia Promedio | Latencia P99 |
|---|---|---|
| text-embedding-3-small | 50ms | 150ms |
| text-embedding-3-large | 80ms | 200ms |
| Cohere embed-v3 | 60ms | 180ms |
| Self-hosted (GPU) | 10ms | 30ms |
Estrategia de Batching
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI()
async def batch_embed(texts, batch_size=100):
"""Efficient batching for large datasets"""
embeddings = []
for i in range(0, len(texts), batch_size):
batch = texts[i:i + batch_size]
response = await client.embeddings.create(
input=batch,
model="text-embedding-3-small"
)
embeddings.extend([e.embedding for e in response.data])
return embeddings
Soporte de Idiomas
Modelos Multilingües
| Modelo | Idiomas | Calidad |
|---|---|---|
| text-embedding-3 | 100+ | Excelente |
| Cohere multilingual | 100+ | Excelente |
| BGE-m3 | 100+ | Excelente |
| paraphrase-multilingual | 50+ | Buena |
Específicos por Idioma
# For specific languages, dedicated models may be better
models_by_language = {
"en": "BAAI/bge-large-en-v1.5",
"zh": "BAAI/bge-large-zh-v1.5",
"multilingual": "BAAI/bge-m3"
}
Opciones de Despliegue
Opción 1: API (Recomendado para la mayoría)
# Pros: No infrastructure, always updated
# Cons: Ongoing cost, latency, data leaves your network
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
Opción 2: Self-Hosted
# Pros: No per-token cost, lower latency, data stays internal
# Cons: Infrastructure cost, maintenance
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-large-en-v1.5')
# Load once, use many times
Opción 3: Híbrido
# Use self-hosted for high volume, API for edge cases
def get_embeddings(texts, use_api=False):
if use_api or len(texts) < 10:
return api_embeddings.embed_documents(texts)
else:
return local_model.encode(texts)
Lista de Verificación para la Selección
| Factor | Pregunta | Recomendación |
|---|---|---|
| Presupuesto | ¿Presupuesto mensual? | >$100: API, <$100: Self-host |
| Volumen | ¿Documentos/mes? | >10M: Considere self-host |
| Latencia | ¿Necesita tiempo real? | <20ms: Requiere self-host |
| Idiomas | ¿Multilingüe? | Use modelos multilingües |
| Privacidad | ¿Sensibilidad de datos? | Self-host si es crítico |
| Calidad | ¿Precisión crítica? | Pague por el mejor modelo |
Matriz de Recomendación
| Caso de Uso | Modelo Recomendado |
|---|---|
| Startup / MVP | text-embedding-3-small |
| Empresa (calidad) | text-embedding-3-large |
| Empresa (costo) | BGE-large (self-hosted) |
| Multilingüe | Cohere multilingual |
| Edge / Offline | all-MiniLM-L6-v2 |
| Máxima calidad | Cohere embed-v3 |
Resumen
- Comience con API (OpenAI small) para prototipos
- Evalúe los puntajes MTEB para su tipo de tarea
- Calcule los costos según su escala esperada
- Considere self-hosting para alto volumen
- Pruebe con sus datos antes de comprometerse
Próximos Pasos
¡Ponga a prueba sus conocimientos con el Quiz del Módulo 3!