Estrategias de Caché para Agentes de IA: Reducir Costos sin Sacrificar Calidad
Estrategias de Caché para Agentes de IA: Reducir Costos sin Sacrificar Calidad
Tu agente de investigación ejecuta 50 tareas al día. Cada tarea comienza con el mismo prompt de sistema de 3.000 tokens, las mismas definiciones de herramientas de 2.500 tokens y la misma base de conocimiento de 5.000 tokens. Eso son 10.500 tokens repetidos 50 veces — 525.000 tokens por día que el modelo lee de forma idéntica cada vez. Con el precio estándar, estás pagando por procesar el mismo contenido una y otra vez.
El caché es la optimización de menor esfuerzo y mayor impacto para agentes en producción. Solo el caché de prompts puede reducir los costos de tokens de entrada en un 90% para el contenido almacenado. Combinado con el caché de resultados de herramientas, a menudo puedes reducir los costos totales del agente a la mitad — sin sacrificar calidad, precisión ni flexibilidad.
En este artículo, aprenderás tres capas de caché para agentes — caché de prompts, caché de resultados de herramientas y memoización de respuestas — con patrones de implementación usando la API de Claude y un análisis de costos claro para guiar tus decisiones.
Sección 1: Anatomía del Costo de un Agente
Antes de optimizar, necesitas entender dónde van realmente tus tokens. Analicemos un flujo de trabajo agéntico típico.
Desglose de Tokens por Turno
En una arquitectura de agente estándar, cada llamada a la API del modelo incluye:
| Componente | Tokens aprox. | ¿Se repite? |
|---|---|---|
| Prompt de sistema | ~1.500 | Cada turno |
| Definiciones de herramientas | ~2.000 | Cada turno |
| Base de conocimiento / contexto | ~3.000 | Cada turno |
| Historial de conversación | Creciente | Se acumula |
| Resultados de herramientas | ~500 prom. | Por llamada a herramienta |
La sobrecarga estática — prompt de sistema, definiciones de herramientas y base de conocimiento — totaliza aproximadamente 6.500 tokens por turno, y es idéntica en cada ocasión.
El Problema del Costo Compuesto
Los agentes no hacen una sola llamada a la API. Iteran en bucle. Una ejecución típica de un agente con 15 pasos se ve así:
Sin caché:
Cada uno de los 15 pasos envía el contexto completo. Asumiendo que el historial de conversación crece en ~300 tokens por paso en promedio:
- Tokens estáticos por paso: 6.500
- Total de tokens estáticos en 15 pasos: 97.500
- Tokens del historial de conversación (acumulados): ~33.750
- Tokens de resultados de herramientas: ~7.500
- Total de tokens de entrada: ~138.750
Con el precio de entrada de Claude Sonnet de $3 por millón de tokens, eso equivale a aproximadamente $0,42 por tarea. Ejecuta 50 tareas al día y estarás pagando $21/día — solo en tokens de entrada.
Con caché de prompts:
Los tokens en caché se cobran a $0,30 por millón para lecturas de caché (90% de descuento). Si almacenas en caché los 6.500 tokens estáticos:
- Lecturas de tokens en caché en 15 pasos: 97.500 tokens × $0,30/M = $0,029
- Tokens sin caché al precio estándar: ~41.250 × $3/M = $0,124
- Escritura de caché (primer paso): 6.500 × $3,75/M = $0,024
- Costo total de entrada: ~$0,18 por tarea
Eso representa una reducción del 57% solo por el caché. Con 50 tareas al día, ahorras más de $12/día — aproximadamente $360/mes — con cambios mínimos en el código.
Sección 2: Caché de Prompts con Claude
La API de caché de prompts de Claude es la optimización de mayor impacto que puedes aplicar a los flujos de trabajo agénticos. Te permite indicarle a la API: “esta parte de mi prompt no ha cambiado — reutiliza el cómputo almacenado en caché”.
Cómo Funciona el Caché de Prompts
Cuando envías una solicitud con el caché habilitado, la infraestructura de Anthropic:
- Verifica si existe una versión en caché del prefijo marcado
- Si no hay caché (cache miss): Procesa el prompt completo, almacena el prefijo en caché y cobra una tarifa de escritura de caché (prima del 25% sobre el precio estándar de entrada)
- Si hay caché (cache hit): Reutiliza el cómputo almacenado, cobrando solo la tarifa de lectura de caché (90% de descuento sobre el precio estándar de entrada)
El caché tiene un TTL de 5 minutos (Time to Live — la duración antes de que los datos en caché expiren). Cada acierto de caché reinicia el TTL, por lo que los agentes activos mantienen su caché activo de forma natural. Los trabajos por lotes con intervalos superiores a 5 minutos entre llamadas incurrirán en costos de escritura de caché con mayor frecuencia.
Qué Almacenar en Caché
No todo puede ni debe almacenarse en caché. Almacena en caché los prefijos estables y repetidos:
- Prompts de sistema — Casi siempre idénticos entre ejecuciones. Almacénalos en caché primero.
- Definiciones de herramientas — Los esquemas de tus herramientas rara vez cambian entre llamadas.
- Bases de conocimiento estáticas — Documentos de referencia, directrices, políticas.
- Prefijos de conversación — En conversaciones de múltiples turnos, almacena en caché los turnos anteriores que no cambiarán.
Restricciones importantes:
- El caché está basado en prefijos — solo puedes almacenar en caché el contenido desde el inicio del prompt, en orden. No puedes almacenar en caché una sección en el medio dejando secciones anteriores sin caché.
- Existe una longitud mínima cacheable de 1.024 tokens para Claude Sonnet y Haiku (2.048 para Opus).
- Puedes establecer hasta 4 puntos de interrupción de caché en una sola solicitud.
Implementación
Aquí tienes un ejemplo completo que muestra la configuración de un agente con caché de prompts:
Antes (sin caché):
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """You are a research assistant specializing in market analysis.You have access to tools for searching databases, reading files, and performingcalculations. Always cite your sources and provide confidence levels for yourfindings. [... detailed instructions totaling ~1,500 tokens ...]"""
TOOLS = [ { "name": "search_database", "description": "Search the company database for market data, competitor info, or financial records.", "input_schema": { "type": "object", "properties": { "query": {"type": "string", "description": "Search query"}, "database": {"type": "string", "enum": ["market", "competitors", "financial"]}, "limit": {"type": "integer", "description": "Max results", "default": 10} }, "required": ["query", "database"] } }, { "name": "read_file", "description": "Read the contents of a research file.", "input_schema": { "type": "object", "properties": { "file_path": {"type": "string", "description": "Path to the file"} }, "required": ["file_path"] } }, # ... more tools totaling ~2,000 tokens in definitions]
KNOWLEDGE_BASE = """## Company Policies and Guidelines[... reference material totaling ~3,000 tokens ...]"""
def run_agent(user_query: str): messages = [{"role": "user", "content": user_query}]
response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=4096, system=f"{SYSTEM_PROMPT}\n\n{KNOWLEDGE_BASE}", tools=TOOLS, messages=messages, ) # Log token usage print(f"Input tokens: {response.usage.input_tokens}") return responseDespués (con caché de prompts):
import anthropic
client = anthropic.Anthropic()
SYSTEM_PROMPT = """You are a research assistant specializing in market analysis.You have access to tools for searching databases, reading files, and performingcalculations. Always cite your sources and provide confidence levels for yourfindings. [... detailed instructions totaling ~1,500 tokens ...]"""
KNOWLEDGE_BASE = """## Company Policies and Guidelines[... reference material totaling ~3,000 tokens ...]"""
TOOLS = [ { "name": "search_database", "description": "Search the company database for market data, competitor info, or financial records.", "input_schema": { "type": "object", "properties": { "query": {"type": "string", "description": "Search query"}, "database": {"type": "string", "enum": ["market", "competitors", "financial"]}, "limit": {"type": "integer", "description": "Max results", "default": 10} }, "required": ["query", "database"] } }, { "name": "read_file", "description": "Read the contents of a research file.", "input_schema": { "type": "object", "properties": { "file_path": {"type": "string", "description": "Path to the file"} }, "required": ["file_path"] }, "cache_control": {"type": "ephemeral"} # Cache breakpoint after tools },]
def run_agent_cached(user_query: str): messages = [{"role": "user", "content": user_query}]
response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=4096, system=[ { "type": "text", "text": SYSTEM_PROMPT, }, { "type": "text", "text": KNOWLEDGE_BASE, "cache_control": {"type": "ephemeral"}, # Cache breakpoint }, ], tools=TOOLS, messages=messages, ) # Log token usage — now includes cache metrics usage = response.usage print(f"Input tokens: {usage.input_tokens}") print(f"Cache read tokens: {usage.cache_read_input_tokens}") print(f"Cache creation tokens: {usage.cache_creation_input_tokens}") return responseLos cambios clave:
- El parámetro
systemse convierte en una lista de bloques de contenido (en lugar de una cadena de texto simple) para poder adjuntarcache_controla bloques específicos. - Agrega `“cache_control”: {“type”:
Artículos Relacionados
- Optimización de Costos en Agentes: Guía Práctica para Reducir el Gasto en APIs
- Recuperación de Errores en Agentes: 5 Patrones para Fiabilidad en Producción
- Patrones de Uso de Herramientas: Interfaces Agente-Herramienta Confiables