CULTIVA IA
MLOps Architecture Plan — OfertaFlash
Ingeniero ML Senior · Producción · 12 Jun 2026
XGBoost + CF Híbrido 50K req/día AWS → K8s Migration
Estado actual vs objetivos
p95 Latencia actual
400ms
⚠ Objetivo: < 80ms
Error rate estimado
~0.3%
⚡ Objetivo: < 0.05%
Coste LLM mensual
~580
💸 Objetivo: < 200€/mes
Drift detection
✗ Sin monitorización
Pipeline de despliegue propuesto
1
Export
ONNX
✓ Listo
2
Docker
FastAPI
→ Sprint 1
3
MLflow
Registry
→ Sprint 1
4
Staging
K8s
Sprint 2
5
Canary
5%
Sprint 2
6
Monitor
Drift
Sprint 3
7
RAG
Chatbot
Sprint 4
8
LLM
Cost Ctrl
Sprint 4
🐳
Container — FastAPI + XGBoost
Dockerfile FROM python:3.11-slim COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY model/xgb_reco_v3.onnx /app/model/ COPY src/ /app/src/ ENV MODEL_PATH=/app/model/xgb_reco_v3.onnx ENV REDIS_URL=redis://redis:6379 HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:8080/health || exit 1 EXPOSE 8080 CMD ["uvicorn", "src.server:app", \ "--host", "0.0.0.0", "--port", "8080", \ "--workers", "4"]
🗄️
Feature Store — Feast + PostgreSQL
Python from feast import Entity, FeatureView user = Entity("user_id", value_type=INT64) reco_features = FeatureView( name="ofertaflash_user_signals", entities=["user_id"], ttl=timedelta(days=1), features=[ Feature("clicks_30d", INT64), Feature("cart_abandon_rate",FLOAT), Feature("avg_price_viewed", FLOAT), Feature("pref_category", STRING), ], online=True, # Redis-backed online store source=pg_source ) # Materialize: cada hora via Airflow DAG store.materialize_incremental( end_date=datetime.now() )
📉
Monitorización de Drift — KS Test
Python from scipy.stats import ks_2samp import mlflow def monitor_input_drift(ref_window, live_window): features = ["clicks_30d", "avg_price_viewed", "cart_abandon_rate"] alerts = [] for feat in features: stat, p = ks_2samp(ref_window[feat], live_window[feat]) psi = compute_psi(ref_window[feat], live_window[feat]) mlflow.log_metric(f"psi_{feat}", psi) if psi > 0.2: # Critical threshold alerts.append({"feature": feat, "psi": psi, "severity": "CRITICAL"}) elif psi > 0.1: # Warning threshold alerts.append({"feature": feat, "psi": psi, "severity": "WARNING"}) return alerts
FeaturePSI SimuladoEstadoAcción
clicks_30d0.04OK
avg_price_viewed0.12WARNINGEvaluar retrain
cart_abandon_rate0.23CRITICALRetrain inmediato
pref_category0.07OK
🔍
RAG Chatbot — Soporte de Producto
Python from qdrant_client import QdrantClient from anthropic import Anthropic client = QdrantClient(host="qdrant", port=6333) llm = Anthropic() def answer_support_query(query: str, user_id: str): # 1. Embed query → retrieve top-5 docs hits = client.search( collection_name="ofertaflash_docs", query_vector=embed(query), limit=5, score_threshold=0.75 ) context = "\n\n".join([h.payload["text"] for h in hits]) # 2. Call LLM with context (Haiku: 5x cheaper) resp = llm.messages.create( model="claude-haiku-4-5", max_tokens=512, messages=[{"role":"user", "content": PROMPT.format(ctx=context, q=query)}] ) track_cost(resp.usage) # ← cost control return resp.content[0].text
Qdrant (self-hosted) text-embedding-3-small Chunk: 512 tok / 50 overlap Haiku 4.5 (coste reducido 5x)
🚨
Umbrales de Alerta
MétricaWarningCritical
p95 latencia> 80ms> 150ms
Error rate> 0.05%> 0.5%
PSI drift> 0.10> 0.20
Accuracy drop> 2%> 5%
Coste LLM/día> 6€> 10€
Cache hit rate< 40%< 20%
🔄
Triggers de Reentrenamiento
TriggerDetecciónAcción
SemanalCron Lunes 02:00Retrain completo
PSI > 0.2Monitor 6hRetrain urgente
Accuracy < 78%Evaluación diariaRetrain + A/B
+50K registrosConteo incrementalFine-tune
Black FridayCalendario manualPre-train especial
💰
Control de Costes LLM
Proveedor/ModeloInputOutput
Claude 3 Opus$15/1M$75/1M
→ Actual (sin ctrl)~580€/mes
Claude Haiku 4.5$0.25/1M$1.25/1M
→ Propuesto + caché~95€/mes
Ahorro estimado: 485€/mes
Migrar a Haiku + prompt caching + response cache Redis 24h
📅
Roadmap del Proyecto (8 semanas)
Semana 1-2 · Sprint 1
Docker + FastAPI + MLflow
Containerizar modelo XGBoost, exponer endpoint /predict, configurar MLflow tracking + model registry. CI/CD GitHub Actions → ECR.
Semana 3-4 · Sprint 2
K8s Staging + Canary Deploy
EKS cluster (3 nodos), manifiestos HPA (2-8 réplicas), canary 5% con NGINX Ingress. Target: p95 < 80ms validado en staging.
Semana 5-6 · Sprint 3
Drift Monitoring + Feature Store
Feast online store (Redis), dashboard Grafana con PSI por feature, alertas PagerDuty, pipeline reentrenamiento automático con Airflow.
Semana 7-8 · Sprint 4
RAG Chatbot + Cost Control
Qdrant self-hosted, ingestión docs soporte (1.200 páginas), migración a Claude Haiku, response caching Redis, budget tracker Slack alert.
☸️
Kubernetes HPA Manifest
YAML · k8s apiVersion: apps/v1 kind: Deployment metadata: name: ofertaflash-reco labels: {app: reco, version: v3} spec: replicas: 3 selector: matchLabels: {app: reco} template: spec: containers: - name: reco image: 123456.dkr.ecr.eu-west-1.amazonaws.com/reco:v3.2.1 resources: requests: {cpu: "500m", memory: "1Gi"} limits: {cpu: "2", memory: "3Gi"} readinessProbe: httpGet: {path: /health, port: 8080} --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler spec: minReplicas: 2 maxReplicas: 8 # Pico viernes: 8K req/h metrics: - type: Resource resource: name: cpu target: {averageUtilization: 60}
Proyección de rendimiento post-migración
62ms
p95 latencia
0.03%
error rate
95€
coste LLM/mes
🗃️
Comparativa Vector Databases
DatabaseHostingLatenciaCosteRecomendación
QdrantSelf-hostedMuy baja$0/mes✓ Elegido
PineconeManagedBaja~$70/mesBackup
WeaviateAmbosBajaVariableAlternativa
pgvectorSelf-hostedMedia$0/mesSi <100K docs
ChromaSelf-hostedBaja$0/mesSolo dev
🛠️
Stack Técnico Final Propuesto
CapaHerramientaJustificación
ServingFastAPI + UvicornREST, 4 workers
OrquestaciónEKS (K8s)HPA automático
ExperimentsMLflowOpen source, S3 backend
FeaturesFeast + RedisOnline <10ms
MonitoringGrafana + PagerDutyAlertas en <5min
Vector DBQdrantSelf-hosted, $0
LLMClaude Haiku 4.55x más barato
CacheRedis 24h TTLHit rate objetivo 55%
📊
Resumen ROI del Proyecto
-84%
Reducción latencia p95
(400ms → 62ms)
-84%
Reducción coste LLM
(580€ → 95€/mes)
< 24h
Alert drift antes de
degradación visible
Auto
Reentrenamiento
sin intervención manual
8 sem
Tiempo a producción
completo