Módulo 1: AI Cost Anatomy

Costos Ocultos en Sistemas AI

Descripción de la cápsula

La factura de OpenAI dice "$2,400/mes." Miras los tokens de input y output, haces la cuenta, y suman $1,500. ¿De dónde vienen los otros $900? De costos que no aparecen cuando piensas en "precio por token": embeddings que se acumulan silenciosamente, context windows llenos de tokens que el modelo ignora, retries que duplican el gasto sin valor adicional, y costos de desarrollo que nadie presupuesta.

Esta cápsula te enseña a detectar esos costos ocultos. No son errores ni bugs — son características estructurales de los sistemas AI que la mayoría de engineers ignora porque no aparecen en la pricing page. Representan entre el 25% y el 40% de una factura típica.

Al terminar, vas a tener un "detector de costos ocultos" que analiza la arquitectura de un sistema AI y señala dónde se fuga dinero.


El desglose real: de dónde viene cada dólar

def show_real_cost_breakdown():
    """Desglose de una factura de $2,400/mes en un sistema AI con RAG."""
    breakdown = {
        "Tokens output (completions)":      {"amount": 900,  "visible": True},
        "Tokens input (prompts + context)":  {"amount": 600,  "visible": True},
        "Embeddings (RAG indexing + queries)":{"amount": 480, "visible": False},
        "Retries (rate limits + errores)":    {"amount": 300, "visible": False},
        "Storage (logs, cache, vectores)":    {"amount": 120, "visible": False},
    }

    total = sum(d["amount"] for d in breakdown.values())
    hidden = sum(d["amount"] for d in breakdown.values() if not d["visible"])

    print(f"{'Componente':<42} {'Monto':>8} {'%':>6} {'Tipo'}")
    print("-" * 68)
    for comp, data in breakdown.items():
        pct = data["amount"] / total * 100
        tipo = "OCULTO" if not data["visible"] else "Visible"
        print(f"{comp:<42} ${data['amount']:>6,} {pct:>5.1f}% {tipo}")
    print("-" * 68)
    print(f"{'TOTAL':<42} ${total:>6,} 100.0%")
    print(f"\nCostos ocultos: ${hidden:,}/mes ({hidden/total*100:.1f}% del total)")

show_real_cost_breakdown()
# Output esperado:
Componente                                   Monto      %  Tipo
--------------------------------------------------------------------
Tokens output (completions)                $   900  37.5%  Visible
Tokens input (prompts + context)           $   600  25.0%  Visible
Embeddings (RAG indexing + queries)        $   480  20.0%  OCULTO
Retries (rate limits + errores)            $   300  12.5%  OCULTO
Storage (logs, cache, vectores)            $   120   5.0%  OCULTO
--------------------------------------------------------------------
TOTAL                                      $ 2,400 100.0%

Costos ocultos: $900/mes (37.5% del total)

El 37.5% de la factura son costos que no ves cuando solo piensas en "tokens de input y output."


Costo oculto 1: Embeddings en pipelines RAG

Los embeddings parecen baratos: $0.02 por millón de tokens con text-embedding-3-small. Pero en un pipeline RAG se acumulan por dos vías: indexación inicial del corpus y conversión de cada query del usuario a embedding para búsqueda de similitud.

def calculate_embedding_costs(
    num_documents: int,
    avg_tokens_per_doc: int,
    queries_per_day: int,
    avg_query_tokens: int = 50,
    price_per_1m: float = 0.02,
    reindex_frequency_days: int = 30
) -> dict:
    """Calcula el costo real de embeddings en un pipeline RAG."""
    total_doc_tokens = num_documents * avg_tokens_per_doc
    indexing_cost = (total_doc_tokens / 1_000_000) * price_per_1m
    reindexes_per_month = 30 / reindex_frequency_days
    monthly_indexing = indexing_cost * reindexes_per_month

    monthly_query = (queries_per_day * avg_query_tokens / 1_000_000) * price_per_1m * 30
    return {
        "indexing_per_run": round(indexing_cost, 4),
        "indexing_monthly": round(monthly_indexing, 4),
        "queries_monthly": round(monthly_query, 4),
        "total_monthly": round(monthly_indexing + monthly_query, 4),
    }

