Optimizar Costos de Tokens en LLMs: Guía Completa [2026]
Reduce hasta 90% el costo de tokens en GPT-4, Claude y otros LLMs. Técnicas de optimización, caching, y mejores prácticas.
Cómo Optimizar Costos de Tokens en LLMs: Guía Definitiva [2026]
TLDR: Los principales consumidores de tokens son: contexto acumulado (40-50%), outputs de herramientas (20-30%), y system prompts repetidos (10-15%). Estrategias clave: usar el modelo correcto para cada tarea, implementar prompt caching, limitar contexto, y hacer batching. Reducción típica: 60-80% de costos.
¿Por qué tus costos de IA son tan altos?
El problema
Muchos desarrolladores ven facturas de $100-500/mes en APIs de IA cuando podrían pagar $20-50 por el mismo resultado.
Causas comunes:
- Enviar todo el historial de conversación en cada request
- Usar GPT-4 para tareas que GPT-4o-mini haría igual de bien
- No implementar caching de prompts repetidos
- Generar outputs más largos de lo necesario
Anatomía de un token
1"Hola, ¿cómo estás hoy?" = 7 tokens (español)2"Hello, how are you today?" = 6 tokens (inglés)3 41000 tokens ≈ 750 palabras en español51000 tokens ≈ 4-5 párrafos de texto
Precios actuales (referencia)
| Modelo | Input/1M | Output/1M |
|---|---|---|
| GPT-4o | $2.50 | $10 |
| GPT-4o-mini | $0.15 | $0.60 |
| Claude 3.5 Sonnet | $3 | $15 |
| Claude 3 Haiku | $0.25 | $1.25 |
| Gemini 1.5 Flash | $0.075 | $0.30 |
Los 6 principales consumidores de tokens
1. Contexto acumulado (40-50% del costo)
El problema:
1# Cada mensaje añade al historial2conversation = []3for i in range(50): # 50 turnos de conversación4 conversation.append({"role": "user", "content": user_msg})5 conversation.append({"role": "assistant", "content": ai_response})6 # El turno 50 envía TODO el historial: ~100K tokens
Costo por turno:
- Turno 1: 500 tokens
- Turno 10: 5,000 tokens
- Turno 25: 25,000 tokens
- Turno 50: 50,000 tokens (¡100x más caro!)
2. Tool outputs almacenados (20-30%)
El problema:
1# Una búsqueda devuelve JSON grande2tool_result = """3{4 "results": [5 {"title": "...", "content": "...", "metadata": {...}},6 {"title": "...", "content": "...", "metadata": {...}},7 # ... 20 resultados más8 ]9}10""" # ~5,000 tokens que se quedan en el contexto
3. System prompts repetidos (10-15%)
El problema:
1SYSTEM_PROMPT = """2Eres un asistente experto en...3[5,000 tokens de instrucciones]4"""5 6# Se envía completo en CADA request7for query in user_queries:8 client.chat.completions.create(9 messages=[10 {"role": "system", "content": SYSTEM_PROMPT}, # 5K tokens11 {"role": "user", "content": query} # 100 tokens12 ]13 )14# 100 queries = 500,000 tokens solo en system prompt
4. Multi-turn reasoning (10-15%)
Tareas complejas que requieren múltiples llamadas a la API:
- Planificación → Ejecución → Verificación → Corrección
- Cada paso consume tokens del contexto anterior
5. Modelo incorrecto (5-10%)
| Tarea | Modelo usado | Modelo óptimo | Diferencia |
|---|---|---|---|
| Clasificación simple | GPT-4o | GPT-4o-mini | 17x más caro |
| Traducción | Claude Opus | Haiku | 60x más caro |
| Extracción datos | GPT-4 | Regex/código | ∞ (gratis) |
6. Cache misses (5-10%)
Cuando el cache expira o no está configurado, pagas el prompt completo de nuevo.
Estrategia 1: Model routing inteligente
El concepto
Usar el modelo más barato que pueda hacer la tarea bien.
1def get_optimal_model(task_type, complexity):2 routing_table = {3 ("classification", "low"): "gpt-4o-mini",4 ("classification", "high"): "gpt-4o",5 ("generation", "low"): "claude-3-haiku",6 ("generation", "high"): "claude-3-5-sonnet",7 ("code", "any"): "claude-3-5-sonnet",8 ("translation", "any"): "gpt-4o-mini",9 ("summarization", "low"): "gemini-1.5-flash",10 ("summarization", "high"): "gpt-4o",11 }12 return routing_table.get((task_type, complexity), "gpt-4o-mini")
Clasificador de complejidad automático
1def classify_complexity(query):2 # Heurísticas simples3 if len(query) < 100 and "?" in query:4 return "low"5 if any(word in query.lower() for word in ["analiza", "compara", "evalúa"]):6 return "high"7 if "código" in query.lower() or "
return "code"
return "medium"
def smart_completion(query):
complexity = classify_complexity(query)
model = get_optimal_model("generation", complexity)
return client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": query}]
)
1### Ahorro típico2 3| Sin routing | Con routing | Ahorro |4|-------------|-------------|--------|5| Todo GPT-4o: $100 | Mix optimizado: $25 | 75% |6 7---8 9## Estrategia 2: Prompt caching10 11### Anthropic Prompt Caching
from anthropic import Anthropic
client = Anthropic()
El system prompt largo se cachea
LONG_SYSTEM_PROMPT = """
[5,000 tokens de instrucciones detalladas]
"""
def cached_completion(user_query):
return client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
system=[{
"type": "text",
"text": LONG_SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"} # Cachear por 5 min
}],
messages=[{"role": "user", "content": user_query}]
)
Primera llamada: pagas 5,000 tokens de system
Siguientes 5 min: pagas ~500 tokens (90% descuento en cached)
1### Costos de cache en Anthropic2 3| Tipo | Costo |4|------|-------|5| Cache write | 1.25x precio normal |6| Cache read | 0.1x precio normal (90% descuento) |7| TTL | 5 minutos |8 9**Break-even:** Si usas el mismo prompt >2 veces en 5 min, el caching ahorra dinero.10 11### OpenAI Prompt Caching (automático)12 13OpenAI cachea automáticamente prompts >1024 tokens que se repiten exactamente:
Los primeros 1024+ tokens idénticos se cachean automáticamente
50% descuento en tokens cacheados
TTL: ~1 hora
1---2 3## Estrategia 3: Gestión de contexto4 5### Limitar historial de conversación
MAX_HISTORY_MESSAGES = 10
def get_trimmed_history(full_history):
if len(full_history) <= MAX_HISTORY_MESSAGES:
return full_history
# Mantener system + últimos N mensajes
return full_history[:1] + full_history[-MAX_HISTORY_MESSAGES:]
1### Summarizar conversaciones largas
def summarize_and_continue(conversation):
if count_tokens(conversation) < 10000:
return conversation
# Resumir todo excepto los últimos 5 mensajes
old_messages = conversation[:-5]
recent_messages = conversation[-5:]
summary = client.chat.completions.create(
model="gpt-4o-mini", # Modelo barato para resumir
messages=[{
"role": "user",
"content": f"Resume esta conversación en 200 palabras:\n{old_messages}"
}]
).choices[0].message.content
return [
{"role": "system", "content": f"Resumen previo: {summary}"}
] + recent_messages
1### Sliding window con overlap
def sliding_window_context(messages, window_size=8000, overlap=1000):
"""
Mantiene una ventana de contexto con overlap
para no perder información crítica en los bordes
"""
total_tokens = count_tokens(messages)
if total_tokens <= window_size:
return messages
# Calcular qué mensajes mantener
keep_tokens = window_size - overlap
kept_messages = []
current_tokens = 0
for msg in reversed(messages):
msg_tokens = count_tokens([msg])
if current_tokens + msg_tokens > keep_tokens:
break
kept_messages.insert(0, msg)
current_tokens += msg_tokens
return kept_messages
1---2 3## Estrategia 4: Batch processing4 5### OpenAI Batch API (50% descuento)
Crear archivo de batch
batch_requests = [
{"custom_id": f"req-{i}", "method": "POST", "url": "/v1/chat/completions",
"body": {"model": "gpt-4o", "messages": [{"role": "user", "content": q}]}}
for i, q in enumerate(queries)
]
Subir y ejecutar
batch_file = client.files.create(
file=open("batch_requests.jsonl", "rb"),
purpose="batch"
)
batch_job = client.batches.create(
input_file_id=batch_file.id,
endpoint="/v1/chat/completions",
completion_window="24h" # Resultados en 24h
)
50% descuento vs llamadas individuales
1### Cuándo usar batching2 3| Escenario | Usar batch? |4|-----------|-------------|5| Procesamiento nocturno | ✅ Sí |6| Análisis de dataset | ✅ Sí |7| Chatbot en tiempo real | ❌ No |8| Generación de contenido | ✅ Sí |9| Respuestas urgentes | ❌ No |10 11---12 13## Estrategia 5: Compression y summarization14 15### Comprimir outputs de herramientas
def compress_tool_output(raw_output, max_tokens=500):
"""Comprime outputs grandes de herramientas"""
if count_tokens(raw_output) <= max_tokens:
return raw_output
# Usar modelo barato para comprimir
compressed = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": f"""Extrae solo la información relevante de este output,
máximo {max_tokens} tokens:
{raw_output}"""
}],
max_tokens=max_tokens
)
return compressed.choices[0].message.content
1### Limitar longitud de outputs
response = client.chat.completions.create(
model="gpt-4o",
messages=[...],
max_tokens=500, # Limitar output
# Pedir concisión en el prompt
system="Responde de forma concisa, máximo 3 párrafos."
)
1### Output structurado (JSON mode)
JSON usa menos tokens que texto narrativo
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": "Extrae nombre, email y teléfono de este texto: ..."
}],
response_format={"type": "json_object"}
)
Output: {"nombre": "Juan", "email": "...", "telefono": "..."}
vs narrativo: "El nombre es Juan, su email es ... y su teléfono..."
1---2 3## Estrategia 6: Modelos locales para tareas básicas4 5### Ollama para tareas gratuitas
import ollama
def local_completion(prompt, model="llama3.1:8b"):
"""Usa modelo local para tareas simples - GRATIS"""
response = ollama.chat(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return response['message']['content']
Tareas ideales para local:
- Clasificación simple
- Extracción de datos estructurados
- Traducciones básicas
- Resúmenes simples
1### Hybrid routing: local + cloud
def hybrid_completion(query, task_type):
# Tareas simples → modelo local (gratis)
if task_type in ["classify", "extract", "translate_simple"]:
return local_completion(query)
# Tareas complejas → cloud (pago)
return cloud_completion(query, model="gpt-4o")
1### Ahorro con modelos locales2 3| Tarea | Cloud (GPT-4o-mini) | Local (Llama 8B) |4|-------|---------------------|------------------|5| 10,000 clasificaciones | ~$5 | $0 |6| 1,000 traducciones | ~$3 | $0 |7| Costo hardware | - | ~$0.05/hora GPU |8 9---10 11## Caso real: De $150 a $35/mes12 13### Escenario inicial14 15**Aplicación:** Chatbot de soporte con RAG16**Volumen:** 50,000 consultas/mes17**Costo inicial:** $150/mes18 19**Desglose del problema:**20- 100% consultas con GPT-4: $8021- Contexto completo cada vez: $4022- Sin caching de prompts: $2023- Outputs largos innecesarios: $1024 25### Optimizaciones aplicadas26 27**1. Model routing (ahorro: $50)**
- 70% consultas simples → GPT-4o-mini
- 20% consultas medias → Claude Haiku
- 10% consultas complejas → GPT-4o
1**2. Prompt caching (ahorro: $18)**
- System prompt de 3,000 tokens cacheado
- 90% de lecturas desde cache
1**3. Contexto limitado (ahorro: $30)**
- Máximo 10 mensajes de historial
- Resumen automático de conversaciones largas
1**4. Outputs controlados (ahorro: $17)**
- max_tokens=300 en lugar de 1000
- Instrucción de concisión en prompt
1### Resultado final2 3| Concepto | Antes | Después |4|----------|-------|---------|5| Costo modelos | $80 | $30 |6| Costo contexto | $40 | $10 |7| Costo prompts | $20 | $2 |8| Costo outputs | $10 | $3 |9| **Total** | **$150** | **$35** |10 11**Ahorro: 77%**12 13---14 15## Preguntas frecuentes16 17### ¿El caching afecta la calidad de las respuestas?18 19**No.** El caching solo evita re-procesar tokens idénticos. El modelo genera la misma respuesta, solo que más barato.20 21### ¿Cuánto contexto es "demasiado"?22 23**Regla general:**24- <10K tokens: Sin problema25- 10-50K tokens: Monitorear costos26- >50K tokens: Implementar gestión activa27 28Para la mayoría de chatbots, 5-10 mensajes de historial son suficientes.29 30### ¿Los modelos pequeños dan peores resultados?31 32**Depende de la tarea.** Para clasificación, extracción y tareas estructuradas, GPT-4o-mini y Haiku son tan buenos como los grandes. Para razonamiento complejo y creatividad, sí necesitas modelos mayores.33 34### ¿Cómo mido mi consumo de tokens?
OpenAI
response = client.chat.completions.create(...)
print(f"Input: {response.usage.prompt_tokens}")
print(f"Output: {response.usage.completion_tokens}")
print(f"Total: {response.usage.total_tokens}")
Anthropic
print(f"Input: {response.usage.input_tokens}")
print(f"Output: {response.usage.output_tokens}")
`Conclusión
La optimización de tokens no es opcional si usas APIs de IA en producción. Con las estrategias de esta guía, puedes reducir costos 60-80% sin sacrificar calidad.
Checklist de optimización:
- [ ] Implementar model routing por tipo de tarea
- [ ] Activar prompt caching para system prompts
- [ ] Limitar historial de conversación
- [ ] Usar batch API para procesamiento no urgente
- [ ] Considerar modelos locales para tareas simples
- [ ] Monitorear consumo de tokens por endpoint
Recursos relacionados:
¿Quieres más tutoriales de desarrollo con IA? Visita Javadex.es para proyectos avanzados.
Síguenos:
¿Listo para poner tu proyecto en producción?
Si estás siguiendo este tutorial, necesitas un servidor donde desplegarlo. Yo uso Hostinger para mis proyectos porque el panel es intuitivo, los VPS van con SSD NVMe, y a 4,99€/mes no hay nada comparable en relación calidad-precio.
* Enlace de afiliado. Si contratas a través de este enlace, nos ayudas a mantener este contenido gratuito.
Posts Relacionados
Consultoría IA en San Sebastián (Donostia): Agentes, Automatización y Modelos Privados para Empresas [2026]
Guía completa de servicios de inteligencia artificial en San Sebastián: agentes IA, automatización, modelos privados y consultoría para empresas vascas en 2026.
Kit Digital 2026 para IA: Cómo Solicitar Hasta 12.000€ para tu PYME Paso a Paso
Tutorial paso a paso para solicitar el Kit Digital 2026 con soluciones de IA. Requisitos, cuantías por segmento (hasta 12.000€), agentes digitalizadores y errores que rechazan tu solicitud.
Formación en Claude Code para Empresas en España: Proveedores, Precios y Qué Esperar [2026]
Guía de formación en Claude Code para empresas españolas: proveedores, precios (desde 4.000€), programas in-company, duración y resultados esperados.
Javier Santos Criado
Consultor de IA y Automatización | Fundador de Javadex
Experto en implementación de soluciones de Inteligencia Artificial para empresas. Especializado en automatización con n8n, integración de LLMs, y desarrollo de agentes IA.
Lleva tu proyecto a producción
Hosting web desde 2,99€/mes o VPS con SSD NVMe desde 4,99€/mes. Panel intuitivo, IP dedicada y soporte 24/7 en español.
¿Quieres más contenido de IA?
Explora nuestras comparativas y guías