<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Open-Source on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/open-source/</link><description>Recent content in Open-Source on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Sat, 23 May 2026 07:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/open-source/index.xml" rel="self" type="application/rss+xml"/><item><title>El catálogo OSS para LLMOps en seis etapas: ficha por ficha, qué hace cada herramienta y cuándo elegirla</title><link>https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/</link><pubDate>Sat, 23 May 2026 07:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Para cada una de las seis etapas LLMOps (Data, Tune, Eval, Deploy, Observe, Retrain) y los dos componentes transversales (prompt + data versioning), el ecosistema open source tiene piezas canónicas que el blog ha estado citando una y otra vez. Este post las junta en un solo sitio con &lt;strong>fichas de ~150 palabras por herramienta core&lt;/strong>: qué hace, en qué se diferencia de sus alternativas dentro del mismo bucket, su &lt;strong>licencia y modelo de gobierno&lt;/strong>, y un gotcha típico que sólo se aprende en producción. Más alternativas como bullets, &lt;strong>matriz de decisión por etapa&lt;/strong> según el caso (corpus pequeño / grande, un tenant / multi-tenant…), &lt;strong>diagrama&lt;/strong> del stack OSS conectado y &lt;strong>tabla maestra&lt;/strong> de licencias / oferta EE. La intención: que el lector cierre el post sabiendo qué hay disponible, qué empresa la mantiene, qué hueco rellena cada pieza, y cuándo elegirla. No es opinión: es catálogo curado.&lt;/p>
&lt;h2 id="estás-aquí-todas-las-etapas-pero-por-columna-oss">Estás aquí: todas las etapas, pero por columna OSS&lt;/h2>
&lt;p>Este post comparte mapa con los dos anteriores de la serie — las seis etapas y los dos transversales están todas activas — pero hace el zoom in en la &lt;strong>columna open source&lt;/strong>.&lt;/p>
&lt;div class="diagram" style="max-width:820px;margin:1rem auto;">
&lt;svg viewBox="0 0 820 220" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="catálogo OSS por etapa del pipeline LLMOps">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#ff8a4c;stroke-width:2}.cross{fill:#ffe9d6;stroke:#c66;stroke-width:1.4;rx:6}.lbl{font:600 12px sans-serif;fill:#222}.sm{font:11px sans-serif;fill:#333}.tiny{font:10px sans-serif;fill:#444}.oss{fill:#dfe9f5;stroke:#356}&lt;/style>
&lt;text x="410" y="20" text-anchor="middle" class="lbl">Catálogo OSS: la caja de herramientas del consultor por etapa&lt;/text>
&lt;rect x="20" y="38" width="120" height="32" class="box active"/>&lt;text x="80" y="58" text-anchor="middle" class="lbl">1 · Data&lt;/text>
&lt;rect x="150" y="38" width="120" height="32" class="box active"/>&lt;text x="210" y="58" text-anchor="middle" class="lbl">2 · Tune&lt;/text>
&lt;rect x="280" y="38" width="120" height="32" class="box active"/>&lt;text x="340" y="58" text-anchor="middle" class="lbl">3 · Eval&lt;/text>
&lt;rect x="410" y="38" width="120" height="32" class="box active"/>&lt;text x="470" y="58" text-anchor="middle" class="lbl">4 · Deploy&lt;/text>
&lt;rect x="540" y="38" width="120" height="32" class="box active"/>&lt;text x="600" y="58" text-anchor="middle" class="lbl">5 · Observe&lt;/text>
&lt;rect x="670" y="38" width="120" height="32" class="box active"/>&lt;text x="730" y="58" text-anchor="middle" class="lbl">6 · Retrain&lt;/text>
&lt;rect x="20" y="88" width="120" height="78" class="box oss"/>
&lt;text x="80" y="103" text-anchor="middle" class="tiny">DVC · lakeFS&lt;/text>
&lt;text x="80" y="117" text-anchor="middle" class="tiny">MinIO · Ceph&lt;/text>
&lt;text x="80" y="131" text-anchor="middle" class="tiny">Qdrant · pgvector&lt;/text>
&lt;text x="80" y="145" text-anchor="middle" class="tiny">Kafka · Flink&lt;/text>
&lt;text x="80" y="159" text-anchor="middle" class="tiny">Debezium · Karapace&lt;/text>
&lt;rect x="150" y="88" width="120" height="78" class="box oss"/>
&lt;text x="210" y="103" text-anchor="middle" class="tiny">HF Transformers&lt;/text>
&lt;text x="210" y="117" text-anchor="middle" class="tiny">PEFT · bitsandbytes&lt;/text>
&lt;text x="210" y="131" text-anchor="middle" class="tiny">DeepSpeed · FSDP&lt;/text>
&lt;text x="210" y="145" text-anchor="middle" class="tiny">Axolotl · LLaMA-Factory&lt;/text>
&lt;text x="210" y="159" text-anchor="middle" class="tiny">Ray Train · MLflow&lt;/text>
&lt;rect x="280" y="88" width="120" height="78" class="box oss"/>
&lt;text x="340" y="103" text-anchor="middle" class="tiny">DeepEval · RAGAS&lt;/text>
&lt;text x="340" y="117" text-anchor="middle" class="tiny">Promptfoo&lt;/text>
&lt;text x="340" y="131" text-anchor="middle" class="tiny">lm-eval-harness&lt;/text>
&lt;text x="340" y="145" text-anchor="middle" class="tiny">NeMo Guardrails&lt;/text>
&lt;text x="340" y="159" text-anchor="middle" class="tiny">Presidio · LlamaGuard&lt;/text>
&lt;rect x="410" y="88" width="120" height="78" class="box oss"/>
&lt;text x="470" y="103" text-anchor="middle" class="tiny">vLLM · TGI · SGLang&lt;/text>
&lt;text x="470" y="117" text-anchor="middle" class="tiny">TensorRT-LLM&lt;/text>
&lt;text x="470" y="131" text-anchor="middle" class="tiny">llama.cpp · Triton&lt;/text>
&lt;text x="470" y="145" text-anchor="middle" class="tiny">KServe · KubeRay&lt;/text>
&lt;text x="470" y="159" text-anchor="middle" class="tiny">Envoy AI · LiteLLM&lt;/text>
&lt;rect x="540" y="88" width="120" height="78" class="box oss"/>
&lt;text x="600" y="103" text-anchor="middle" class="tiny">OpenTelemetry&lt;/text>
&lt;text x="600" y="117" text-anchor="middle" class="tiny">Tempo · Jaeger&lt;/text>
&lt;text x="600" y="131" text-anchor="middle" class="tiny">Prometheus · Loki&lt;/text>
&lt;text x="600" y="145" text-anchor="middle" class="tiny">Langfuse · Phoenix&lt;/text>
&lt;text x="600" y="159" text-anchor="middle" class="tiny">Tetragon · Evidently&lt;/text>
&lt;rect x="670" y="88" width="120" height="78" class="box oss"/>
&lt;text x="730" y="103" text-anchor="middle" class="tiny">Airflow · Prefect&lt;/text>
&lt;text x="730" y="117" text-anchor="middle" class="tiny">Dagster · Argo&lt;/text>
&lt;text x="730" y="131" text-anchor="middle" class="tiny">Kubeflow Pipelines&lt;/text>
&lt;text x="730" y="145" text-anchor="middle" class="tiny">Feast&lt;/text>
&lt;text x="730" y="159" text-anchor="middle" class="tiny">Argilla · Label Studio&lt;/text>
&lt;rect x="20" y="180" width="380" height="22" class="cross"/>
&lt;text x="210" y="195" text-anchor="middle" class="sm">Prompt versioning: Langfuse Prompts · MLflow Prompt Registry&lt;/text>
&lt;rect x="410" y="180" width="380" height="22" class="cross"/>
&lt;text x="600" y="195" text-anchor="middle" class="sm">Data versioning: DVC · lakeFS · OpenLineage · DataHub&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h2 id="la-analogía-la-caja-de-herramientas-del-electricista">La analogía: la caja de herramientas del electricista&lt;/h2>
&lt;p>Un electricista profesional llega a una instalación con una caja organizada por compartimentos. No improvisa: para cada tipo de cable hay un pelacables específico, para cada tornillo un destornillador del calibre exacto, para cada medida un multímetro y unas pinzas amperimétricas, para cada conexión la regleta o el conector adecuado. La diferencia entre un electricista profesional y un manitas no es que sepa más teoría — a menudo el manitas se ha leído manuales —, es que &lt;strong>tiene la herramienta correcta al alcance de la mano y sabe cuándo usar cada una&lt;/strong>. El día que falta el pelacables específico, improvisar con un cúter rompe el aislamiento, deja un cable mal terminado y el cuadro acaba volviendo a su sitio en garantía dos meses más tarde.&lt;/p>
&lt;p>El stack OSS LLMOps funciona igual. Para cada problema canónico —versionar un dataset, indexar un corpus para retrieval, servir tokens con batching dinámico, propagar &lt;code>trace_id&lt;/code> end-to-end, gestionar prompts con label &lt;code>production&lt;/code>, orquestar pipelines de retraining— hay una pieza canónica del ecosistema open source que lo resuelve, mantenida por una comunidad o fundación seria, con licencia clara y un gotcha bien documentado. El consultor que sabe qué herramienta usar para cada cosa monta un sistema robusto en semanas; el que improvisa con &amp;ldquo;lo que ya conoce el equipo&amp;rdquo; paga después en operativa, normalmente cuando el sistema lleva ya carga real y cualquier sustitución es caro.&lt;/p>
&lt;p>Este post abre la caja de herramientas y enseña cada ficha. No es un manual de uso — para eso están los posts de cada deep-dive enlazados al final —; es el &lt;strong>catálogo curado&lt;/strong>.&lt;/p>
&lt;h2 id="diagrama-del-stack-oss-de-referencia-conectado">Diagrama del stack OSS de referencia conectado&lt;/h2>
&lt;p>El catálogo cobra sentido cuando se ve cómo se conectan las piezas en una sola arquitectura coherente, que es la que el blog ha estado describiendo a lo largo de la serie. Las cajas no flotan; se hablan unas con otras por contratos estables (HTTP, gRPC, OTel, Kafka, S3/MinIO API).&lt;/p>
&lt;div class="diagram" style="max-width:820px;margin:1rem auto;">
&lt;svg viewBox="0 0 820 460" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="stack OSS LLMOps de referencia con cajas conectadas">
&lt;style>.b{stroke:#333;stroke-width:1.4;rx:6;fill:#eef2f7}.serv{fill:#ff8a4c;stroke:#a44}.data{fill:#dfe9f5;stroke:#356}.obs{fill:#d8eecf;stroke:#373}.ctrl{fill:#f5e3d8;stroke:#763}.bg{fill:#fafafa;stroke:#ccc;rx:8}.lbl{font:600 12px sans-serif;fill:#222}.sm{font:11px sans-serif;fill:#222}.tiny{font:600 10px sans-serif;fill:#222}.arr{stroke:#666;stroke-width:1.4;fill:none;marker-end:url(#a)}.otel{stroke:#1a73e8;stroke-width:1.4;fill:none;stroke-dasharray:3 2;marker-end:url(#ab)}&lt;/style>
&lt;defs>&lt;marker id="a" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;marker id="ab" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#1a73e8"/>&lt;/marker>&lt;/defs>
&lt;text x="410" y="20" text-anchor="middle" class="lbl">Stack OSS LLMOps conectado: serving, data, observabilidad y control plane&lt;/text>
&lt;rect x="20" y="40" width="780" height="80" class="b bg"/>
&lt;text x="30" y="58" class="tiny">PLANO DE SERVING&lt;/text>
&lt;rect x="40" y="68" width="120" height="40" class="b serv"/>&lt;text x="100" y="93" text-anchor="middle" class="sm">Envoy AI Gateway&lt;/text>
&lt;rect x="180" y="68" width="120" height="40" class="b serv"/>&lt;text x="240" y="93" text-anchor="middle" class="sm">vLLM (LoRA hot-swap)&lt;/text>
&lt;rect x="320" y="68" width="120" height="40" class="b serv"/>&lt;text x="380" y="93" text-anchor="middle" class="sm">KServe / Operator&lt;/text>
&lt;rect x="460" y="68" width="120" height="40" class="b serv"/>&lt;text x="520" y="93" text-anchor="middle" class="sm">Triton (multi-modelo)&lt;/text>
&lt;rect x="600" y="68" width="180" height="40" class="b serv"/>&lt;text x="690" y="93" text-anchor="middle" class="sm">Kubernetes (RKE2 + Cilium)&lt;/text>
&lt;path class="arr" d="M160,88 L180,88"/>&lt;path class="arr" d="M300,88 L320,88"/>
&lt;rect x="20" y="140" width="380" height="170" class="b bg"/>
&lt;text x="30" y="158" class="tiny">PLANO DE DATOS&lt;/text>
&lt;rect x="40" y="168" width="160" height="36" class="b data"/>&lt;text x="120" y="190" text-anchor="middle" class="sm">PostgreSQL + pgvector&lt;/text>
&lt;rect x="220" y="168" width="160" height="36" class="b data"/>&lt;text x="300" y="190" text-anchor="middle" class="sm">Qdrant (RAG)&lt;/text>
&lt;rect x="40" y="214" width="160" height="36" class="b data"/>&lt;text x="120" y="236" text-anchor="middle" class="sm">MinIO / Ceph (S3)&lt;/text>
&lt;rect x="220" y="214" width="160" height="36" class="b data"/>&lt;text x="300" y="236" text-anchor="middle" class="sm">Kafka + Debezium&lt;/text>
&lt;rect x="40" y="260" width="160" height="36" class="b data"/>&lt;text x="120" y="282" text-anchor="middle" class="sm">DVC + lakeFS&lt;/text>
&lt;rect x="220" y="260" width="160" height="36" class="b data"/>&lt;text x="300" y="282" text-anchor="middle" class="sm">Flink / Spark&lt;/text>
&lt;path class="arr" d="M380,186 L460,186 L460,88 L460,108"/>
&lt;rect x="420" y="140" width="380" height="170" class="b bg"/>
&lt;text x="430" y="158" class="tiny">PLANO DE OBSERVABILIDAD&lt;/text>
&lt;rect x="440" y="168" width="160" height="36" class="b obs"/>&lt;text x="520" y="190" text-anchor="middle" class="sm">OTel Collector&lt;/text>
&lt;rect x="620" y="168" width="160" height="36" class="b obs"/>&lt;text x="700" y="190" text-anchor="middle" class="sm">Langfuse&lt;/text>
&lt;rect x="440" y="214" width="160" height="36" class="b obs"/>&lt;text x="520" y="236" text-anchor="middle" class="sm">Tempo (traces)&lt;/text>
&lt;rect x="620" y="214" width="160" height="36" class="b obs"/>&lt;text x="700" y="236" text-anchor="middle" class="sm">Phoenix Arize OSS&lt;/text>
&lt;rect x="440" y="260" width="160" height="36" class="b obs"/>&lt;text x="520" y="282" text-anchor="middle" class="sm">Prometheus + Grafana&lt;/text>
&lt;rect x="620" y="260" width="160" height="36" class="b obs"/>&lt;text x="700" y="282" text-anchor="middle" class="sm">Loki + Tetragon&lt;/text>
&lt;path class="otel" d="M240,108 L240,130 L460,130 L460,168"/>
&lt;text x="350" y="146" class="tiny" fill="#1a73e8">OTel spans (gen_ai.*)&lt;/text>
&lt;rect x="20" y="330" width="780" height="110" class="b bg"/>
&lt;text x="30" y="348" class="tiny">CONTROL PLANE (Tune + Eval + Retrain + Prompt versioning)&lt;/text>
&lt;rect x="40" y="358" width="140" height="36" class="b ctrl"/>&lt;text x="110" y="380" text-anchor="middle" class="sm">Axolotl + PEFT&lt;/text>
&lt;rect x="200" y="358" width="140" height="36" class="b ctrl"/>&lt;text x="270" y="380" text-anchor="middle" class="sm">MLflow Tracking&lt;/text>
&lt;rect x="360" y="358" width="140" height="36" class="b ctrl"/>&lt;text x="430" y="380" text-anchor="middle" class="sm">Promptfoo + RAGAS&lt;/text>
&lt;rect x="520" y="358" width="140" height="36" class="b ctrl"/>&lt;text x="590" y="380" text-anchor="middle" class="sm">Argo / Kubeflow Pipelines&lt;/text>
&lt;rect x="680" y="358" width="100" height="36" class="b ctrl"/>&lt;text x="730" y="380" text-anchor="middle" class="sm">Argilla&lt;/text>
&lt;rect x="40" y="402" width="140" height="30" class="b ctrl"/>&lt;text x="110" y="420" text-anchor="middle" class="sm">Langfuse Prompts&lt;/text>
&lt;rect x="200" y="402" width="140" height="30" class="b ctrl"/>&lt;text x="270" y="420" text-anchor="middle" class="sm">Feast&lt;/text>
&lt;rect x="360" y="402" width="140" height="30" class="b ctrl"/>&lt;text x="430" y="420" text-anchor="middle" class="sm">NeMo Guardrails&lt;/text>
&lt;rect x="520" y="402" width="140" height="30" class="b ctrl"/>&lt;text x="590" y="420" text-anchor="middle" class="sm">OpenLineage + DataHub&lt;/text>
&lt;rect x="680" y="402" width="100" height="30" class="b ctrl"/>&lt;text x="730" y="420" text-anchor="middle" class="sm">Presidio&lt;/text>
&lt;path class="arr" d="M110,358 L110,300 L110,300"/>&lt;path class="arr" d="M110,300 L110,260 L120,260"/>
&lt;/svg>
&lt;/div>
&lt;p>Las flechas continuas marcan flujo de datos / control; las punteadas azules son trazas OTel. El plano K8s sostiene todo. El control plane abajo es donde viven los pipelines de retraining, los evals en CI, los prompts versionados y el lineage. El plano de datos a la izquierda alimenta tanto el serving (RAG, configs) como el control plane (datasets, lineage). El plano de observabilidad recibe del serving y de todo lo demás.&lt;/p>
&lt;p>Ahora vamos por etapas. Cada una abre con un párrafo de contexto, luego fichas de herramientas core (~150 palabras cada una), bullets de alternativas relevantes, y matriz de decisión específica al final.&lt;/p>
&lt;h2 id="etapa-1--data--transversal-data-versioning">Etapa 1 — Data + transversal Data versioning&lt;/h2>
&lt;p>La etapa Data resuelve tres problemas distintos que los principiantes confunden: &lt;strong>versionar&lt;/strong> datasets (que &lt;code>(dataset_id, version, hash)&lt;/code> exista y propague), &lt;strong>almacenar y servir&lt;/strong> el corpus operativo (object store + vector index + texto estructurado), y &lt;strong>moverlo&lt;/strong> entre sistemas con CDC y schemas estables. Cubierto en detalle en los posts de &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">data versioning con DVC y lakeFS&lt;/a>, &lt;a href="https://blog.lo0.es/posts/postgresql-qdrant-ingestion-microservicios/">PostgreSQL + Qdrant en ingestión&lt;/a> y &lt;a href="https://blog.lo0.es/posts/rag-kafka-datalake-arquitectura/">RAG sobre Kafka&lt;/a>.&lt;/p>
&lt;h3 id="dvc-data-version-control">DVC (Data Version Control)&lt;/h3>
&lt;p>DVC pone los datasets bajo control de versiones con la misma disciplina que git pone el código. Los apuntadores &lt;code>.dvc&lt;/code> viven en git (texto plano, ~200 bytes por dataset), el contenido grande vive en un object store remote (S3, MinIO, Azure Blob, GCS). Cada &lt;code>dvc add&lt;/code> calcula un hash SHA-256 del dataset, lo sube al remote y guarda el apuntador. La línea fundamental: el &lt;code>dataset_hash&lt;/code> se convierte en el ticket de equipaje que viaja al trainer, al experiment tracking y a la lineage. Un mismo dataset reentrenado dos veces produce el mismo hash, por tanto experimentos reproducibles. DVC se integra con MLflow y W&amp;amp;B como input artifact. &lt;strong>Gotcha:&lt;/strong> funciona bien para datasets que cambian por reemplazo (sustituyo &lt;code>train.jsonl&lt;/code> por una versión nueva) y peor para datasets con miles de ficheros pequeños que cambian individualmente. Para ese caso, se combina con lakeFS. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Iterative.ai&lt;/strong> desde 2017. Hay DVC Studio (gestionado) y &lt;code>dvc data&lt;/code> (CLI puro) en distintos planos.&lt;/p>
&lt;h3 id="lakefs">lakeFS&lt;/h3>
&lt;p>lakeFS lleva la semántica git (branch, commit, merge, rollback) a un bucket S3/MinIO/ADLS entero. Donde DVC versiona archivos individuales como apuntadores en git, lakeFS versiona &lt;strong>el bucket completo&lt;/strong>: puedes crear un branch del corpus, ingerir datos nuevos en el branch, validar que pasan checks (recall@10 sobre golden queries para embeddings, completitud para corpus tabular), y sólo entonces hacer merge a &lt;code>main&lt;/code>. Es la pieza que hace seguro el RAG continuo: el corpus en producción está siempre en &lt;code>main&lt;/code>, las actualizaciones se prueban en branches. Cuenta con hooks (pre-merge, pre-commit) que disparan validaciones automáticas, y con time-travel para reproducir el estado del bucket en una fecha pasada. &lt;strong>Gotcha:&lt;/strong> el overhead del manifest sobre buckets enormes (cientos de millones de objetos) merece dimensionamiento; lakeFS guarda metadatos en su propio Postgres, no en el bucket. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Treeverse&lt;/strong> desde 2020. Oferta gestionada: &lt;strong>lakeFS Cloud&lt;/strong>.&lt;/p>
&lt;h3 id="minio">MinIO&lt;/h3>
&lt;p>MinIO es el object store S3-compatible que rellena el hueco &amp;ldquo;S3 on-premise&amp;rdquo; sin sobresaltos. API idéntica a S3 (los SDKs de AWS funcionan apuntándole un endpoint distinto), cliente CLI propio (&lt;code>mc&lt;/code>), modo erasure-coded para tolerancia a fallo, replicación bucket-a-bucket, encryption at rest. Es la base sobre la que se montan los demás componentes del plano de datos: DVC remote, lakeFS underlying storage, snapshots de Postgres, MLflow artifacts, datasets de eval, modelos guardados, KV cache fabric distribuido. En despliegues pequeños se monta single-node multi-disk; en serios, clusters distribuidos. &lt;strong>Gotcha:&lt;/strong> la licencia cambió a &lt;strong>AGPLv3&lt;/strong> en 2021 (era Apache 2.0 antes), lo que implica que distribuir software conectado a MinIO obliga a abrir el código que se conecta. Para uso interno on-premise no es problema; para vendor que empaqueta MinIO en producto comercial, sí. Mantenida por &lt;strong>MinIO Inc.&lt;/strong> con oferta enterprise SUBNET y un fork comunitario llamado &lt;strong>AIStor&lt;/strong> lanzado en 2025.&lt;/p>
&lt;h3 id="qdrant">Qdrant&lt;/h3>
&lt;p>Qdrant es el vector database OSS más alineado con el patrón &amp;ldquo;corpus RAG por tenant con ACLs estrictas&amp;rdquo; del blog. Escrito en Rust, expone API REST + gRPC, indexa con HNSW + quantization scalar/binary para reducir memoria, soporta payload filtering eficiente (no es post-filtering: integra el filtro en la búsqueda HNSW), y permite colecciones aisladas por tenant. Para el escenario del &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">chatbot multi-tenant&lt;/a>, Qdrant es donde viven las &lt;code>tenant_&amp;lt;id&amp;gt;_kb_v3&lt;/code> con ACL strict. Escala bien horizontalmente (sharding por payload) y vertical (millones de chunks en un nodo con 64GB RAM). &lt;strong>Gotcha:&lt;/strong> la quantization binaria es agresiva — reduce VRAM 32× pero degrada recall 10-20%; activarla sin re-tune de threshold rompe retrieval silenciosamente. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Qdrant Solutions GmbH&lt;/strong> (Alemania). Hay Qdrant Cloud (gestionado) y soporte EU-only para casos ENS.&lt;/p>
&lt;h3 id="postgresql--pgvector">PostgreSQL + pgvector&lt;/h3>
&lt;p>Postgres 18 con la extensión &lt;code>pgvector&lt;/code> es el &amp;ldquo;vector database escondido&amp;rdquo; del stack: cuando el corpus es pequeño (sub-millón de embeddings) y ya hay Postgres en producción para datos operativos, montar Qdrant aparte es operativa cara. pgvector añade un tipo &lt;code>vector(dim)&lt;/code>, índices HNSW y IVF, y operadores &lt;code>&amp;lt;-&amp;gt;&lt;/code>, &lt;code>&amp;lt;#&amp;gt;&lt;/code>, &lt;code>&amp;lt;=&amp;gt;&lt;/code> para coseno, L2 y dot product. Combinado con &lt;code>tsvector&lt;/code> (búsqueda full-text de Postgres) permite &lt;strong>hybrid search&lt;/strong> dense + sparse en una sola query SQL. La 0.8 (2025) introdujo soporte halfvec y bit para reducir tamaño 4×-8×. &lt;strong>Gotcha:&lt;/strong> HNSW en pgvector consume bastante RAM para construir el índice (multiplica por ~2 el tamaño de los embeddings) y bloquea inserts durante el build; en producción se construye en un secondary, se promociona, y se descarta el primary. Licencia &lt;strong>PostgreSQL License&lt;/strong> (BSD-style permisiva) tanto en core como en pgvector. Mantenido por la &lt;strong>PostgreSQL Development Group&lt;/strong> + pgvector por &lt;strong>Andrew Kane&lt;/strong> + Crunchy Data + Neon.&lt;/p>
&lt;h3 id="apache-kafka--debezium">Apache Kafka + Debezium&lt;/h3>
&lt;p>Kafka es el bus de eventos donde se materializa el &amp;ldquo;todo lo que pasa en la empresa es un stream&amp;rdquo;. Para LLMOps en producción cumple dos funciones: &lt;strong>CDC desde sistemas fuente&lt;/strong> (Debezium captura cambios en Postgres / MySQL / MongoDB y los publica como topics) y &lt;strong>buffer de eventos LLM&lt;/strong> (cada request, cada feedback, cada eval result acaba en un topic con el &lt;code>trace_id&lt;/code> propagado). Como cuenta el &lt;a href="https://blog.lo0.es/posts/rag-kafka-datalake-arquitectura/">post sobre RAG sobre Kafka&lt;/a>, el corpus RAG se mantiene fresco capturando los cambios del CMS / sistema fuente como CDC, ejecutando el embedding en Flink streaming, e ingestando en Qdrant continuamente. &lt;strong>Gotcha:&lt;/strong> Kafka mal dimensionado con retención larga + topics multi-cliente se convierte en un agujero de disco rápido; medir el throughput por topic y la cardinalidad de keys antes de producción es obligatorio. Licencia Kafka &lt;strong>Apache 2.0&lt;/strong> (proyecto &lt;strong>ASF&lt;/strong>); Debezium &lt;strong>Apache 2.0&lt;/strong> (proyecto incubado por &lt;strong>Red Hat&lt;/strong>). Alternativa drop-in compatible Kafka: &lt;strong>Redpanda&lt;/strong> (BSL — uso comercial restringido).&lt;/p>
&lt;h3 id="apache-flink-mención-breve">Apache Flink (mención breve)&lt;/h3>
&lt;p>Flink procesa streams con latencia sub-segundo y semántica exactly-once. En el plano LLM se usa para: ejecutar embeddings en streaming (sobre topics CDC), agregar métricas online, materializar features para retraining. Licencia Apache 2.0, ASF. Alternativa común: &lt;strong>Spark Structured Streaming&lt;/strong> (también ASF, micro-batch latency).&lt;/p>
&lt;p>&lt;strong>Más opciones para Data&lt;/strong>, mencionadas en el blog:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ceph&lt;/strong> — object store para clusters grandes con replicación geo-distribuida. Licencia LGPL/Apache, &lt;strong>Red Hat / IBM&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Milvus&lt;/strong> — vector database C++ alternativa a Qdrant; mejor para corpus de miles de millones. Apache 2.0, &lt;strong>Zilliz&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Karapace&lt;/strong> — Schema Registry compatible Confluent OSS. Apache 2.0, &lt;strong>Aiven&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>DataHub / Apache Atlas / OpenMetadata&lt;/strong> — catalog + lineage. Apache 2.0, &lt;strong>Acryl Data / ASF / Collate&lt;/strong> respectivamente.&lt;/li>
&lt;li>&lt;strong>OpenLineage&lt;/strong> — estándar de eventos lineage cross-system. Apache 2.0, &lt;strong>Linux Foundation AI&amp;amp;Data&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Matriz de decisión — Data:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Si tu caso es&lt;/th>
&lt;th>Elige&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Corpus &amp;lt; 1M embeddings, ya tienes Postgres&lt;/td>
&lt;td>&lt;strong>pgvector&lt;/strong> (un componente menos)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corpus 1M-100M, multi-tenant con ACL&lt;/td>
&lt;td>&lt;strong>Qdrant&lt;/strong> (filtering integrado, ACLs por colección)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corpus &amp;gt; 100M, sharding agresivo&lt;/td>
&lt;td>&lt;strong>Milvus&lt;/strong> (escala lineal mejor a billones)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Datasets entrenamiento + experiment tracking&lt;/td>
&lt;td>&lt;strong>DVC&lt;/strong> sobre MinIO + integración MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corpus RAG con releases controlados&lt;/td>
&lt;td>&lt;strong>lakeFS&lt;/strong> sobre MinIO + hooks pre-merge&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quieres ambos&lt;/td>
&lt;td>&lt;strong>DVC + lakeFS&lt;/strong> complementarios (recomendación del blog)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="etapa-2--tune">Etapa 2 — Tune&lt;/h2>
&lt;p>La etapa Tune produce un nuevo &lt;code>model_id, model_version&lt;/code> —típicamente un adapter LoRA sobre un base estable— con lineage hasta el dataset y experiment tracking para reproducir. Detalle en el &lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">post de fine-tuning continuo&lt;/a>.&lt;/p>
&lt;h3 id="huggingface-transformers--peft">HuggingFace Transformers + PEFT&lt;/h3>
&lt;p>&lt;code>transformers&lt;/code> es la biblioteca canónica para cargar y entrenar modelos de la familia decoder-only (Llama, Mistral, Qwen, Gemma…) y encoder-decoder. &lt;code>peft&lt;/code> (Parameter-Efficient Fine-Tuning) es el complemento que añade soporte declarativo de LoRA, QLoRA, IA3 y adapters varios. Juntos forman el &lt;strong>core obligatorio&lt;/strong> del stack Tune OSS: cualquier framework superior (Axolotl, LLaMA-Factory) los usa por debajo. PEFT permite entrenar un adapter de ~280 MB (orden de magnitud) en lugar de un modelo completo de ~140 GB, con resultado funcional equivalente en la mayoría de tareas de ajuste de estilo / dominio. &lt;strong>Gotcha:&lt;/strong> PEFT con &lt;code>target_modules&lt;/code> mal configurado entrena un adapter que cubre solo Q y V de la atención, dejando fuera key, output proj y MLP. El resultado parece entrenado pero rinde mal; añadir &lt;code>target_modules=[&amp;quot;all-linear&amp;quot;]&lt;/code> corrige (a costa de adapter más grande). Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenidas por &lt;strong>Hugging Face SAS&lt;/strong> (empresa francesa); modelo de gobierno open con maintainers externos activos.&lt;/p>
&lt;h3 id="bitsandbytes">bitsandbytes&lt;/h3>
&lt;p>bitsandbytes implementa quantization de pesos a 8-bit y 4-bit con NF4 para modelos cargados con &lt;code>transformers&lt;/code>. Reduce los 140 GB de Llama 3 70B FP16 a ~40 GB en NF4, permitiendo entrenamiento QLoRA en una sola H100 80GB. El truco está en que los pesos quedan quantized en memoria pero los cómputos sensibles (atención, gradient updates en el adapter) se hacen en FP16/BF16 con dequantization al vuelo. Ideal para fine-tuning en hardware limitado y para serving con vLLM cuando se quiere reducir VRAM. &lt;strong>Gotcha:&lt;/strong> la NF4 quantization es lossy; en modelos pequeños (&amp;lt; 7B) la degradación de calidad es perceptible. Para production serving de modelos &amp;lt; 7B, se prefiere INT8 (más memoria, menos pérdida) o FP8 si el hardware lo soporta (H100 sí). Licencia &lt;strong>MIT&lt;/strong>, mantenida por &lt;strong>Tim Dettmers&lt;/strong> (originalmente en U. Washington, ahora con apoyo de Anthropic y HuggingFace).&lt;/p>
&lt;h3 id="mlflow-tracking">MLflow Tracking&lt;/h3>
&lt;p>MLflow es el experiment tracking OSS de referencia: cada run del trainer registra parameters (lr, batch size, epochs, target_modules), metrics (loss curves, eval scores), artifacts (modelo, tokenizer, configs) y crucialmente &lt;strong>input artifacts&lt;/strong> (dataset_id, dataset_hash, parent_run). El registry de modelos asocia cada &lt;code>model_version&lt;/code> a un &lt;code>run_id&lt;/code> reproducible. La línea de continuidad entre Tune y Deploy pasa por aquí: el deployment lee del registry el modelo a servir, con su lineage explícito. MLflow 2.x integra &lt;strong>MLflow Prompts&lt;/strong> (registry de prompts) y &lt;strong>MLflow Tracing&lt;/strong> (spans OTel-compatible), reduciendo número de componentes necesarios. &lt;strong>Gotcha:&lt;/strong> el backend store por defecto es SQLite — funciona para experimentos personales y se rompe en cluster compartido. En producción: Postgres como backend store + MinIO/S3 como artifact store. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>LF AI &amp;amp; Data&lt;/strong> (donado por Databricks en 2020).&lt;/p>
&lt;h3 id="axolotl">Axolotl&lt;/h3>
&lt;p>Axolotl envuelve &lt;code>transformers + PEFT + bitsandbytes + DeepSpeed + FSDP&lt;/code> en una configuración YAML declarativa: en lugar de escribir un script de ~300 líneas para configurar un fine-tuning, defines &lt;code>config.yml&lt;/code> con base model, dataset path, LoRA config, training hyperparams y run de una línea. Soporta cargas Llama, Mistral, Qwen, Gemma, Phi… Mantiene compatibilidad con HuggingFace Hub para descargar modelos y datasets, y con MLflow / W&amp;amp;B para tracking. Es el framework de conveniencia que el blog cita cuando habla de &amp;ldquo;fine-tuning productivo sin reinventar la rueda&amp;rdquo;. &lt;strong>Gotcha:&lt;/strong> el ritmo de cambios de la community es rápido; un &lt;code>config.yml&lt;/code> que funcionaba hace 6 meses puede romper con una versión actual por refactors internos. Pinneando la versión exacta de Axolotl en el entorno se mitiga. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>OpenAccess AI Collective&lt;/strong> (community-driven). Alternativa muy similar y más usada en China: &lt;strong>LLaMA-Factory&lt;/strong> (Apache 2.0, Beihang U.).&lt;/p>
&lt;h3 id="ray-train">Ray Train&lt;/h3>
&lt;p>Ray Train escala fine-tuning a múltiples nodos distribuyendo los workers en un cluster Ray. Mientras DeepSpeed y FSDP son &lt;strong>paralelismo intra-job&lt;/strong> (varios GPUs colaborando en un job), Ray Train es el &lt;strong>plano de orquestación&lt;/strong> que monta el cluster, lanza workers, gestiona checkpoints, recupera de fallos de nodo, integra con Slurm o Kubernetes. Para entrenamientos &amp;gt; 8 GPUs en clusters cambiantes, Ray Train evita la operativa de &amp;ldquo;lanzar manualmente N procesos torchrun con NCCL&amp;rdquo;. Se combina con MLflow para tracking. &lt;strong>Gotcha:&lt;/strong> la curva de aprendizaje de Ray es real; para un solo nodo 4-8 GPUs, &lt;code>torchrun&lt;/code> o Hugging Face Accelerate son más simples. Ray Train brilla cuando hay N nodos cambiantes. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Anyscale Inc.&lt;/strong> (commercial backer) + community. Alternativa más K8s-native: &lt;strong>Kubeflow Training Operator&lt;/strong> (Apache 2.0, LF AI &amp;amp; Data).&lt;/p>
&lt;p>&lt;strong>Más opciones para Tune:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DeepSpeed&lt;/strong> — paralelismo ZeRO 3 stages, mixed precision, offload CPU/NVMe. MIT, &lt;strong>Microsoft&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>FSDP&lt;/strong> (Fully Sharded Data Parallel) — paralelismo PyTorch nativo, alternativa a DeepSpeed. BSD, &lt;strong>Meta&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>LLaMA-Factory&lt;/strong> — equivalente a Axolotl con foco en Llama family. Apache 2.0, &lt;strong>Beihang University&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Matriz de decisión — Tune:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Si tu caso es&lt;/th>
&lt;th>Elige&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Fine-tune en 1 GPU 24GB (RTX 4090)&lt;/td>
&lt;td>&lt;strong>QLoRA con bitsandbytes NF4&lt;/strong> + Axolotl&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fine-tune en 1 H100 80GB modelos &amp;lt; 13B&lt;/td>
&lt;td>&lt;strong>LoRA bf16&lt;/strong> + Axolotl&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fine-tune en 4-8 GPUs nodo único&lt;/td>
&lt;td>&lt;strong>transformers + PEFT + Accelerate&lt;/strong> + MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fine-tune multi-nodo en cluster K8s&lt;/td>
&lt;td>&lt;strong>Kubeflow Training Operator&lt;/strong> o &lt;strong>Ray Train&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tracking obligatorio reproducible&lt;/td>
&lt;td>&lt;strong>MLflow + DVC input artifact&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quieres lo mínimo viable&lt;/td>
&lt;td>&lt;strong>Axolotl + MLflow&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="etapa-3--eval--guardrails">Etapa 3 — Eval + Guardrails&lt;/h2>
&lt;p>Eval valida candidatos pre y post promotion contra un golden set con métricas operativas; Guardrails ejecuta safety online. Detallado en los posts de &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">evals&lt;/a> y &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a>.&lt;/p>
&lt;h3 id="deepeval">DeepEval&lt;/h3>
&lt;p>DeepEval es la suite OSS de evals &amp;ldquo;tipo pytest&amp;rdquo;: defines tests con assertions sobre faithfulness, answer relevancy, contextual precision, hallucination rate, summarization quality… y los ejecutas en CI. Cada métrica es un evaluator: algunos rule-based, otros LLM-as-judge con prompts auditables. La filosofía es &amp;ldquo;evals como tests unitarios&amp;rdquo;: parametrizable por dataset, fallable en CI, integrable con GitHub Actions. &lt;strong>Gotcha:&lt;/strong> las métricas LLM-as-judge varían entre versiones de modelo judge — si el judge sube de versión, los thresholds dejan de tener significado estadístico anterior. Pinning explícito del modelo judge en config + recalibration periódico del threshold es disciplina obligatoria. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Confident AI&lt;/strong> (empresa); oferta SaaS comercial paralela. Comparable: &lt;strong>TruLens&lt;/strong> (MIT, &lt;strong>TruEra&lt;/strong>) y &lt;strong>G-Eval&lt;/strong> (académica).&lt;/p>
&lt;h3 id="ragas-rag-assessment">RAGAS (RAG Assessment)&lt;/h3>
&lt;p>RAGAS está especializada en evaluar pipelines RAG. Define cuatro métricas canónicas: &lt;strong>faithfulness&lt;/strong> (la respuesta se sostiene en los chunks recuperados), &lt;strong>answer relevancy&lt;/strong> (la respuesta responde a la query), &lt;strong>context precision&lt;/strong> (los chunks recuperados son relevantes), &lt;strong>context recall&lt;/strong> (se recuperaron todos los chunks relevantes). Cada métrica se computa con LLM-as-judge sobre un dataset de (query, contexto, respuesta esperada). Para un sistema RAG, RAGAS es el evaluator que mide si el retrieval está alineado con la generación. Se integra con Langfuse y MLflow para guardar resultados. &lt;strong>Gotcha:&lt;/strong> RAGAS funciona bien con golden sets de &amp;lt; 1000 ejemplos; sobre golden sets enormes el coste de judge LLM por evaluación se dispara — la práctica es muestrear. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Exploding Gradients&lt;/strong> (empresa de los autores).&lt;/p>
&lt;h3 id="promptfoo">Promptfoo&lt;/h3>
&lt;p>Promptfoo es el evaluator declarativo orientado a CI: defines en &lt;code>promptfooconfig.yaml&lt;/code> un set de prompts y un set de assertions (contiene texto X, no contiene Y, faithfulness &amp;gt; 0.8, judge approves…), apuntas a un provider (OpenAI compatible, vLLM, Ollama…), y &lt;code>promptfoo eval&lt;/code> corre la matriz prompts × providers × assertions, devuelve diff vs baseline y falla CI si algo regresiona. Es la pieza más &amp;ldquo;DevOps-friendly&amp;rdquo; del ecosistema de evals: integra trivial con GitHub Actions, GitLab CI o Jenkins. &lt;strong>Gotcha:&lt;/strong> los thresholds de assertions hay que calibrarlos con datos reales; arrancar con &lt;code>&amp;gt; 0.5&lt;/code> por defecto produce false positives que erosionan la confianza del equipo. Calibrar tras la primera semana. Licencia &lt;strong>MIT&lt;/strong>, mantenida por &lt;strong>Promptfoo, Inc.&lt;/strong> (empresa); oferta SaaS comercial Promptfoo Cloud existe pero el OSS es completo.&lt;/p>
&lt;h3 id="nemo-guardrails">NeMo Guardrails&lt;/h3>
&lt;p>NeMo Guardrails es el framework de NVIDIA para definir y aplicar políticas en sistemas LLM mediante un DSL llamado &lt;strong>Colang&lt;/strong>. Permite expresar reglas como &amp;ldquo;si el usuario pregunta sobre tema X, contestar con plantilla Y&amp;rdquo; o &amp;ldquo;si el modelo intenta hacer Z, bloquear&amp;rdquo; en una sintaxis tipo guion conversacional, no en Python. Se ejecuta como middleware entre app y modelo: input rails (validan lo que entra), output rails (validan lo que sale), dialog rails (controlan el flujo). Pensado para sistemas multi-turn complejos donde las políticas son nontriviales. &lt;strong>Gotcha:&lt;/strong> Colang añade latencia por turno (~50-200 ms dependiendo del policy graph); para chat conversacional alto throughput se desactivan dialog rails y se quedan solo input + output. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>NVIDIA&lt;/strong>.&lt;/p>
&lt;h3 id="microsoft-presidio">Microsoft Presidio&lt;/h3>
&lt;p>Presidio es el detector OSS de PII (Personally Identifiable Information) más maduro del ecosistema. Detecta DNI, NIE, IBAN, números de teléfono, emails, direcciones físicas, números de tarjeta de crédito, nombres propios, fechas de nacimiento… con recognizers basados en regex + NER (spaCy) + custom validators. Permite &lt;strong>redacción&lt;/strong> (sustituir por placeholders), &lt;strong>enmascarado&lt;/strong> (asteriscos) o &lt;strong>anonimización determinista&lt;/strong> (hash repetible). Para escenarios ENS/NIS2, es la pieza que se pone delante (en input) y detrás (en output) del LLM para garantizar que no se procesa ni emite PII. &lt;strong>Gotcha:&lt;/strong> los recognizers built-in cubren bien inglés y mal el resto; para español, catalán y vasco hay que añadir recognizers custom — disciplinada pero hacedero. Licencia &lt;strong>MIT&lt;/strong>, mantenida por &lt;strong>Microsoft&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Más opciones para Eval:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Phoenix Arize OSS&lt;/strong> — combina tracing + evals, alternativa a Langfuse Evals. ELv2, &lt;strong>Arize AI&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>lm-eval-harness&lt;/strong> — suite académica con benchmarks estándar (MMLU, HellaSwag…). MIT, &lt;strong>EleutherAI&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>HELM&lt;/strong> — evals holísticos académicos. Apache 2.0, &lt;strong>Stanford CRFM&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Guardrails AI&lt;/strong> — alternativa pythonic a NeMo Guardrails. Apache 2.0, &lt;strong>Guardrails AI Inc.&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>LlamaGuard / PromptGuard / ShieldGemma&lt;/strong> — modelos de safety, no frameworks. Pesos abiertos, Meta / Google.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Matriz de decisión — Eval + Guardrails:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Si tu caso es&lt;/th>
&lt;th>Elige&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Eval en CI tipo &amp;ldquo;pytest para LLMs&amp;rdquo;&lt;/td>
&lt;td>&lt;strong>Promptfoo + GitHub Actions&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Eval específico de pipeline RAG&lt;/td>
&lt;td>&lt;strong>RAGAS + Langfuse datasets&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Eval general con métricas custom&lt;/td>
&lt;td>&lt;strong>DeepEval + dataset MLflow&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Dialog policy con reglas declarativas&lt;/td>
&lt;td>&lt;strong>NeMo Guardrails (Colang)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Solo PII redaction in/out&lt;/td>
&lt;td>&lt;strong>Presidio&lt;/strong> (no necesitas NeMo)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Safety model abierto en español&lt;/td>
&lt;td>&lt;strong>LlamaGuard 3&lt;/strong> o &lt;strong>ShieldGemma&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="etapa-4--deploy">Etapa 4 — Deploy&lt;/h2>
&lt;p>Deploy sirve tokens al usuario con throughput y latencia predecibles, adapter hot-swap y multi-tenancy si aplica. Cubierto en los posts de &lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en K8s&lt;/a>, &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">operators LLM&lt;/a>, &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">cluster multi-tenant&lt;/a>, &lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a>, &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a> y &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">disaggregated serving&lt;/a>.&lt;/p>
&lt;h3 id="vllm">vLLM&lt;/h3>
&lt;p>vLLM es &lt;strong>el&lt;/strong> motor de inferencia OSS de referencia. Implementa &lt;strong>PagedAttention&lt;/strong> (paging del KV cache estilo memoria virtual, evita fragmentación), &lt;strong>continuous batching&lt;/strong> (las requests se incorporan al batch a medida que llegan, en lugar de esperar al batch siguiente), &lt;strong>prefix caching&lt;/strong> (los prefijos comunes — system prompts — no recomputan KV cache), &lt;strong>LoRA hot-swap&lt;/strong> (&lt;code>--enable-lora&lt;/code> permite cargar y descargar adapters sin reiniciar el motor), API &lt;strong>OpenAI-compatible&lt;/strong>, y soporte &lt;strong>disaggregated prefill/decode&lt;/strong> desde 2025. Cubre del modelo Llama 3 / Mistral / Qwen / DeepSeek casi todo. &lt;strong>Gotcha:&lt;/strong> el throughput máximo solo se alcanza con &lt;code>--max-num-seqs&lt;/code> y &lt;code>--gpu-memory-utilization&lt;/code> tuneados para el modelo y hardware concretos; valores por defecto son conservadores. La sesión inicial de tuning compensa: 2-3x de throughput. Licencia &lt;strong>Apache 2.0&lt;/strong>, originada en UC Berkeley, hoy mantenida por &lt;strong>vLLM Project / LF AI &amp;amp; Data&lt;/strong> + comunidad amplia (Red Hat, NVIDIA, AWS, IBM contribuyen). Alternativas serias en el mismo bucket: &lt;strong>TGI&lt;/strong> (Apache 2.0, &lt;strong>Hugging Face&lt;/strong>), &lt;strong>SGLang&lt;/strong> (Apache 2.0, &lt;strong>LMSys&lt;/strong>), &lt;strong>TensorRT-LLM&lt;/strong> (Apache 2.0, &lt;strong>NVIDIA&lt;/strong>, requiere conversión).&lt;/p>
&lt;h3 id="kserve">KServe&lt;/h3>
&lt;p>KServe es el operator de Kubernetes para servir modelos ML, incluido LLM, en un patrón declarativo: defines un &lt;code>InferenceService&lt;/code> YAML con el modelo y predictor (que puede ser vLLM, TGI, Triton, o un container custom) y KServe se encarga de scheduling sobre nodos GPU, autoscaling (incluido scale-to-zero), traffic splitting para canary, model registry integration. Es la capa que estandariza el &amp;ldquo;cómo se despliega un modelo en K8s&amp;rdquo; entre múltiples motores, en lugar de inventar YAML específicos por motor. Soporta multi-modelo con &lt;strong>Inference Graphs&lt;/strong> (encadenar prepocesador → modelo → postprocesador) y integra con KEDA/Karpenter para autoscaling de GPU pools. &lt;strong>Gotcha:&lt;/strong> scale-to-zero en GPU funciona mal en la práctica porque el warm-up (cargar pesos en VRAM) tarda decenas de segundos; mejor &lt;code>minReplicas: 1&lt;/code>. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>Kubeflow / LF AI &amp;amp; Data&lt;/strong>. Alternativas: &lt;strong>KubeRay&lt;/strong> (Apache 2.0, &lt;strong>Anyscale&lt;/strong>), &lt;strong>llm-d&lt;/strong> (Apache 2.0, &lt;strong>CNCF&lt;/strong>), &lt;strong>KAITO&lt;/strong> (MIT, &lt;strong>Microsoft Azure&lt;/strong>).&lt;/p>
&lt;h3 id="triton-inference-server">Triton Inference Server&lt;/h3>
&lt;p>Triton sirve modelos heterogéneos en un solo backend: LLM (vía backend vLLM o TensorRT-LLM), modelos tradicionales (ONNX, TorchScript, TensorFlow), modelos custom. Para sistemas donde se mezclan inferencia LLM con clasificadores tradicionales, encoders de embeddings, reranking models, OCR, etc., Triton evita tener N motores distintos en N pods. Soporta ensemble models (encadenar modelos en una sola request), dynamic batching, model versioning, model warmup. &lt;strong>Gotcha:&lt;/strong> Triton es flexible pero pesado de operar; para sistemas que sirven sólo LLM, vLLM directamente es más simple y más optimizado. Triton brilla cuando hay heterogeneidad real. Licencia &lt;strong>BSD-3-Clause&lt;/strong>, mantenido por &lt;strong>NVIDIA&lt;/strong>.&lt;/p>
&lt;h3 id="envoy-ai-gateway">Envoy AI Gateway&lt;/h3>
&lt;p>Envoy AI Gateway es el &amp;ldquo;API gateway con conciencia de LLM&amp;rdquo; del ecosistema CNCF. Construido sobre Envoy Proxy, añade conocimiento de las APIs OpenAI-compatible (chat completions, embeddings, etc.), routing entre múltiples backends (vLLM local + OpenAI + Anthropic + Bedrock), &lt;strong>token-based rate limiting&lt;/strong> (limita por tokens/minuto, no por requests), retries inteligentes, fallback entre proveedores, observability OTel built-in. Es la pieza que materializa &amp;ldquo;AI Gateway&amp;rdquo; como categoría arquitectónica. &lt;strong>Gotcha:&lt;/strong> la integración con autenticación (OIDC, JWT) es flexible pero requiere configuración Envoy detallada; un AI Gateway &amp;ldquo;out of the box&amp;rdquo; sin configuración produce un Envoy que pasa todo. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>CNCF&lt;/strong> desde la donación inicial de Tetrate. Alternativas: &lt;strong>LiteLLM Proxy&lt;/strong> (MIT, &lt;strong>BerriAI&lt;/strong>), &lt;strong>Portkey&lt;/strong> (MIT, &lt;strong>Portkey AI&lt;/strong>), &lt;strong>Kong AI Gateway&lt;/strong> (Apache 2.0 base + EE, &lt;strong>Kong Inc.&lt;/strong>).&lt;/p>
&lt;h3 id="llamacpp">llama.cpp&lt;/h3>
&lt;p>llama.cpp sirve LLMs en CPUs (y Apple Silicon, GPUs vía Vulkan/Metal/CUDA) con quantization muy agresiva (GGUF format, hasta 2-bit). Es la opción canónica para inferencia en hardware sin GPU dedicada — edge devices, workstations, máquinas de desarrollo. Cubre desde modelos pequeños (Phi-3, Gemma 2B) a Llama 70B en hardware con suficiente RAM. &lt;strong>Gotcha:&lt;/strong> la latencia en CPU es órdenes de magnitud peor que en GPU dedicada — útil para evals offline, drift checks, desarrollo local, no para serving productivo en cargas reales. Licencia &lt;strong>MIT&lt;/strong>, mantenida por &lt;strong>Georgi Gerganov&lt;/strong> + community.&lt;/p>
&lt;p>&lt;strong>Más opciones para Deploy:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>TensorRT-LLM&lt;/strong> — máxima optimización en NVIDIA Hopper/Ada. Apache 2.0, NVIDIA.&lt;/li>
&lt;li>&lt;strong>SGLang&lt;/strong> — buena para cargas con structured generation y JSON. Apache 2.0, LMSys.&lt;/li>
&lt;li>&lt;strong>TGI&lt;/strong> — alternativa madura, foco en HuggingFace ecosystem. Apache 2.0, HuggingFace.&lt;/li>
&lt;li>&lt;strong>NVIDIA Dynamo&lt;/strong> — disaggregated serving multinodo. Apache 2.0, NVIDIA.&lt;/li>
&lt;li>&lt;strong>llm-d&lt;/strong> — operator K8s específico para LLM. Apache 2.0, CNCF.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Matriz de decisión — Deploy:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Si tu caso es&lt;/th>
&lt;th>Elige&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Production serving en NVIDIA H100/A100&lt;/td>
&lt;td>&lt;strong>vLLM&lt;/strong> (default seguro)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Squeezing absoluto de throughput Hopper&lt;/td>
&lt;td>&lt;strong>TensorRT-LLM&lt;/strong> + plugin vLLM o standalone&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Edge / dev local sin GPU&lt;/td>
&lt;td>&lt;strong>llama.cpp&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Multi-modelo (LLM + clasificadores + encoders)&lt;/td>
&lt;td>&lt;strong>Triton&lt;/strong> con backend vLLM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>K8s declarativo con autoscaling&lt;/td>
&lt;td>&lt;strong>KServe&lt;/strong> + vLLM como predictor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AI Gateway con token rate limiting&lt;/td>
&lt;td>&lt;strong>Envoy AI Gateway&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cluster GPU multi-nodo disaggregated&lt;/td>
&lt;td>&lt;strong>NVIDIA Dynamo&lt;/strong> sobre vLLM&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="etapa-5--observe">Etapa 5 — Observe&lt;/h2>
&lt;p>Observe propaga &lt;code>trace_id&lt;/code> end-to-end, emite métricas runtime, ejecuta judge LLM sobre sampling y detecta drift. Detallado en &lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">tracing con AgentSight&lt;/a>, &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability con OTel&lt;/a> y &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a>.&lt;/p>
&lt;h3 id="opentelemetry-collector">OpenTelemetry Collector&lt;/h3>
&lt;p>OTel Collector es el agente que recibe traces, metrics y logs en formato OTel (o en cualquier otro vía receivers), los procesa (filtros, sampling, atributo enrichment, redacción PII), y los enruta a uno o varios backends (Tempo, Jaeger, Prometheus, Loki, Langfuse…). Es &lt;strong>la pieza que desacopla las apps del backend de observabilidad&lt;/strong>: cambiar de Tempo a Jaeger es cambiar el exporter del Collector, no la app. Para LLMOps, importa especialmente porque la spec &lt;strong>OTel GenAI semantic conventions&lt;/strong> define los atributos &lt;code>gen_ai.request.model&lt;/code>, &lt;code>gen_ai.prompt.version&lt;/code>, &lt;code>gen_ai.response.tokens&lt;/code>, etc., que cosen el &lt;code>trace_id&lt;/code> con el lineage del sistema. &lt;strong>Gotcha:&lt;/strong> la configuración del Collector tiende a crecer; sin disciplina y revisión periódica, acaba en un YAML de 800 líneas que nadie entiende. Modularizar con &lt;code>extensions&lt;/code> ayuda. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>CNCF / OpenTelemetry Project&lt;/strong>.&lt;/p>
&lt;h3 id="tempo-traces--jaeger">Tempo (traces) + Jaeger&lt;/h3>
&lt;p>Grafana Tempo es el backend de trazas distribuidas optimizado para coste: usa object store (S3/MinIO) en lugar de Elasticsearch, deduplica por &lt;code>trace_id&lt;/code>, integra nativamente con Grafana para visualización. Para LLMOps, donde una request real genera 10-30 spans (gateway, prompt pull, RAG retrieval, prefill, decode N veces, scoring), Tempo aguanta volúmenes altos con coste razonable. &lt;strong>Jaeger&lt;/strong> es la alternativa CNCF más establecida, mejor para casos &amp;lt; 100k traces/día, peor para object store nativo. &lt;strong>Gotcha:&lt;/strong> Tempo no tiene indexing tradicional; búsquedas como &amp;ldquo;traces que tardaron &amp;gt; 5s y tocaron al tenant X&amp;rdquo; requieren el &lt;strong>TraceQL&lt;/strong> + Grafana, no son tan rápidas como en Jaeger con Elasticsearch. Para diagnóstico ad-hoc inmediato, conviene mantener un Jaeger paralelo con sampling agresivo. Licencias &lt;strong>AGPL 3.0&lt;/strong> (Tempo) y &lt;strong>Apache 2.0&lt;/strong> (Jaeger), mantenidas por &lt;strong>Grafana Labs&lt;/strong> y &lt;strong>CNCF&lt;/strong> respectivamente.&lt;/p>
&lt;h3 id="prometheus--grafana">Prometheus + Grafana&lt;/h3>
&lt;p>Prometheus es la base de métricas time-series del ecosistema. Modelo pull (scrapes endpoints &lt;code>/metrics&lt;/code>), PromQL para queries, exporters para todo (Postgres, Kafka, NVIDIA GPU vía &lt;code>dcgm-exporter&lt;/code>, vLLM nativo). Grafana visualiza Prometheus + Tempo + Loki en un solo plano. Para LLMOps, las métricas críticas son &lt;code>gpu_utilization&lt;/code>, &lt;code>kv_cache_usage_pct&lt;/code>, &lt;code>tokens_per_second&lt;/code>, &lt;code>prefill_latency_p95&lt;/code>, &lt;code>decode_latency_p95&lt;/code>, &lt;code>queue_depth&lt;/code>, agregadas por tenant. &lt;strong>Gotcha:&lt;/strong> Prometheus es muy bueno hasta ~1M series activas; por encima conviene &lt;strong>Thanos&lt;/strong> o &lt;strong>Mimir&lt;/strong> para retención larga y escalabilidad horizontal. Para LLM cluster típico de blog (4-8 H100), Prometheus solo basta. Licencias &lt;strong>Apache 2.0&lt;/strong> (Prometheus, &lt;strong>CNCF&lt;/strong>) y &lt;strong>AGPL 3.0&lt;/strong> (Grafana 10+, &lt;strong>Grafana Labs&lt;/strong>).&lt;/p>
&lt;h3 id="langfuse">Langfuse&lt;/h3>
&lt;p>Langfuse es el observability + prompt management OSS específico para LLM. Captura spans con semantic conventions LLM (input, output, model, tokens, latency, score, user_id, session_id), las visualiza como &lt;strong>traces conversacionales&lt;/strong> (no solo árboles de spans), gestiona &lt;strong>prompts versionados con label &lt;code>production&lt;/code>&lt;/strong> y permite &lt;strong>datasets curados + evals&lt;/strong> desde la misma UI. Para LLMOps en serio, Langfuse rellena el hueco que ni Tempo ni Jaeger cubren: una UI de tracing pensada para LLM-first. &lt;strong>Gotcha:&lt;/strong> Langfuse mantiene su propio store (Postgres + ClickHouse para alto volumen); en cluster grandes la operativa de ClickHouse merece atención. Para arrancar, solo-Postgres aguanta. Licencia &lt;strong>MIT&lt;/strong> del OSS core, &lt;strong>EE Enterprise Edition&lt;/strong> con features adicionales (SSO, audit logs, advanced RBAC). Mantenida por &lt;strong>Langfuse GmbH&lt;/strong> (Berlín, alemana). Hay Langfuse Cloud (SaaS).&lt;/p>
&lt;h3 id="phoenix-arize-oss">Phoenix Arize OSS&lt;/h3>
&lt;p>Phoenix es el OSS de Arize AI para LLM observability + evals, alternativa a Langfuse con énfasis distinto: más orientado a evaluation y debugging visual (embedding drift, cluster analysis), menos a prompt management. Buena pareja con Langfuse cuando se quiere doble enfoque: Langfuse para &amp;ldquo;traces conversacionales producción&amp;rdquo;, Phoenix para &amp;ldquo;investigación exploratoria del comportamiento del modelo&amp;rdquo;. &lt;strong>Gotcha:&lt;/strong> Phoenix duplica funcionalidad con Langfuse y con MLflow; tener los tres en producción multiplica operativa. Elegir uno principal y los otros como complemento. Licencia &lt;strong>Elastic License 2.0&lt;/strong> (no es OSI strictly), mantenida por &lt;strong>Arize AI&lt;/strong>.&lt;/p>
&lt;h3 id="cilium-tetragon--hubble">Cilium Tetragon + Hubble&lt;/h3>
&lt;p>Tetragon (eBPF runtime security observer) y Hubble (eBPF network observer) son las piezas de bajo nivel que dan visibilidad de runtime real al cluster: qué procesos se ejecutan en qué pods, qué syscalls hacen, qué conexiones de red abren, en tiempo real. Para entornos ENS/NIS2 que exigen &amp;ldquo;demuestra qué se ejecutó en producción&amp;rdquo;, Tetragon es la capa de auditoría irrefutable: cada ejecución de proceso con su parent, sus capabilities, su contexto K8s. Hubble visualiza flujos network por pod, namespace, service. &lt;strong>Gotcha:&lt;/strong> la cantidad de eventos generados es alta; sin filtrado en kernel (que Tetragon soporta con &lt;code>TracingPolicy&lt;/code>), satura el plano observability rápido. Disciplina en policies. Licencia &lt;strong>Apache 2.0&lt;/strong> ambos, mantenidos por &lt;strong>Cilium / CNCF / Isovalent&lt;/strong>.&lt;/p>
&lt;h3 id="evidently-ai">Evidently AI&lt;/h3>
&lt;p>Evidently es la librería OSS para &lt;strong>drift detection&lt;/strong>: compara distribuciones de inputs y outputs entre dos ventanas temporales (entrenamiento vs producción, semana actual vs semana anterior), aplica tests estadísticos (KS, PSI, Wasserstein, chi-square) y genera reports HTML. Para LLMOps detecta cuándo la distribución de prompts cambia (nuevos temas, nuevas longitudes, nuevos idiomas) o cuándo el modelo empieza a responder más corto/largo/diferente. &lt;strong>Gotcha:&lt;/strong> Evidently está orientada a tabular y embeddings; para texto crudo conviene combinarla con un encoder embedder que produzca vectores antes de aplicar tests. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Evidently AI&lt;/strong> (empresa). Alternativas: &lt;strong>NannyML&lt;/strong> (Apache 2.0, &lt;strong>NannyML BV&lt;/strong>), &lt;strong>Alibi Detect&lt;/strong> (Apache 2.0, &lt;strong>Seldon&lt;/strong>).&lt;/p>
&lt;p>&lt;strong>Más opciones para Observe:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Loki&lt;/strong> — backend logs estilo Prometheus para Grafana. AGPL 3.0, Grafana Labs.&lt;/li>
&lt;li>&lt;strong>Pixie&lt;/strong> — eBPF observability auto-instrumentado. Apache 2.0, CNCF.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Matriz de decisión — Observe:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Si tu caso es&lt;/th>
&lt;th>Elige&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Stack mínimo viable&lt;/td>
&lt;td>&lt;strong>OTel Collector + Tempo + Prometheus + Grafana + Langfuse&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Traces con búsqueda ad-hoc fuerte&lt;/td>
&lt;td>Añadir &lt;strong>Jaeger&lt;/strong> con sampling agresivo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Compliance ENS / NIS2 runtime audit&lt;/td>
&lt;td>&lt;strong>Tetragon + Hubble&lt;/strong> + retention obligada&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Investigación exploratoria del modelo&lt;/td>
&lt;td>&lt;strong>Phoenix Arize OSS&lt;/strong> además de Langfuse&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Drift detection estadístico&lt;/td>
&lt;td>&lt;strong>Evidently&lt;/strong> sobre embeddings + inputs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cluster &amp;gt; 1M series Prometheus&lt;/td>
&lt;td>&lt;strong>Mimir&lt;/strong> (Grafana Labs) o &lt;strong>Thanos&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="etapa-6--retrain--transversales">Etapa 6 — Retrain + transversales&lt;/h2>
&lt;p>Retrain cierra el bucle feedback → triage → dataset enriquecido → adapter nuevo. Prompt versioning y data versioning cosen lineage cross-stage. Detallado en &lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">retrain&lt;/a>, &lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">prompt versioning&lt;/a> y &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">data versioning&lt;/a>.&lt;/p>
&lt;h3 id="apache-airflow">Apache Airflow&lt;/h3>
&lt;p>Airflow es el scheduler de DAGs OSS más establecido. Defines workflows como código Python (DAGs), cada DAG con tareas (operators) que se ejecutan según dependencias declaradas + schedule cron. Para retraining: una DAG semanal que extrae feedback de Postgres, lo triagea con LLM-as-classifier, enriquece el dataset enriquecido en DVC, lanza el job de fine-tuning en Kubernetes, ejecuta evals contra el golden set, y promueve si pasa gates. Ecosistema enorme de operators para todo (S3, Postgres, Kafka, Slack, K8s, Spark…). &lt;strong>Gotcha:&lt;/strong> Airflow 2.x mejoró mucho desde el caos de 1.x, pero el scheduler sigue siendo un componente que merece atención operativa (Postgres backend, executor pool, sidecar workers); para pipelines simples es over-engineering. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>ASF&lt;/strong>.&lt;/p>
&lt;h3 id="argo-workflows">Argo Workflows&lt;/h3>
&lt;p>Argo Workflows es el equivalente K8s-native de Airflow: cada paso es un container, los DAGs se definen como YAML K8s, el ejecutor es el propio Kubernetes. Para entornos donde &lt;strong>todo es K8s&lt;/strong>, Argo encaja sin un componente extra que mantener. Las tareas largas (fine-tuning de 6 horas) se ejecutan como Pods que sobreviven a fallos del control plane. Integra trivial con Kubeflow Pipelines (que se construye encima). &lt;strong>Gotcha:&lt;/strong> la sintaxis YAML de Argo es verbosa; para DAGs complejos, Argo se siente menos productivo que Airflow en Python. Soluciones: &lt;strong>Hera&lt;/strong> (DSL Python para Argo, &lt;strong>DataBricks contribution&lt;/strong>) o &lt;strong>Argo + custom CRDs&lt;/strong>. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>CNCF&lt;/strong>.&lt;/p>
&lt;h3 id="kubeflow-pipelines">Kubeflow Pipelines&lt;/h3>
&lt;p>Kubeflow Pipelines es la capa por encima de Argo Workflows orientada específicamente a ML: artifact tracking, experiment tracking, pipeline templates reutilizables, componentes versionados. Construido sobre Argo, añade el modelo conceptual ML (input artifact, output artifact, metrics) que Argo crudo no tiene. Para retraining cíclico en cluster K8s, es la opción más &amp;ldquo;ML-ready&amp;rdquo; del ecosistema OSS. &lt;strong>Gotcha:&lt;/strong> Kubeflow como suite completa es pesada (10+ componentes); muchas org instalan solo Pipelines + Training Operator + Katib y omiten Notebook Server / KFServing legacy. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>CNCF / LF AI &amp;amp; Data&lt;/strong>.&lt;/p>
&lt;h3 id="feast">Feast&lt;/h3>
&lt;p>Feast es el feature store OSS más usado. Define &lt;strong>feature views&lt;/strong> sobre fuentes batch (BigQuery, Postgres, Parquet) y online (Redis, DynamoDB, Postgres con extension), expone una API consistente para read-during-training y read-during-inference (point-in-time correctness), y garantiza que las features del modelo en producción son las mismas que con las que se entrenó. Para LLMOps donde el modelo necesita features de usuario / sesión / contexto consistentes (último plan, antigüedad como cliente, tickets recientes), Feast da la disciplina. &lt;strong>Gotcha:&lt;/strong> para muchos sistemas LLM puros (chatbot RAG sin features complejas), Feast es over-engineering — basta con Postgres. Cuando hay features de verdad (recomendación, scoring, ranking), Feast brilla. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenido por &lt;strong>LF AI &amp;amp; Data&lt;/strong>.&lt;/p>
&lt;h3 id="argilla">Argilla&lt;/h3>
&lt;p>Argilla es la plataforma OSS de anotación + HiL (human-in-the-loop) más alineada con LLMOps moderno. Crea proyectos de anotación con templates (clasificación, ranking, span annotation, RLHF preference, free-form text), conecta con HuggingFace datasets, integra con Langfuse para importar traces desde producción como casos a anotar. Soporta múltiples anotadores con reconciliación, kappa scoring, control de calidad. Para enriquecer datasets de retrain con casos del cluster &amp;ldquo;tono brusco&amp;rdquo; del &lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">post de Retrain&lt;/a>, Argilla es el frontend. &lt;strong>Gotcha:&lt;/strong> Argilla requiere Elasticsearch para production performance; para experimentos pequeños vale con SQLite. Licencia &lt;strong>Apache 2.0&lt;/strong>, mantenida por &lt;strong>Argilla, Inc.&lt;/strong> (adquirida por &lt;strong>Hugging Face&lt;/strong> en 2024). Alternativa: &lt;strong>Label Studio&lt;/strong> (Apache 2.0, &lt;strong>HumanSignal&lt;/strong>), más generalista, menos LLM-first.&lt;/p>
&lt;h3 id="langfuse-prompts--mlflow-prompt-registry">Langfuse Prompts + MLflow Prompt Registry&lt;/h3>
&lt;p>Langfuse Prompts gestiona prompts como entidades versionadas con labels (production, staging, experiment). El cliente lee el prompt activo de Langfuse en el path de la request (con cache local de pocos segundos) y propaga &lt;code>prompt_id, prompt_version&lt;/code> al span OTel — exactamente como hace el &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a>. MLflow Prompt Registry hace lo mismo con un modelo conceptual ligeramente distinto (sin labels-as-pointers; usa stages como Models registry). Ambas válidas; la elección depende de qué herramienta de tracking ya hay. &lt;strong>Gotcha (Langfuse):&lt;/strong> las labels son mutables — cambiar &lt;code>production&lt;/code> apunta a otra versión sin auditoría explícita; conviene desplegar prompts vía PR contra el repo de configs, no manualmente en UI. Licencias y gobierno cubiertos arriba.&lt;/p>
&lt;p>&lt;strong>Más opciones para Retrain + transversales:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prefect&lt;/strong> — DAGs Python &amp;ldquo;moderno&amp;rdquo;, alternativa a Airflow. Apache 2.0, &lt;strong>Prefect Tech&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Dagster&lt;/strong> — DAGs con foco fuerte en data assets. Apache 2.0, &lt;strong>Dagster Labs&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Label Studio&lt;/strong> — anotación generalista. Apache 2.0, &lt;strong>HumanSignal&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>OpenLineage&lt;/strong> — estándar de eventos lineage cross-system. Apache 2.0, &lt;strong>LF AI &amp;amp; Data&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>DataHub / Apache Atlas / OpenMetadata&lt;/strong> — catalog + lineage con UI. Apache 2.0.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Matriz de decisión — Retrain + transversales:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Si tu caso es&lt;/th>
&lt;th>Elige&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Pipelines simples con catálogo de operators&lt;/td>
&lt;td>&lt;strong>Airflow&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Todo es K8s, minimalismo de componentes&lt;/td>
&lt;td>&lt;strong>Argo Workflows&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ML pipelines con artifact tracking&lt;/td>
&lt;td>&lt;strong>Kubeflow Pipelines&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Anotación HiL para retrain LLM&lt;/td>
&lt;td>&lt;strong>Argilla&lt;/strong> + integración Langfuse&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Features compartidas entre training e inference&lt;/td>
&lt;td>&lt;strong>Feast&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sin features complejos, sólo prompts + LLM&lt;/td>
&lt;td>Saltar Feast&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prompt registry ligero&lt;/td>
&lt;td>&lt;strong>Langfuse Prompts&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ya hay MLflow centralizado&lt;/td>
&lt;td>&lt;strong>MLflow Prompt Registry&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="tabla-maestra-licencia-gobierno-y-oferta-enterprise">Tabla maestra: licencia, gobierno y oferta enterprise&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Herramienta&lt;/th>
&lt;th>Licencia&lt;/th>
&lt;th>Gobierno / mantenedor&lt;/th>
&lt;th>EE / SaaS comercial&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>DVC&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Iterative.ai&lt;/td>
&lt;td>DVC Studio&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>lakeFS&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Treeverse&lt;/td>
&lt;td>lakeFS Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MinIO&lt;/strong>&lt;/td>
&lt;td>AGPL v3&lt;/td>
&lt;td>MinIO Inc.&lt;/td>
&lt;td>SUBNET / AIStor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Qdrant&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Qdrant GmbH&lt;/td>
&lt;td>Qdrant Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>pgvector&lt;/strong>&lt;/td>
&lt;td>PostgreSQL License&lt;/td>
&lt;td>Andrew Kane + community&lt;/td>
&lt;td>— (built-in Postgres clouds)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PostgreSQL&lt;/strong>&lt;/td>
&lt;td>PostgreSQL License&lt;/td>
&lt;td>PostgreSQL Global Dev Group&lt;/td>
&lt;td>múltiples managed (Crunchy, Neon, Aiven, EDB)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Apache Kafka&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>ASF&lt;/td>
&lt;td>Confluent Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Debezium&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Red Hat / ASF&lt;/td>
&lt;td>Debezium Server / Confluent Connectors&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Apache Flink&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>ASF&lt;/td>
&lt;td>Ververica Platform, Aiven&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>HF Transformers&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Hugging Face SAS&lt;/td>
&lt;td>HF Inference Endpoints / Enterprise Hub&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PEFT&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Hugging Face SAS&lt;/td>
&lt;td>— (parte de la oferta HF)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>bitsandbytes&lt;/strong>&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>Tim Dettmers + community&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MLflow&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>LF AI &amp;amp; Data&lt;/td>
&lt;td>Databricks MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Axolotl&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>OpenAccess AI Collective&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ray (Train)&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Anyscale + community&lt;/td>
&lt;td>Anyscale Platform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DeepSpeed&lt;/strong>&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DeepEval&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Confident AI&lt;/td>
&lt;td>Confident AI SaaS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>RAGAS&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Exploding Gradients&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Promptfoo&lt;/strong>&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>Promptfoo, Inc.&lt;/td>
&lt;td>Promptfoo Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NeMo Guardrails&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>NVIDIA&lt;/td>
&lt;td>NeMo Microservices&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Presidio&lt;/strong>&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Phoenix (Arize)&lt;/strong>&lt;/td>
&lt;td>Elastic v2&lt;/td>
&lt;td>Arize AI&lt;/td>
&lt;td>Arize Platform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>vLLM&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>vLLM Project / LF AI &amp;amp; Data&lt;/td>
&lt;td>múltiples (Red Hat, AWS, IBM, NVIDIA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>TGI&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Hugging Face SAS&lt;/td>
&lt;td>HF Inference Endpoints&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SGLang&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>LMSys + community&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>TensorRT-LLM&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>NVIDIA&lt;/td>
&lt;td>NVIDIA AI Enterprise&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>llama.cpp&lt;/strong>&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>Georgi Gerganov + community&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Triton Inference Server&lt;/strong>&lt;/td>
&lt;td>BSD-3&lt;/td>
&lt;td>NVIDIA&lt;/td>
&lt;td>NVIDIA AI Enterprise&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>KServe&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>LF AI &amp;amp; Data (Kubeflow)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Envoy AI Gateway&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>CNCF / Tetrate&lt;/td>
&lt;td>Tetrate Service Bridge&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>LiteLLM&lt;/strong>&lt;/td>
&lt;td>MIT&lt;/td>
&lt;td>BerriAI&lt;/td>
&lt;td>LiteLLM Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenTelemetry&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>CNCF&lt;/td>
&lt;td>múltiples vendor (Honeycomb, Datadog, Grafana)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tempo&lt;/strong>&lt;/td>
&lt;td>AGPL 3.0&lt;/td>
&lt;td>Grafana Labs&lt;/td>
&lt;td>Grafana Cloud Tempo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Jaeger&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>CNCF&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Prometheus&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>CNCF&lt;/td>
&lt;td>Grafana Cloud, AMP, GCP Managed Prom, Azure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Grafana&lt;/strong>&lt;/td>
&lt;td>AGPL 3.0&lt;/td>
&lt;td>Grafana Labs&lt;/td>
&lt;td>Grafana Cloud, Grafana Enterprise&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Loki&lt;/strong>&lt;/td>
&lt;td>AGPL 3.0&lt;/td>
&lt;td>Grafana Labs&lt;/td>
&lt;td>Grafana Cloud Loki&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Langfuse&lt;/strong>&lt;/td>
&lt;td>MIT (core) / EE&lt;/td>
&lt;td>Langfuse GmbH&lt;/td>
&lt;td>Langfuse Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tetragon&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Cilium / CNCF / Isovalent&lt;/td>
&lt;td>Isovalent Enterprise&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Hubble&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Cilium / CNCF&lt;/td>
&lt;td>Isovalent Enterprise&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Evidently AI&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Evidently AI&lt;/td>
&lt;td>Evidently Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Apache Airflow&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>ASF&lt;/td>
&lt;td>Astronomer, MWAA, Cloud Composer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Argo Workflows&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>CNCF&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Kubeflow Pipelines&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>CNCF / LF AI &amp;amp; Data&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Feast&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>LF AI &amp;amp; Data&lt;/td>
&lt;td>Tecton (commercial)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Argilla&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Hugging Face&lt;/td>
&lt;td>HF Hub features&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenLineage&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>LF AI &amp;amp; Data&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DataHub&lt;/strong>&lt;/td>
&lt;td>Apache 2.0&lt;/td>
&lt;td>Acryl Data&lt;/td>
&lt;td>Acryl Cloud&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Patrón a mirar al leer la tabla:&lt;/strong> las &lt;strong>AGPL 3.0&lt;/strong> y &lt;strong>Elastic v2&lt;/strong> son las que más fricción meten en empresas con políticas estrictas de licencias (legal pide review específico). Las &lt;strong>Apache 2.0&lt;/strong> son las que pasan compliance sin discusión. Las que tienen &amp;ldquo;EE Enterprise&amp;rdquo; o equivalente esconden una decisión: la versión OSS es funcionalmente completa para producción, pero features de equipo (SSO, audit, advanced RBAC) viven en la versión comercial. Para clientes ENS bajo declaración ALTA, las features EE (SSO con SAML/OIDC corporativo, audit logs inmutables) suelen ser obligatorias — vale la pena conocer el precio antes.&lt;/p>
&lt;h2 id="cuándo-subir-desde-el-stack-mínimo-al-stack-completo">Cuándo subir desde el &amp;ldquo;stack mínimo&amp;rdquo; al &amp;ldquo;stack completo&amp;rdquo;&lt;/h2>
&lt;p>El catálogo entero puede ser intimidante. Pero no se monta todo desde el primer día. Hay un orden razonable que el blog ha estado validando en posts a lo largo de la serie. El &lt;strong>stack mínimo viable&lt;/strong> que sirve una API LLM con disciplina aceptable:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Serving&lt;/strong>: vLLM en Kubernetes + un Envoy AI Gateway delante.&lt;/li>
&lt;li>&lt;strong>Datos&lt;/strong>: Postgres + pgvector (sin Qdrant), MinIO para object store, sin Kafka.&lt;/li>
&lt;li>&lt;strong>Tune&lt;/strong>: Axolotl + MLflow, sin Ray Train.&lt;/li>
&lt;li>&lt;strong>Eval&lt;/strong>: Promptfoo en CI, sin RAGAS ni judge en producción.&lt;/li>
&lt;li>&lt;strong>Observe&lt;/strong>: OTel Collector + Prometheus + Grafana + Langfuse, sin Phoenix ni Tetragon.&lt;/li>
&lt;li>&lt;strong>Retrain&lt;/strong>: feedback en Postgres + scripts crontab, sin Airflow.&lt;/li>
&lt;li>&lt;strong>Versioning&lt;/strong>: prompts en Langfuse + datasets en DVC sobre MinIO, sin lakeFS.&lt;/li>
&lt;/ul>
&lt;p>Eso son &lt;strong>~8-10 componentes&lt;/strong> y sirve un sistema LLM razonable para un solo tenant con tráfico moderado. Cuando el sistema crece, hay momentos identificables donde añadir cada pieza compensa:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Disparador&lt;/th>
&lt;th>Componente que añadir&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Multi-tenant con corpus aislados&lt;/td>
&lt;td>&lt;strong>Qdrant&lt;/strong> (colecciones por tenant, ACL)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corpus se renueva frecuente y se rompe periódicamente&lt;/td>
&lt;td>&lt;strong>lakeFS&lt;/strong> (branches con hooks pre-merge)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Embedding pipeline necesita streaming&lt;/td>
&lt;td>&lt;strong>Kafka + Debezium + Flink&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Retrain pasa de mensual a semanal&lt;/td>
&lt;td>&lt;strong>Airflow&lt;/strong> o &lt;strong>Argo Workflows&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Aparecen features compartidas (perfil cliente, scoring)&lt;/td>
&lt;td>&lt;strong>Feast&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Anotación supera la capacidad informal&lt;/td>
&lt;td>&lt;strong>Argilla&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Eval RAG necesita métricas específicas&lt;/td>
&lt;td>&lt;strong>RAGAS&lt;/strong> + Langfuse datasets&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Compliance ENS exige runtime audit&lt;/td>
&lt;td>&lt;strong>Tetragon + Hubble&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Drift es invisible y aparece tarde&lt;/td>
&lt;td>&lt;strong>Evidently&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Stack único deja de cubrir multi-modelo&lt;/td>
&lt;td>&lt;strong>Triton&lt;/strong> o &lt;strong>KServe&lt;/strong> con varios predictors&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Múltiples adapters multi-tenant simultáneos&lt;/td>
&lt;td>&lt;strong>vLLM Production Stack&lt;/strong> + Operator dedicado&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Cada salto añade 1-2 componentes y vale el coste solo cuando el disparador está claro. Añadir Kafka &amp;ldquo;por si acaso&amp;rdquo; cuando el corpus se actualiza una vez al mes es trabajo neto negativo.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-todavía">Lo que no hemos cubierto (todavía)&lt;/h2>
&lt;p>Quedan piezas merecedoras de su propio post:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Schema Registry&lt;/strong> para LLM data y prompts (Confluent OSS, Karapace, JSON Schema Registry).&lt;/li>
&lt;li>&lt;strong>Catálogo + lineage&lt;/strong> profundizado: DataHub vs Atlas vs OpenMetadata + OpenLineage en serio.&lt;/li>
&lt;li>&lt;strong>Federated learning&lt;/strong> sobre OSS (Flower, FedML) para escenarios donde los datos no se centralizan.&lt;/li>
&lt;li>&lt;strong>MCP Servers OSS&lt;/strong> y su lugar en el stack como capa de tools / acciones.&lt;/li>
&lt;li>&lt;strong>Evals &amp;ldquo;agéntic&amp;rdquo;&lt;/strong> específicos para sistemas multi-step con tool use.&lt;/li>
&lt;li>&lt;strong>Mejores prácticas de upgrade&lt;/strong> de cada componente (vLLM cada 6 semanas, Kafka mayor cada 18 meses, etc.).&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM en producción&lt;/a> — la pieza forense que sigue una request por las seis etapas; este catálogo es la lista de herramientas que aparecieron en ese recorrido.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">El catálogo paralelo OSS vs hyperscalers&lt;/a> — el corte horizontal que enseña, para cada etapa, qué hace cada herramienta OSS y cuál es su equivalente en AWS, GCP y Azure.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">El pipeline LLMOps de seis etapas&lt;/a> — el mapa maestro del pipeline al que este catálogo pone nombres OSS concretos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mlops-llms-panorama-2026/">MLOps específico para LLMs en 2026&lt;/a> — contexto general sobre LLMOps.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> — el deep-dive de los dos protagonistas OSS de la etapa Data + transversal.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">Prompt versioning con Langfuse y MLflow&lt;/a> — el deep-dive del transversal Prompt.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">Fine-tuning continuo en producción&lt;/a> — la etapa Tune en operativa real.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> y &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — los deep-dives de Eval + safety.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a> · &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a> · &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">Disaggregated serving&lt;/a> · &lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en K8s&lt;/a> · &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">Operators LLM K8s&lt;/a> · &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">Cluster GPU multi-tenant&lt;/a> — Deploy en todas sus capas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">AgentSight tracing LLM&lt;/a> · &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability con OTel&lt;/a> · &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a> — Observe en sus tres ángulos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain: cerrar el bucle&lt;/a> — la etapa Retrain detallada.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.vllm.ai/">vLLM&lt;/a> · &lt;a href="https://github.com/vllm-project/production-stack">vLLM Production Stack&lt;/a> · &lt;a href="https://huggingface.co/docs/text-generation-inference/">TGI&lt;/a> · &lt;a href="https://docs.sglang.ai/">SGLang&lt;/a> · &lt;a href="https://nvidia.github.io/TensorRT-LLM/">TensorRT-LLM&lt;/a> · &lt;a href="https://github.com/ggerganov/llama.cpp">llama.cpp&lt;/a> — motores de inferencia OSS.&lt;/li>
&lt;li>&lt;a href="https://docs.nvidia.com/deeplearning/triton-inference-server/">Triton Inference Server&lt;/a> · &lt;a href="https://kserve.github.io/website/">KServe&lt;/a> · &lt;a href="https://aigateway.envoyproxy.io/">Envoy AI Gateway&lt;/a> · &lt;a href="https://docs.litellm.ai/">LiteLLM&lt;/a> — orquestación y AI gateway.&lt;/li>
&lt;li>&lt;a href="https://qdrant.tech/documentation/">Qdrant&lt;/a> · &lt;a href="https://github.com/pgvector/pgvector">pgvector&lt;/a> · &lt;a href="https://milvus.io/docs">Milvus&lt;/a> — vector databases.&lt;/li>
&lt;li>&lt;a href="https://dvc.org/doc">DVC&lt;/a> · &lt;a href="https://docs.lakefs.io/">lakeFS&lt;/a> · &lt;a href="https://min.io/docs/">MinIO&lt;/a> — versioning y object store.&lt;/li>
&lt;li>&lt;a href="https://kafka.apache.org/documentation/">Apache Kafka&lt;/a> · &lt;a href="https://debezium.io/documentation/">Debezium&lt;/a> · &lt;a href="https://flink.apache.org/">Apache Flink&lt;/a> — streams y CDC.&lt;/li>
&lt;li>&lt;a href="https://huggingface.co/docs/transformers">Hugging Face Transformers&lt;/a> · &lt;a href="https://huggingface.co/docs/peft">PEFT&lt;/a> · &lt;a href="https://huggingface.co/docs/bitsandbytes">bitsandbytes&lt;/a> · &lt;a href="https://docs.axolotl.ai/">Axolotl&lt;/a> — fine-tuning.&lt;/li>
&lt;li>&lt;a href="https://mlflow.org/docs/">MLflow&lt;/a> · &lt;a href="https://docs.ray.io/en/latest/train/">Ray Train&lt;/a> · &lt;a href="https://www.kubeflow.org/docs/components/trainer/">Kubeflow Training Operator&lt;/a> — orquestación de entrenamiento.&lt;/li>
&lt;li>&lt;a href="https://docs.confident-ai.com/">DeepEval&lt;/a> · &lt;a href="https://docs.ragas.io/">RAGAS&lt;/a> · &lt;a href="https://promptfoo.dev/docs/">Promptfoo&lt;/a> · &lt;a href="https://docs.nvidia.com/nemo/guardrails/">NeMo Guardrails&lt;/a> · &lt;a href="https://microsoft.github.io/presidio/">Presidio&lt;/a> — evals y guardrails.&lt;/li>
&lt;li>&lt;a href="https://opentelemetry.io/docs/">OpenTelemetry&lt;/a> · &lt;a href="https://opentelemetry.io/docs/specs/semconv/gen-ai/">OTel GenAI semconv&lt;/a> · &lt;a href="https://grafana.com/docs/tempo/">Tempo&lt;/a> · &lt;a href="https://prometheus.io/docs/">Prometheus&lt;/a> · &lt;a href="https://grafana.com/docs/">Grafana&lt;/a> · &lt;a href="https://grafana.com/docs/loki/">Loki&lt;/a> — observability foundation.&lt;/li>
&lt;li>&lt;a href="https://langfuse.com/docs">Langfuse&lt;/a> · &lt;a href="https://docs.arize.com/phoenix">Phoenix Arize&lt;/a> · &lt;a href="https://docs.evidentlyai.com/">Evidently AI&lt;/a> — LLM observability y drift.&lt;/li>
&lt;li>&lt;a href="https://docs.cilium.io/">Cilium&lt;/a> · &lt;a href="https://tetragon.io/">Tetragon&lt;/a> · &lt;a href="https://docs.cilium.io/en/stable/observability/hubble/">Hubble&lt;/a> — eBPF runtime.&lt;/li>
&lt;li>&lt;a href="https://airflow.apache.org/docs/">Apache Airflow&lt;/a> · &lt;a href="https://argo-workflows.readthedocs.io/">Argo Workflows&lt;/a> · &lt;a href="https://www.kubeflow.org/docs/components/pipelines/">Kubeflow Pipelines&lt;/a> · &lt;a href="https://docs.feast.dev/">Feast&lt;/a> · &lt;a href="https://docs.argilla.io/">Argilla&lt;/a> — orquestación + retrain + anotación.&lt;/li>
&lt;/ul></description></item><item><title>El catálogo paralelo: las seis etapas LLMOps en open source y en los hyperscalers (AWS, GCP, Azure)</title><link>https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/</link><pubDate>Sat, 23 May 2026 07:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>El &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense anterior&lt;/a> usó una única request para recorrer las seis etapas del pipeline LLMOps y los dos componentes transversales. Este post recorre las mismas etapas pero las cruza con tres columnas extra: cómo se monta cada etapa en &lt;strong>open source on-premise&lt;/strong>, y cuáles son los servicios equivalentes en &lt;strong>AWS&lt;/strong>, &lt;strong>GCP&lt;/strong> y &lt;strong>Azure&lt;/strong>. No es una guía de migración ni un benchmark de coste: es un &lt;strong>catálogo de equivalencias&lt;/strong> con sus gaps. El patrón general que verás: el OSS te da control, soberanía y composición libre a cambio de operativa cara; los hyperscalers te dan integración y time-to-market a cambio de lock-in en márgenes, contratos de datos y dependencia política. Para escenarios sometidos a ENS / NIS2 con datos críticos del cliente, el OSS gana por defecto; para proyectos de descubrimiento donde el time-to-market es la métrica que decide, el hyperscaler gana por defecto. La parte interesante está en el medio. Como hilo concreto, al final tomamos el chatbot multi-tenant del post anterior y lo portamos a AWS pieza a pieza para mostrar qué desaparece, qué aparece, y dónde se materializa el lock-in.&lt;/p>
&lt;h2 id="estás-aquí-las-mismas-seis-etapas-pero-por-columna">Estás aquí: las mismas seis etapas, pero por columna&lt;/h2>
&lt;p>Este post comparte mapa con el post anterior — las seis etapas y los dos transversales están todas activas — pero cambia el corte: en lugar de seguir una request horizontalmente, hace el corte vertical y muestra qué herramientas viven en cada etapa según el modelo de despliegue.&lt;/p>
&lt;div class="diagram" style="max-width:840px;margin:1rem auto;">
&lt;svg viewBox="0 0 840 310" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="las seis etapas LLMOps con sus equivalentes OSS y hyperscaler">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#ff8a4c;stroke-width:2}.cross{fill:#ffe9d6;stroke:#c66;stroke-width:1.4;rx:6}.lbl{font:600 12px sans-serif;fill:#222}.sm{font:10px sans-serif;fill:#333}.tiny{font:9px sans-serif;fill:#222}.row{font:600 10px sans-serif;fill:#333}.oss{fill:#dfe9f5;stroke:#356}.aws{fill:#fde6c8;stroke:#a65}.gcp{fill:#dceaf8;stroke:#369}.azu{fill:#dde2f8;stroke:#447}.foot{font:9px sans-serif;fill:#666}&lt;/style>
&lt;text x="420" y="20" text-anchor="middle" class="lbl">Catálogo paralelo: open source on-premise vs hyperscalers gestionados&lt;/text>
&lt;rect x="60" y="35" width="125" height="30" class="box active"/>&lt;text x="122.5" y="54" text-anchor="middle" class="lbl">1 · Data&lt;/text>
&lt;rect x="190" y="35" width="125" height="30" class="box active"/>&lt;text x="252.5" y="54" text-anchor="middle" class="lbl">2 · Tune&lt;/text>
&lt;rect x="320" y="35" width="125" height="30" class="box active"/>&lt;text x="382.5" y="54" text-anchor="middle" class="lbl">3 · Eval&lt;/text>
&lt;rect x="450" y="35" width="125" height="30" class="box active"/>&lt;text x="512.5" y="54" text-anchor="middle" class="lbl">4 · Deploy&lt;/text>
&lt;rect x="580" y="35" width="125" height="30" class="box active"/>&lt;text x="642.5" y="54" text-anchor="middle" class="lbl">5 · Observe&lt;/text>
&lt;rect x="710" y="35" width="125" height="30" class="box active"/>&lt;text x="772.5" y="54" text-anchor="middle" class="lbl">6 · Retrain&lt;/text>
&lt;text x="52" y="98" text-anchor="end" class="row">OSS&lt;/text>
&lt;rect x="60" y="80" width="125" height="30" class="box oss"/>&lt;text x="122.5" y="99" text-anchor="middle" class="tiny">DVC · lakeFS · Qdrant&lt;/text>
&lt;rect x="190" y="80" width="125" height="30" class="box oss"/>&lt;text x="252.5" y="99" text-anchor="middle" class="tiny">PEFT · MLflow · Ray&lt;/text>
&lt;rect x="320" y="80" width="125" height="30" class="box oss"/>&lt;text x="382.5" y="99" text-anchor="middle" class="tiny">DeepEval · Promptfoo&lt;/text>
&lt;rect x="450" y="80" width="125" height="30" class="box oss"/>&lt;text x="512.5" y="99" text-anchor="middle" class="tiny">vLLM · KServe · Operators&lt;/text>
&lt;rect x="580" y="80" width="125" height="30" class="box oss"/>&lt;text x="642.5" y="99" text-anchor="middle" class="tiny">OTel · Tempo · Langfuse&lt;/text>
&lt;rect x="710" y="80" width="125" height="30" class="box oss"/>&lt;text x="772.5" y="99" text-anchor="middle" class="tiny">Airflow · Argo · Kubeflow&lt;/text>
&lt;text x="52" y="138" text-anchor="end" class="row">AWS&lt;/text>
&lt;rect x="60" y="120" width="125" height="30" class="box aws"/>&lt;text x="122.5" y="139" text-anchor="middle" class="tiny">S3 · OpenSearch · MSK&lt;/text>
&lt;rect x="190" y="120" width="125" height="30" class="box aws"/>&lt;text x="252.5" y="139" text-anchor="middle" class="tiny">SageMaker · Bedrock&lt;/text>
&lt;rect x="320" y="120" width="125" height="30" class="box aws"/>&lt;text x="382.5" y="139" text-anchor="middle" class="tiny">Bedrock Eval · Guardrails&lt;/text>
&lt;rect x="450" y="120" width="125" height="30" class="box aws"/>&lt;text x="512.5" y="139" text-anchor="middle" class="tiny">Bedrock · SM Endpoints&lt;/text>
&lt;rect x="580" y="120" width="125" height="30" class="box aws"/>&lt;text x="642.5" y="139" text-anchor="middle" class="tiny">CloudWatch · X-Ray · ADOT&lt;/text>
&lt;rect x="710" y="120" width="125" height="30" class="box aws"/>&lt;text x="772.5" y="139" text-anchor="middle" class="tiny">SM Pipelines · GT&lt;/text>
&lt;text x="52" y="178" text-anchor="end" class="row">GCP&lt;/text>
&lt;rect x="60" y="160" width="125" height="30" class="box gcp"/>&lt;text x="122.5" y="179" text-anchor="middle" class="tiny">GCS · BQ · Vertex VS&lt;/text>
&lt;rect x="190" y="160" width="125" height="30" class="box gcp"/>&lt;text x="252.5" y="179" text-anchor="middle" class="tiny">Vertex Training · Tuning&lt;/text>
&lt;rect x="320" y="160" width="125" height="30" class="box gcp"/>&lt;text x="382.5" y="179" text-anchor="middle" class="tiny">Vertex Eval · Model Armor&lt;/text>
&lt;rect x="450" y="160" width="125" height="30" class="box gcp"/>&lt;text x="512.5" y="179" text-anchor="middle" class="tiny">Vertex Pred · Gemini API&lt;/text>
&lt;rect x="580" y="160" width="125" height="30" class="box gcp"/>&lt;text x="642.5" y="179" text-anchor="middle" class="tiny">Cloud Trace · Monitoring&lt;/text>
&lt;rect x="710" y="160" width="125" height="30" class="box gcp"/>&lt;text x="772.5" y="179" text-anchor="middle" class="tiny">Vertex Pipelines&lt;/text>
&lt;text x="52" y="218" text-anchor="end" class="row">Azure&lt;/text>
&lt;rect x="60" y="200" width="125" height="30" class="box azu"/>&lt;text x="122.5" y="219" text-anchor="middle" class="tiny">ADLS · AI Search · ADF&lt;/text>
&lt;rect x="190" y="200" width="125" height="30" class="box azu"/>&lt;text x="252.5" y="219" text-anchor="middle" class="tiny">Azure ML · AOAI tuning&lt;/text>
&lt;rect x="320" y="200" width="125" height="30" class="box azu"/>&lt;text x="382.5" y="219" text-anchor="middle" class="tiny">AI Eval · Content Safety&lt;/text>
&lt;rect x="450" y="200" width="125" height="30" class="box azu"/>&lt;text x="512.5" y="219" text-anchor="middle" class="tiny">AOAI · ML Endpoints&lt;/text>
&lt;rect x="580" y="200" width="125" height="30" class="box azu"/>&lt;text x="642.5" y="219" text-anchor="middle" class="tiny">App Insights · Monitor&lt;/text>
&lt;rect x="710" y="200" width="125" height="30" class="box azu"/>&lt;text x="772.5" y="219" text-anchor="middle" class="tiny">Azure ML Pipelines&lt;/text>
&lt;rect x="60" y="245" width="385" height="26" class="cross"/>
&lt;text x="252.5" y="262" text-anchor="middle" class="sm">Prompt versioning: Langfuse · MLflow ↔ Bedrock · Vertex · Foundry&lt;/text>
&lt;rect x="450" y="245" width="385" height="26" class="cross"/>
&lt;text x="642.5" y="262" text-anchor="middle" class="sm">Data versioning: DVC · lakeFS · OpenLineage ↔ S3 · Dataplex · Purview&lt;/text>
&lt;text x="420" y="295" text-anchor="middle" class="foot">El stack OSS se monta on-premise; AWS / GCP / Azure muestran los equivalentes gestionados por etapa.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h2 id="la-analogía-la-panadería-propia-y-la-franquicia">La analogía: la panadería propia y la franquicia&lt;/h2>
&lt;p>Un panadero abre negocio. Tiene dos modelos posibles.&lt;/p>
&lt;p>Puede abrir &lt;strong>panadería propia&lt;/strong>: alquila el local, compra el horno, elige los proveedores de harina, contrata a su maestro panadero, escribe sus recetas, decide los precios, decora el escaparate. El día que quiere lanzar un pan ecológico de masa madre de centeno, no pide permiso a nadie. El día que el precio de la harina sube, busca otro proveedor. Pero todo lo paga él: la inversión inicial, el riesgo, la operativa diaria, los meses en los que no acierta con el barrio. La panadería es suya.&lt;/p>
&lt;p>O puede entrar en &lt;strong>franquicia&lt;/strong>: el franquiciador le entrega el local llave en mano, el horno con contrato de mantenimiento, los proveedores ya negociados, los manuales operativos, las recetas escritas, el marketing centralizado, la app de fidelización, el sistema TPV. La curva de aprendizaje es de semanas, no de años. Pero las recetas son del franquiciador, los proveedores también, el precio del pan está en el catálogo y el día que cambia la fórmula del croissant le llega un correo informativo, no una decisión de negocio.&lt;/p>
&lt;p>Ambas panaderías sacan pan. Ambas cumplen sanidad y producen ingresos. La diferencia operativa es enorme y no es de tecnología: es de &lt;strong>propiedad, control y plazo&lt;/strong>.&lt;/p>
&lt;p>El paralelismo con LLMOps es directo. El stack OSS on-premise es la panadería propia. El stack gestionado en hyperscalers es la franquicia. Las &lt;strong>piezas&lt;/strong> que aparecen en cada etapa son equivalentes funcionalmente — al final del día las dos resuelven el mismo problema técnico —, pero el modelo de gobierno, el coste operativo, el lock-in y las garantías de cumplimiento son distintos. Este post hace el catálogo paralelo para que la elección no se haga por defecto.&lt;/p>
&lt;h2 id="recap-rápido-del-post-anterior">Recap rápido del post anterior&lt;/h2>
&lt;p>En el &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a> seguimos una request específica: un usuario premium-es de una aseguradora preguntando &lt;em>&amp;quot;¿Cómo cancelo mi suscripción premium?&amp;quot;&lt;/em> al chatbot de soporte multi-tenant del proveedor SaaS que la hospeda. El recorrido atravesó las &lt;strong>seis etapas del pipeline LLMOps&lt;/strong> —Data, Tune, Eval, Deploy, Observe, Retrain— más los &lt;strong>dos componentes transversales&lt;/strong> —prompt versioning y data versioning— sobre una infraestructura on-premise: RKE2 con Cilium BGP, cluster 4×H100 SXM, RTX 4090 de desarrollo, vLLM en Kubernetes, Langfuse + OTel + Prometheus + Tempo, Postgres + Qdrant, DVC + lakeFS + MinIO, Kafka y MLflow. El sistema cumple ENS / NIS2 y mantiene &lt;code>trace_id&lt;/code> propagado extremo a extremo.&lt;/p>
&lt;p>Lo que viene ahora es ese mismo sistema, pieza a pieza, mostrando para cada caja qué herramienta hace el trabajo si estás en cloud público — porque la pregunta del integrador rara vez es &amp;ldquo;¿OSS sí o no?&amp;rdquo;: es &amp;ldquo;¿qué pierdo y qué gano si esta caja la cojo gestionada?&amp;rdquo;. Y la respuesta es distinta por caja.&lt;/p>
&lt;h2 id="etapa-1--data">Etapa 1 — Data&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Hay tres sub-problemas que la etapa Data resuelve, frecuentemente confundidos. Primero, &lt;strong>versionado e identidad&lt;/strong> del corpus y de los datasets de entrenamiento (que un &lt;code>dataset_id, dataset_version&lt;/code> exista y propague). Segundo, &lt;strong>almacenamiento y servido&lt;/strong> del corpus operativo (object store + vector index + texto estructurado). Tercero, &lt;strong>streams e ingestión&lt;/strong> desde sistemas fuente con CDC, transformación y esquemas estables (Schema Registry).&lt;/p>
&lt;p>&lt;strong>Stack OSS de referencia.&lt;/strong> El versionado vive en &lt;strong>DVC&lt;/strong> (apuntadores en git, contenido en object store) combinado con &lt;strong>lakeFS&lt;/strong> para semántica branch/merge sobre datos. El &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">post sobre data versioning&lt;/a> profundiza en la diferencia funcional. El object store es &lt;strong>MinIO&lt;/strong> o &lt;strong>Ceph&lt;/strong>. El vector index es &lt;strong>Qdrant&lt;/strong> o &lt;strong>Milvus&lt;/strong> para corpus grandes (millones de chunks) y &lt;strong>pgvector sobre Postgres 18&lt;/strong> para casos pequeños donde la operativa de un componente menos compensa. La capa stream es &lt;strong>Kafka&lt;/strong> (Apache puro o &lt;strong>Redpanda&lt;/strong>) con &lt;strong>Schema Registry&lt;/strong> (Confluent o &lt;strong>Karapace&lt;/strong> OSS), CDC con &lt;strong>Debezium&lt;/strong> o &lt;strong>Flink CDC&lt;/strong>, transformación con &lt;strong>Flink&lt;/strong> o &lt;strong>Spark Structured Streaming&lt;/strong>. El catálogo / lineage es &lt;strong>DataHub&lt;/strong>, &lt;strong>Apache Atlas&lt;/strong> o &lt;strong>OpenMetadata&lt;/strong> con eventos &lt;strong>OpenLineage&lt;/strong> entre sistemas. El &lt;a href="https://blog.lo0.es/posts/postgresql-qdrant-ingestion-microservicios/">post sobre ingestión PostgreSQL + Qdrant&lt;/a> y el &lt;a href="https://blog.lo0.es/posts/rag-kafka-datalake-arquitectura/">post sobre RAG sobre Kafka&lt;/a> cubren la operativa detallada.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, el corpus vive en &lt;strong>S3&lt;/strong> (con versioning habilitado, que es el sustituto barato del data versioning serio), las consultas tabulares en &lt;strong>Athena&lt;/strong> o &lt;strong>Redshift&lt;/strong>, el vector index en &lt;strong>Amazon OpenSearch&lt;/strong> con plug-in vectorial o en &lt;strong>Amazon Aurora pgvector&lt;/strong>. La capa stream es &lt;strong>MSK&lt;/strong> (Kafka gestionado) o &lt;strong>Kinesis Data Streams&lt;/strong>, CDC con &lt;strong>AWS DMS&lt;/strong>, transformación con &lt;strong>Glue Streaming&lt;/strong> o &lt;strong>MSK Connect&lt;/strong>. El catálogo es &lt;strong>AWS Glue Data Catalog&lt;/strong> + &lt;strong>AWS Lake Formation&lt;/strong> para gobierno de datos. Y para el caso RAG hay además &lt;strong>Amazon Bedrock Knowledge Bases&lt;/strong>, que es el atajo gestionado: le das S3, te indexa en OpenSearch o Aurora pgvector, te expone un retrieval API y se acaba la operativa — a cambio de pagar por chunk indexado y consulta.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, el corpus vive en &lt;strong>Cloud Storage&lt;/strong> (con object versioning), el almacén analítico es &lt;strong>BigQuery&lt;/strong> (con &lt;strong>BigQuery Vector Search&lt;/strong> ya integrado), el vector dedicado es &lt;strong>Vertex AI Vector Search&lt;/strong> (antes Matching Engine). La capa stream es &lt;strong>Pub/Sub&lt;/strong> + &lt;strong>Dataflow&lt;/strong>, CDC con &lt;strong>Datastream&lt;/strong>. El catálogo y lineage es &lt;strong>Dataplex&lt;/strong> (que en 2024-2025 absorbió Data Catalog y añadió lineage automático). El equivalente gestionado de Knowledge Bases es &lt;strong>Vertex AI Search&lt;/strong> (antes Discovery Engine).&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, el corpus vive en &lt;strong>ADLS Gen2&lt;/strong>, las consultas tabulares en &lt;strong>Microsoft Fabric&lt;/strong> / &lt;strong>Azure Synapse&lt;/strong>, el vector index en &lt;strong>Azure AI Search&lt;/strong> (vector mode) o &lt;strong>Azure Cosmos DB for PostgreSQL&lt;/strong> con pgvector. La capa stream es &lt;strong>Event Hubs&lt;/strong> + &lt;strong>Stream Analytics&lt;/strong> o &lt;strong>Microsoft Fabric Real-Time Intelligence&lt;/strong>, CDC con &lt;strong>Azure Data Factory&lt;/strong>. El catálogo es &lt;strong>Microsoft Purview&lt;/strong>, que cubre catalog, lineage y data governance integrados con Entra ID.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Data.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Object store&lt;/td>
&lt;td>MinIO, Ceph&lt;/td>
&lt;td>S3&lt;/td>
&lt;td>Cloud Storage&lt;/td>
&lt;td>ADLS Gen2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Versionado de datasets&lt;/td>
&lt;td>DVC, lakeFS&lt;/td>
&lt;td>S3 Versioning (limitado), Lake Formation&lt;/td>
&lt;td>GCS Versioning, Dataplex&lt;/td>
&lt;td>ADLS versioning, Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Vector index&lt;/td>
&lt;td>Qdrant, Milvus, pgvector&lt;/td>
&lt;td>OpenSearch, Aurora pgvector, Bedrock KB&lt;/td>
&lt;td>Vertex Vector Search, BigQuery VS&lt;/td>
&lt;td>Azure AI Search, Cosmos pgvector&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Stream + CDC&lt;/td>
&lt;td>Kafka + Debezium + Flink&lt;/td>
&lt;td>MSK / Kinesis + DMS + Glue&lt;/td>
&lt;td>Pub/Sub + Datastream + Dataflow&lt;/td>
&lt;td>Event Hubs + ADF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Schema Registry&lt;/td>
&lt;td>Karapace, Confluent OSS&lt;/td>
&lt;td>Glue Schema Registry&lt;/td>
&lt;td>Pub/Sub schemas&lt;/td>
&lt;td>Schema Registry (Event Hubs)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Catalog + lineage&lt;/td>
&lt;td>DataHub, Atlas, OpenLineage&lt;/td>
&lt;td>Glue Catalog + Lake Formation&lt;/td>
&lt;td>Dataplex&lt;/td>
&lt;td>Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAG gestionado end-to-end&lt;/td>
&lt;td>— (lo montas)&lt;/td>
&lt;td>Bedrock Knowledge Bases&lt;/td>
&lt;td>Vertex AI Search&lt;/td>
&lt;td>Azure AI Studio Knowledge&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> &lt;em>S3 Versioning&lt;/em> no es DVC. Conserva versiones de objetos pero no tiene noción de &lt;strong>dataset&lt;/strong> (¿qué objetos forman juntos la versión 3 del enriquecido?), no propaga &lt;code>dataset_hash&lt;/code> al trainer, no integra con experiment tracking, y no falla un CI si un dataset rompe schema. Cubrirlo de verdad en AWS exige combinarlo con Lake Formation, Glue Data Catalog y registros propios en SageMaker Experiments. Lo mismo en GCP con Dataplex y en Azure con Purview. El gap es real y se paga en operativa o en lineage roto.&lt;/p>
&lt;h2 id="etapa-2--tune">Etapa 2 — Tune&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Producir un nuevo &lt;code>model_id, model_version&lt;/code> —típicamente un adapter LoRA sobre un base estable, como cuenta el &lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">post de fine-tuning continuo&lt;/a>— con lineage hasta el dataset que lo entrenó y experiment tracking que permita reproducirlo seis meses después.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Núcleo técnico: &lt;strong>HuggingFace Transformers + PEFT&lt;/strong> (LoRA, QLoRA), &lt;strong>bitsandbytes&lt;/strong> para quantization, &lt;strong>DeepSpeed&lt;/strong> o &lt;strong>FSDP&lt;/strong> para paralelismo. Experiment tracking: &lt;strong>MLflow&lt;/strong> (autoritativo) o &lt;strong>Weights &amp;amp; Biases self-hosted&lt;/strong>. Frameworks de conveniencia: &lt;strong>Axolotl&lt;/strong> y &lt;strong>Llama Factory&lt;/strong> envuelven la maquinaria anterior con configuración declarativa. Orquestación distribuida: &lt;strong>Kubeflow Training Operator&lt;/strong> o &lt;strong>Ray Train&lt;/strong>. En infraestructuras pequeñas, scripts directos con &lt;strong>Slurm&lt;/strong> o &lt;strong>K8s Jobs&lt;/strong> sobre GPU pools. La cadena de lineage &lt;code>dataset → run → model&lt;/code> se cierra registrando el dataset como input artifact MLflow.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>SageMaker Training Jobs&lt;/strong> sirve para la mayoría de cargas, &lt;strong>SageMaker HyperPod&lt;/strong> para entrenamientos grandes con resiliencia a fallos de nodo, &lt;strong>SageMaker JumpStart&lt;/strong> ofrece fine-tuning click-to-train sobre catálogo de modelos pre-curados. Para fine-tuning de modelos Bedrock (Claude, Llama, Mistral hospedados) está &lt;strong>Bedrock Custom Models&lt;/strong>: tú subes el dataset al S3, Bedrock entrena, te devuelve un endpoint privado con throughput provisionado. El experiment tracking equivalente es &lt;strong>SageMaker Experiments&lt;/strong> o &lt;strong>MLflow gestionado en SageMaker&lt;/strong> (sí, AWS hospeda MLflow oficialmente desde 2024).&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Custom Training&lt;/strong> corre cualquier contenedor con GPUs o TPUs; &lt;strong>Vertex AI Tuning&lt;/strong> es la API gestionada para fine-tunear Gemini y modelos del Model Garden. Experiment tracking en &lt;strong>Vertex AI Experiments&lt;/strong> (con compatibilidad MLflow).&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure ML Training Jobs&lt;/strong> sobre clusters propios o managed compute; &lt;strong>Azure OpenAI fine-tuning&lt;/strong> para fine-tunear GPT y o-series; &lt;strong>Azure ML Experiments&lt;/strong> con MLflow integrado nativamente desde 2022.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Tune.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Framework de entrenamiento&lt;/td>
&lt;td>HF Transformers + PEFT&lt;/td>
&lt;td>SageMaker SDK&lt;/td>
&lt;td>Vertex AI SDK&lt;/td>
&lt;td>Azure ML SDK&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quantization / paralelismo&lt;/td>
&lt;td>bitsandbytes, DeepSpeed, FSDP&lt;/td>
&lt;td>SageMaker libs + soporte HF&lt;/td>
&lt;td>Vertex + soporte HF&lt;/td>
&lt;td>Azure ML + soporte HF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fine-tuning gestionado (caja negra)&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Bedrock Custom Models, JumpStart&lt;/td>
&lt;td>Vertex Tuning (Gemini)&lt;/td>
&lt;td>Azure OpenAI fine-tuning&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Distribuido en cluster&lt;/td>
&lt;td>Kubeflow, Ray Train, Slurm&lt;/td>
&lt;td>SageMaker HyperPod&lt;/td>
&lt;td>Vertex AI Training (multinodo)&lt;/td>
&lt;td>Azure ML compute clusters&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Experiment tracking&lt;/td>
&lt;td>MLflow, W&amp;amp;B self-hosted&lt;/td>
&lt;td>SageMaker Experiments, MLflow gestionado&lt;/td>
&lt;td>Vertex Experiments&lt;/td>
&lt;td>Azure ML + MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Acceso a base de modelo&lt;/td>
&lt;td>El que descargues (Llama, Mistral, Qwen)&lt;/td>
&lt;td>Bedrock catalog + HF Hub&lt;/td>
&lt;td>Vertex Model Garden + HF Hub&lt;/td>
&lt;td>Azure ML model catalog + HF Hub&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Los fine-tunings &lt;em>managed&lt;/em> (Bedrock Custom, Vertex Tuning, AOAI fine-tuning) son &lt;strong>caja negra&lt;/strong>: no eliges hiperparámetros más allá de un puñado, no ves los logs detallados del trainer, no puedes inspeccionar el dataset una vez en su pipeline. El experiment tracking que ofrecen no es comparable al MLflow puesto al lado del trainer, donde puedes capturar cualquier métrica y artefacto. Para escenarios donde &lt;em>operativamente&lt;/em> no necesitas inspección esto es liberador; para escenarios de ENS / NIS2 donde tienes que demostrar qué entrenó qué, el caja negra incumple por construcción.&lt;/p>
&lt;h2 id="etapa-3--eval">Etapa 3 — Eval&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Validar candidatos antes y después de promotion contra un golden set, con métricas operativas (faithfulness al RAG, tono, format compliance, toxicidad, jailbreak resistance, PII leakage) ejecutadas como gates en CI y como sampling online. Cubierto en el &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">post sobre evals&lt;/a> y en el de &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Suites de evals: &lt;strong>DeepEval&lt;/strong>, &lt;strong>RAGAS&lt;/strong> (especializada en RAG), &lt;strong>Promptfoo&lt;/strong> (declarativa, ideal para CI), &lt;strong>lm-eval-harness&lt;/strong> (académica), &lt;strong>HELM&lt;/strong>. Evals integrados con tracing: &lt;strong>Langfuse Evals&lt;/strong>, &lt;strong>Phoenix Arize OSS&lt;/strong>. Judges LLM-as-judge: cualquier modelo OSS local; en sistemas serios, dos judges distintos para reducir sesgo. Safety y guardrails: &lt;strong>NeMo Guardrails&lt;/strong> (NVIDIA), &lt;strong>Guardrails AI&lt;/strong>, &lt;strong>LlamaGuard&lt;/strong> + &lt;strong>PromptGuard&lt;/strong> (Meta), &lt;strong>ShieldGemma&lt;/strong> (Google, pesos abiertos), &lt;strong>PII detectors&lt;/strong> tipo &lt;strong>Presidio&lt;/strong> (Microsoft) on-prem.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>Bedrock Model Evaluation&lt;/strong> ofrece evals automáticos (toxicity, accuracy, robustness) y human-in-the-loop, &lt;strong>Bedrock Guardrails&lt;/strong> cubre la capa de safety (denied topics, PII, prompt injection, contextual grounding check), &lt;strong>SageMaker Clarify&lt;/strong> añade bias y explainability sobre modelos generales.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Evaluation Service&lt;/strong> ejecuta evals con métricas automáticas y judge LLM, &lt;strong>Vertex AI Model Armor&lt;/strong> y los &lt;strong>safety filters&lt;/strong> integrados en Gemini API cubren la capa de guardrails. &lt;strong>Vertex AI Studio&lt;/strong> expone Eval interactivo para iteración con prompts.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure AI Evaluation SDK&lt;/strong> corre evals offline contra datasets, &lt;strong>Azure AI Content Safety&lt;/strong> cubre safety (Prompt Shields contra jailbreak, &lt;strong>Groundedness detection&lt;/strong>, content categories, &lt;strong>PII detection&lt;/strong>). Todo accesible desde &lt;strong>Azure AI Foundry&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Eval.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Suite de evals automáticos&lt;/td>
&lt;td>DeepEval, RAGAS, Promptfoo&lt;/td>
&lt;td>Bedrock Model Evaluation&lt;/td>
&lt;td>Vertex AI Evaluation Service&lt;/td>
&lt;td>Azure AI Evaluation SDK&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LLM-as-judge&lt;/td>
&lt;td>Cualquier modelo OSS&lt;/td>
&lt;td>Bedrock judge models&lt;/td>
&lt;td>Vertex judge (Gemini)&lt;/td>
&lt;td>Azure OpenAI judges&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Golden set management&lt;/td>
&lt;td>Langfuse datasets, manual&lt;/td>
&lt;td>SageMaker Ground Truth datasets&lt;/td>
&lt;td>Vertex Datasets&lt;/td>
&lt;td>Azure ML Datasets&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Guardrails (jailbreak, PII, prompt injection)&lt;/td>
&lt;td>NeMo Guardrails, LlamaGuard, Presidio&lt;/td>
&lt;td>Bedrock Guardrails&lt;/td>
&lt;td>Vertex Model Armor + Gemini safety&lt;/td>
&lt;td>Azure AI Content Safety (Prompt Shields, Groundedness)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Eval en CI&lt;/td>
&lt;td>Promptfoo + GitHub Actions&lt;/td>
&lt;td>Bedrock Eval API + CodeBuild&lt;/td>
&lt;td>Vertex Eval API + Cloud Build&lt;/td>
&lt;td>Azure AI Eval + Azure Pipelines&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Los guardrails gestionados son convenientes pero &lt;strong>opacos&lt;/strong>: las reglas de Bedrock Guardrails son configurables pero la implementación de detección no se inspecciona; lo mismo en Azure AI Content Safety. En OSS, NeMo Guardrails te enseña el grafo de Colang y Presidio te enseña los recognizers — auditables, modificables. Para sistemas regulados donde un auditor pregunta &lt;em>&amp;quot;¿cómo detecta exactamente PII?&amp;quot;&lt;/em>, el OSS responde con código; el cloud responde con documentación.&lt;/p>
&lt;h2 id="etapa-4--deploy">Etapa 4 — Deploy&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Servir tokens al usuario final con latencia y throughput predecibles, ratio coste / token decente, soporte de adapters hot-swap, y multi-tenancy si el negocio lo exige. Cubierto en los posts de &lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a>, &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a>, &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">disaggregated serving&lt;/a>, &lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en K8s&lt;/a>, &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">operators LLM&lt;/a> y &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">cluster multi-tenant&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Motor de inferencia: &lt;strong>vLLM&lt;/strong> (PagedAttention, prefix caching, LoRA hot-swap, OpenAI-compatible API) como referencia, &lt;strong>TensorRT-LLM&lt;/strong> para máxima optimización sobre Hopper / Ada, &lt;strong>SGLang&lt;/strong> para cargas con muchas restructuraciones de prompt, &lt;strong>TGI&lt;/strong> (Hugging Face) como alternativa madura, &lt;strong>llama.cpp&lt;/strong> para edge y CPUs, &lt;strong>NVIDIA Dynamo&lt;/strong> para disaggregated serving multinodo en clusters grandes. Orquestación en Kubernetes: &lt;strong>KServe&lt;/strong>, &lt;strong>KubeRay&lt;/strong>, operators dedicados como &lt;strong>llm-d&lt;/strong>, &lt;strong>vLLM Production Stack&lt;/strong> y &lt;strong>KAITO&lt;/strong>. Gateway / control plane: &lt;strong>Envoy AI Gateway&lt;/strong>, &lt;strong>LiteLLM Proxy&lt;/strong>, &lt;strong>Portkey AI Gateway&lt;/strong>, &lt;strong>Kong AI Gateway&lt;/strong>. Triton Inference Server cubre cargas mixtas (LLM + tradicionales) donde un solo backend importa.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, dos rutas distintas. La ruta &lt;em>gestionada por modelo&lt;/em> es &lt;strong>Amazon Bedrock&lt;/strong>: catálogo de modelos hospedados (Claude, Llama, Mistral, Cohere, Titan), pago por token o &lt;strong>Provisioned Throughput&lt;/strong> con SLA, &lt;strong>Bedrock Prompt Caching&lt;/strong> equivalente conceptual al prefix caching de vLLM, &lt;strong>Bedrock Agents&lt;/strong> y &lt;strong>Bedrock Knowledge Bases&lt;/strong> integrados. La ruta &lt;em>gestionada por infraestructura&lt;/em> es &lt;strong>SageMaker Endpoints&lt;/strong> (real-time, async, serverless, batch) con &lt;strong>Inference Components&lt;/strong> para densificar múltiples modelos en una instancia. Hardware propio: &lt;strong>AWS Inferentia&lt;/strong> y &lt;strong>Trainium&lt;/strong> vía el chip &lt;strong>Neuron&lt;/strong>, alternativa a NVIDIA con coste / token mejor en cargas estables si compila tu modelo.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Prediction Endpoints&lt;/strong> corre tus contenedores o modelos del &lt;strong>Model Garden&lt;/strong>, &lt;strong>Gemini API&lt;/strong> vía Vertex AI ofrece los Gemini gestionados, &lt;strong>Cloud TPU v5e / v5p / Trillium (v6)&lt;/strong> como hardware propio competidor de H100 para entrenamiento e inferencia. Para soberanía está &lt;strong>Google Distributed Cloud air-gapped&lt;/strong>, que lleva Vertex AI a un rack on-premise certificable.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure OpenAI Service&lt;/strong> sirve modelos OpenAI (GPT-4.1, o-series, GPT-image), &lt;strong>Azure ML Managed Online Endpoints&lt;/strong> corre cualquier modelo (incluido OSS vía contenedor), &lt;strong>Azure AI Foundry models&lt;/strong> absorbió en 2025 el catálogo de modelos abiertos servidos as-a-service. Hardware: &lt;strong>Azure ND H100 v5&lt;/strong>, &lt;strong>ND H200 v5&lt;/strong>, &lt;strong>ND GB200 v6&lt;/strong> y la apuesta propia &lt;strong>Microsoft Maia 100&lt;/strong> para inferencia interna.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Deploy.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Motor de inferencia&lt;/td>
&lt;td>vLLM, TensorRT-LLM, SGLang, TGI&lt;/td>
&lt;td>Bedrock (modelo gestionado), SM Endpoints (tu contenedor)&lt;/td>
&lt;td>Vertex Prediction, Gemini API&lt;/td>
&lt;td>Azure OpenAI, Azure ML Endpoints&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix / prompt caching&lt;/td>
&lt;td>vLLM nativo&lt;/td>
&lt;td>Bedrock Prompt Caching&lt;/td>
&lt;td>Vertex AI context caching&lt;/td>
&lt;td>Azure OpenAI prompt caching&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Adapter hot-swap (LoRA)&lt;/td>
&lt;td>vLLM &lt;code>--enable-lora&lt;/code>, S-LoRA&lt;/td>
&lt;td>Bedrock Custom Models endpoints&lt;/td>
&lt;td>Vertex Tuning endpoints&lt;/td>
&lt;td>Azure OpenAI fine-tuned deployments&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disaggregated serving&lt;/td>
&lt;td>NVIDIA Dynamo, vLLM PD-disagg&lt;/td>
&lt;td>— (interno gestionado, no expuesto)&lt;/td>
&lt;td>— (interno gestionado, no expuesto)&lt;/td>
&lt;td>— (interno gestionado, no expuesto)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware acelerador&lt;/td>
&lt;td>NVIDIA H100/H200/B200, AMD MI300&lt;/td>
&lt;td>Inferentia, Trainium, NVIDIA&lt;/td>
&lt;td>TPU v5/v6, NVIDIA&lt;/td>
&lt;td>Maia, NVIDIA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AI Gateway / proxy&lt;/td>
&lt;td>Envoy AI Gateway, LiteLLM, Portkey, Kong&lt;/td>
&lt;td>API Gateway + Bedrock&lt;/td>
&lt;td>Vertex AI + Apigee&lt;/td>
&lt;td>Azure API Management + AOAI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Orquestación K8s&lt;/td>
&lt;td>KServe, KubeRay, llm-d, KAITO&lt;/td>
&lt;td>EKS + SageMaker Operators&lt;/td>
&lt;td>GKE + Vertex AI&lt;/td>
&lt;td>AKS + KAITO&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Bedrock Prompt Caching y Vertex context caching &lt;strong>suenan&lt;/strong> equivalentes al prefix caching de vLLM, pero operativamente son distintos: el cache vive en el plano del hyperscaler, su política de eviction es opaca, su coste se cobra aparte, y no podés ver hit ratio por tenant fácilmente. En vLLM ves el hit ratio en métricas Prometheus y decides la política. Igual con disaggregated serving: los hyperscalers lo implementan internamente para reducir su propio coste de servir, pero &lt;strong>no exponen&lt;/strong> el control de prefill/decode al usuario — si necesitas que tu workload tenga TTFT controlado por separado del TPS, no es palanca disponible.&lt;/p>
&lt;h2 id="etapa-5--observe">Etapa 5 — Observe&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Trazas LLM end-to-end con &lt;code>trace_id&lt;/code> propagado por todos los componentes, métricas de runtime por tenant, scoring online (judge LLM sobre sampling), drift estadístico, y safety / guardrails monitoring. Cubierto en los posts de &lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">tracing AgentSight&lt;/a>, &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability con OTel&lt;/a> y &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Estándar base: &lt;strong>OpenTelemetry&lt;/strong> (especificación + collector + SDKs) con las &lt;strong>gen_ai semantic conventions&lt;/strong> que se estabilizaron en 2025. Backends: &lt;strong>Tempo&lt;/strong> o &lt;strong>Jaeger&lt;/strong> para traces, &lt;strong>Prometheus&lt;/strong> para metrics, &lt;strong>Loki&lt;/strong> para logs, &lt;strong>Grafana&lt;/strong> como UI común. Capa LLM-específica: &lt;strong>Langfuse&lt;/strong> (self-hosted con licencia EE opcional) y &lt;strong>Phoenix Arize OSS&lt;/strong>. Capa eBPF para observabilidad de bajo nivel: &lt;strong>Pixie&lt;/strong>, &lt;strong>Hubble&lt;/strong>, y &lt;strong>Cilium Tetragon&lt;/strong> para runtime security. Drift: &lt;strong>Evidently AI&lt;/strong>, &lt;strong>NannyML&lt;/strong>, &lt;strong>Alibi Detect&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>CloudWatch&lt;/strong> (metrics + logs) + &lt;strong>AWS X-Ray&lt;/strong> (traces) son la base, &lt;strong>CloudWatch Application Signals&lt;/strong> añade APM con OTel compatible, &lt;strong>Amazon Managed Prometheus&lt;/strong> y &lt;strong>Amazon Managed Grafana&lt;/strong> sirven el plano si quieres mantener Prom + Grafana sin operar. &lt;strong>Bedrock logging&lt;/strong> integrado con CloudWatch y S3. &lt;strong>ADOT&lt;/strong> (AWS Distro for OpenTelemetry) es el collector oficial.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Cloud Monitoring&lt;/strong> + &lt;strong>Cloud Logging&lt;/strong> + &lt;strong>Cloud Trace&lt;/strong> + &lt;strong>Cloud Profiler&lt;/strong> forman el quinteto, todos compatibles con OTel. &lt;strong>Vertex AI Model Monitoring&lt;/strong> ofrece drift detection (feature skew, prediction drift) integrado con runs.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure Monitor&lt;/strong> + &lt;strong>Application Insights&lt;/strong> + &lt;strong>Log Analytics&lt;/strong> cubren la pila APM con OTel nativo, &lt;strong>Azure ML Model Monitor&lt;/strong> añade drift y data quality, &lt;strong>Azure OpenAI diagnostic logs&lt;/strong> enriquecen los traces con metadata de tokens y modelo.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Observe.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Traces (OTel)&lt;/td>
&lt;td>OTel + Tempo / Jaeger&lt;/td>
&lt;td>X-Ray + ADOT, App Signals&lt;/td>
&lt;td>Cloud Trace&lt;/td>
&lt;td>App Insights + Azure Monitor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Metrics&lt;/td>
&lt;td>Prometheus + Grafana&lt;/td>
&lt;td>CloudWatch + AMP / AMG&lt;/td>
&lt;td>Cloud Monitoring&lt;/td>
&lt;td>Azure Monitor Metrics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Logs&lt;/td>
&lt;td>Loki, ELK&lt;/td>
&lt;td>CloudWatch Logs&lt;/td>
&lt;td>Cloud Logging&lt;/td>
&lt;td>Log Analytics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LLM-específico (prompt, scores, sessions)&lt;/td>
&lt;td>Langfuse, Phoenix Arize OSS&lt;/td>
&lt;td>Bedrock logging + CW + custom&lt;/td>
&lt;td>Vertex AI tracing + custom&lt;/td>
&lt;td>App Insights + AOAI logs + custom&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Drift detection&lt;/td>
&lt;td>Evidently, NannyML, Alibi Detect&lt;/td>
&lt;td>SageMaker Model Monitor&lt;/td>
&lt;td>Vertex AI Model Monitoring&lt;/td>
&lt;td>Azure ML Model Monitor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>eBPF / runtime&lt;/td>
&lt;td>Pixie, Hubble, Tetragon&lt;/td>
&lt;td>— (no equivalente directo)&lt;/td>
&lt;td>GKE Dataplane v2 / Cloud Service Mesh&lt;/td>
&lt;td>Azure CNI + Defender for Cloud&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Las herramientas APM clásicas del cloud (X-Ray, Cloud Trace, App Insights) no entienden &lt;strong>prompt versioning&lt;/strong> ni &lt;strong>adapter id&lt;/strong> como conceptos nativos. Aceptan los atributos &lt;code>gen_ai.*&lt;/code> como dimensions, pero las UIs no priorizan esas vistas. Langfuse y Phoenix sí, porque están diseñadas para LLM. En cloud, el patrón habitual es enviar dual: APM al servicio gestionado para infra + Langfuse / Phoenix self-hosted para el plano LLM. Eso compensa.&lt;/p>
&lt;h2 id="etapa-6--retrain--transversales">Etapa 6 — Retrain + transversales&lt;/h2>
&lt;p>&lt;strong>El problema (Retrain).&lt;/strong> Cerrar el bucle feedback → triage → dataset enriquecido → adapter nuevo, con cadencia mixta (trimestral + incident-driven). Cubierto en el &lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">post de Retrain&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS Retrain.&lt;/strong> Orquestación: &lt;strong>Apache Airflow&lt;/strong>, &lt;strong>Prefect&lt;/strong>, &lt;strong>Dagster&lt;/strong> o &lt;strong>Argo Workflows&lt;/strong> y &lt;strong>Kubeflow Pipelines&lt;/strong> para K8s-native. Feature store cuando aplica: &lt;strong>Feast&lt;/strong>. Annotation y human-in-the-loop: &lt;strong>Argilla&lt;/strong>, &lt;strong>Label Studio&lt;/strong>, &lt;strong>Trubrics&lt;/strong>. Captura de feedback estructurado: tabla &lt;strong>Postgres&lt;/strong> propia + &lt;strong>Langfuse scores&lt;/strong> + &lt;strong>Phoenix annotations&lt;/strong>. Lineage del ciclo cerrado: &lt;strong>OpenLineage&lt;/strong> atando dataset → run → model → deployment → feedback → dataset siguiente.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler Retrain.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>SageMaker Pipelines&lt;/strong> orquesta el ciclo, &lt;strong>SageMaker Ground Truth&lt;/strong> y &lt;strong>A2I&lt;/strong> (Augmented AI) gestionan annotation y HiL, &lt;strong>SageMaker Model Monitor&lt;/strong> dispara alertas que pueden invocar pipelines de retrain. &lt;strong>AWS Step Functions&lt;/strong> sirve como orquestador alternativo más general.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Pipelines&lt;/strong> (basado en Kubeflow Pipelines, compatible) orquesta, &lt;strong>Vertex AI Data Labeling Service&lt;/strong> anota, &lt;strong>Vertex AI Feature Store&lt;/strong> gestiona features, &lt;strong>Workflows&lt;/strong> o &lt;strong>Cloud Composer&lt;/strong> (Airflow gestionado) como alternativas de orquestación.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure ML Pipelines&lt;/strong> orquesta, &lt;strong>Azure ML Data Labeling&lt;/strong> anota, &lt;strong>Azure ML Feature Store&lt;/strong> gestiona features.&lt;/p>
&lt;p>&lt;strong>El problema (transversales: prompt + data versioning).&lt;/strong> Que &lt;code>prompt_id, prompt_version&lt;/code> y &lt;code>dataset_id, dataset_version&lt;/code> propaguen por todo el sistema y aparezcan en spans, runs y métricas. Cubiertos en los posts de &lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">prompt versioning&lt;/a> y &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">data versioning&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Equivalentes prompt versioning.&lt;/strong> OSS: &lt;strong>Langfuse Prompts&lt;/strong>, &lt;strong>MLflow Prompt Registry&lt;/strong>. AWS: &lt;strong>Bedrock Prompt Management&lt;/strong> (catalog, versiones, labels, A/B testing integrado) y &lt;strong>SageMaker Prompt Hub&lt;/strong>. GCP: &lt;strong>Vertex AI Prompt Management&lt;/strong> dentro de Vertex AI Studio. Azure: &lt;strong>Azure AI Foundry Prompt flow&lt;/strong> y prompt versioning en &lt;strong>Azure OpenAI deployments&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Equivalentes data versioning.&lt;/strong> OSS: DVC + lakeFS (ya cubierto en Data). AWS: S3 Versioning + Lake Formation + Glue Catalog (no son DVC pero juntos cubren parte). GCP: Cloud Storage versioning + Dataplex (idem). Azure: ADLS Gen2 versioning + Purview (idem). El &lt;strong>gap real&lt;/strong> aquí es que ningún hyperscaler ofrece DVC nativamente — la operativa de dataset-as-first-class-citizen sigue requiriendo capa propia.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Retrain + transversales.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Orquestación pipelines ML&lt;/td>
&lt;td>Airflow, Dagster, Argo, Kubeflow&lt;/td>
&lt;td>SageMaker Pipelines, Step Functions&lt;/td>
&lt;td>Vertex AI Pipelines, Cloud Composer&lt;/td>
&lt;td>Azure ML Pipelines&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Feature store&lt;/td>
&lt;td>Feast&lt;/td>
&lt;td>SageMaker Feature Store&lt;/td>
&lt;td>Vertex AI Feature Store&lt;/td>
&lt;td>Azure ML Feature Store&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Annotation / HiL&lt;/td>
&lt;td>Argilla, Label Studio&lt;/td>
&lt;td>SageMaker Ground Truth, A2I&lt;/td>
&lt;td>Vertex Data Labeling&lt;/td>
&lt;td>Azure ML Data Labeling&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Captura de feedback&lt;/td>
&lt;td>Postgres + Langfuse scores&lt;/td>
&lt;td>Bedrock + custom + Ground Truth&lt;/td>
&lt;td>Vertex + custom&lt;/td>
&lt;td>App Insights + custom&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prompt versioning&lt;/td>
&lt;td>Langfuse Prompts, MLflow Prompts&lt;/td>
&lt;td>Bedrock Prompt Management&lt;/td>
&lt;td>Vertex Prompt Management&lt;/td>
&lt;td>Azure AI Foundry Prompt flow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Data versioning&lt;/td>
&lt;td>DVC + lakeFS + OpenLineage&lt;/td>
&lt;td>S3 Versioning + Lake Formation&lt;/td>
&lt;td>GCS + Dataplex&lt;/td>
&lt;td>ADLS + Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Lineage cross-system&lt;/td>
&lt;td>OpenLineage + DataHub&lt;/td>
&lt;td>SageMaker Lineage Tracking&lt;/td>
&lt;td>Dataplex lineage&lt;/td>
&lt;td>Purview&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="el-chatbot-del-post-anterior-portado-a-aws">El chatbot del post anterior portado a AWS&lt;/h2>
&lt;p>Para que el catálogo deje de ser abstracto, tomamos el escenario completo del &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post anterior&lt;/a> — el chatbot multi-tenant de soporte para aseguradoras sobre stack OSS on-premise — y lo describimos componente a componente con stack AWS. No es una migración ejecutable; es el &lt;strong>mapa de qué desaparece, qué aparece y dónde aparece el lock-in&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>El plano de red.&lt;/strong> Edge LB y WAF: &lt;strong>AWS WAF + CloudFront&lt;/strong>. Ingress al cluster: &lt;strong>AWS Load Balancer Controller&lt;/strong> sobre &lt;strong>EKS&lt;/strong>. Lo que era Cilium BGP + RKE2 se sustituye por EKS con &lt;strong>VPC CNI&lt;/strong> (o Cilium en EKS, posible). El equivalente conceptual de Tetragon es &lt;strong>Amazon GuardDuty for EKS&lt;/strong> + &lt;strong>Falco&lt;/strong> opcional. Lock-in moderado: el control de red se acopla a VPC.&lt;/p>
&lt;p>&lt;strong>El gateway de chat y la auth.&lt;/strong> Lo que era una API gateway propia con JWT verificación se materializa como &lt;strong>Amazon API Gateway&lt;/strong> + &lt;strong>Amazon Cognito&lt;/strong> (o IAM Identity Center si es B2B). El AI-aware routing del gateway se cubre con &lt;strong>Bedrock&lt;/strong> + tags por cliente o con &lt;strong>AWS API Gateway custom authorizers&lt;/strong> invocando una Lambda para tenant resolution. Lock-in alto en la capa de identidad si se elige Cognito.&lt;/p>
&lt;p>&lt;strong>El motor de inferencia.&lt;/strong> Tres opciones distintas, con trade-off claro.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Bedrock con modelo gestionado&lt;/strong> (Claude / Llama / Mistral): se elimina toda la operativa de vLLM, K8s Operators, KV cache y disaggregated serving. Se pasa a &lt;strong>Provisioned Throughput&lt;/strong> para garantía de latencia. Se gana time-to-market; se pierde control sobre prefill/decode, sobre adapter LoRA custom (Bedrock acepta fine-tunes Bedrock-managed pero no LoRAs arbitrarios), y se entra en lock-in de modelo (cambiar de Claude a Llama es cambiar de API).&lt;/li>
&lt;li>&lt;strong>SageMaker Endpoints con tu contenedor vLLM&lt;/strong>: se mantiene vLLM y sus optimizaciones, pero K8s desaparece y SageMaker lo reemplaza como plano de orquestación. Inference Components permite densificar múltiples adapters. El KV cache, prefix caching y LoRA hot-swap funcionan igual. Lock-in moderado en el SDK SageMaker y en el formato de Inference Components.&lt;/li>
&lt;li>&lt;strong>EKS con vLLM&lt;/strong> (la opción minimalista): básicamente el stack OSS pero con EKS en lugar de RKE2 y EBS/EFS en lugar de Ceph. Lock-in bajo, beneficio limitado del cloud.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Data layer.&lt;/strong> El corpus pasa a &lt;strong>S3&lt;/strong> con versioning, los embeddings a &lt;strong>Amazon OpenSearch Service&lt;/strong> o a &lt;strong>Aurora pgvector&lt;/strong>. La opción gestionada radical es &lt;strong>Bedrock Knowledge Bases&lt;/strong>: subes documentos a S3, te indexa, te expone un retrieval API. Eliminamos Qdrant, eliminamos pipelines de embedding manuales, eliminamos parte de Kafka + Flink. Pero el control sobre reranking custom, ACL fino por chunk y la posibilidad de re-embeber con un encoder propio nuevo desaparece — Bedrock KB usa los embedders de Titan o Cohere disponibles en Bedrock, y cambiarlos es cambiar todo el índice. Compliance ENS: hay que validar que los buckets y el índice viven en regiones EU y que el modelo de embedding también.&lt;/p>
&lt;p>&lt;strong>Stream + CDC.&lt;/strong> Kafka + Debezium se reemplaza por &lt;strong>MSK&lt;/strong> + &lt;strong>MSK Connect&lt;/strong> o por &lt;strong>Kinesis + DMS&lt;/strong>. Schema Registry: &lt;strong>Glue Schema Registry&lt;/strong>. Los eventos siguen siendo equivalentes funcionalmente. Lock-in moderado si vas a Kinesis (Kinesis no es Kafka), bajo si vas a MSK (compatibilidad Kafka).&lt;/p>
&lt;p>&lt;strong>Data versioning.&lt;/strong> Aquí el gap es claro. S3 Versioning + Lake Formation + Glue Catalog &lt;strong>no es DVC&lt;/strong>. Para conservar la disciplina del post anterior — &lt;code>(dataset_id, dataset_version, sha256_hash)&lt;/code> propagado como input artifact al trainer — se puede mantener DVC sobre S3 (DVC funciona perfectamente con S3 como remote) o aceptar la limitación y registrar manualmente el lineage en SageMaker Lineage Tracking. La primera opción mantiene la operativa; la segunda acepta degradación.&lt;/p>
&lt;p>&lt;strong>Etapa Tune.&lt;/strong> El adapter LoRA &lt;code>customer_support_v7&lt;/code> se entrena con &lt;strong>SageMaker Training Jobs&lt;/strong> sobre instancias &lt;strong>ml.p5.48xlarge&lt;/strong> (8× H100), usando un contenedor HuggingFace + PEFT estándar. MLflow gestionado por SageMaker o MLflow propio en EC2 cubren el tracking. Alternativa: si se acepta el caja negra, &lt;strong>Bedrock Custom Models&lt;/strong> con un dataset en S3 produce un modelo Bedrock fine-tuneado sin instanciar GPU manualmente, a cambio de no poder inspeccionar el run.&lt;/p>
&lt;p>&lt;strong>Etapa Eval.&lt;/strong> Promptfoo + RAGAS en CI corre igual sobre &lt;strong>CodeBuild&lt;/strong>. &lt;strong>Bedrock Model Evaluation&lt;/strong> sustituye buena parte de la suite de evals automáticos. &lt;strong>Bedrock Guardrails&lt;/strong> sustituye NeMo Guardrails + Presidio + LlamaGuard, con la pérdida de transparencia comentada antes.&lt;/p>
&lt;p>&lt;strong>Etapa Deploy.&lt;/strong> Si se eligió Bedrock como motor, esta etapa se desvanece — Bedrock sirve. Si se eligió SageMaker Endpoints + vLLM, KServe se sustituye por SageMaker Operators (o se conserva KServe sobre EKS). El AI Gateway que en OSS era Envoy AI Gateway o LiteLLM pasa a ser &lt;strong>API Gateway&lt;/strong> + &lt;strong>Bedrock&lt;/strong> o &lt;strong>API Gateway&lt;/strong> + &lt;strong>Lambda&lt;/strong> + &lt;strong>SageMaker&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Etapa Observe.&lt;/strong> OTel Collector sigue siendo el estándar. Trazas a &lt;strong>AWS X-Ray&lt;/strong> + &lt;strong>CloudWatch Application Signals&lt;/strong>. Métricas a &lt;strong>Amazon Managed Prometheus&lt;/strong>. Logs a &lt;strong>CloudWatch Logs&lt;/strong> + opcional &lt;strong>OpenSearch&lt;/strong> para búsqueda. &lt;strong>Langfuse&lt;/strong> se hospeda en &lt;strong>ECS Fargate&lt;/strong> o &lt;strong>EKS&lt;/strong> porque el cloud no tiene equivalente nativo del prompt + traces + scores integrado. Drift: &lt;strong>SageMaker Model Monitor&lt;/strong> sustituye Evidently / NannyML. eBPF (Pixie / Hubble / Tetragon) &lt;strong>no tiene equivalente directo&lt;/strong> en AWS gestionado — Falco o instalación de Tetragon en EKS sigue siendo la ruta.&lt;/p>
&lt;p>&lt;strong>Etapa Retrain.&lt;/strong> &lt;strong>SageMaker Pipelines&lt;/strong> orquesta el ciclo trimestral. &lt;strong>SageMaker Ground Truth&lt;/strong> + &lt;strong>A2I&lt;/strong> sustituyen Argilla. El &lt;code>feedback_signals&lt;/code> en Postgres se mantiene tal cual (RDS Postgres) o se traslada a DynamoDB para escalas grandes.&lt;/p>
&lt;p>&lt;strong>Cuánto pesa el lock-in.&lt;/strong> El componente con lock-in más alto es Bedrock + Bedrock Knowledge Bases + Bedrock Guardrails: salir de ahí requiere reescribir el plano de inferencia y reindexar todo el RAG. Le sigue SageMaker SDK (Pipelines, Endpoints, Training) — salir cuesta pero es reescribir scripts, no datos. Datos en S3 son portables (S3 → MinIO con &lt;code>rclone&lt;/code> funciona). El observabilidad OTel es portable casi sin coste si se mantiene el collector como abstracción. El gateway de auth es el otro punto de lock-in alto si va Cognito.&lt;/p>
&lt;p>&lt;strong>Qué se gana.&lt;/strong> Reducción dramática de operativa de infraestructura GPU, parches K8s, gestión de drivers CUDA, dimensionamiento de prefill/decode, gestión de Ceph / MinIO. Curva de arranque muy corta: una request servida en menos de un sprint vs varias semanas de bring-up del stack OSS. SLAs explícitos del proveedor.&lt;/p>
&lt;p>&lt;strong>Qué se pierde.&lt;/strong> Soberanía contractual de datos (los datos siguen en regiones EU si así se configura, pero el operador es un tercero estadounidense bajo Cloud Act). Visibilidad de la pila completa (Bedrock es caja negra desde el modelo hacia abajo). Independencia de roadmap (la decisión de discontinuar un modelo, subir precios o cambiar guardrails no la controla el cliente). Optimización fina del coste por token (las palancas son las que el proveedor expone). Para clientes ENS bajo declaración ALTA o NIS2 categoría esencial, varios de estos puntos son &lt;strong>incumplimiento&lt;/strong>, no preferencia.&lt;/p>
&lt;h2 id="tabla-maestra-el-catálogo-paralelo-entero">Tabla maestra: el catálogo paralelo entero&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Etapa / componente&lt;/th>
&lt;th>OSS on-premise (referencia del blog)&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Data&lt;/strong>&lt;/td>
&lt;td>DVC + lakeFS + MinIO + Qdrant + Kafka + Debezium&lt;/td>
&lt;td>S3 + Lake Formation + OpenSearch / Aurora pgvector + MSK + DMS&lt;/td>
&lt;td>GCS + Dataplex + Vertex Vector Search + Pub/Sub + Datastream&lt;/td>
&lt;td>ADLS Gen2 + Purview + Azure AI Search + Event Hubs + ADF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Data versioning (transv.)&lt;/strong>&lt;/td>
&lt;td>DVC + lakeFS + OpenLineage&lt;/td>
&lt;td>S3 Versioning + Lake Formation + Glue Catalog&lt;/td>
&lt;td>GCS Versioning + Dataplex lineage&lt;/td>
&lt;td>ADLS versioning + Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tune&lt;/strong>&lt;/td>
&lt;td>HF Transformers + PEFT + bitsandbytes + MLflow + Ray/Kubeflow&lt;/td>
&lt;td>SageMaker Training + HyperPod + Bedrock Custom + SM Experiments&lt;/td>
&lt;td>Vertex AI Training + Vertex Tuning + Vertex Experiments&lt;/td>
&lt;td>Azure ML Training + Azure OpenAI fine-tuning + Azure ML + MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Eval&lt;/strong>&lt;/td>
&lt;td>DeepEval + RAGAS + Promptfoo + Langfuse Evals + NeMo Guardrails&lt;/td>
&lt;td>Bedrock Model Evaluation + Bedrock Guardrails + SageMaker Clarify&lt;/td>
&lt;td>Vertex AI Evaluation Service + Model Armor + Gemini safety&lt;/td>
&lt;td>Azure AI Evaluation SDK + Content Safety (Prompt Shields, Groundedness)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Deploy&lt;/strong>&lt;/td>
&lt;td>vLLM + KServe + LLM Operators + Envoy AI Gateway&lt;/td>
&lt;td>Bedrock + SageMaker Endpoints (+ Inferentia / Trainium)&lt;/td>
&lt;td>Vertex AI Prediction + Gemini API (+ TPU)&lt;/td>
&lt;td>Azure OpenAI + Azure ML Endpoints (+ Maia)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Observe&lt;/strong>&lt;/td>
&lt;td>OTel + Tempo + Prometheus + Loki + Langfuse + Phoenix + Hubble&lt;/td>
&lt;td>CloudWatch + X-Ray + ADOT + AMP/AMG + SM Model Monitor&lt;/td>
&lt;td>Cloud Monitoring + Cloud Trace + Vertex Model Monitoring&lt;/td>
&lt;td>Azure Monitor + App Insights + Azure ML Model Monitor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Retrain&lt;/strong>&lt;/td>
&lt;td>Airflow / Argo / Kubeflow Pipelines + Argilla + Feast&lt;/td>
&lt;td>SageMaker Pipelines + Ground Truth + A2I + SM Feature Store&lt;/td>
&lt;td>Vertex AI Pipelines + Data Labeling + Vertex Feature Store&lt;/td>
&lt;td>Azure ML Pipelines + Data Labeling + Azure ML Feature Store&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Prompt versioning (transv.)&lt;/strong>&lt;/td>
&lt;td>Langfuse Prompts + MLflow Prompt Registry&lt;/td>
&lt;td>Bedrock Prompt Management + SM Prompt Hub&lt;/td>
&lt;td>Vertex AI Prompt Management&lt;/td>
&lt;td>Azure AI Foundry Prompt flow&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="cuándo-elegir-cada-lado--la-decisión-real">Cuándo elegir cada lado — la decisión real&lt;/h2>
&lt;p>La pregunta correcta no es &lt;em>&amp;quot;¿OSS o cloud?&amp;quot;&lt;/em>. Es por etapa.&lt;/p>
&lt;p>El &lt;strong>lado OSS gana por defecto&lt;/strong> cuando hay:&lt;/p>
&lt;ul>
&lt;li>Datos sometidos a ENS categoría ALTA, NIS2 sectores esenciales o equivalentes (datos sanitarios identificables, banca regulada, infra crítica). Aquí la trazabilidad del proveedor y el contrato de procesamiento no son negociables; usar un servicio cuyo operador esté sometido a Cloud Act, FISA 702 o equivalente compromete la base legal.&lt;/li>
&lt;li>Requisitos de inspección auditable del modelo, los guardrails y el pipeline completo. Si un regulador pregunta &lt;em>&amp;quot;¿cómo detecta exactamente PII?&amp;quot;&lt;/em> y la respuesta acabable en código abierto es obligatoria.&lt;/li>
&lt;li>Volúmenes grandes con cargas estables. Por encima de cierto umbral de tokens/mes, el coste de Bedrock / AOAI / Vertex se aleja del coste amortizado de un cluster GPU propio. El umbral depende de carga, pero típicamente está entre 5-50 mil millones de tokens/mes para modelos del rango Llama 70B.&lt;/li>
&lt;li>Independencia de roadmap es prioritaria. El día que el proveedor discontinúa un modelo o sube el precio un 40%, la organización tiene que poder ignorarlo.&lt;/li>
&lt;/ul>
&lt;p>El &lt;strong>lado hyperscaler gana por defecto&lt;/strong> cuando hay:&lt;/p>
&lt;ul>
&lt;li>Time-to-market crítico, MVP en semanas. La operativa del stack OSS pesa demasiado para un proyecto que aún no ha probado producto-mercado.&lt;/li>
&lt;li>Equipo pequeño sin SREs / MLEs especializados en inferencia GPU. La operativa de KServe + vLLM + KV cache + multi-tenant no es trivial; si el equipo no puede sostenerla, hospedar es el camino.&lt;/li>
&lt;li>Cargas variables / spikes impredecibles. Bedrock on-demand y SageMaker serverless cobran lo que usas; un cluster propio paga la GPU esté ocupada o no.&lt;/li>
&lt;li>Necesidad de modelos propietarios específicos (Claude, GPT-4.1, Gemini Pro) que no tienen equivalente OSS aceptable para el caso.&lt;/li>
&lt;/ul>
&lt;p>Las &lt;strong>etapas mixtas&lt;/strong> son frecuentes y razonables. En la práctica, un patrón común en 2026 es: data, observe y retrain en OSS self-hosted (lineage y soberanía), tune en OSS sobre cluster propio, eval en OSS + guardrails gestionados según safety profile, deploy gestionado para modelos propietarios y self-hosted para modelos abiertos. La pregunta a hacerse para cada etapa es: &lt;em>&amp;ldquo;si el proveedor sube precios un 50% o discontinúa un componente mañana, ¿cuánto cuesta moverlo?&amp;rdquo;&lt;/em>. El catálogo paralelo de este post da la respuesta para cada caja.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-todavía">Lo que no hemos cubierto (todavía)&lt;/h2>
&lt;p>Quedan piezas merecedoras de su propio post:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>OpenAI / Anthropic API directamente&lt;/strong> (no a través de Bedrock o AOAI): otro nivel de gestionado, otro contrato.&lt;/li>
&lt;li>&lt;strong>Híbridos serios&lt;/strong>: Outposts AWS, Distributed Cloud GCP, Azure Stack HCI / Azure Local — el hyperscaler en tu sala.&lt;/li>
&lt;li>&lt;strong>Cost accounting por tenant&lt;/strong> comparado OSS vs cloud: cómo se hace la factura y dónde se rompe la atribución.&lt;/li>
&lt;li>&lt;strong>Migración real&lt;/strong> OSS → cloud o cloud → OSS: pasos, scripts, gotchas.&lt;/li>
&lt;li>&lt;strong>Soberanía europea concreta&lt;/strong>: GAIA-X, EuroHPC, oferta de cloud europeo (OVHcloud, Scaleway, IONOS, Aruba), comparativa con los tres grandes para casos ENS / NIS2.&lt;/li>
&lt;li>&lt;strong>AWS Inferentia / Trainium, GCP TPU v6 Trillium, Azure Maia&lt;/strong>: chips propios y cómo cambian el cálculo de coste / token.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM en producción&lt;/a> — el recorrido forense de una request por las seis etapas, hilo del que este post hace el corte vertical.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">El catálogo OSS para LLMOps en seis etapas: ficha por ficha&lt;/a> — el zoom in al lado open source de la tabla maestra de este post: ficha de ~150 palabras por herramienta OSS core (vLLM, Langfuse, DVC, Qdrant, Airflow, NeMo Guardrails, Presidio…), licencia y gobierno, matriz de decisión por etapa y diagrama del stack OSS conectado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">El pipeline LLMOps de seis etapas&lt;/a> — el mapa maestro al que este catálogo es complemento.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mlops-llms-panorama-2026/">MLOps específico para LLMs en 2026&lt;/a> — contexto general sobre por qué LLMOps no es MLOps clásico.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> — el deep-dive del transversal Data.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">Prompt versioning con Langfuse y MLflow&lt;/a> — el deep-dive del transversal Prompt.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">Fine-tuning continuo en producción&lt;/a> — Tune detallado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> — Eval detallado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — la capa de safety en detalle.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a> · &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a> · &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">Disaggregated serving&lt;/a> — Deploy desde dentro.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en Kubernetes&lt;/a> · &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">Operators LLM en K8s&lt;/a> · &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">Cluster GPU multi-tenant&lt;/a> — Deploy operativo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">AgentSight tracing LLM&lt;/a> · &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability con OTel&lt;/a> · &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a> — Observe en sus capas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain: cerrar el bucle feedback → dataset → adapter&lt;/a> — Retrain detallado.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.vllm.ai/">vLLM documentation&lt;/a> y &lt;a href="https://github.com/vllm-project/production-stack">vLLM Production Stack&lt;/a> — motor de inferencia OSS de referencia.&lt;/li>
&lt;li>&lt;a href="https://docs.aws.amazon.com/bedrock/">Amazon Bedrock documentation&lt;/a> — catálogo de modelos gestionados AWS, Knowledge Bases, Guardrails y Prompt Management.&lt;/li>
&lt;li>&lt;a href="https://docs.aws.amazon.com/sagemaker/">Amazon SageMaker AI&lt;/a> — training, endpoints, pipelines, model monitoring.&lt;/li>
&lt;li>&lt;a href="https://cloud.google.com/vertex-ai/docs">Google Vertex AI documentation&lt;/a> — training, prediction, evaluation, model monitoring.&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/azure/ai-foundry/">Azure AI Foundry documentation&lt;/a> — plano unificado de Microsoft para AI applications.&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/azure/ai-services/openai/">Azure OpenAI Service documentation&lt;/a> — modelos OpenAI hospedados en Azure.&lt;/li>
&lt;li>&lt;a href="https://opentelemetry.io/docs/specs/semconv/gen-ai/">OpenTelemetry GenAI semantic conventions&lt;/a> — el estándar que cose la observabilidad a través de las fronteras OSS / cloud.&lt;/li>
&lt;li>&lt;a href="https://langfuse.com/docs">Langfuse documentation&lt;/a> y &lt;a href="https://docs.arize.com/phoenix">Arize Phoenix&lt;/a> — LLM observability OSS de referencia.&lt;/li>
&lt;li>&lt;a href="https://dvc.org/">DVC&lt;/a> y &lt;a href="https://lakefs.io/">lakeFS&lt;/a> — data versioning OSS.&lt;/li>
&lt;li>&lt;a href="https://docs.nvidia.com/nemo/guardrails/">NeMo Guardrails&lt;/a> — safety + dialog policy OSS.&lt;/li>
&lt;li>ENS (Esquema Nacional de Seguridad) y NIS2 (Network and Information Security Directive 2) — los marcos de cumplimiento que tienen la última palabra en la elección OSS vs cloud para clientes regulados de la UE.&lt;/li>
&lt;/ul></description></item></channel></rss>