costs = calculate_embedding_costs(
    num_documents=10_000, avg_tokens_per_doc=2_000,
    queries_per_day=5_000, reindex_frequency_days=7
)
print(f"Indexación/mes: ${costs['indexing_monthly']:.4f}")
print(f"Queries/mes:    ${costs['queries_monthly']:.4f}")
print(f"TOTAL/mes:      ${costs['total_monthly']:.4f}")
# Output esperado:
Indexación/mes: $1.7143
Queries/mes:    $0.1500
TOTAL/mes:      $1.8643

¿Solo $1.86? ¿Dónde están los $480?

Ese ejemplo usa 10K documentos con el modelo small. En producción real, los números escalan dramáticamente:

scenarios = [
    ("Startup (10K docs)",    10_000,   2_000,   5_000, 30),
    ("Scale-up (100K docs)", 100_000,   3_000,  50_000,  7),
    ("Enterprise (1M docs)", 1_000_000, 3_000, 200_000,  3),
]

for label, (name, docs, tpd, qpd, reindex) in zip(
    ["small ($0.02)", "large ($0.13)"],
    [(0.02,), (0.13,)]
):
    pass  # Se muestra abajo con ambos modelos

for price_label, price in [("small $0.02", 0.02), ("large $0.13", 0.13)]:
    print(f"\n=== text-embedding-3-{price_label}/1M ===")
    for name, docs, tpd, qpd, reindex in scenarios:
        c = calculate_embedding_costs(docs, tpd, qpd, price_per_1m=price, reindex_frequency_days=reindex)
        print(f"  {name:<25} ${c['total_monthly']:>10.2f}/mes")
# Output esperado:

=== text-embedding-3-small $0.02/1M ===
  Startup (10K docs)        $       0.55/mes
  Scale-up (100K docs)      $      27.21/mes
  Enterprise (1M docs)      $     606.00/mes

=== text-embedding-3-large $0.13/1M ===
  Startup (10K docs)        $       3.58/mes
  Scale-up (100K docs)      $     176.89/mes
  Enterprise (1M docs)      $   3,939.00/mes

Con re-indexación frecuente y text-embedding-3-large a escala enterprise, los embeddings pueden dominar la factura. La trampa: cada re-indexación paga por todos los tokens de nuevo. La solución (indexación incremental) viene en módulos posteriores.


Costo oculto 2: Context window desperdiciado

Envías 3,000 tokens de contexto RAG para obtener una respuesta de 10 tokens. Esos 3,000 tokens cuestan dinero aunque el modelo solo use una fracción para responder.

def analyze_context_waste(
    context_tokens: int,
    other_input_tokens: int,
    output_tokens: int,
    useful_context_ratio: float = 0.3,
    input_price_per_1m: float = 2.50,
    output_price_per_1m: float = 10.00
) -> dict:
    """Analiza el desperdicio de context window."""
    total_input = context_tokens + other_input_tokens
    input_cost = (total_input / 1_000_000) * input_price_per_1m
    output_cost = (output_tokens / 1_000_000) * output_price_per_1m
    total_cost = input_cost + output_cost

    wasted = int(context_tokens * (1 - useful_context_ratio))
    wasted_cost = (wasted / 1_000_000) * input_price_per_1m

    return {
        "total_cost": round(total_cost, 8),
        "wasted_tokens": wasted,
        "wasted_cost": round(wasted_cost, 8),
        "waste_pct": round(wasted_cost / total_cost * 100, 1),
    }

# GPT-4o: 3K contexto RAG, 550 otros tokens input, 200 output
result = analyze_context_waste(3_000, 550, 200, useful_context_ratio=0.3)
print(f"Costo total/request:  ${result['total_cost']:.6f}")
print(f"Tokens desperdiciados: {result['wasted_tokens']:,}")
print(f"Costo desperdiciado:  ${result['wasted_cost']:.6f} ({result['waste_pct']}% de la request)")
# Output esperado:
Costo total/request:  $0.010875
Tokens desperdiciados: 2,100
Costo desperdiciado:  $0.005250 (48.3% de la request)

A escala mensual

requests_day = 10_000
monthly_waste = result["wasted_cost"] * requests_day * 30
print(f"10K requests/día → ${monthly_waste:,.2f}/mes desperdiciados en contexto irrelevante")
# Output esperado:
10K requests/día → $1,575.00/mes desperdiciados en contexto irrelevante

