SISTEMA DE ACCESO INFORMÁTICO

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:

ComponenteTokens aprox.¿Se repite?
Prompt de sistema~1.500Cada turno
Definiciones de herramientas~2.000Cada turno
Base de conocimiento / contexto~3.000Cada turno
Historial de conversaciónCrecienteSe 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:

  1. Verifica si existe una versión en caché del prefijo marcado
  2. 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)
  3. 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 performing
calculations. Always cite your sources and provide confidence levels for your
findings. [... 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 response

Despué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 performing
calculations. Always cite your sources and provide confidence levels for your
findings. [... 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 response

Los cambios clave:

  1. El parámetro system se convierte en una lista de bloques de contenido (en lugar de una cadena de texto simple) para poder adjuntar cache_control a bloques específicos.
  2. Agrega `“cache_control”: {“type”:

Artículos Relacionados