README · by ansango
← Volver al libro

Arquitectura de AI engineering

Cómo diseñar el sistema: los 5 pasos para construir una arquitectura robusta (context, guardrails, router, caches, agents), monitoring, observabilidad y orquestación

~7 min de lectura
Resumen

Esta nota cubre la primera mitad del capítulo 10: cómo diseñar la arquitectura de un sistema de IA listo para producción. El libro propone 5 pasos secuenciales (enhance context → put guardrails → add model router → reduce latency with caches → add agent patterns), una capa de monitoring y observabilidad que es no opcional, y los patrones de orquestación que encadenan todo. La segunda mitad (feedback de usuarios) está en Feedback de usuario.

El mindset de arquitectura

El libro empieza el capítulo con una observación clave: la arquitectura de un sistema de IA es iterativa, no big-design-up-front. Empiezas con un diagrama de 4 cajas (usuario → aplicación → API del modelo → modelo) y vas añadiendo complejidad a medida que los problemas aparecen.

“La arquitectura de un sistema de IA es la respuesta a ‘qué falla y cómo lo mitigo’.”

Cada decisión arquitectónica responde a un problema concreto que ya has visto o que anticipas. Arquitectura sin diagnóstico es especulación.

Los 5 pasos del framework arquitectónico

El libro destila el diseño de un sistema de IA en cinco pasos acumulativos. No todos los productos necesitan los cinco, pero la mayoría acaba llegando a grados 3-4.

Paso 1: Enhance context

El primer paso es mejorar el contexto que recibe el modelo. Ya vimos esto en RAG.

En qué consiste

Patrones comunes

Por qué es el primer paso

Porque es lo que más impacto tiene en la calidad con el menor coste. Un sistema con buen contexto y un modelo mediocre a menudo gana a un sistema con mal contexto y un modelo excelente.

Paso 2: Put in guardrails

El segundo paso es poner barreras de seguridad. Cubrimos esto en Prompt engineering defensivo.

En qué consiste

Implementación en la arquitectura

user_input → [input guard] → app → [output guard] → response

Los guards son típicamente:

Por qué es importante

Sin guardrails, tarde o temprano alguien:

Los guardrails son code, no prompt

El libro es claro: las defensas críticas no pueden ser solo prompt. Deben ser código que se ejecuta de forma determinista. El prompt es complemento, no sustituto.

Paso 3: Add model router and gateway

Cuando un sistema tiene varios modelos (o varios proveedores), necesitas un router que decida qué modelo usar para cada request.

Por qué un router

Patrones de routing

Task-based routing

Ciertos tipos de request a ciertos modelos.

def route(request):
    if request.task == "classification":
        return cheap_model
    elif request.task == "complex_reasoning":
        return powerful_model
    elif request.task == "code":
        return code_model
Capability-based routing

Rutas basadas en capacidades requeridas (contexto largo, multimodal, function calling).

Cost-based routing

Maximizar calidad por dólar. Empezar con modelo barato, escalar a potente solo si falla.

def cascade_route(request):
    try:
        return cheap_model.generate(request)
    except QualityBelowThreshold:
        return retry_with_powerful_model(request)

Gateway

Un gateway añade:

Frameworks populares: Portkey, OpenRouter, Cloudflare AI Gateway.

Paso 4: Reduce latency with caches

El cuarto paso es reducir latencia con cachés. Cubrimos técnicas en Inferencia.

Tipos de cache

Qué cachear

TipoHit rate típicoImpacto
System prompt100%Ahorro medio
User context (RAG)20-50%Gran ahorro
Conversation history0-30%Depende
Full request5-20%Latencia brutal
Prompt caching es el quick win

Si usas OpenAI, Anthropic, Google o Together, activa prompt caching. Ahorra 50-90% del coste de input con casi ningún cambio en tu código.

Invalidación

Paso 5: Add agent patterns

El quinto paso es añadir patrones de agentic cuando la tarea lo requiere. Cubrimos agentes en Agentes.

Cuándo añadir agentes

Cuándo NO añadir agentes

Patrones de integración

No todo necesita un agente

El libro advierte: el entusiasmo por los agentes a menudo lleva a complicar sistemas que funcionarían mejor como pipelines tradicionales. Un agente es la opción cuando hay decisiones genuinas a tomar, no para añadir buzzwords.

Monitoring y observability

El libro insiste: sin monitoring, no tienes un sistema de producción. Tienes una demo glorificada.

Las tres pilares

Logs

Registros de cada request, response, error.

log.info({
    "request_id": uuid(),
    "user_id": user.id,
    "model": "gpt-4",
    "input_tokens": 245,
    "output_tokens": 102,
    "latency_ms": 1832,
    "cost_usd": 0.018,
    "quality_score": 0.92,
    "tools_called": ["search_docs"],
    "errors": None,
})

Metrics

Agregaciones numéricas:

Traces

Secuencias de spans que muestran qué pasó en cada request:

user_request (1500ms)
 ├─ input_validation (10ms)
 ├─ context_retrieval (200ms)
 │   ├─ embedding (50ms)
 │   └─ vector_search (120ms)
 ├─ model_call (1200ms)
 │   ├─ prefill (300ms)
 │   └─ decode (900ms)
 ├─ output_validation (50ms)
 └─ response_serialization (40ms)

Qué monitorizar (específico de AI)

Herramientas

Dashboards en producción, no en staging

El libro recomienda diseñar los dashboards para el primer día en producción, no después. Lo que no se mide en producción, no se mejora.

Alerting

Define estos umbrales antes de salir a producción.

AI pipeline orchestration

El último bloque de esta nota trata de cómo orquestar los distintos pasos del pipeline.

Frameworks de orquestación

LangChain / LangGraph

El más popular. Tiene LangGraph para grafos con estado.

LlamaIndex

Foco en RAG, también soporta agentes.

Haystack (deepset)

Framework para pipelines NLP, muy maduro.

Prefect / Airflow

Workflow managers generales, no específicos de AI pero útiles.

Custom

Código propio con asyncio, threads, message queues.

Patrones de orquestación

DAG (Directed Acyclic Graph)

Pasos en orden, sin ciclos. El más simple.

validate_input → retrieve_context → call_model → format_output → log

State machine

Estado explícito, transiciones según resultados.

INITIAL → PROCESSING → SUCCESS

                  ERROR → RETRY → PROCESSING

Event-driven

Pasos reaccionan a eventos. Más complejo pero más flexible.

Long-running

Workflows que duran horas o días. Stateful, con persistencia.

Persistencia de estado

Para workflows largos, el estado debe persistir:

Frameworks como LangGraph o Temporal lo gestionan automáticamente.

Error handling

Diseña para fallar

El libro recomienda asumir que todo falla. El modelo se cae, la BD de vectores se cae, la API externa se cae. Diseña para que cada fallo degrade el sistema de forma elegante, no catastrófica.

Resumen en tres frases

Próximos pasos