$1,575/mes en tokens que el modelo ni necesita. Las soluciones (reranking, filtrado de chunks) se cubren en módulos 3 y 5-6.


Costo oculto 3: Retries por rate limiting

Cuando una request falla por rate limit (HTTP 429), la lógica estándar la reintenta. Cada retry cuesta lo mismo que la request original pero no entrega valor adicional.

import random

def simulate_retry_costs(
    total_requests: int,
    cost_per_request: float,
    failure_rate: float = 0.07,
    max_retries: int = 3
) -> dict:
    """Simula el costo adicional por retries."""
    random.seed(42)
    total_api_calls = 0

    for _ in range(total_requests):
        for attempt in range(max_retries + 1):
            total_api_calls += 1
            if random.random() >= failure_rate:
                break

    extra = total_api_calls - total_requests
    overhead = extra * cost_per_request
    return {
        "total_api_calls": total_api_calls,
        "extra_calls": extra,
        "intended_cost": round(total_requests * cost_per_request, 2),
        "actual_cost": round(total_api_calls * cost_per_request, 2),
        "overhead": round(overhead, 2),
        "overhead_pct": round(extra / total_requests * 100, 1),
    }

result = simulate_retry_costs(10_000, 0.01, failure_rate=0.07)
print(f"Requests: {result['total_api_calls']:,} reales vs {10_000:,} planeadas (+{result['extra_calls']:,})")
print(f"Costo: ${result['actual_cost']:.2f} real vs ${result['intended_cost']:.2f} planeado")
print(f"Overhead: ${result['overhead']:.2f}/día ({result['overhead_pct']}%)")
print(f"Overhead mensual: ${result['overhead'] * 30:.2f}")
# Output esperado:
Requests: 10,760 reales vs 10,000 planeadas (+760)
Costo: $107.60 real vs $100.00 planeado
Overhead: $7.60/día (7.6%)
Overhead mensual: $228.00

$228/mes en requests duplicadas que no entregan valor. La solución más efectiva no es mejorar el retry strategy — es reducir requests con caching (módulos 4-6).


Costo oculto 4: Costos de desarrollo y testing

Cada llamada a la API durante desarrollo cuesta dinero. "Solo estoy probando" con GPT-4o puede ser sorprendentemente caro.

def estimate_dev_costs(
    developers: int,
    calls_per_dev_day: int,
    avg_input: int, avg_output: int,
    model_prices: dict,
    working_days: int = 22
) -> dict:
    cost_per_call = (
        (avg_input / 1_000_000) * model_prices["input"]
        + (avg_output / 1_000_000) * model_prices["output"]
    )
    monthly = cost_per_call * developers * calls_per_dev_day * working_days
    return {"cost_per_call": round(cost_per_call, 6), "monthly": round(monthly, 2)}

gpt4o = estimate_dev_costs(3, 100, 1_000, 500, {"input": 2.50, "output": 10.00})
mini = estimate_dev_costs(3, 100, 1_000, 500, {"input": 0.15, "output": 0.60})

print(f"3 devs × 100 calls/día:")
print(f"  Con GPT-4o:      ${gpt4o['monthly']:.2f}/mes")
print(f"  Con GPT-4o-mini: ${mini['monthly']:.2f}/mes")
print(f"  Ahorro:          ${gpt4o['monthly'] - mini['monthly']:.2f}/mes")
# Output esperado:
3 devs × 100 calls/día:
  Con GPT-4o:      $49.50/mes
  Con GPT-4o-mini: $2.97/mes
  Ahorro:          $46.53/mes

La regla de oro: usa el modelo más barato para desarrollo y testing. Solo usa el modelo de producción para validación final.


Costo oculto 5: Fine-tuning — costos amortizados

Fine-tuning tiene dos costos que muchos ignoran: el costo de entrenamiento y un premium de inference (modelos fine-tuned cuestan más por token que los base).

