Reduzca los costos de LLM: Estrategias de optimización de tokens
Reduzca los costos de los modelos de lenguaje grande en un 80% con una optimización inteligente de tokens
La optimización de tokens es la habilidad crítica que separa las aplicaciones de LLM eficientes económicamente de experimentos que consumen presupuesto.
Con los costos de API que escalan linealmente con el uso de tokens, entender e implementar estrategias de optimización puede reducir los gastos en un 60-80% manteniendo la calidad.

Entendiendo la Economía de Tokens
Antes de optimizar, debes entender cómo funcionan los tokens y los precios en diferentes proveedores de LLM.
Bases de los Tokens
Los tokens son las unidades fundamentales que procesan los LLM, aproximadamente equivalentes a 4 caracteres o 0,75 palabras en inglés. La cadena “¡Hola, mundo!” contiene aproximadamente 4 tokens. Diferentes modelos usan diferentes tokenizers (GPT usa tiktoken, Claude usa el suyo propio), por lo que los recuentos de tokens varían ligeramente entre proveedores.
Comparación de Modelos de Precios
Precios de OpenAI (hasta 2025):
- GPT-4 Turbo: $0,01 de entrada / $0,03 de salida por 1K tokens
- GPT-3.5 Turbo: $0,0005 de entrada / $0,0015 de salida por 1K tokens
- GPT-4o: $0,005 de entrada / $0,015 de salida por 1K tokens
Precios de Anthropic:
- Claude 3 Opus: $0,015 de entrada / $0,075 de salida por 1K tokens
- Claude 3 Sonnet: $0,003 de entrada / $0,015 de salida por 1K tokens
- Claude 3 Haiku: $0,00025 de entrada / $0,00125 de salida por 1K tokens
Para una comparación completa de proveedores de LLM en la nube incluyendo precios detallados, características y casos de uso, consulta nuestra guía dedicada.
Insight clave: Los tokens de salida cuestan 2-5 veces más que los de entrada. Limitar la longitud de salida tiene un impacto desproporcionado en los costos.
Ingeniería de Prompts para Eficiencia
La ingeniería de prompts efectiva reduce significativamente el consumo de tokens sin sacrificar la calidad.
1. Eliminar Redundancia
Ejemplo malo (127 tokens):
Eres un asistente útil. Por favor, ayúdame con la siguiente tarea.
Me gustaría que analices el siguiente texto y me proporciones
un resumen. Aquí está el texto que quiero que resumas:
[text]
Por favor, proporciona un resumen conciso de los puntos principales.
Optimizado (38 tokens):
Resumen de los puntos clave:
[text]
Ahorro: Reducción del 70% en tokens, calidad de salida idéntica.
2. Usar formatos estructurados
JSON y formatos estructurados reducen el desperdicio de tokens de lenguaje natural.
En lugar de:
Por favor, extrae el nombre de la persona, la edad y la ocupación de este texto
y formatea tu respuesta claramente.
Usa:
Extraer a JSON: {nombre, edad, ocupación}
Texto: [input]
3. Optimización de Aprendizaje con Pocos Ejemplos
Los ejemplos con pocos ejemplos son poderosos pero costosos. Optimiza al:
- Usar el mínimo de ejemplos necesarios (1-3 normalmente suficientes)
- Mantener los ejemplos concisos - eliminar palabras innecesarias
- Compartir prefijos comunes - reducir instrucciones repetidas
# Prompt optimizado con pocos ejemplos
prompt = """Clasificar sentimiento (pos/neg):
Texto: "Gran producto!" -> pos
Texto: "Desapuntado" -> neg
Texto: "{user_input}" ->"""
Para más patrones de optimización de Python y atajos de sintaxis, consulta nuestro cheat sheet de Python.
Estrategias de Caché de Contexto
El caché de contexto es la estrategia más efectiva de optimización para aplicaciones con contenido estático repetido.
Cómo funciona el caché de contexto
Proveedores como OpenAI y Anthropic cachean prefijos de prompts que aparecen en múltiples solicitudes. Las partes cachéadas cuestan un 50-90% menos que los tokens regulares.
Requisitos:
- Contenido mínimo cachéable: 1024 tokens (OpenAI) o 2048 tokens (Anthropic)
- TTL de caché: 5-60 minutos según el proveedor
- El contenido debe ser idéntico y aparecer al inicio del prompt
Ejemplo de Implementación
from openai import OpenAI
client = OpenAI()
# Mensaje del sistema cachéado entre solicitudes
SYSTEM_PROMPT = """Eres un asistente de servicio al cliente para TechCorp.
Políticas de la empresa:
[Documento de política grande - 2000 tokens]
"""
# Esto se cachéa automáticamente
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": "¿Cómo devuelvo un artículo?"}
]
)
# Llamadas posteriores dentro del TTL de caché usan el prompt del sistema cachéado
# Pagando solo por el mensaje del usuario + salida
Impacto real: Las aplicaciones con bases de conocimiento o instrucciones largas ven una reducción del 60-80% en costos.
Estrategia de Selección de Modelos
Usar el modelo adecuado para cada tarea es crucial para la optimización de costos.
La Escalera de Modelos
- GPT-4 / Claude Opus - Razonamiento complejo, tareas creativas, precisión crítica
- GPT-4o / Claude Sonnet - Equilibrio entre rendimiento y costo, propósito general
- GPT-3.5 / Claude Haiku - Tareas simples, clasificación, extracción
- Modelos pequeños finamente ajustados - Tareas repetitivas especializadas
Patrón de Enrutamiento
def route_request(task_complexity, user_query):
"""Enrutamiento a un modelo adecuado según la complejidad"""
# Clasificación simple - usar Haiku
if task_complexity == "simple":
return call_llm("claude-3-haiku", user_query)
# Moderada - usar Sonnet
elif task_complexity == "moderate":
return call_llm("claude-3-sonnet", user_query)
# Razonamiento complejo - usar Opus
else:
return call_llm("claude-3-opus", user_query)
Estudio de caso: Un chatbot de servicio al cliente que enrutaba el 80% de las consultas a GPT-3.5 y el 20% a GPT-4 redujo los costos en un 75% en comparación con usar GPT-4 para todo.
Procesamiento por lotes
Para cargas de trabajo no urgentes, el procesamiento por lotes ofrece un descuento del 50% de la mayoría de los proveedores.
API de lotes de OpenAI
from openai import OpenAI
client = OpenAI()
# Crear archivo de lote
batch_requests = [
{"custom_id": f"request-{i}",
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": query}]
}}
for i, query in enumerate(queries)
]
# Enviar lote (descuento del 50%, procesamiento de 24 horas)
batch = client.batches.create(
input_file_id=upload_batch_file(batch_requests),
endpoint="/v1/chat/completions",
completion_window="24h"
)
Casos de uso:
- Etiquetado y anotación de datos
- Generación de contenido para blogs/SEO
- Generación de informes
- Traducciones por lotes
- Generación sintética de conjuntos de datos
Técnicas de Control de Salida
Dado que los tokens de salida cuestan 2-5 veces más, controlar la longitud de salida es crítico.
1. Establecer Máximo de Tokens
response = client.chat.completions.create(
model="gpt-4",
messages=messages,
max_tokens=150 # Límite duro para evitar costos descontrolados
)
2. Usar Secuencias de Parada
response = client.chat.completions.create(
model="gpt-4",
messages=messages,
stop=["END", "\n\n\n"] # Detener en marcadores
)
3. Solicitar formatos concisos
Añadir instrucciones como:
- “Respuesta en menos de 50 palabras”
- “Solo puntos en lista”
- “Devolver solo JSON, sin explicación”
Streaming para una mejor experiencia del usuario
Aunque el streaming no reduce los costos, mejora la percepción del rendimiento y permite la terminación temprana.
stream = client.chat.completions.create(
model="gpt-4",
messages=messages,
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
token = chunk.choices[0].delta.content
print(token, end="")
# Terminación temprana si la respuesta se desvía
if undesired_pattern(token):
break
Optimización de RAG
La Generación Aumentada por Recuperación (RAG) agrega contexto, pero un RAG no optimizado desperdicia tokens.
Patrón de RAG eficiente
def optimized_rag(query, vector_db):
# 1. Recuperar fragmentos relevantes
chunks = vector_db.search(query, top_k=3) # No demasiados
# 2. Comprimir fragmentos - eliminar redundancias
compressed = compress_chunks(chunks) # Compresión personalizada
# 3. Truncar al límite de tokens
context = truncate_to_tokens(compressed, max_tokens=2000)
# 4. Prompt estructurado
prompt = f"Contexto:\n{context}\n\nP: {query}\nR:"
return call_llm(prompt)
Técnicas de optimización:
- Usar chunking semántico (no tamaño fijo)
- Eliminar formato markdown de los fragmentos recuperados
- Implementar re-ordenamiento para obtener contenido más relevante
- Considerar resumen de chunks para documentos grandes
Caché de Respuesta
Caché de solicitudes idénticas o similares para evitar llamadas a la API por completo.
Implementación con Redis
import redis
import hashlib
import json
redis_client = redis.Redis()
def cached_llm_call(prompt, model="gpt-4", ttl=3600):
# Crear clave de caché desde prompt + modelo
cache_key = hashlib.md5(
f"{model}:{prompt}".encode()
).hexdigest()
# Verificar caché
cached = redis_client.get(cache_key)
if cached:
return json.loads(cached)
# Llamar a LLM
response = call_llm(model, prompt)
# Cachear resultado
redis_client.setex(
cache_key,
ttl,
json.dumps(response)
)
return response
Caché semántico: Para consultas similares (no idénticas), usa embeddings vectoriales para encontrar respuestas cachéadas.
Monitoreo y Análisis
Rastrea el uso de tokens para identificar oportunidades de optimización.
Métricas Esenciales
class TokenTracker:
def __init__(self):
self.metrics = {
'total_tokens': 0,
'input_tokens': 0,
'output_tokens': 0,
'cost': 0.0,
'requests': 0
}
def track_request(self, response, model):
usage = response.usage
self.metrics['input_tokens'] += usage.prompt_tokens
self.metrics['output_tokens'] += usage.completion_tokens
self.metrics['total_tokens'] += usage.total_tokens
self.metrics['cost'] += calculate_cost(usage, model)
self.metrics['requests'] += 1
def report(self):
return {
'avg_tokens_per_request':
self.metrics['total_tokens'] / self.metrics['requests'],
'total_cost': self.metrics['cost'],
'input_output_ratio':
self.metrics['input_tokens'] / self.metrics['output_tokens']
}
Alertas de Costos
Establece alertas cuando el uso exceda umbrales:
def check_cost_threshold(daily_cost, threshold=100):
if daily_cost > threshold:
send_alert(f"Costo diario ${daily_cost} excedido ${threshold}")
Técnicas Avanzadas
1. Modelos de Compresión de Prompts
Usa modelos dedicados para comprimir prompts:
- LongLLMLingua
- AutoCompressors
- Tokens de compresión aprendidos
Estos pueden lograr ratios de compresión de 10 veces manteniendo un 90%+ de rendimiento en tareas.
2. Decodificación especulativa
Ejecuta un modelo pequeño junto con un modelo grande para predecir tokens, reduciendo las llamadas al modelo grande. Normalmente 2-3 veces más rápido y reducción de costos para calidad similar.
3. Cuantización
Para modelos auto-hospedados, la cuantización (4-bit, 8-bit) reduce la memoria y el cálculo:
- 4-bit: ~75% reducción de memoria, pérdida mínima de calidad
- 8-bit: ~50% reducción de memoria, pérdida insignificante de calidad
Si estás ejecutando LLMs localmente, Ollama proporciona una excelente plataforma para desplegar modelos cuantizados con mínima configuración. Para selección de hardware y benchmarks de rendimiento, nuestra comparación entre NVIDIA DGX Spark, Mac Studio y RTX-4080 muestra rendimiento real en diferentes configuraciones de hardware ejecutando modelos grandes cuantizados.
Lista de Verificación de Optimización de Costos
- Perfilar el uso actual de tokens y costos por punto final
- Revisar prompts para redundancia - eliminar palabras innecesarias
- Implementar caché de contexto para contenido estático > 1K tokens
- Configurar enrutamiento de modelos (pequeños para simples, grandes para complejos)
- Añadir límites de max_tokens a todas las solicitudes
- Implementar caché de respuestas para consultas idénticas
- Usar API por lotes para cargas de trabajo no urgentes
- Habilitar streaming para mejor experiencia del usuario
- Optimizar RAG: menos chunks, mejor ranking
- Monitorear con seguimiento de tokens y alertas de costos
- Considerar ajuste fino para tareas repetitivas
- Evaluar modelos más pequeños (Haiku, GPT-3.5) para clasificación
Estudio de Caso Real
Escenario: Chatbot de soporte al cliente, 100K solicitudes/mes
Antes de la optimización:
- Modelo: GPT-4 para todas las solicitudes
- Tokens de entrada promedio: 800
- Tokens de salida promedio: 300
- Costo: 100K × (800 × 0,00003 + 300 × 0,00006) = $4.200/mes
Después de la optimización:
- Enrutamiento de modelos: 80% GPT-3.5, 20% GPT-4
- Caché de contexto: 70% de los prompts cachéados
- Compresión de prompts: 40% reducción
- Caché de respuestas: 15% tasa de acierto
Resultados:
- 85% de las solicitudes evitaban GPT-4
- 70% beneficiaban del descuento de caché de contexto
- 40% menos tokens de entrada
- Costo efectivo: $780/mes
- Ahorro: 81% ($3.420/mes)
Enlaces Útiles
- Herramienta de Tokenizador de OpenAI - Visualizar desglose de tokens
- Precios de Anthropic - Comparar modelos de Claude
- LiteLLM - API unificada de LLM con seguimiento de costos
- Guía de Ingeniería de Prompts - Mejores prácticas
- LangChain - Marco de aplicación de LLM con caché
- Tokenizers de HuggingFace - Biblioteca de tokenización rápida
- Documentación de API de lotes de OpenAI - Descuento del 50% para procesamiento por lotes
Conclusión
La optimización de tokens transforma la economía de los LLM de prohibitivamente cara a escalable de forma sostenible. Al implementar compresión de prompts, caché de contexto, selección inteligente de modelos y caché de respuestas, la mayoría de las aplicaciones logran una reducción del 60-80% en costos sin comprometer la calidad.
Comienza con las victorias rápidas: audita tus prompts, activa el caché de contexto y enruta tareas simples a modelos más pequeños. Monitorea religiosamente tu uso de tokens - lo que se mide se optimiza. La diferencia entre una aplicación de LLM eficiente económicamente y una cara no es la tecnología, sino la estrategia de optimización.
Artículos Relacionados
- Proveedores de LLM en la nube - Comparación completa de proveedores de LLM en la nube
- Cheat sheet de Python - Sintaxis y patrones esenciales de Python
- Cheat sheet de Ollama - Guía de despliegue de LLM local
- Comparación de rendimiento de Ollama: NVIDIA DGX Spark vs Mac Studio vs RTX-4080 - Benchmarks de rendimiento para LLM auto-hospedados