Caché, Limitación de Tasa y Optimización de Costos
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
La mayoría de las startups de IA no mueren por malos modelos. Mueren por una mala economía unitaria. Una sola llamada a GPT-4o cuesta fracciones de centavo. Diez mil usuarios realizando diez llamadas por día cuesta
50 solo en tokens de entrada -- antes de que cobres un solo dólar. Las empresas que sobreviven son las que tratan cada llamada a la API como una transacción financiera, no como una llamada a una función.
Tipo: Build
Lenguajes: Python
Prerrequisitos: Phase 11 Lesson 09 (Function Calling)
Tiempo: ~45 minutos
Relacionado: Phase 11 · 15 (Prompt Caching) — esta lección cubre el almacenamiento en caché a nivel de aplicación (caché semántico, caché de hash exacto, enrutamiento de modelos). La Lección 15 cubre el almacenamiento en caché de prompts a nivel de proveedor (cache_control de Anthropic, automático de OpenAI, CachedContent de Gemini). Combina ambos para una reducción de costos del 50-95%.
Objetivos de Aprendizaje
Implementar un caché semántico que atienda consultas repetidas o similares desde el caché en lugar de realizar una nueva llamada a la API
Calcular los costos por solicitud entre proveedores e implementar alertas de presupuesto y limitación de tasa basada en tokens
Construir una capa de optimización de costos con compresión de prompts, enrutamiento de modelos (caro vs barato) y almacenamiento en caché de respuestas
Diseñar una estrategia de caché en niveles utilizando coincidencia exacta, similitud semántica y caché de prefijo para diferentes tipos de consultas
El Problema
Construyes un chatbot de RAG. Funciona de maravilla. A los usuarios les encanta.
Entonces llega la factura.
GPT-5 cuesta $5 por millón de tokens de entrada y
5 por millón de salida. Claude Opus 4.7 cuesta
5 de entrada / $75 de salida. Gemini 3 Pro cuesta
.25 de entrada / $5 de salida. GPT-5-mini cuesta $0.25/
. Los precios a continuación son ilustrativos; siempre verifica la página de precios actual del proveedor.
Aquí está la matemática que mata a las startups:
10,000 usuarios activos diarios
10 consultas por usuario al día
1,000 tokens de entrada por consulta (prompt del sistema + contexto + mensaje del usuario)
500 tokens de salida por respuesta
Costo diario de entrada: 10,000 x 10 x 1,000 / 1,000,000 x
.50 =
50/día
Costo diario de salida: 10,000 x 10 x 500 / 1,000,000 x
0.00 = $500/díaTotal mensual:
2,500/mes
Eso es solo el LLM. Agrega embeddings, alojamiento de bases de datos vectoriales, infraestructura. Estás ante un costo de $30,000/mes por un chatbot.
La parte brutal: el 40-60% de esas consultas son casi duplicadas. Los usuarios hacen las mismas preguntas con palabras ligeramente diferentes. Tu prompt del sistema -- idéntico en cada solicitud -- se factura cada vez. Los documentos de contexto recuperados por RAG se repiten entre usuarios que preguntan sobre el mismo tema.
Estás pagando el precio completo por computación redundante.
El Concepto
La Anatomía de Costos de una Llamada de LLM
Cada llamada a la API tiene cinco componentes de costo.
graph LR
A[Consulta del Usuario] --> B[Prompt del Sistema<br/>500-2000 tokens]
A --> C[Contexto Recuperado<br/>500-4000 tokens]
A --> D[Mensaje del Usuario<br/>50-500 tokens]
B --> E[Costo de Entrada<br/>
.50/1M tokens]
C --> E
D --> E
E --> F[Procesamiento del Modelo]
F --> G[Costo de Saída<br/>
0.00/1M tokens]
Los prompts del sistema son el asesino silencioso. Un prompt del sistema de 1,500 tokens enviado con cada solicitud cuesta $3.75 por millón de solicitudes solo por ese prefijo. Con 100K solicitudes al día, eso equivale a $375/día --
1,250/mes -- por texto que nunca cambia.
Caché del Proveedor: Descuentos Integrados
Los tres proveedores principales ofrecen almacenamiento en caché de prompts en el lado del proveedor en 2026, pero la mecánica difiere. Consulta Phase 11 · 15 para un análisis detallado.
Proveedor
Mecanismo
Descuento
Mínimo
Duración del Caché
Anthropic
Marcadores explícitos cache_control
90% en aciertos de caché (se paga un 25% extra en la escritura)
1,024 tokens (Sonnet/Opus), 2,048 (Haiku)
5 min por defecto; 1h extendido (2x prima de escritura)
OpenAI
Coincidencia automática de prefijo
50% en aciertos de caché
1,024 tokens
Mejor esfuerzo de hasta 1 hora
Google Gemini
API CachedContent explícita
~75% de reducción (más almacenamiento)
4,096 (Flash) / 32,768 (Pro)
TTL configurable por el usuario
El enfoque de Anthropic es explícito. Marcas secciones de tu prompt con cache_control: {"type": "ephemeral"}. La primera solicitud paga una prima de escritura del 25%. Las solicitudes subsiguientes con el mismo prefijo obtienen un 90% de descuento. Un prompt del sistema de 2,000 tokens que normalmente cuesta $0.005 cuesta $0.000625 en aciertos de caché. Con 100K solicitudes, eso ahorra $437.50/día.
El enfoque de OpenAI es automático. Cualquier prefijo de prompt que coincida con una solicitud anterior obtiene un 50% de descuento. No se necesitan marcadores. El compromiso: menor descuento, menor control, pero cero esfuerzo de implementación.
Caché Semántico: Tu Capa Personalizada
El almacenamiento en caché del proveedor solo funciona para prefijos idénticos. El caché semántico maneja el caso más difícil: diferentes consultas con el mismo significado.
"¿Cuál es la política de devoluciones?" y "¿Cómo devuelvo un artículo?" son cadenas diferentes pero con la misma intención. Un caché semántico genera embeddings de ambas consultas, calcula la similitud de coseno y devuelve la respuesta almacenada en caché si la similitud supera un umbral (normalmente 0.92-0.95).
flowchart TD
A[Consulta del Usuario] --> B[Generar Embedding de Consulta]
B --> C{¿Consulta similar<br/>en caché?}
C -->|sim > 0.95| D[Devolver Respuesta Almacenada]
C -->|sim < 0.95| E[Llamar API del LLM]
E --> F[Guardar Respuesta en Caché<br/>con Embedding]
F --> G[Devolver Respuesta]
D --> G
Los costos de embedding son insignificantes. El text-embedding-3-small de OpenAI cuesta $0.02 por millón de tokens. Verificar el caché no cuesta casi nada en comparación con una llamada completa de LLM.
Caché Exacto: Hash y Coincidencia
Para llamadas deterministas (temperatura=0, mismo modelo, mismo prompt), el caché exacto es más simple y rápido. Genera un hash del prompt completo, verifica el caché y devuélvelo si lo encuentras.
Esto funciona perfectamente para:
Prompt del sistema + contexto fijo + consultas de usuario idénticas
Llamada de funciones con definiciones de herramientas idénticas
Procesamiento por lotes donde el mismo documento se procesa varias veces
Limitación de Tasa: Protegiendo tu Presupuesto
La limitación de tasa no es solo por justicia. Es por supervivencia.
Algoritmo de cubeta de tokens (token bucket): cada usuario obtiene una cubeta de N tokens que se rellena a una tasa R por segundo. Una solicitud consume tokens de la cubeta. Si la cubeta está vacía, la solicitud se rechaza. Esto permite ráfagas (usar toda la cubeta a la vez) mientras se impone una tasa promedio.
Cuotas por usuario: establece límites diarios/mensuales de tokens por nivel de usuario.
Nivel
Límite Diario de Tokens
Máx Solicitudes/min
Acceso a Modelos
Gratis
50,000
10
Solo GPT-4o-mini
Pro
500,000
60
GPT-4o, Claude Sonnet
Enterprise
5,000,000
300
Todos los modelos
Enrutamiento de Modelos: El Modelo Concreto para el Trabajo Concreto
No todas las consultas necesitan GPT-4o.
"¿A qué hora cierra la tienda?" no requiere un modelo de
0/M de salida. GPT-4o-mini a $0.60/M de salida lo maneja perfectamente. Claude Haiku a
.25/M de salida también. Un clasificador simple enruta las consultas baratas a modelos baratos y las consultas complejas a modelos caros.
flowchart TD
A[Consulta del Usuario] --> B[Clasificador de Complejidad]
B -->|Simple: búsqueda, FAQ| C[GPT-4o-mini<br/>$0.15/$0.60 por 1M]
B -->|Media: análisis, resumen| D[Claude Sonnet<br/>$3.00/
5.00 por 1M]
B -->|Compleja: razonamiento, código| E[GPT-4o / Claude Opus<br/>
.50/
0.00+]
Un enrutador bien ajustado ahorra entre un 40 y un 70% solo en costos de modelos.
Seguimiento de Costos: Sabe a Dónde se Va el Dinero
No puedes optimizar lo que no mides. Registra cada llamada a la API con:
Marca de tiempo
Nombre del modelo
Tokens de entrada
Tokens de salida
Latencia (ms)
Costo calculado ($)
ID de usuario
Acierto/fallo de caché (cache hit/miss)
Categoría de solicitud
Estos datos revelan qué características son costosas, qué usuarios son grandes consumidores y dónde tiene mayor impacto el caché.
Procesamiento por Lotes (Batching): Descuentos por Volumen
La API Batch de OpenAI procesa solicitudes de forma asíncrona con un 50% de descuento. Envías un lote de hasta 50,000 solicitudes y los resultados regresan en un plazo de 24 horas.
Usa el procesamiento por lotes para:
Procesamiento nocturno de documentos
Clasificación masiva
Ejecuciones de evaluación
Pipelines de enriquecimiento de datos
No lo uses para: consultas en tiempo real de cara al usuario (la latencia importa).
Alertas de Presupuesto e Interruptores Automáticos (Circuit Breakers)
Un interruptor automático detiene el gasto cuando alcanzas un límite. Sin uno, un error o abuso puede consumir tu presupuesto mensual en cuestión de horas.
Establece tres umbrales:
Advertencia (70% del presupuesto): envía una alerta
Restricción (85% del presupuesto): cambia solo a modelos más baratos
Detener (95% del presupuesto): rechaza nuevas solicitudes, devuelve solo respuestas en caché
El Stack de Optimización
Aplica estas técnicas en orden. Cada capa se acumula sobre las anteriores.
Capa
Técnica
Ahorro Típico
Esfuerzo de Implementación
1
Caché de prompt del proveedor
30-50%
Bajo (agregar marcadores de caché)
2
Caché exacto
10-20%
Bajo (hash + dict)
3
Caché semántico
15-30%
Medio (embeddings + similitud)
4
Enrutamiento de modelos
40-70%
Medio (clasificador)
5
Limitación de tasa
Protección de presupuesto
Bajo (cubeta de tokens)
6
Compresión de prompt
10-30%
Medio (reescribir prompts)
7
Procesamiento por lotes
50% en solicitudes elegibles
Bajo (API de lotes)
Una aplicación RAG que aplica las capas 1-5 normalmente reduce los costos de
2,500/mes a $4,000-6,000/mes. Esa es la diferencia entre agotar los fondos de inversión y construir un negocio.
Ahorros Reales: Antes y Después
Aquí hay un desglose real para un chatbot RAG que atiende a 10,000 DAU.
Métrica
Antes de la Optimización
Después de la Optimización
Ahorro
Costo mensual de LLM
2,500
$5,200
77%
Costo promedio por consulta
$0.0075
$0.0017
77%
Tasa de aciertos de caché
0%
52%
--
Consultas enrutadas a mini
0%
65%
--
Latencia P95
2,800ms
900ms (aciertos de caché: 50ms)
68%
Costo mensual de embeddings
$0
80
(nuevo costo)
Costo mensual total
2,500
$5,380
76%
El costo de embedding para el caché semántico (
80/mes) se amortiza en la primera hora de aciertos de caché.
Constrúyelo
Paso 1: Calculadora de Costos
Construye una calculadora de costos de tokens que conozca los precios antiguos/actuales de los modelos principales.
La primera solicitud paga una prima de escritura del 25%. Las solicitudes subsiguientes con el mismo prefijo obtienen un 90% de descuento. El caché dura 5 minutos y reinicia el temporizador en cada acierto.
Caché Automático de OpenAI
# from openai import OpenAI
#
# client = OpenAI()
#
# response = client.chat.completions.create(
# model="gpt-4o",
# messages=[
# {"role": "system", "content": "You are a helpful customer support agent..."},
# {"role": "user", "content": "What is the return policy?"},
# ],
# )
#
# print(f"Prompt tokens: {response.usage.prompt_tokens}")
# print(f"Cached tokens: {response.usage.prompt_tokens_details.cached_tokens}")
# print(f"Completion tokens: {response.usage.completion_tokens}")
OpenAI almacena en caché automáticamente. Cualquier prefijo de prompt de 1,024+ tokens que coincida con una solicitud reciente obtiene un 50% de descuento. No se requieren cambios en el código -- solo verifica prompt_tokens_details.cached_tokens en la respuesta para confirmar que está funcionando.
API Batch de OpenAI
# import json
# from openai import OpenAI
#
# client = OpenAI()
#
# requests = []
# for i, query in enumerate(queries):
# requests.append({
# "custom_id": f"request-{i}",
# "method": "POST",
# "url": "/v1/chat/completions",
# "body": {
# "model": "gpt-4o-mini",
# "messages": [{"role": "user", "content": query}],
# },
# })
#
# with open("batch_input.jsonl", "w") as f:
# for r in requests:
# f.write(json.dumps(r) + "\n")
#
# batch_file = client.files.create(file=open("batch_input.jsonl", "rb"), purpose="batch")
# batch = client.batches.create(input_file_id=batch_file.id, endpoint="/v1/chat/completions", completion_window="24h")
# print(f"Batch ID: {batch.id}, Status: {batch.status}")
La API Batch otorga un 50% de descuento plano en todos los tokens. Los resultados llegan en un plazo de 24 horas. Perfecto para cargas de trabajo no en tiempo real: evaluaciones, etiquetado de datos, resumen masivo.
En producción, reemplaza el escaneo lineal con un índice vectorial (Redis Vector Search, Pinecone o pgvector). El escaneo lineal funciona para <1,000 entradas. Más allá de eso, usa ANN (vecino más cercano aproximado) para búsquedas O(log n).
Envíalo
Esta lección produce outputs/prompt-cost-optimizer.md -- un prompt reutilizable que analiza tu aplicación de LLM y recomienda optimizaciones de costos específicas con ahorros proyectados.
También produce outputs/skill-cost-patterns.md -- un marco de decisión para elegir la estrategia de caché adecuada, la configuración del límite de tasa y las reglas de enrutamiento de modelos para tu caso de uso.
Ejercicios
Implementar la política de desalojo LRU para el caché semántico. Reemplaza el desalojo del más antiguo primero (oldest-first) por el de uso menos reciente (least-recently-used). Realiza un seguimiento del tiempo del último acceso para cada entrada y desaloja la entrada con el acceso más antiguo cuando el caché esté lleno. Compara las tasas de acierto entre las dos estrategias durante 100 consultas.
Construir una herramienta de proyección de costos. Dado un registro de llamadas de API (los logs de CostTracker), proyecta el costo mensual basado en el promedio móvil de los últimos 7 dias. Ten en cuenta los patrones de días laborables y fines de semana. Activa una alerta si el costo mensual proyectado supera el presupuesto en más de un 20%.
Implementar caché semántico en niveles. Usa dos umbrales de similitud: 0.98 para aciertos de alta confianza (devolver inmediatamente) y 0.90 para aciertos de confianza media (devolver con una advertencia: "Basado en una pregunta anterior similar..."). Registra de qué nivel proviene cada acierto y mide las diferencias en la satisfacción del usuario.
Construir un clasificador de enrutamiento de modelos. Reemplaza el clasificador basado en palabras clave por uno basado en embeddings. Genera embeddings de 50 consultas etiquetadas (simple/media/compleja), luego clasifica nuevas consultas encontrando el ejemplo etiquetado más cercano. Mide la precisión de la clasificación frente a un conjunto de prueba de 20 consultas.
Implementar un interruptor automático con niveles de degradación. Al 70% del presupuesto, registra una advertencia. Al 85%, cambia automáticamente todo el enrutamiento al modelo más barato (gpt-4o-mini). Al 95%, sirve solo respuestas en caché y rechaza nuevas consultas. Prueba simulando 1,000 solicitudes con un presupuesto de
.00 y verifica que cada umbral se active correctamente.
Términos Clave
Término
Lo que la gente dice
Lo que realmente significa
Caché de prompt
"Caché del prompt del sistema"
Almacenamiento en caché a nivel de proveedor donde los prefijos de prompt repetidos obtienen un descuento (90% Anthropic, 50% OpenAI) -- sin cambios de código para OpenAI, marcadores explícitos para Anthropic
Caché semántico
"Caché inteligente"
Generar embedding de la consulta, calcular la similitud con consultas anteriores y devolver la respuesta almacenada en caché si la similitud supera un umbral -- captura paráfrases que la coincidencia exacta pierde
Caché exacto
"Caché por hash"
Generar un hash del prompt completo (modelo + mensajes + temperatura) y devolver la respuesta almacenada en caché para entradas idénticas -- solo funciona para llamadas deterministas con temperature=0
Cubeta de tokens
"Limitador de tasa"
Un algoritmo donde cada usuario tiene una cubeta de N tokens que se rellena a una tasa R por segundo -- permite ráfagas hasta N mientras impone una tasa promedio de R
Enrutamiento de modelos
"Enrutamiento de bajo costo"
Usar un clasificador para enviar consultas simples a modelos baratos (GPT-4o-mini, Haiku) y consultas complejas a modelos caros (GPT-4o, Opus) -- ahorra un 40-70% en costos de modelos
Seguimiento de costos
"Medición"
Registrar cada llamada a la API con modelo, tokens, latencia, costo e ID de usuario para saber exactamente a dónde va el dinero y qué características son costosas
Interruptor automático (Circuit breaker)
"Botón de apagado"
Degradar automáticamente el servicio (modelos más baratos, solo caché) o detener las solicitudes por completo cuando el gasto se acerca al límite del presupuesto
API Batch
"Descuento por lote"
Procesamiento asíncrono de OpenAI con un 50% de descuento -- envía hasta 50,000 solicitudes, obtén resultados en 24 horas
Compresión de prompt
"Dieta de tokens"
Reescribir los prompts del sistema y el contexto para usar menos tokens mientras se preserva el significado -- los prompts más cortos cuestan menos y a menudo funcionan mejor
Tasa de aciertos de caché
"Eficiencia del caché"
El porcentaje de solicitudes servidas desde el caché en lugar de llamar al LLM -- el 40-60% es típico para los chatbots de producción, ahorra proporcionalmente en costos
Lecturas Adicionales
Anthropic Prompt Caching Guide -- la documentación oficial de los marcadores explícitos cache_control de Anthropic, precios y comportamiento del tiempo de vida del caché
OpenAI Prompt Caching -- el caché automático de OpenAI, cómo verificar los aciertos de caché a través de los campos de uso y longitudes mínimas de prefijo
OpenAI Batch API -- 50% de descuento para procesamiento asíncrono, formato JSONL, ventana de finalización de 24 horas y límites de 50K solicitudes
GPTCache -- biblioteca de caché semántico de código abierto que admite múltiples motores de embeddings, almacenes de vectores y políticas de desalojo
Martian Model Router -- enrutamiento de modelos en producción que selecciona automáticamente el modelo más barato capaz de manejar cada consulta
Not Diamond -- enrutador de modelos basado en ML que aprende de tus patrones de tráfico para optimizar las compensaciones de costo/calidad entre proveedores
Helicone -- plataforma de observabilidad de LLM con seguimiento de costos, caché, limitación de tasa y alertas de presupuesto como una capa de proxy
Dean & Barroso, "The Tail at Scale" (CACM 2013) -- latencia, rendimiento, percentiles TTFT/TPOT y solicitudes de cobertura; el modelo de costo detrás de "elegir el modelo más barato que aún cumpla con el P95."