def calculate_finetuning_costs(
    training_tokens: int, epochs: int,
    requests_day: int, avg_in: int, avg_out: int,
    months: int = 12
) -> dict:
    # GPT-4o-mini fine-tuning pricing
    train_price = 3.00     # per 1M tokens de training
    ft_input = 0.30        # 2x base
    ft_output = 1.20       # 2x base
    base_input = 0.15
    base_output = 0.60

    training_cost = (training_tokens * epochs / 1_000_000) * train_price
    ft_monthly = ((avg_in/1e6)*ft_input + (avg_out/1e6)*ft_output) * requests_day * 30
    base_monthly = ((avg_in/1e6)*base_input + (avg_out/1e6)*base_output) * requests_day * 30

    return {
        "training_cost": round(training_cost, 2),
        "ft_monthly_inference": round(ft_monthly, 2),
        "base_monthly_inference": round(base_monthly, 2),
        "premium_monthly": round(ft_monthly - base_monthly + training_cost/months, 2),
    }

ft = calculate_finetuning_costs(500_000, 3, 5_000, 500, 200)
print(f"Training (único):     ${ft['training_cost']:.2f}")
print(f"Inference FT/mes:     ${ft['ft_monthly_inference']:.2f}")
print(f"Inference base/mes:   ${ft['base_monthly_inference']:.2f}")
print(f"Premium total/mes:    ${ft['premium_monthly']:.2f}")
# Output esperado:
Training (único):     $4.50
Inference FT/mes:     $58.50
Inference base/mes:   $29.25
Premium total/mes:    $29.63

Fine-tuning duplica tu costo de inference. Solo vale la pena si la mejora en calidad justifica ese premium.


Costo oculto 6: Streaming y desconexiones

Streaming no cuesta más en tokens, pero si la conexión se corta a mitad de stream, pierdes la respuesta parcial y pagas de nuevo al reintentar.

def streaming_overhead(requests_day: int, cost_per_req: float, disconnect_rate: float = 0.02):
    disconnects = int(requests_day * disconnect_rate)
    # Pagas tokens parciales perdidos + retry completo
    daily_overhead = disconnects * cost_per_req * 1.7
    return {"disconnects_day": disconnects, "overhead_monthly": round(daily_overhead * 30, 2)}

s = streaming_overhead(10_000, 0.01, 0.02)
print(f"Desconexiones/día: {s['disconnects_day']}")
print(f"Overhead mensual:  ${s['overhead_monthly']:.2f}")
# Output esperado:
Desconexiones/día: 200
Overhead mensual:  $102.00

Detector de costos ocultos: función integradora

from dataclasses import dataclass

@dataclass
class SystemConfig:
    name: str
    model: str
    requests_per_day: int
    avg_input_tokens: int
    avg_output_tokens: int
    has_rag: bool = False
    rag_documents: int = 0
    rag_tokens_per_doc: int = 0
    rag_reindex_days: int = 30
    rag_context_tokens: int = 0
    useful_context_ratio: float = 0.5
    failure_rate: float = 0.04
    uses_streaming: bool = False
    disconnect_rate: float = 0.02
    developers: int = 0
    dev_calls_per_day: int = 0

@dataclass
class CostAlert:
    category: str
    severity: str
    monthly_cost: float
    recommendation: str

def detect_hidden_costs(cfg: SystemConfig) -> list[CostAlert]:
    """Analiza un sistema y detecta costos ocultos."""
    alerts = []
    prices = {
        "gpt-4o": (2.50, 10.00), "gpt-4o-mini": (0.15, 0.60),
        "claude-3.5-sonnet": (3.00, 15.00), "claude-3-haiku": (0.25, 1.25),
    }
    inp_price, out_price = prices.get(cfg.model, (2.50, 10.00))
    base_cost = (cfg.avg_input_tokens/1e6)*inp_price + (cfg.avg_output_tokens/1e6)*out_price

    # 1. Embeddings RAG
    if cfg.has_rag and cfg.rag_documents > 0:
        c = calculate_embedding_costs(
            cfg.rag_documents, cfg.rag_tokens_per_doc,
            cfg.requests_per_day, reindex_frequency_days=cfg.rag_reindex_days
        )
        sev = "high" if c["total_monthly"] > 100 else "medium" if c["total_monthly"] > 10 else "low"
        alerts.append(CostAlert("Embeddings (RAG)", sev, c["total_monthly"],
                                "Indexación incremental, usar embedding-3-small"))

    # 2. Context waste
    if cfg.rag_context_tokens > 0:
        wasted = cfg.rag_context_tokens * (1 - cfg.useful_context_ratio)
        waste_monthly = (wasted/1e6) * inp_price * cfg.requests_per_day * 30
        sev = "high" if waste_monthly > 500 else "medium" if waste_monthly > 50 else "low"
        alerts.append(CostAlert("Context window waste", sev, round(waste_monthly, 2),
                                "Implementar reranking, reducir chunks"))

    # 3. Retries
    if cfg.failure_rate > 0:
        retry_monthly = base_cost * cfg.requests_per_day * cfg.failure_rate * 1.1 * 30
        sev = "high" if retry_monthly > 200 else "medium" if retry_monthly > 20 else "low"
        alerts.append(CostAlert("Retries", sev, round(retry_monthly, 2),
                                "Caching para reducir requests totales"))

    # 4. Streaming
    if cfg.uses_streaming and cfg.disconnect_rate > 0:
        s_monthly = base_cost * cfg.requests_per_day * cfg.disconnect_rate * 1.7 * 30
        sev = "medium" if s_monthly > 50 else "low"
        alerts.append(CostAlert("Streaming desconexiones", sev, round(s_monthly, 2),
                                "Guardar tokens parciales"))

    # 5. Dev costs
    if cfg.developers > 0:
        dev_monthly = base_cost * cfg.developers * cfg.dev_calls_per_day * 22
        sev = "medium" if dev_monthly > 30 else "low"
        alerts.append(CostAlert("Desarrollo/Testing", sev, round(dev_monthly, 2),
                                "Usar modelo barato para dev"))

    alerts.sort(key=lambda a: a.monthly_cost, reverse=True)
    return alerts

# Analizar un sistema real
system = SystemConfig(
    name="Customer Support Bot", model="gpt-4o",
    requests_per_day=10_000, avg_input_tokens=1_500, avg_output_tokens=500,
    has_rag=True, rag_documents=50_000, rag_tokens_per_doc=2_000,
    rag_reindex_days=7, rag_context_tokens=3_000, useful_context_ratio=0.3,
    failure_rate=0.07, uses_streaming=True, disconnect_rate=0.03,
    developers=3, dev_calls_per_day=80,
)

alerts = detect_hidden_costs(system)
print(f"=== Detector: {system.name} ===\n")
total = 0
for a in alerts:
    icon = {"high": "🔴", "medium": "🟡", "low": "🟢"}[a.severity]
    print(f"{icon} {a.category:<28} ${a.monthly_cost:>10,.2f}/mes → {a.recommendation}")
    total += a.monthly_cost
print(f"\nTOTAL costos ocultos: ${total:,.2f}/mes")
# Output esperado:
=== Detector: Customer Support Bot ===

🟡 Context window waste          $  1,575.00/mes → Implementar reranking, reducir chunks
🟡 Streaming desconexiones       $    306.00/mes → Guardar tokens parciales
🟡 Retries                       $    231.00/mes → Caching para reducir requests totales
🟡 Desarrollo/Testing            $     95.04/mes → Usar modelo barato para dev
🟡 Embeddings (RAG)              $      8.87/mes → Indexación incremental, usar embedding-3-small

TOTAL costos ocultos: $2,215.91/mes

Comparación: Costos visibles vs ocultos

CriterioCostos visiblesCostos ocultos
Qué incluyeTokens input + outputEmbeddings, retries, context waste, dev, streaming
% de la factura60-75%25-40%
Fácil de calcularSí (tokens × precio)Requiere análisis de arquitectura
Lo monitoreanLa mayoría de equiposCasi nadie
Oportunidad de ahorroModeradaAlta (precisamente porque nadie los mira)

Conexión con el proyecto

El detector de costos ocultos se integra en el Cost Breakdown Calculator. Tu calculadora final (cápsula 08) debe incluir costos visibles Y ocultos, detectar automáticamente qué aplica según la arquitectura, y generar alertas con recomendaciones. Sin esto, tu baseline subestimaría el gasto real.


Troubleshooting

Problema 1: "No sé qué porcentaje de mi contexto RAG es útil"

Causa: No hay métricas de relevancia del contexto recuperado. Solución: Compara respuestas con contexto completo vs reducido (top 1-2 chunks vs top 5). Si la calidad no baja, estás enviando contexto innecesario.

Problema 2: "No tengo visibilidad de cuántos retries hace mi sistema"

Causa: La lógica de retry en la librería del cliente no se loggea. Solución: Envuelve las llamadas API con un wrapper que cuente intentos y loggee cada uno.

Problema 3: "Los costos de embeddings parecen irrelevantes ($0.02/1M)"

Causa: Pensar en precio unitario sin calcular volumen total. Solución: Calcula docs × tokens_per_doc × precio × reindexaciones/mes. Los números sorprenden a escala.

Problema 4: "Mis developers usan GPT-4o para todo"

Causa: Sin política de uso de modelos en desarrollo. Solución: Variable de entorno DEV_MODEL=gpt-4o-mini. La diferencia es 16x en costo.


Ejercicios

Ejercicio 1: Identificar costos ocultos en una arquitectura (Fácil)

Lee esta descripción: "Chatbot con RAG. GPT-4o para todo. 20K docs re-indexados semanalmente. Top 10 chunks como contexto (~5,000 tokens). 3 developers probando con GPT-4o. Streaming activo. 8% de requests fallan y se reintentan." Lista todos los costos ocultos.

Ver solución

Costos ocultos identificados:

  1. Embeddings re-indexación: 20K docs × ~2K tokens × 4 veces/mes
  2. Context window waste: 5,000 tokens contexto, probablemente 30-50% útil
  3. Retries al 8%: cada retry duplica costo sin valor
  4. Dev costs con GPT-4o: 3 devs usando el modelo más caro
  5. Streaming desconexiones: tokens parciales perdidos

Explicación: Identificar es el primer paso. Cuantificar con detect_hidden_costs() es el segundo. Priorizar por impacto es el tercero.

Ejercicio 2: Calcular embeddings para RAG (Fácil)

100,000 documentos de 1,500 tokens. Re-indexas cada 3 días. 20,000 queries/día. Calcula el costo mensual con text-embedding-3-small y text-embedding-3-large.

Ver solución
for name, price in [("small", 0.02), ("large", 0.13)]:
    c = calculate_embedding_costs(100_000, 1_500, 20_000, price_per_1m=price, reindex_frequency_days=3)
    print(f"text-embedding-3-{name}: ${c['total_monthly']:.2f}/mes")
# Output esperado:
text-embedding-3-small: $30.48/mes
text-embedding-3-large: $198.12/mes

Explicación: La re-indexación cada 3 días es el driver principal. Indexación incremental (solo docs nuevos/modificados) reduce este costo drásticamente.

Ejercicio 3: Estimar costo de retries (Medio)

50,000 requests/día a GPT-4o-mini (600 in + 200 out tokens). 10% failure rate. Calcula: llamadas API reales, overhead mensual, y porcentaje del costo total.

Ver solución
cost_per_req = (600/1e6)*0.15 + (200/1e6)*0.60  # $0.00021
r = simulate_retry_costs(50_000, cost_per_req, failure_rate=0.10)
print(f"API calls reales: {r['total_api_calls']:,} (vs 50,000 planeadas)")
print(f"Overhead mensual: ${r['overhead'] * 30:.2f}")
print(f"Porcentaje: {r['overhead_pct']}%")

Explicación: 10% failure rate ≈ 10% overhead en costos. La solución más efectiva es caching, no mejor retry logic.

Ejercicio 4: Context optimization — cuánto puedes ahorrar (Medio)

GPT-4o, 15,000 requests/día. Actualmente 4,000 tokens de contexto RAG con 25% útil. Si reduces a solo los 1,000 tokens útiles, ¿cuánto ahorras anualmente?

Ver solución
other_input = 500  # system prompt + query
output = 300

# Actual
current = ((4_000+other_input)/1e6)*2.50 + (output/1e6)*10.00
# Optimizado
optimized = ((1_000+other_input)/1e6)*2.50 + (output/1e6)*10.00

monthly_savings = (current - optimized) * 15_000 * 30
print(f"Actual/req:      ${current:.6f}")
print(f"Optimizado/req:  ${optimized:.6f}")
print(f"Ahorro mensual:  ${monthly_savings:,.2f}")
print(f"Ahorro anual:    ${monthly_savings * 12:,.2f}")
# Output esperado:
Actual/req:      $0.014250
Optimizado/req:  $0.006750
Ahorro mensual:  $3,375.00
Ahorro anual:    $40,500.00

Explicación: $40,500/año desperdiciados en contexto que el modelo no necesita. El modelo genera la misma respuesta con 1,000 tokens relevantes que con 4,000 donde el 75% es ruido.

Ejercicio 5: Auditoría completa (Difícil)

Configura detect_hidden_costs() para: "E-commerce AI assistant. Claude 3.5 Sonnet. 30K req/día. 2,000 in + 1,000 out tokens. RAG con 200K docs (1,500 tokens), re-indexa diario. 8,000 tokens contexto, 40% útil. 4% failure rate. Streaming con 4% disconnects. 5 devs, 120 calls/día."

Ver solución
ecom = SystemConfig(
    name="E-commerce Assistant", model="claude-3.5-sonnet",
    requests_per_day=30_000, avg_input_tokens=2_000, avg_output_tokens=1_000,
    has_rag=True, rag_documents=200_000, rag_tokens_per_doc=1_500,
    rag_reindex_days=1, rag_context_tokens=8_000, useful_context_ratio=0.4,
    failure_rate=0.04, uses_streaming=True, disconnect_rate=0.04,
    developers=5, dev_calls_per_day=120,
)

# Costos visibles
visible = ((2_000/1e6)*3.00 + (1_000/1e6)*15.00) * 30_000 * 30
alerts = detect_hidden_costs(ecom)
hidden = sum(a.monthly_cost for a in alerts)

print(f"Visible:  ${visible:,.2f}/mes")
print(f"Oculto:   ${hidden:,.2f}/mes")
print(f"TOTAL:    ${visible + hidden:,.2f}/mes")
print(f"% oculto: {hidden/(visible+hidden)*100:.1f}%")

Explicación: En sistemas con RAG, streaming y equipos de desarrollo activos, los costos ocultos representan 25-40% del gasto total.

Ejercicio 6: Plan de reducción priorizado (Difícil)

Usando los resultados del Ejercicio 5, ordena las acciones de reducción por impacto/dificultad y estima el ahorro total posible.

Ver solución
plan = [
    ("Reducir contexto 8K→3K (reranking)",     "60% de context waste",  "Media", 1),
    ("Caching exact + semantic",                "40% de todas las requests", "Media", 2),
    ("Indexación incremental embeddings",       "80% de costo indexación",   "Baja",  3),
    ("GPT-4o-mini para desarrollo",             "90% de dev costs",      "Baja",  4),
    ("Guardar tokens parciales streaming",      "50% de streaming overhead", "Media", 5),
]

print(f"{'#':>2} {'Acción':<45} {'Ahorro estimado':<25} {'Dificultad'}")
print("-" * 85)
for action, savings, diff, prio in plan:
    print(f"{prio:>2}. {action:<45} {savings:<25} {diff}")
print(f"\nOrden: mayor impacto + menor dificultad primero")

Explicación: Quick wins primero — cambiar variable de ambiente para dev es inmediato. Semantic caching requiere Redis y diseño. Cada módulo posterior de la guía da herramientas para ejecutar este plan.


Resumen

  • ✅ Los costos ocultos representan 25-40% de una factura típica de AI
  • ✅ Embeddings en RAG se acumulan con re-indexación frecuente y volumen de documentos
  • ✅ Context window desperdiciado es el costo oculto más grande en sistemas RAG
  • ✅ Retries por rate limiting duplican costos sin entregar valor — 10% failure ≈ 10% overhead
  • ✅ Costos de desarrollo: "solo probando" con GPT-4o cuesta 16x más que con mini
  • ✅ Fine-tuning tiene premium de inference 2x que pocos presupuestan
  • ✅ El detector de costos ocultos analiza arquitectura y señala fugas de dinero automáticamente

Próxima cápsula: Cost breakdown por tipo de operación — fórmulas exactas para completions, embeddings y fine-tuning.


Recursos adicionales

  1. OpenAI Rate Limits - Rate limits y cómo manejarlos
  2. OpenAI Embeddings Guide - Guía de embeddings con pricing
  3. OpenAI Fine-Tuning Pricing - Costos de training e inference
  4. Anthropic Rate Limits - Límites en Anthropic
  5. Cohere Rerank - Reranking para reducir contexto innecesario
  6. LangChain Cost Tracking - Tracking de tokens en LangChain
  7. Redis for AI Caching - Patrones de caching para reducir API calls
  8. OpenAI Cookbook: Token Counting - Conteo y estimación de tokens

Creado: Marzo 2026 Versión: 1.0