<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://aboneto.dev/feed.xml" rel="self" type="application/atom+xml"/><link href="https://aboneto.dev/" rel="alternate" type="text/html" hreflang="es"/><updated>2026-06-03T16:14:53+00:00</updated><id>https://aboneto.dev/feed.xml</id><title type="html">aboneto.dev</title><subtitle>Escribo sobre IA aplicada, infraestructura y arquitectura. Cosas que pruebo, mido y uso en el día a día.</subtitle><author><name>Antonio Barbosa</name></author><entry xml:lang="es"><title type="html">Opencode Go vs Claude Code: Un análisis real de 11 días</title><link href="https://aboneto.dev/opencode-go-vs-claude-code" rel="alternate" type="text/html" title="Opencode Go vs Claude Code: Un análisis real de 11 días"/><published>2026-05-30T00:00:00+00:00</published><updated>2026-05-30T00:00:00+00:00</updated><id>https://aboneto.dev/opencode-go-vs-claude-code</id><content type="html" xml:base="https://aboneto.dev/opencode-go-vs-claude-code"><![CDATA[<p>Llevo 11 días usando <a href="https://opencode.ai">Opencode Go</a> de forma intensiva para probar sus modelos y las capacidades de la herramienta. Estuve probando diferentes modelos, desde los más baratos hasta los premium, y viendo cómo se comportan en tareas de arquitectura, refactoring y Vibe Coding. Con buenas técnicas de prompt, aplicando <a href="https://en.wikipedia.org/wiki/Spec-driven_development">Spec Driven Development (SDD)</a>, <a href="https://github.com/JuliusBrussee/caveman">Caveman</a> y <a href="https://github.com/rtk-ai/rtk">RTK</a>, logré buenos resultados con un bajo costo.</p> <p>Mi suscripción de $10 me da un límite de $60 en consumo de API, de los cuales ya usé $50 en apenas 11 días. Eso me hizo preguntarme: ¿qué pasaría si me paso a Claude Code? Durante este tiempo también estuve probando el <a href="https://claude.com/pricing">plan pro de Claude Code</a>, pero me encontré con límites de uso que me hicieron cuestionar si realmente es la mejor opción para mi patrón de uso, principalmente cuando usaba <a href="https://artificialanalysis.ai/models/claude-opus-4-7">Claude Opus 4.7</a>.</p> <p>Acá van los datos reales. Cuánto gasté, en qué modelos, qué pasaría con los límites de Claude Code y por qué pagar más no siempre significa un mejor <em>setup</em>.</p> <p><img src="/assets/img/opencode-go-vs-claude-code.webp" alt="Opencode Go vs Claude Code: Un análisis real de 11 días"/></p> <h2 id="mi-uso-de-opencode-go-en-11-días">Mi uso de Opencode Go en 11 días</h2> <h3 id="resumen-general">Resumen general</h3> <table> <thead> <tr> <th>Métrica</th> <th>Valor</th> </tr> </thead> <tbody> <tr> <td><strong>Costo total</strong></td> <td>$50.31</td> </tr> <tr> <td><strong>Costo promedio/día</strong></td> <td>$4.19</td> </tr> <tr> <td><strong>Tokens promedio/sesión</strong></td> <td>533.7K</td> </tr> <tr> <td><strong>Tokens media/sesión</strong></td> <td>44.7K</td> </tr> <tr> <td><strong>Input</strong></td> <td>8.3M</td> </tr> <tr> <td><strong>Output</strong></td> <td>1.6M</td> </tr> <tr> <td><strong>Cache Read</strong></td> <td>242.2M</td> </tr> <tr> <td><strong>Cache Write</strong></td> <td>2.4M</td> </tr> </tbody> </table> <p>Esto no quiere decir que pagué $50.31. Pagué $10 por la suscripción, pero generé un consumo de $50.31. El consumo es lo que determina si me paso del límite mensual ($60) o no.</p> <h3 id="uso-por-modelo">Uso por modelo</h3> <div class="table-wrapper"> <table> <thead> <tr> <th>Modelo</th> <th>Mensajes</th> <th>Input Tokens</th> <th>Output Tokens</th> <th>Cache Read</th> <th>Cache Write</th> <th>Costo</th> </tr> </thead> <tbody> <tr> <td><a href="https://artificialanalysis.ai/models/mimo-v2-5-pro">MiMo-v2.5-pro</a></td> <td>2,239</td> <td>3.8M</td> <td>729.4K</td> <td>161.5M</td> <td>0</td> <td>$40.89</td> </tr> <tr> <td><a href="https://artificialanalysis.ai/models/minimax-m2-7">MiniMax M2.7</a></td> <td>1,836</td> <td>4.0M</td> <td>649.8K</td> <td>65.2M</td> <td>1.2M</td> <td>$5.90</td> </tr> <tr> <td><a href="https://artificialanalysis.ai/models/qwen3-6-plus">qwen3.6-plus</a></td> <td>395</td> <td>2.3K</td> <td>120.9K</td> <td>13.8M</td> <td>1.2M</td> <td>$1.78</td> </tr> <tr> <td><a href="https://artificialanalysis.ai/models/kimi-k2-6">kimi-k2.6</a></td> <td>51</td> <td>427.8K</td> <td>64.2K</td> <td>1.4M</td> <td>0</td> <td>$0.89</td> </tr> <tr> <td><a href="https://artificialanalysis.ai/models/qwen3-7-max">qwen3.7-max</a></td> <td>29</td> <td>174</td> <td>7.3K</td> <td>490.1K</td> <td>28.7K</td> <td>$0.39</td> </tr> </tbody> </table> </div> <h3 id="análisis-de-los-números">Análisis de los números</h3> <p><a href="https://artificialanalysis.ai/models/mimo-v2-5-pro">MiMo-v2.5-pro</a> se llevó el 81% del presupuesto (<code class="language-plaintext highlighter-rouge">$40.89</code> de <code class="language-plaintext highlighter-rouge">$50.31</code>). Tiene sentido, fue el modelo con el que construí algunos proyectos y donde más tiempo estuve experimentando. Además, esto fue antes de que Xiaomi MiMo bajara los precios de sus APIs, lo que lo hace aún más atractivo para desarrolladores con consumo alto. Si fuera con los precios actuales, el costo de <code class="language-plaintext highlighter-rouge">Mimo v2.5 Pro</code> sería de <code class="language-plaintext highlighter-rouge">$2.86</code>, un 93% menos que los <code class="language-plaintext highlighter-rouge">$40.89</code> que pagué, representaría solo el 5.7% del consumo total.</p> <p><a href="https://artificialanalysis.ai/models/minimax-m2-7">MiniMax M2.7</a> procesó el 41% de mis mensajes (1,836 de 4,550) y solo costó el 12% del total ($5.90). Mi patrón es claro: delego tareas repetitivas a modelos baratos y reservo el premium para razonamiento profundo. MiniMax M2.7 cuesta $0.3 por millón de tokens de entrada y $1.2 por millón de tokens de salida, muy por debajo de la mayoría de los otros modelos.</p> <p>El costo por mensaje:</p> <div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Costo total: $50.31
Total mensajes: 4,550
Costo por mensaje: $0.011
</code></pre></div></div> <p>El sistema leyó 242.2M de tokens del caché. Está reutilizando contexto de forma agresiva para mantener memoria entre sesiones. Sin ese caché, el costo de <em>input</em> se iría a las nubes.</p> <p>Durante los 11 días, estuve trabajando casi que 100% del tiempo con Vibe Coding, lo que explica el alto número de mensajes y tokens. Puedo decir que los modelos utilizados me sorprendieron mucho, especialmente <code class="language-plaintext highlighter-rouge">Mimo v2.5 Pro</code> y <code class="language-plaintext highlighter-rouge">MiniMax M2.7</code>, que lograron desarrollo real, entendiendo contexto complejo y generando código de alta calidad. Lo único que tuve que hacer es definir bien el plan con Spec Driven Development (SDD) y iterar en esta etapa.</p> <h2 id="los-límites-del-plan-de-claude-code">Los límites del plan de Claude Code</h2> <p>Los números concretos de mi consumo promedio:</p> <ul> <li>4,550 mensajes en 11 días = <strong>414 mensajes/día</strong></li> <li>Asumiendo 8 horas de uso activo: <strong>51.75 mensajes/hora</strong></li> <li>En una ventana de 5 horas: <strong>258.75 mensajes</strong></li> </ul> <p>Ahora comparemos con cada plan de Claude Code:</p> <h3 id="pro">Pro</h3> <ul> <li><strong>Precio:</strong> $20/mes</li> <li><strong>Límite por ventana de 5 horas:</strong> ~45 prompts</li> <li><strong>Límite semanal:</strong> ~40–80 horas de Sonnet</li> </ul> <p>Con mi promedio de 258.75 mensajes por ventana de 5 horas, el plan Pro no funcionaría. A media mañana ya estaría viendo errores de <em>rate limit</em>. No es una opción viable para uso intensivo.</p> <h3 id="max-5x">Max 5x</h3> <ul> <li><strong>Precio:</strong> $100/mes</li> <li><strong>Límite por ventana de 5 horas:</strong> ~225 prompts</li> <li><strong>Límite semanal:</strong> ~140–240 horas de Sonnet + 15-35 horas de Opus</li> </ul> <p>Con 258.75 mensajes por ventana, ya supero el límite de 225 mensajes, imagínate con Opus que consume más rápido el límite (~35% más tokens que Sonnet).</p> <h3 id="max-20x">Max 20x</h3> <ul> <li><strong>Precio:</strong> $200/mes</li> <li><strong>Límite por ventana de 5 horas:</strong> ~900 prompts</li> <li><strong>Límite semanal:</strong> ~140–480 horas de Sonnet + 24-40 horas de Opus</li> </ul> <p>Con 258.75 mensajes por ventana, consumiría el ~29% del límite base (900 mensajes). Pero cuesta $200/mes.</p> <p>Claude Code te encierra en modelos de Anthropic. Pierdes el acceso a MiniMax, Qwen, Kimi, Mimo y el resto del stack que hoy hace el trabajo pesado por centavos.</p> <h2 id="tabla-comparativa-lado-a-lado">Tabla comparativa: lado a lado</h2> <div class="table-wrapper"> <table> <thead> <tr> <th>Aspecto</th> <th>OpenCode Go (+ Zen)</th> <th>Claude Pro</th> <th>Claude Max 5x</th> <th>Claude Max 20x</th> </tr> </thead> <tbody> <tr> <td><strong>Costo base/mes</strong></td> <td>$10</td> <td>$20</td> <td>$100</td> <td>$200</td> </tr> <tr> <td><strong>Mi gasto proyectado/mes</strong></td> <td>~$60</td> <td>$20</td> <td>$100</td> <td>$200</td> </tr> <tr> <td><strong>Modelos disponibles</strong></td> <td>75+</td> <td>Solo Claude</td> <td>Solo Claude</td> <td>Solo Claude</td> </tr> <tr> <td><strong>Límite por 5h</strong></td> <td>Flexible</td> <td>~45 prompts</td> <td>~225 prompts</td> <td>~900 prompts</td> </tr> <tr> <td><strong>Mi consumo vs límite</strong></td> <td>Sin techo</td> <td>Insuficiente</td> <td>Insuficiente</td> <td>Cómodo</td> </tr> <tr> <td><strong>Flexibilidad de modelos</strong></td> <td>Alta</td> <td>Baja</td> <td>Baja</td> <td>Baja</td> </tr> <tr> <td><strong>Acceso a Opus</strong></td> <td>Sí (vía API)</td> <td>No</td> <td>Sí (xhigh)</td> <td>Sí (xhigh)</td> </tr> </tbody> </table> </div> <p>Claude Max 20x es la única opción que me da margen para mi patrón de uso actual. Pero cuesta $200/mes, un salto enorme comparado con los $10 de OpenCode Go. Y ese costo no se justifica si puedo manejar mi consumo con OpenCode Go + Zen por mucho menos, con la flexibilidad de modelos que necesito. Si me paso del límite de $60, simplemente recargo créditos en Zen y sigo trabajando sin interrupciones.</p> <p>Opencode Go también tiene <a href="https://opencode.ai/docs/es/go/#l%C3%ADmites-de-uso">límites de uso</a>, pero son mucho más flexibles que los de Claude Code. Puedo usar diferentes modelos según la tarea, mejorar mis prompts para reducir tokens y ajustar mi consumo sin preocuparme por límites rígidos.</p> <h2 id="opencode-zen">OpenCode Zen</h2> <p>Para los que no les alcanza con la suscripción base de OpenCode Go, hay un camino: OpenCode Zen, que se activa automáticamente cuando superas el límite de $60.</p> <p>Es <em>pay-as-you-go</em>. Agregas créditos de $10, pagas solo lo que usas, y si quieres, cuando tu balance baja de $5 se recarga automáticamente. Sin compromiso mensual, sin límites de “prompts por 5 horas”.</p> <p>Si mantengo este mismo ritmo en OpenCode Go, para cubrir mi faltante este mes, necesitaría agregar unos $50-60 en créditos Zen. Eso me da exactamente lo que necesito sin cambiar de herramienta ni perder los modelos que uso.</p> <p>OpenCode Zen ofrece <em>zero markup</em>. Pagas los modelos al precio de la API original, sin recargos. Tienes tu propia cuenta de API sin pelearte con múltiples <em>providers</em>.</p> <p>No es permanente. Puedo cancelar cuando quiera y volver a mi suscripción de $10. Es un puente, no una mudanza.</p> <h2 id="xiaomi-mimo-token-plan">Xiaomi MiMo Token Plan</h2> <p>El <a href="https://platform.xiaomimimo.com/token-plan">Token Plan</a> es el sistema de suscripción por créditos de Xiaomi MiMo, diseñado específicamente para escenarios de programación con IA. A diferencia de la facturación tradicional por uso (pay-as-you-go), este plan ofrece paquetes fijos de créditos mensuales o anuales. En el plan <code class="language-plaintext highlighter-rouge">Lite</code> mensual, por ejemplo, pagas $6 por <code class="language-plaintext highlighter-rouge">4,100,000,000</code> créditos mensuales y cada mensaje consume créditos según el modelo y la cantidad de tokens procesados.</p> <div class="table-wrapper"> <table> <thead> <tr> <th>Model</th> <th>Input (Cache Hit) Token</th> <th>Input (Cache Miss) Token</th> <th>Output Token</th> </tr> </thead> <tbody> <tr> <td><strong>mimo-v2.5-pro</strong></td> <td>2.5 Credits</td> <td>300 Credits</td> <td>600 Credits</td> </tr> <tr> <td><strong>mimo-v2.5</strong></td> <td>2 Credits</td> <td>100 Credits</td> <td>200 Credits</td> </tr> </tbody> </table> </div> <p>Si usamos la misma referencia de tokens que usamos de <code class="language-plaintext highlighter-rouge">mimo-v2.5-pro</code> en OpenCode Go:</p> <div class="table-wrapper"> <table> <thead> <tr> <th>Modelo</th> <th>Mensajes</th> <th>Input Tokens</th> <th>Output Tokens</th> <th>Cache Read</th> <th>Cache Write</th> <th>Costo</th> </tr> </thead> <tbody> <tr> <td><code class="language-plaintext highlighter-rouge">mimo-v2.5-pro</code></td> <td>2,239</td> <td>3.8M</td> <td>729.4K</td> <td>161.5M</td> <td>0</td> <td>$40.89</td> </tr> </tbody> </table> </div> <p>El costo en créditos sería:</p> <div class="table-wrapper"> <table> <thead> <tr> <th>Concepto</th> <th>Tokens</th> <th>Credits</th> </tr> </thead> <tbody> <tr> <td>Cache Read (hits)</td> <td>161.5M</td> <td>403,750,000</td> </tr> <tr> <td>Input (misses)</td> <td>3.8M</td> <td>1,140,000,000</td> </tr> <tr> <td>Output</td> <td>729.4K</td> <td>437,640,000</td> </tr> <tr> <td>Total</td> <td> </td> <td>1,981,390,000 (~1.98B)</td> </tr> </tbody> </table> </div> <p>Serían consumidos 1.98B créditos, lo que en el plan <code class="language-plaintext highlighter-rouge">Lite</code> de Xiaomi MiMo equivaldría a 48.32% del paquete mensual de 4.1B créditos por $6.</p> <p>Si procesáramos todo el consumo de Opencode Go en Xiaomi MiMo, la diferencia entre modelos es notable:</p> <div class="table-wrapper"> <table> <thead> <tr> <th>Concepto</th> <th>Tokens</th> <th>mimo-v2.5-pro</th> <th>mimo-v2.5</th> </tr> </thead> <tbody> <tr> <td>Cache Read</td> <td>242.2M</td> <td>605.5M credits</td> <td>323M credits</td> </tr> <tr> <td>Input (misses)</td> <td>8.3M</td> <td>2,476.3M credits</td> <td>380M credits</td> </tr> <tr> <td>Output</td> <td>1.6M</td> <td>943M credits</td> <td>145.9M credits</td> </tr> <tr> <td><strong>Total</strong></td> <td> </td> <td><strong>~4B credits</strong></td> <td><strong>~849M credits</strong></td> </tr> <tr> <td>% del plan Lite ($6)</td> <td> </td> <td>98%</td> <td>21%</td> </tr> </tbody> </table> </div> <p>Con <a href="https://artificialanalysis.ai/models/mimo-v2-5-pro">MiMo-v2.5-pro</a> casi agotamos el plan Lite de 4.1B credits. Con <a href="https://artificialanalysis.ai/models/mimo-v2-5-0424">MiMo-v2.5</a> usamos solo el 21%, y todavía queda margen para mucho más uso.</p> <p>Con este análisis, creo que conviene combinar OpenCode Go y <a href="https://platform.xiaomimimo.com/token-plan">Xiaomi MiMo Token Plan</a>: usar modelos como <a href="https://artificialanalysis.ai/models/qwen3-7-max">Qwen3.7 Max</a> para planificación y Spec Driven Development (SDD), reservar <a href="https://artificialanalysis.ai/models/mimo-v2-5-pro">MiMo-v2.5-pro</a> para desarrollo y refactoring, y dejar <a href="https://artificialanalysis.ai/models/mimo-v2-5-0424">MiMo-v2.5</a> para tareas menos críticas. Así se mejora el consumo de créditos y se reducen costos sin sacrificar calidad.</p> <h2 id="conclusión">Conclusión</h2> <p>Después de 11 días, 4,550 mensajes y $50.31 en consumo, tengo claro que para uso intensivo y personal, la flexibilidad de modelos importa más que el nombre de la herramienta.</p> <p>Claude Code es bueno, pero sus planes están pensados para otro patrón de uso, cada vez más restrictivo y enfocado en el uso empresarial. El plan Pro se queda corto en minutos, el Max 5x no alcanza en ventanas de alta actividad, y el Max 20x (el único viable) cuesta $200/mes y te limita al ecosistema de Anthropic.</p> <p>OpenCode Go con su suscripción de $10 me da acceso a muchos modelos, sin límites rígidos por ventana de tiempo. Cuando supero el tope mensual, OpenCode Zen me permite seguir trabajando con <em>pay-as-you-go</em> y <em>zero markup</em>. Agrego créditos solo cuando los necesito, sin compromisos mensuales.</p> <p>La combinación con Xiaomi MiMo Token Plan abre otra puerta. Si tu flujo depende mucho de <a href="https://artificialanalysis.ai/models/mimo-v2-5-pro">MiMo-v2.5-pro</a>, puedes reducir costos bastante usando su sistema de créditos, reservando OpenCode Go para modelos que MiMo no cubre. Además, <a href="https://platform.xiaomimimo.com/docs/en-US/news/v2.5-price-update">recientemente Xiaomi MiMo bajó los precios de sus APIs</a>, lo que hace esta opción aún más atractiva para desarrolladores con consumo alto. Los precios ahora están iguales a <code class="language-plaintext highlighter-rouge">Deepseek V4</code> pero con modelos más potentes.</p> <p>Mi setup personal actual: OpenCode Go ($10) + Xiaomi MiMo Token Plan. Costo mensual estimado: $16. Cinco veces menos que el plan <code class="language-plaintext highlighter-rouge">Max 5x</code> de Claude. Uso <a href="https://artificialanalysis.ai/models/qwen3-7-max">Qwen3.7 Max</a> para planificación y Spec Driven Development (SDD), <a href="https://artificialanalysis.ai/models/mimo-v2-5-0424">MiMo-v2.5</a> y <a href="https://artificialanalysis.ai/models/mimo-v2-5-pro">MiMo-v2.5-pro</a> para desarrollo y refactoring, y los demás modelos para probar y tener una segunda opinión. Con este setup, no tengo interrupciones por límites de uso, tengo acceso a una variedad de modelos y mantengo un costo controlado.</p> <p>Para el trabajo profesional, uso la herramienta que mi trabajo me proporciona, sea Claude, Cursor, Codex o cualquier otra. Lo más importante es seguir probando las herramientas y entender cómo ser más eficiente con ellas.</p> <p>La herramienta perfecta no existe. Lo que importa es cuál se adapta a tu patrón de uso. Si eres de los que codean 8 horas seguidas, delegan tareas a modelos baratos y reservan el premium para lo que importa, los números hablan por sí solos.</p> <p>Si quieres replicar el análisis, revisa tu consumo. Si pasas los $20/mes, considera una opción <em>pay-as-you-go</em> antes de cambiar de herramienta de golpe.</p>]]></content><author><name>Antonio Barbosa</name></author><category term="Artificial Intelligence"/><category term="Software Architecture"/><category term="Tecnología"/><category term="Cost Optimization"/><category term="Artificial Intelligence"/><category term="Software Architecture"/><category term="Tecnología"/><category term="AI"/><category term="Opencode Go"/><category term="Claude Code"/><category term="Costos"/><category term="Productividad"/><summary type="html"><![CDATA[$60 en consumo de API por $10 de suscripción. Un análisis real de 11 días comparando Opencode Go vs Claude Code: costos, límites y cuándo tiene sentido cambiar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/opencode-go-vs-claude-code.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/opencode-go-vs-claude-code.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Desmitificando el AI First: la prioridad estratégica</title><link href="https://aboneto.dev/desmitificando-ai-first-prioridad-estrategica" rel="alternate" type="text/html" title="Desmitificando el AI First: la prioridad estratégica"/><published>2026-05-21T00:00:00+00:00</published><updated>2026-05-21T00:00:00+00:00</updated><id>https://aboneto.dev/desmitificando-ai-first-prioridad-estrategica</id><content type="html" xml:base="https://aboneto.dev/desmitificando-ai-first-prioridad-estrategica"><![CDATA[<p><img src="/assets/img/ai-first-prioridad-estrategica.webp" alt="AI First como prioridad estratégica en arquitectura de software"/></p> <p>En los últimos tiempos, “AI First” se convirtió en una de esas frases que aparecen en presentaciones corporativas, posts de LinkedIn y roadmaps tecnológicos. Y como suele pasar con los términos de moda, se fue distorsionando hasta convertirse en algo que muchos repiten sin entender del todo qué significa.</p> <p>Hay quienes lo interpretan como “vamos a meter IA en todo lo que hagamos”. Otros lo ven como una estrategia aislada y única, casi como un departamento aparte que vive en su propia burbuja. Y unos pocos lo entienden como lo que realmente es: una estrategia de priorización que debe convivir con todas las demás estrategias de la organización.</p> <p>En este post quiero aclarar qué es realmente AI First, cómo se relaciona con otras estrategias “First” que ya conocemos, y por qué el rol del arquitecto de software es clave para que todo esto no se vuelva un caos.</p> <h3 id="qué-significa-realmente-first">¿Qué significa realmente “First”?</h3> <p>Antes de hablar de AI First, hablemos del sufijo “first”. Cuando decimos que algo es “first” no estamos diciendo que sea lo único importante. Estamos diciendo que es lo primero a considerar al momento de tomar decisiones de diseño y arquitectura.</p> <p>“Mobile First” no significa que el escritorio no importe. Significa que diseñamos pensando primero en móvil y luego adaptamos. “Cloud First” no significa que todo tiene que estar en la nube sí o sí, sino que la nube es la primera opción a evaluar antes de considerar alternativas on-premise; pensar cloud native primero.</p> <p>Entonces, AI First es una prioridad, no una declaración de exclusividad. El “first” indica su posición dentro de una clasificación de estrategias, pero no implica que las demás prioridades dejen de ser relevantes. Es decir, “primero que…” y no “en lugar de…”.</p> <h3 id="el-problema-de-tener-demasiadas-prioridades">El problema de tener demasiadas prioridades</h3> <p>Acá viene la trampa más común: si todo es prioridad, nada es prioridad. He visto organizaciones que se declaran simultáneamente AI First, Data First, Customer First, Security First, Cloud First, Mobile First, API First, Privacy First y otras. El resultado es predecible: cuando hay que tomar decisiones difíciles donde estas prioridades chocan entre sí, nadie sabe qué pesa más.</p> <p>Y acá hay un fenómeno que vale la pena nombrar: en la práctica, stakeholders y desarrolladores tienden a enfocarse solo en las primeras 5 prioridades del ranking. No por mala intención, sino porque la atención humana es limitada y el ranking funciona como un filtro natural. Lo que está en el top 5 se discute, se mide y se exige; lo que queda más abajo se asume, se olvida o se posterga.</p> <p>Esto no significa que haya que limitar la lista a 5. Significa que, sin una cultura organizacional fuerte o sin la presencia activa de un arquitecto de software, las prioridades que quedan fuera del top 5 corren un riesgo real de quedar abandonadas. La organización puede terminar saltando estrategias importantes simplemente porque no estaban entre las primeras cinco que el equipo tenía en mente.</p> <h2 id="a-nivel-organizacional-vs-a-nivel-proyecto">A nivel organizacional vs. a nivel proyecto</h2> <p>Una organización tiene su conjunto de estrategias generales, pero cada proyecto puede tener su propio orden de prioridades según su naturaleza. Eso sí, sin desviarse de la estrategia organizacional.</p> <p>A nivel organizacional, una clasificación podría verse así:</p> <ol> <li>AI First</li> <li>Data First</li> <li>Customer First</li> <li>Security First</li> <li>Cloud First</li> </ol> <p>Pero cuando bajamos al nivel de un proyecto específico, la realidad cambia. Imaginemos una app bancaria móvil con capacidades de IA. El orden podría reorganizarse así:</p> <ol> <li>AI First</li> <li>Mobile First</li> <li>Data First</li> <li>Customer First</li> <li>Security First</li> <li>Cloud First</li> </ol> <p>¿Por qué “Mobile First” entra en la lista? Porque para ese proyecto en particular, la experiencia móvil es un factor de diseño que no puede dejarse para después. Si lo hacemos, vamos a terminar con una app que funciona “más o menos” en móvil, que es exactamente lo opuesto a lo que el proyecto necesita.</p> <p>Pensemos ahora en un servicio de back-end:</p> <ol> <li>AI First</li> <li>API First</li> <li>Cloud First</li> <li>Data First</li> <li>Security First</li> </ol> <p>Lo importante es que la prioridad organizacional se mantiene como marco, y las prioridades del proyecto se acomodan dentro de ese marco sin contradecirlo.</p> <h2 id="ai-first">AI First</h2> <p>Acá quiero ser muy explícito porque es el malentendido más común: AI First no es una estrategia aislada. No es un capítulo aparte del libro de la organización. Es una estrategia que <strong>debe convivir con las demás</strong>.</p> <p>Cuando hablamos de AI First, estamos diciendo que la inteligencia artificial es el primer lente a través del cual evaluamos cómo resolver un problema, diseñar un producto o automatizar un proceso. Pero ese lente no anula los demás. Cuando diseñamos una solución con IA, también tenemos que pensar en los datos que la alimentan y apoyarán la toma de decisiones (Data First), en cómo la van a usar las personas y con qué propósito (Customer First), en cómo protegemos esa información y evitamos riesgos (Security First) y en dónde vive todo esto y bajo qué arquitectura (Cloud First).</p> <p>Si tratamos a AI First como una isla, vamos a construir soluciones con IA sin datos confiables, sin pensar en el usuario final, sin seguridad y con una arquitectura deficiente. Y eso no es AI First, eso es un experimento que va a fracasar.</p> <p>En la práctica, esto se traduce en una pregunta que el equipo debe hacerse antes de tomar decisiones importantes: ¿hay una manera en que la inteligencia artificial pueda aportar valor acá? Si la respuesta es sí, esa opción se evalúa primero. Si la respuesta es no, o si el costo no lo justifica, se descarta y se siguen las vías tradicionales. Pero la pregunta se hace siempre, no como una ocurrencia tardía.</p> <p>Adoptar AI First implica varios cambios concretos:</p> <ul> <li> <p>A nivel de mentalidad, el equipo deja de ver la IA como un “extra” o un proyecto especial, y empieza a considerarla como una capacidad disponible desde el inicio del diseño. No es algo que se agrega al final para sumar puntos de innovación.</p> </li> <li> <p>A nivel de procesos, las fases de discovery, diseño y arquitectura incluyen explícitamente la evaluación de componentes de IA. Esto requiere que los equipos conozcan lo suficiente sobre capacidades de modelos, sus limitaciones y sus costos para tomar decisiones informadas.</p> </li> <li> <p>A nivel de infraestructura, la organización invierte en las bases que hacen viable usar IA de forma seria: pipelines de datos confiables, plataformas para entrenar o consumir modelos, mecanismos de monitoreo y gobierno, y políticas claras sobre cómo y dónde se puede aplicar.</p> </li> </ul> <h3 id="lo-que-ai-first-no-es">Lo que AI First no es</h3> <p>No es usar IA en todo porque sí. No es reemplazar lógica determinística que ya funciona bien con un modelo solo para tener IA en la solución. No es un eslogan de marketing. Y, como ya dijimos, no es una estrategia que viva aislada del resto.</p> <h2 id="el-rol-del-arquitecto-de-software">El rol del arquitecto de software</h2> <p>Acá entra una pieza fundamental: el arquitecto de software. No basta con declarar prioridades en un documento y olvidarse. Alguien tiene que validar, en cada decisión técnica, que la solución esté cumpliendo con todas las prioridades del proyecto y de la organización, no solo con las que están en el top de la lista.</p> <p>Recordemos el punto anterior: los equipos tienden a enfocarse en las primeras 5 prioridades. El arquitecto es justamente quien evita que las demás se pierdan en el camino. Es el contrapeso que asegura que la prioridad número 7 u 8 también esté presente en las decisiones de diseño, aunque nadie más la esté mencionando en las reuniones.</p> <p>El arquitecto es responsable de:</p> <ul> <li>Verificar que la solución sea coherente con la estrategia AI First sin sacrificar las demás.</li> <li>Asegurar que las prioridades organizacionales no se pierdan en las decisiones del día a día del proyecto, incluso las que quedan fuera del top 5.</li> <li>Identificar cuándo dos prioridades entran en conflicto y resolver ese conflicto basándose en el orden establecido.</li> <li>Documentar las decisiones para que el equipo entienda no solo el “qué” sino el “por qué”.</li> </ul> <p>Este trabajo de validación es lo que diferencia un proyecto que realmente cumple con la estrategia organizacional de uno que solo cumple con la parte visible del ranking.</p> <h2 id="conclusión">Conclusión</h2> <p>AI First es una prioridad estratégica, no una declaración de que la IA es lo único que importa. Ocupa una posición en la clasificación de estrategias de la organización y dice “primero pensamos en cómo la IA puede aportar valor”, pero sin descartar las demás estrategias que también son importantes.</p> <p>Para que funcione, hay que mantener coherencia entre el nivel organizacional y el nivel de proyecto, y tener presente que los equipos tenderán naturalmente a enfocarse en las primeras 5 prioridades del ranking. Por eso necesitamos a alguien, típicamente el arquitecto de software, validando que cada decisión cumpla con el marco completo y no solo con la parte más visible.</p> <p>Si tu organización está pensando en adoptar AI First, no lo trates como un proyecto aparte ni como una bandera para ondear. Trátalo como lo que es: una prioridad más en un conjunto cuidadosamente clasificado de estrategias que, en conjunto, definen cómo tu equipo construye soluciones.</p> <p>Porque al final, una buena arquitectura no se trata de elegir una estrategia ganadora. Se trata de hacer que todas convivan en armonía, con un orden claro cuando llega el momento de decidir.</p> <p>Espero sinceramente que este post evite futuras discusiones sin sentido en las redes sociales como “AI First vs Data First” o “AI First vs Security First”.</p>]]></content><author><name>Antonio Barbosa</name></author><category term="Artificial Intelligence"/><category term="Software Architecture"/><category term="Tecnología"/><category term="Artificial Intelligence"/><category term="Software Architecture"/><category term="Tecnología"/><summary type="html"><![CDATA[AI First no es meter IA en todo ni una estrategia aislada. Es una prioridad estratégica que convive con Data First, Security First y Cloud First. El rol del arquitecto: que las prioridades fuera del top 5 no se pierdan.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/ai-first-prioridad-estrategica.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/ai-first-prioridad-estrategica.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Multi-Agente: más allá de la velocidad, una estrategia para aislar contexto y optimizar costos</title><link href="https://aboneto.dev/multi-agente-mas-alla-de-la-velocidad-aislar-contexto-y-optimizar-costos" rel="alternate" type="text/html" title="Multi-Agente: más allá de la velocidad, una estrategia para aislar contexto y optimizar costos"/><published>2026-05-18T00:00:00+00:00</published><updated>2026-05-18T00:00:00+00:00</updated><id>https://aboneto.dev/multi-agente-mas-alla-de-la-velocidad-aislar-contexto-y-optimizar-costos</id><content type="html" xml:base="https://aboneto.dev/multi-agente-mas-alla-de-la-velocidad-aislar-contexto-y-optimizar-costos"><![CDATA[<p><img src="/assets/img/multi-agent-context.webp" alt="Arquitectura multi-agente con orquestador y subagentes especializados"/></p> <p><em>Trabajar con múltiples agentes especializados no es solo una cuestión de paralelizar tareas. Es una decisión arquitectónica con impacto directo sobre el consumo de tokens, la limpieza del contexto principal y la escalabilidad operativa de tu flujo de trabajo con IA.</em></p> <p>Cuando alguien empieza a operar con agentes, el primer instinto suele ser cargar al <em>main agent</em> con todas las skills disponibles, todas las herramientas conectadas y un <em>system prompt</em> gigante donde se intenta cubrir cualquier escenario imaginable. Funciona, pero la sesión se vuelve lenta, la factura mensual escala sin justificación clara y, lo peor, el agente empieza a perder foco porque tiene demasiada información compitiendo por su atención en cada turno.</p> <p>La solución no es un modelo más grande ni un <em>context window</em> más amplio. La solución es arquitectónica: especializar agentes para cada tipo de tarea y delegar la ejecución, dejando al orquestador con la mínima responsabilidad necesaria. Esta estrategia importa mucho más de lo que parece, y se traduce en ahorro real de tokens y mayor robustez operativa.</p> <h2 id="aislar-contexto-es-como-aislar-funciones">Aislar contexto es como aislar funciones</h2> <p>La filosofía detrás del multi-agente es exactamente la misma que aplicamos cuando aprendimos a programar: subdividir el procesamiento en métodos o funciones para aislar la lógica, controlar el uso de memoria y exponer una interfaz limpia donde solo entran <em>inputs</em> y solo sale un resultado.</p> <p>Un subagente opera bajo el mismo principio. El orquestador define qué necesita resolver, le pasa al subagente únicamente la información indispensable y recibe de vuelta un resultado acotado. El subagente no ve el historial completo de la conversación, no conoce el resto del <em>backlog</em>, no carga las skills de otros agentes. Solo conoce lo que el orquestador decidió compartir y se enfoca en una responsabilidad concreta.</p> <p>Esta separación produce varios beneficios técnicos que se notan rápido en producción:</p> <ul> <li><strong>El contexto del orquestador no se contamina</strong> con detalles operativos de cada subtarea. Después de delegar, lo único que vuelve al <em>main thread</em> es el resultado, no el proceso completo.</li> <li><strong>Cada subagente puede operar con un <em>system prompt</em> y un conjunto de instrucciones afinados para su dominio</strong>, sin tener que convivir con prompts genéricos diseñados para cubrir todo.</li> <li><strong>El consumo de tokens del agente principal se mantiene bajo control</strong>, porque la conversación principal no acumula el ruido de cada exploración intermedia, búsqueda en el código o lectura de archivos auxiliares.</li> </ul> <p>Es la misma razón por la cual nadie escribe una sola función <code class="language-plaintext highlighter-rouge">main()</code> de 5.000 líneas: aislar responsabilidades reduce el costo cognitivo y operativo de cada pieza.</p> <h2 id="el-costo-oculto-de-tener-todo-en-la-sesión-principal">El costo oculto de tener todo en la sesión principal</h2> <p>Trabajar sin delegación tiene un costo que solo se nota cuando revisas el desglose de tokens. Cada turno del agente principal carga, como mínimo:</p> <ul> <li>El <em>system prompt</em> completo.</li> <li>El historial acumulado de la conversación.</li> <li>La lista de todas las herramientas disponibles, con su schema.</li> <li>La lista de todas las skills instaladas, con su título y descripción.</li> <li>Los resultados de cada tool call previa, incluso aquellos que ya no son relevantes para la tarea actual.</li> </ul> <p>Si todo este peso permanece concentrado en una sola sesión, cada nueva acción paga el costo total del contexto acumulado, turno tras turno. Cuando delegas a un subagente, ese cómputo intermedio ocurre dentro de su propia sesión, con su propio <em>context window</em>, y solo el resultado final viaja de vuelta al orquestador. La diferencia se nota en sesiones largas y, sobre todo, en flujos donde el agente realiza muchas operaciones de búsqueda, lectura de archivos o análisis exploratorio.</p> <p>Y acá hay otro punto crítico: los modelos actuales operan con ventanas de contexto limitadas, típicamente 256k tokens en la mayoría de modelos comerciales y hasta 1M en los modelos de gama alta. Suena enorme, pero se llena rápido cuando concentras todo el trabajo en una sola sesión. Una vez que te acercas al límite, terminas obligado a comprimir el historial, descartar partes relevantes o directamente reiniciar la sesión y perder el contexto del proyecto. La arquitectura multi-agente te permite estirar ese presupuesto: cada subagente trabaja con su propio <em>context window</em> fresco, y el orquestador solo acumula resultados acotados, no el detalle de cada exploración. Resultado: sesiones más largas y productivas sin tener que comprimir o reiniciar a cada rato.</p> <h2 id="contexto-adicional-bajo-demanda">Contexto adicional bajo demanda</h2> <p>Cada subagente puede tener su propio contexto adicional cargado únicamente cuando se activa. En la práctica, este contexto suele materializarse en un archivo markdown (<a href="https://code.claude.com/docs/en/sub-agents">Claude</a>, <a href="https://opencode.ai/docs/es/agents/#subagentes">Opencode</a>, <a href="https://github.com/google-gemini/gemini-cli/blob/main/docs/core/subagents.md">Gemini</a>) o toml (<a href="https://developers.openai.com/codex/subagents">Codex</a>) específico del subagente, con instrucciones, convenciones y conocimiento de dominio que solo aplican a las tareas que ese agente ejecuta. Es una mecánica similar a la de una skill, pero aplicada a un agente completo.</p> <p>Tu agente principal conoce las reglas generales del proyecto, las convenciones de naming, la estructura del repositorio, definidas por ejemplo en el archivo <code class="language-plaintext highlighter-rouge">AGENTS.md</code> en la raíz del proyecto. Pero cuando necesitas resolver una tarea de seguridad, delegas a un agente que arranca con su propio contexto especializado: <em>checklists</em> de auditoría, referencias a CVEs relevantes y un <em>system prompt</em> afinado para revisar código en busca de vulnerabilidades. Ese contexto pesado solo entra en juego cuando hace falta, no consume tokens del <em>main thread</em> y se descarta cuando la subtarea termina.</p> <p>Este patrón te permite operar con bases de conocimiento mucho más profundas de lo que tu sesión principal podría sostener si tuviera que cargar todo al mismo tiempo.</p> <h2 id="skills-el-impuesto-que-pagas-en-cada-iteración">Skills: el impuesto que pagas en cada iteración</h2> <p>Las skills consumen tokens del contexto principal en cada iteración. No importa si estás usando una skill o no en ese turno: el modelo necesita saber cuáles tiene disponibles. Para que el agente decida bien cuándo invocar una skill, el sistema le muestra en cada turno la lista completa con su título y descripción.</p> <p>Multiplica eso por la cantidad de skills instaladas y vas a entender por qué un proyecto con 25 o 30 skills empieza a notarse en la factura, incluso cuando aparentemente “no estás haciendo nada raro”. Cada conversación arranca con ese <em>overhead</em> fijo y lo paga en cada turno.</p> <p>La arquitectura multi-agente resuelve este problema:</p> <ul> <li><strong>El agente principal solo carga las skills que necesita para la orquestación y la definición de especificaciones</strong>: planificación, generación de specs, gestión de tareas y delegación.</li> <li><strong>Las skills específicas se asignan a los subagentes responsables de ejecutar esas tareas</strong>: Una skill de auditoría de seguridad vive en el agente de seguridad. Una skill de generación de tests unitarios vive en el agente de pruebas automatizadas. Una skill de migración de bases de datos vive en el agente que toca infraestructura.</li> <li><strong>El resultado</strong>: El agente principal queda más liviano, paga menos overhead por turno, y puedes instalar un volumen mucho mayor de skills en tu proyecto sin saturar la sesión principal.</li> </ul> <p>Es la misma lógica que aplicamos al diseñar microservicios: no todo el código vive en el mismo proceso. Cada servicio carga solo las dependencias que necesita.</p> <p>Pero lamentablemente esto no está habilitado en todos los proveedores ni de la misma forma. Veamos cada caso:</p> <h3 id="claude-code">Claude Code</h3> <p>Claude logra aislar las skills de un agente personalizado a la perfección, respetando la definición del agente y listando solamente las skills que existen en su carpeta:</p> <p><img src="/assets/img/claude-skills-conocidas.webp" alt="Claude listando solamente las skills definidas para el agente"/></p> <p>Estructura de carpetas:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.claude/
├── agents/
│   └── code-reviewer.md
│   └── skills/
│       └── code-reviewer/
│           ├── code-review/
│           │   ├── SKILL.md
│           │   └── references/
│           │       ├── code-review-reception.md
│           │       ├── requesting-code-review.md
│           │       └── verification-before-completion.md
│           ├── frontend-design/
│           │   └── SKILL.md
│           ├── javascript-pro/
│           │   ├── SKILL.md
│           │   └── references/
│           │       ├── async-patterns.md
│           │       ├── browser-apis.md
│           │       ├── modern-syntax.md
│           │       ├── modules.md
│           │       └── node-essentials.md
│           ├── javascript-typescript-jest/
│           │   └── SKILL.md
│           ├── mobile-first-design/
│           │   └── SKILL.md
│           ├── responsive-web-design/
│           │   └── SKILL.md
│           └── semantic-html/
│               ├── SKILL.md
│               └── references/
│                   ├── element-decision-trees.md
│                   └── heading-patterns.md
</code></pre></div></div> <p>Definición del agente:</p> <div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">code-reviewer</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Reviews pull requests and code changes for quality, security, and performance.</span>
<span class="na">tools</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">Read</span><span class="pi">,</span> <span class="nv">Grep</span><span class="pi">,</span> <span class="nv">Glob</span><span class="pi">,</span> <span class="nv">Bash(ls *)</span><span class="pi">]</span>
<span class="na">color</span><span class="pi">:</span> <span class="s">green</span>
<span class="nn">---</span>

You are a code review specialist. Your skills are located at
<span class="sb">`.claude/agents/skills/code-reviewer/`</span>. Before reviewing any code,
list that directory and load the relevant SKILL.md files.
</code></pre></div></div> <p>Al solicitar a Claude usando el agente <code class="language-plaintext highlighter-rouge">code-reviewer</code> que me responda una información contenida en la skill <code class="language-plaintext highlighter-rouge">frontend-design</code> sin mencionar la skill directamente, él logró detectar la skill automáticamente y cargarla en su contexto:</p> <p><img src="/assets/img/claude-leyendo-skill.webp" alt="Claude leyendo la skill del agente automáticamente"/></p> <p>Luego me respondió con exactitud la información de la skill, sin alucinar o tener que buscar más información:</p> <p><img src="/assets/img/claude-respondiendo-con-skill.webp" alt="Claude respondiendo con la información de la skill frontend-design"/></p> <h3 id="gemini-y-antigravity">Gemini y Antigravity</h3> <p>Gemini y Antigravity siguen las instrucciones del agente y logran detectar bien las skills conocidas y habilitadas, mezclando las del proyecto, del usuario y las específicas del agente:</p> <p><img src="/assets/img/gemini-skills-conocidas.webp" alt="Skills conocidas por el agente code-reviewer en Gemini"/></p> <p>Estructura de carpetas:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.gemini/
├── agents/
│   └── code-reviewer.md
│   └── skills/
│       └── code-reviewer/
│           ├── code-review/
│           │   ├── SKILL.md
│           │   └── references/
│           │       ├── code-review-reception.md
│           │       ├── requesting-code-review.md
│           │       └── verification-before-completion.md
│           ├── frontend-design/
│           │   └── SKILL.md
│           ├── javascript-pro/
│           │   ├── SKILL.md
│           │   └── references/
│           │       ├── async-patterns.md
│           │       ├── browser-apis.md
│           │       ├── modern-syntax.md
│           │       ├── modules.md
│           │       └── node-essentials.md
│           ├── javascript-typescript-jest/
│           │   └── SKILL.md
│           ├── mobile-first-design/
│           │   └── SKILL.md
│           ├── responsive-web-design/
│           │   └── SKILL.md
│           └── semantic-html/
│               ├── SKILL.md
│               └── references/
│                   ├── element-decision-trees.md
│                   └── heading-patterns.md
</code></pre></div></div> <p>Definición del agente:</p> <div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">code-reviewer</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Reviews pull requests and code changes for quality, security, and performance.</span>
<span class="nn">---</span>

You are a code review specialist. Your skills are located at
<span class="sb">`.gemini/agents/skills/code-reviewer/`</span>. Before reviewing any code,
list that directory and load the relevant SKILL.md files.
</code></pre></div></div> <p>Al preguntar por un determinado contenido de una skill <code class="language-plaintext highlighter-rouge">frontend-design</code>, sin permitir acceso a internet y solamente usando skills, el agente fue capaz de leer la skill y responder:</p> <p><img src="/assets/img/gemini-respondiendo-con-skill.webp" alt="Gemini respondiendo con base en el contenido de la skill frontend-design"/></p> <h3 id="codex">Codex</h3> <p>Codex no permite definir skills específicas para un agente, pero sí limitar su uso.</p> <p>Estructura de carpetas:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.codex/
├── agents/
│   └── code-reviewer.toml
└── skills/
    ├── frontend-design/
    │   └── SKILL.md
    ├── javascript-pro/
    │   ├── SKILL.md
    │   └── references/
    │       ├── async-patterns.md
    │       ├── browser-apis.md
    │       ├── modern-syntax.md
    │       ├── modules.md
    │       └── node-essentials.md
    ├── javascript-typescript-jest/
    │   └── SKILL.md
    ├── mobile-first-design/
    │   └── SKILL.md
    ├── responsive-web-design/
    │   └── SKILL.md
    └── semantic-html/
        ├── SKILL.md
        └── references/
            ├── element-decision-trees.md
            └── heading-patterns.md
</code></pre></div></div> <p>Definición del agente:</p> <div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">name</span> <span class="o">=</span><span class="w"> </span><span class="s">"code-reviewer"</span>
<span class="n">description</span> <span class="o">=</span><span class="w"> </span><span class="s">"PR reviewer focused on correctness, security, and missing tests."</span>
<span class="n">model</span> <span class="o">=</span><span class="w"> </span><span class="s">"gpt-5.5"</span>
<span class="n">model_reasoning_effort</span> <span class="o">=</span><span class="w"> </span><span class="s">"high"</span>
<span class="n">sandbox_mode</span> <span class="o">=</span><span class="w"> </span><span class="s">"read-only"</span>

<span class="n">developer_instructions</span> <span class="o">=</span><span class="w"> </span><span class="s">"""
You are a code review specialist. Use the code-review skill
for structured reviews and cc-skill-security-review for security passes when available.
Do not use javascript-pro; it is disabled for this agent.
Be thorough but constructive.
"""</span>

<span class="k">[[</span><span class="n">skills</span><span class="k">.</span><span class="n">config</span><span class="k">]]</span>
<span class="n">path</span> <span class="o">=</span><span class="w"> </span><span class="s">".codex/skills/code-review/SKILL.md"</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>

<span class="k">[[</span><span class="n">skills</span><span class="k">.</span><span class="n">config</span><span class="k">]]</span>
<span class="n">path</span> <span class="o">=</span><span class="w"> </span><span class="s">".codex/skills/javascript-pro/SKILL.md"</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">false</span>

<span class="k">[[</span><span class="n">skills</span><span class="k">.</span><span class="n">config</span><span class="k">]]</span>
<span class="n">path</span> <span class="o">=</span><span class="w"> </span><span class="s">".codex/skills/mobile-first-design/SKILL.md"</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>

<span class="k">[[</span><span class="n">skills</span><span class="k">.</span><span class="n">config</span><span class="k">]]</span>
<span class="n">path</span> <span class="o">=</span><span class="w"> </span><span class="s">".codex/skills/javascript-typescript-jest/SKILL.md"</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>

<span class="k">[[</span><span class="n">skills</span><span class="k">.</span><span class="n">config</span><span class="k">]]</span>
<span class="n">path</span> <span class="o">=</span><span class="w"> </span><span class="s">".codex/skills/semantic-html/SKILL.md"</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>

<span class="k">[[</span><span class="n">skills</span><span class="k">.</span><span class="n">config</span><span class="k">]]</span>
<span class="n">path</span> <span class="o">=</span><span class="w"> </span><span class="s">".codex/skills/frontend-design/SKILL.md"</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>
</code></pre></div></div> <p>Codex lanzando el subagente <code class="language-plaintext highlighter-rouge">code-reviewer</code>:</p> <p><img src="/assets/img/codex-lanzando-agent.webp" alt="Codex lanzando el subagente code-reviewer"/></p> <p>Podemos notar que Codex no pudo ejecutar la skill <code class="language-plaintext highlighter-rouge">javascript-pro</code> porque estaba deshabilitada:</p> <p><img src="/assets/img/codex-limitando-skill.webp" alt="Codex no pudo ejecutar la skill javascript-pro"/></p> <h3 id="opencode">Opencode</h3> <p>Así como Codex, en Opencode solo podemos limitar las skills que un agente puede consumir, pero todavía no podemos definir un conjunto de skills específicas para usar.</p> <p>Estructura de carpetas:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.opencode/
├── agents/
│   └── code-reviewer.md
└── skills/
    ├── frontend-design/
    │   └── SKILL.md
    ├── javascript-pro/
    │   ├── SKILL.md
    │   └── references/
    │       ├── async-patterns.md
    │       ├── browser-apis.md
    │       ├── modern-syntax.md
    │       ├── modules.md
    │       └── node-essentials.md
    ├── javascript-typescript-jest/
    │   └── SKILL.md
    ├── mobile-first-design/
    │   └── SKILL.md
    ├── responsive-web-design/
    │   └── SKILL.md
    └── semantic-html/
        ├── SKILL.md
        └── references/
            ├── element-decision-trees.md
            └── heading-patterns.md
</code></pre></div></div> <p>Definición del agente:</p> <div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">code-reviewer</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Reviews pull requests and code changes for quality, security, and performance.</span>
<span class="na">mode</span><span class="pi">:</span> <span class="s">primary</span>
<span class="na">temperature</span><span class="pi">:</span> <span class="m">0.1</span>
<span class="na">color</span><span class="pi">:</span> <span class="s2">"</span><span class="s">#00a732"</span>
<span class="na">tools</span><span class="pi">:</span>
  <span class="na">write</span><span class="pi">:</span> <span class="kc">false</span>
  <span class="na">edit</span><span class="pi">:</span> <span class="kc">false</span>
  <span class="na">bash</span><span class="pi">:</span> <span class="kc">false</span>
<span class="na">permission</span><span class="pi">:</span>
  <span class="na">skill</span><span class="pi">:</span>
    <span class="s2">"</span><span class="s">*"</span><span class="err">:</span> <span class="s">deny</span>
    <span class="s">"code-review"</span><span class="err">:</span> <span class="s">allow</span>
    <span class="s">"javascript-pro"</span><span class="err">:</span> <span class="s">allow</span>
    <span class="s">"javascript-typescript-jest"</span><span class="err">:</span> <span class="s">allow</span>
    <span class="s">"semantic-html"</span><span class="err">:</span> <span class="s">allow</span>
    <span class="s">"frontend-design"</span><span class="err">:</span> <span class="s">allow</span>
<span class="nn">---</span>

You are a code review specialist.
</code></pre></div></div> <p>Podemos notar que Opencode no logró encontrar la skill <code class="language-plaintext highlighter-rouge">mobile-first-design</code> y usarla:</p> <p><img src="/assets/img/opencode-skill-utilization.webp" alt="Opencode limitando el uso de la skill mobile-first-design"/></p> <h2 id="otras-ventajas-operativas-relevantes">Otras ventajas operativas relevantes</h2> <p>Además del ahorro directo de tokens, la arquitectura multi-agente ofrece otros beneficios operativos:</p> <ul> <li><strong>Paralelismo real</strong>: el orquestador puede lanzar varios subagentes en paralelo cuando las tareas son independientes. Mientras un agente revisa la documentación, otro analiza el código de pruebas y un tercero valida la configuración de despliegue. El <em>main thread</em> solo sintetiza los resultados.</li> <li><strong>Resiliencia y aislamiento de errores</strong>: si un subagente se atasca, falla o entra en un <em>loop</em>, la sesión principal sigue viva. Puedes reintentar la subtarea sin perder el contexto general del proyecto.</li> <li><strong>Especialización iterativa</strong>: con el tiempo, refinas los prompts y las skills de cada subagente independientemente, sin tocar la lógica del orquestador. Es la versión IA del <em>single responsibility principle</em>.</li> <li><strong>Observabilidad por dominio</strong>: monitorear el consumo, los errores y el desempeño por subagente te da una visión mucho más clara de dónde se va el presupuesto y qué piezas necesitan optimización, comparado con tener una sola sesión gigante donde todo se mezcla.</li> <li><strong>Menor riesgo de prompt injection cruzado</strong>: si un subagente procesa contenido de fuentes externas (correos, páginas web, documentos), una posible inyección queda contenida en ese subagente. El orquestador recibe solo el resultado, no el contenido bruto.</li> </ul> <h2 id="cómo-aplicar-esta-arquitectura-en-tu-día-a-día">Cómo aplicar esta arquitectura en tu día a día</h2> <p>Si quieres adoptar este patrón sin reorganizar todo tu flujo de trabajo de un día para el otro, te recomiendo este enfoque incremental:</p> <ol> <li><strong>Mapea tus tareas recurrentes</strong>: identifica los tipos de trabajo que tu agente principal hace una y otra vez (auditoría de código, generación de documentos, front-end, back-end, CI/CD, exploración de repositorios, generación de tests, revisión de seguridad).</li> <li><strong>Crea un subagente especializado por cada tipo</strong>: dale a cada uno un <em>system prompt</em> afinado, las skills mínimas necesarias y, cuando aplique, un contexto adicional propio.</li> <li><strong>Despeja el agente principal</strong>: deja en el orquestador solo las skills de orquestación y especificación. Mueve el resto a los subagentes que las usen.</li> <li><strong>Mide el delta</strong>: compara el consumo de tokens del agente principal antes y después. Vas a ver una diferencia significativa, especialmente en sesiones largas.</li> <li><strong>Itera sobre los subagentes</strong>: refina los prompts y las skills de cada uno según el desempeño. No tienes que rehacer toda la arquitectura, solo ajustar la pieza que falla.</li> </ol> <h2 id="el-costo-de-la-complejidad-más-madurez-no-menos">El costo de la complejidad: más madurez, no menos</h2> <p>Trabajar con multi-agente no es gratis. Distribuir responsabilidades entre varios subagentes exige más madurez técnica y mayor disciplina de planificación que operar con una sola sesión que improvisa sobre la marcha. Es exactamente la misma curva que existe entre un monolito y una arquitectura de microservicios: ganas escalabilidad y aislamiento, pero pagas el precio en coordinación, contratos claros y diseño previo.</p> <p>El riesgo más concreto es este: si delegas tareas mal definidas a un subagente, vas a obtener resultados ambiguos. El orquestador va a tener que pedir aclaraciones, reintentar, complementar con más contexto, y entrar en <em>loops</em> de ida y vuelta que terminan consumiendo más tokens que si hubieras resuelto todo en una sola sesión. La promesa de ahorro se evapora cuando la planificación es pobre.</p> <p>Por eso recomiendo apoyarse en un buen framework de <em>Spec-Driven Development</em> (SDD), donde primero defines con claridad qué quieres construir, qué entradas tiene cada subagente, qué resultado se espera y cuáles son los criterios de aceptación. Herramientas como <a href="https://github.com/Fission-AI/OpenSpec">OpenSpec</a> o <a href="https://github.com/github/spec-kit">GitHub Spec Kit</a> te permiten formalizar la especificación antes de empezar a ejecutar, dejando un artefacto que el orquestador y los subagentes pueden consultar sin reinterpretar la intención original en cada turno.</p> <p>La regla práctica es simple: planifica con anticipación, fragmenta la especificación en piezas que cada subagente pueda resolver de manera autocontenida, y solo después delega. Si te saltas este paso y empiezas a orquestar agentes sobre un problema mal definido, vas a pagar el costo en <em>loops</em> infinitos, contexto contaminado y una factura de tokens más alta que la del monolito que estabas intentando reemplazar.</p> <h2 id="conclusión">Conclusión</h2> <p>Operar con múltiples agentes no es una moda para parecer sofisticado. Es la traducción directa, al mundo de la IA, de un principio que la ingeniería de software lleva décadas aplicando: separar responsabilidades, aislar contexto y exponer interfaces limpias. El beneficio no se mide solo en velocidad o paralelismo, sino en eficiencia de tokens, claridad operativa y capacidad de escalar el sistema sin que el costo se dispare.</p> <p>Si todavía estás operando con un único agente cargado de skills y prompts genéricos, probablemente estés pagando un <em>overhead</em> mensual que se puede recortar sustancialmente con una arquitectura mejor pensada. Como casi todo en ingeniería: vale la pena la inversión inicial de tiempo, y el ahorro acumulado lo notas turno tras turno.</p> <hr/> <p><em>¿Cómo está estructurada tu arquitectura de agentes hoy? ¿Tu sesión principal lleva el peso de todo, o ya empezaste a delegar responsabilidades?</em></p>]]></content><author><name>Antonio Barbosa</name></author><category term="Vibe Coding"/><category term="Artificial Intelligence"/><category term="Cost Optimization"/><category term="Llm Engineering"/><category term="multi-agente"/><category term="agentes"/><category term="tokens"/><category term="contexto"/><category term="arquitectura"/><summary type="html"><![CDATA[Cuando alguien empieza a operar con agentes, el primer instinto suele ser cargar al main agent con todas las skills disponibles, todas las herramientas conectadas y un system prompt gigante donde se...]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/multi-agent-context.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/multi-agent-context.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">HITL en Vibe Coding e IaC: evita la factura larga</title><link href="https://aboneto.dev/hitl-en-vibe-coding-y-iac-el-humano-que-evita-la-factura-larga" rel="alternate" type="text/html" title="HITL en Vibe Coding e IaC: evita la factura larga"/><published>2026-05-16T00:00:00+00:00</published><updated>2026-05-16T00:00:00+00:00</updated><id>https://aboneto.dev/hitl-en-vibe-coding-y-iac-el-humano-que-evita-la-factura-larga</id><content type="html" xml:base="https://aboneto.dev/hitl-en-vibe-coding-y-iac-el-humano-que-evita-la-factura-larga"><![CDATA[<p><img src="/assets/img/hitl-vibe-coding-iac.webp" alt="HITL en Vibe Coding e IaC: evita la factura larga"/></p> <p><em>La IA generativa ya escribe specs, código y pipelines completos. Quitar al humano del proceso no te da velocidad: te da tokens quemados, drift en producción y noches de oncall que podrías haber evitado con un único checkpoint bien colocado.</em></p> <p>En 2026 el discurso corporativo va casi todo en una sola dirección: agentes autónomos, <em>full automation</em>, <em>self-healing pipelines</em>. La promesa es seductora porque vende. La realidad operativa es que casi ningún equipo está listo para ejecutar esa promesa sin un humano validando los puntos críticos del flujo.</p> <p>Ya escribí antes sobre la <a href="https://medium.com/@aboneto/claude-vibe-coding-y-la-falsa-promesa-de-la-autonom%C3%ADa-comprada-3824adc1a762">falsa promesa de la autonomía operativa</a>. Ese post diagnosticaba el problema. Este es la versión prescriptiva: dónde poner el HITL (Human In The Loop), qué validar en cada gate y por qué saltarse esa disciplina se paga en tokens, en MTTR y en horas de retrabajo.</p> <h2 id="el-hitl-no-es-freno-es-multiplicador">El HITL no es freno, es multiplicador</h2> <p>Hay una confusión muy instalada en equipos que recién están explorando flujos agénticos: pensar que HITL significa “el humano revisa todo” o “el humano frena a la IA”. Ninguna de las dos cosas escala.</p> <p>HITL bien diseñado funciona como un <em>gate</em> en transiciones críticas de estado. La IA sugiere, propone, optimiza, detecta typos que el ojo humano deja pasar. El humano aprueba el paso de una etapa a la siguiente cuando ese paso es costoso de revertir. Es la misma lógica que aplicamos en CI/CD desde hace años: no bloqueas cada commit, bloqueas el merge a <code class="language-plaintext highlighter-rouge">main</code> y el deploy a producción.</p> <p>Aplicado a flujos con IA, los dos lugares donde el gate paga su costo con creces son la definición de specs en Vibe Coding y el camino de IaC hacia producción.</p> <h2 id="hitl-en-vibe-coding-el-gate-está-en-el-sdd-no-en-el-código">HITL en Vibe Coding: el gate está en el SDD, no en el código</h2> <p>Cuando un agente entrega un <em>Pull Request</em> mediocre, el reflejo natural es revisar el código línea por línea. Es tarde. El error casi nunca está en el código; está en la spec o prompt que generó ese código.</p> <p><a href="https://en.wikipedia.org/wiki/Spec-driven_development">Spec Driven Development (SDD)</a> le da estructura al agente: requirements (Requerimientos), scenarios (Escenarios), design decisions (Decisiones de Diseño), tasks (Tareas). Sin esa estructura, el agente alucina interfaces, inventa contratos y mezcla dominios. Con esa estructura, el agente avanza con menos ruido y más predictibilidad.</p> <p>El problema es que una spec mal definida es radioactiva. El agente la va a interpretar literalmente y va a generar 800 líneas de código que cumplen al pie de la letra algo que no era lo que querías. Después vienen las correcciones, los re-prompts, los rollbacks parciales. Cada iteración consume contexto completo del repo, specs intermedias y el historial de la conversación.</p> <p>Una estimación conservadora basada en proyectos reales: una <em>feature</em> mediana arrancada con una spec floja suele requerir entre 3 y 5 iteraciones extras de corrección, cada una consumiendo entre 30k y 80k tokens. Eso es entre 100k y 400k tokens quemados que no aportaron valor, solo deshicieron una decisión que se tomó mal al inicio.</p> <p>El HITL en SDD es barato comparado con eso. Diez minutos revisando que el spec describe el problema correcto, que los scenarios cubren los edge cases que conoces y que las decisions reflejan el stack real del proyecto. Ese gate evita que el agente genere medio sistema sobre una premisa equivocada.</p> <h3 id="los-frameworks-sdd-no-son-magia">Los frameworks SDD no son magia</h3> <p>Aquí hay un punto que se está pasando por alto en muchos equipos: adoptar un framework SDD como <a href="https://github.com/Fission-AI/OpenSpec">OpenSpec</a> o <a href="https://github.com/github/spec-kit">SpecKit</a> no resuelve el problema solo por instalarlo. El framework te da el esqueleto: estructura de carpetas, tipos de artefactos, flujo de ejecución, hooks. Lo que no te da es contexto del dominio, reglas de tu organización ni convenciones de tu stack.</p> <p>Si dejas el framework en su configuración por defecto, el agente sigue alucinando. No alucina menos por usar OpenSpec; aluciana distinto. Va a inventar bibliotecas, va a sugerir patrones de microservicios donde tu proyecto es un monolito modular, va a proponer arquitecturas event-driven cuando tu equipo de cinco personas no las opera bien.</p> <p>Personalizar el framework es trabajo de ingeniería: glosario de dominio inyectado en el contexto, reglas de codificación del proyecto, restricciones del stack (versiones de runtime, bases de datos permitidas, libraries vetadas), naming conventions, criterios de testing. Esa capa es la que convierte un framework genérico en algo que reduce alucinaciones de verdad.</p> <p>El HITL convive con todo esto. El humano valida que el framework esté bien configurado, que las reglas se mantienen al día y que cada spec generada respeta esas reglas antes de que el agente baje a implementación. Sin esa validación, el framework solo le da apariencia de rigor a un flujo que sigue siendo caótico.</p> <h2 id="hitl-en-iac-y-gitops-el-gate-va-antes-del-apply-no-después">HITL en IaC y GitOps: el gate va antes del apply, no después</h2> <p>En infraestructura, la tentación de dejar a la IA ejecutar por CLI directo es alta. Hay agentes que pueden correr <code class="language-plaintext highlighter-rouge">terraform plan</code>, <code class="language-plaintext highlighter-rouge">terraform apply</code>, <code class="language-plaintext highlighter-rouge">kubectl apply</code>, <code class="language-plaintext highlighter-rouge">gh workflow run</code>. Funcionan. El problema es que el costo de un error en infra no se mide en re-prompts, se mide en outages.</p> <p>Un caso real que se repite: un agente genera un cambio en Terraform donde un <code class="language-plaintext highlighter-rouge">for_each</code> recibe un mapa con keys distintas a las del state. Para el ojo humano sin contexto suficiente, el diff se ve razonable. El <code class="language-plaintext highlighter-rouge">plan</code> muestra “5 to add, 5 to destroy”. Si nadie revisa ese plan con criterio, el <code class="language-plaintext highlighter-rouge">apply</code> borra cinco recursos productivos y los recrea con IDs nuevos. Endpoints rotos, <em>downtime</em> medido en minutos en el mejor caso y en horas si depende de DNS o de cosas que se replican lento.</p> <p>El HITL en IaC no significa que un humano apruebe cada <code class="language-plaintext highlighter-rouge">terraform apply</code>. Eso fricciona demasiado y termina en <em>rubber stamping</em>, que es peor que no tener gate. El HITL útil está en dos puntos concretos:</p> <ul> <li><strong>Pull Request review</strong> antes del merge, con el <code class="language-plaintext highlighter-rouge">plan</code> adjunto en el PR (estilo Atlantis, Terraform Cloud o Argo CD con preview). El humano lee el plan y aprueba el cambio cuando entiende qué se va a tocar.</li> <li><strong>Promotion gate</strong> entre ambientes (staging → prod), donde un humano confirma que lo aplicado en staging se comportó como se esperaba antes de propagar a prod.</li> </ul> <p>Lo que la IA aporta en este flujo es valioso y específico: detecta errores de tipado, valida que el código compile, sugiere optimizaciones de módulos, compara el diff contra el state, anota riesgos potenciales en el PR. Es trabajo que un humano hace lento y mal porque es repetitivo. La IA lo hace rápido y consistente.</p> <p>Una estimación basada en equipos que adoptaron este modelo: gating el merge y la promotion con HITL reduce incidentes graves atribuibles a cambios de infra entre un 30 y un 50%. No elimina los incidentes, pero los empuja a categorías menos costosas y deja el MTTR mucho más sano porque el rollback se decide con contexto, no en pánico.</p> <h2 id="checklist-de-gates-dónde-poner-al-humano">Checklist de gates: dónde poner al humano</h2> <p>Resumen accionable, pensado para equipos que recién están armando su flujo con agentes:</p> <ul> <li><strong>Gate 1, Spec aprobada</strong>: antes de que el agente genere una sola línea de código, un humano valida que el spec describe el problema correcto, los escenarios cubren los edge cases conocidos y las decisions reflejan el stack real.</li> <li><strong>Gate 2, Framework SDD configurado</strong>: revisar periódicamente que las reglas, glosarios y restricciones del framework estén al día con la evolución del proyecto. Los frameworks no se autoadministran.</li> <li><strong>Gate 3, PR review con plan visible</strong>: en IaC, ningún merge a <code class="language-plaintext highlighter-rouge">main</code> sin que el <code class="language-plaintext highlighter-rouge">terraform plan</code> (o equivalente) esté en el PR (pipeline ejecutado) y haya sido leído por un humano que entienda qué recursos toca.</li> <li><strong>Gate 4, Promotion entre ambientes</strong>: el paso staging hacia prod requiere confirmación humana, idealmente con métricas de staging adjuntas. Apply automático en prod sin validación previa de staging es deuda técnica disfrazada de velocidad.</li> <li><strong>Gate 5, Auditoría de output del agente</strong>: spot-check periódico de los PRs aprobados por agentes para detectar drift en calidad antes de que se vuelva sistémico.</li> </ul> <h2 id="conclusión">Conclusión</h2> <p>La conversación interesante en 2026 ya no es si usar IA en el ciclo de desarrollo, sino dónde dejarla decidir sola y dónde forzar un humano en el medio. Los equipos que están sacando ROI real lo entendieron: HITL no es resistencia al cambio, es disciplina de ingeniería aplicada al nuevo stack.</p> <p>Saltarse esa disciplina por entusiasmo o por presión de un roadmap agresivo es barato al principio y caro al final. La factura llega en forma de tokens consumidos, incidentes de producción y confianza erosionada con el negocio. Poner los gates correctos cuesta menos que cualquiera de esas tres cosas.</p> <p>La IA es un multiplicador brutal cuando opera dentro de un marco que le definimos nosotros. Sin ese marco, el multiplicador funciona igual de bien para el caos.</p>]]></content><author><name>Antonio Barbosa</name></author><category term="Human In The Loop"/><category term="Vibe Coding"/><category term="Iac"/><category term="Llm Engineering"/><category term="Artificial Intelligence"/><category term="hitl"/><category term="vibe-coding"/><category term="iac"/><category term="terraform"/><category term="sdd"/><category term="agentes"/><summary type="html"><![CDATA[En 2026 el discurso corporativo va casi todo en una sola dirección: agentes autónomos, full automation, self-healing pipelines. La promesa es seductora porque vende. La realidad operativa es que casi...]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/hitl-vibe-coding-iac.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/hitl-vibe-coding-iac.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Fine-tuning vs. RAG: cuándo cada uno tiene ROI real en producción</title><link href="https://aboneto.dev/fine-tuning-vs-rag-cuando-cada-uno-tiene-roi-real-en-produccion" rel="alternate" type="text/html" title="Fine-tuning vs. RAG: cuándo cada uno tiene ROI real en producción"/><published>2026-05-15T00:00:00+00:00</published><updated>2026-05-15T00:00:00+00:00</updated><id>https://aboneto.dev/fine-tuning-vs-rag-cuando-cada-uno-tiene-roi-real-en-produccion</id><content type="html" xml:base="https://aboneto.dev/fine-tuning-vs-rag-cuando-cada-uno-tiene-roi-real-en-produccion"><![CDATA[<p><img src="/assets/img/rag-vs-finetuning-roi.webp" alt="Fine-tuning vs. RAG"/></p> <p>Ya vimos cómo bajar el costo de inferencia usando modelos open-weight como <code class="language-plaintext highlighter-rouge">Qwen 3.5</code> en el artículo <a href="https://aboneto.medium.com/reduciendo-el-costo-en-producci%C3%B3n-qwen-3-5-en-aws-vs-openai-c4dc8eb16ed6">Reduciendo el costo en producción: Qwen 3.5 en AWS vs APIs Comerciales</a>. Pero cuando tienes el costo base bajo control, te enfrentas a otro problema: cómo darle al modelo conocimiento específico de tu empresa.</p> <p>Aquí casi todo el mundo salta directo a RAG (Retrieval-Augmented Generation) porque el fine-tuning tiene fama de ser caro y complejo. Hoy vamos a ver por qué esa idea está desactualizada. Olvídate de los tutoriales de código por un momento. Vamos a hablar de números, latencia y el costo real de operar esto en producción.</p> <h2 id="la-trampa-de-hacer-siempre-rag">La trampa de hacer siempre RAG</h2> <p>RAG se convirtió en el estándar. Tienes un problema de conocimiento y le tiras una base de datos vectorial encima. Funciona bien, pero no es la única opción. Entrenar modelos open-weight en plataformas como <a href="https://aws.amazon.com/es/sagemaker/ai/">AWS SageMaker</a> o <a href="ttps://docs.cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?hl=es">Google Vertex AI</a> hoy es mucho más accesible. La pregunta correcta no es cuál tecnología está de moda, sino cuál tiene sentido financiero y operativo para tu tráfico.</p> <h2 id="dónde-se-va-el-presupuesto">Dónde se va el presupuesto</h2> <p>Hacer RAG significa que pagas todo el tiempo. Cada vez que cambian tus datos, tienes que generar embeddings. Pagas la base de datos vectorial todos los meses. Y el costo oculto más grande: cada request incluye miles de tokens de contexto recuperado. Eso dispara el consumo de input tokens. Si usas un modelo propietario o muy pesado, la factura a fin de mes duele.</p> <p>El fine-tuning funciona diferente. Pagas el cómputo GPU por adelantado para entrenar el modelo. Luego pagas el hosting del endpoint. ¿La ventaja? Como el modelo ya memorizó la información, tus prompts son cortos. Te ahorras millones de input tokens a largo plazo. Con mucho volumen de consultas, el fine-tuning sale más barato.</p> <h2 id="latencia-ttft-y-tpot">Latencia: TTFT y TPOT</h2> <p>Si mides el tiempo hasta el primer token (TTFT), RAG es naturalmente más lento. Tienes que vectorizar la consulta, buscar en la base de datos, extraer los chunks, armar un prompt gigante, mandarlo al LLM y esperar la respuesta. El fine-tuning se salta esos pasos, el request llega y el modelo responde directo.</p> <p>Si mides los tokens por segundo (TPOT), un modelo open-weight afinado como un <code class="language-plaintext highlighter-rouge">Qwen 3.5</code> o <code class="language-plaintext highlighter-rouge">Qwen 3.6</code> escupe palabras mucho más rápido que un modelo propietario de gran tamaño conectado a un sistema RAG, como los modelos comerciales de OpenAI o Claude.</p> <h2 id="cuándo-usar-cada-enfoque">Cuándo usar cada enfoque</h2> <p>Aquí tienes una guía rápida para tomar la decisión.</p> <p><strong>Fine-tuning</strong>: si tienes volumen y previsibilidad. Si haces clasificación masiva, generas JSONs estructurados o tienes mucho tráfico sobre un dominio de conocimiento estático, el fine-tuning gana. La baja latencia y el ahorro en tokens justifican el costo de entrenamiento. También es tu mejor opción si tienes SLAs de latencia que no soportan el retraso de una búsqueda vectorial.</p> <p><strong>RAG</strong>: si tus datos cambian todos los días. Si es una base de soporte al cliente que se actualiza constantemente, reentrenar el modelo a diario destruiría tu presupuesto. RAG también es obligatorio si por compliance necesitas mostrar de qué documento exacto salió la respuesta.</p> <p><strong>Combina los dos</strong>: si tienes los recursos. Puedes hacer fine-tuning para que el modelo aprenda sobre su empresa, su estructura interna, sus productos y su forma de comunicarse, y usar RAG solo para buscar datos dinámicos como precios o inventario. Obtienes la máxima precisión posible, aunque requiere mayor madurez en tu equipo de ingeniería.</p> <h2 id="cómo-aplicar-este-modelo-mental">Cómo aplicar este modelo mental</h2> <p>Para llevar esta teoría a producción sin quemar el presupuesto, te recomiendo un enfoque iterativo:</p> <ol> <li><strong>Mide tu baseline de RAG</strong>: Aísla el costo de tu base de datos vectorial (Pinecone, pgvector) y suma el gasto mensual de <em>input tokens</em> que consumes por inyectar contexto.</li> <li><strong>Compara contra el fierro</strong>: Calcula el costo de levantar un endpoint dedicado en<a href="https://aws.amazon.com/es/sagemaker/ai/">AWS SageMaker</a> o <a href="ttps://docs.cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?hl=es">Google Vertex AI</a> para un modelo open-weight como <code class="language-plaintext highlighter-rouge">Qwen 3.5</code> o <code class="language-plaintext highlighter-rouge">Qwen 3.6</code>. Si tu gasto en tokens supera el costo de la infraestructura fija, tienes el caso de negocio justificado para el fine-tuning.</li> <li><strong>Mide el impacto del TTFT</strong>: Haz pruebas de carga para medir el Time To First Token. Si tu sistema RAG actual retrasa la respuesta y afecta la retención de usuarios, el fine-tuning se vuelve una necesidad operativa, no solo financiera.</li> <li><strong>Implementa un LLM Router</strong>: Si vas por la ruta híbrida, dale al modelo una <em>tool</em> para consultar el RAG solo cuando necesite datos que no memorizó. Si la consulta es sobre conocimiento interno, responde directo. Así consigues precisión y flexibilidad, pero pagas el precio en complejidad arquitectónica. Evalúa si tu caso de uso justifica mantener ambos sistemas vivos.</li> </ol> <h2 id="conclusión">Conclusión</h2> <p>No asumas que RAG es la única ruta válida solo porque es la más repetida en la industria de hoy. Tampoco asumas que el fine-tuning es un lujo reservado para gigantes tecnológicos. En entornos de producción reales, la viabilidad de un sistema generativo se mide en dólares por millón de tokens y en milisegundos de latencia.</p> <p>Cruza tus propios números. Compara el costo mensual de tu infraestructura vectorial y los input tokens que quemas inyectando contexto, frente al precio fijo de levantar una instancia en AWS y entrenar un modelo open-weight altamente optimizado. Es muy probable que descubras que el fine-tuning, o un enfoque híbrido impulsado por herramientas (tools), tiene mucho más sentido financiero y operativo para tu tráfico.</p> <p>Si quieres profundizar en los números duros de levantar estos modelos en la nube, revisa el análisis de <a href="https://aboneto.medium.com/reduciendo-el-costo-en-producci%C3%B3n-qwen-3-5-en-aws-vs-openai-c4dc8eb16ed6">Qwen 3.5 en AWS vs APIs Comerciales</a> y empieza a optimizar tu arquitectura hoy mismo.</p>]]></content><author><name>Antonio Barbosa</name></author><category term="Rag"/><category term="Fine Tuning"/><category term="Artificial Intelligence"/><category term="Return On Investment"/><category term="Generative Ai Solution"/><category term="rag"/><category term="fine-tuning"/><category term="qwen"/><category term="costos"/><category term="latencia"/><category term="produccion"/><summary type="html"><![CDATA[Ya vimos cómo bajar el costo de inferencia usando modelos open-weight como Qwen 3.5 en el artículo Reduciendo el costo en producción: Qwen 3.5 en AWS vs APIs Comerciales. Pero cuando tienes el costo...]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/rag-vs-finetuning-roi.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/rag-vs-finetuning-roi.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">LLM-as-a-Judge: cómo construir pipelines de evaluación de IA que escalen</title><link href="https://aboneto.dev/llm-as-a-judge-como-construir-pipelines-de-evaluacion-de-ia-que-escalen" rel="alternate" type="text/html" title="LLM-as-a-Judge: cómo construir pipelines de evaluación de IA que escalen"/><published>2026-05-13T00:00:00+00:00</published><updated>2026-05-13T00:00:00+00:00</updated><id>https://aboneto.dev/llm-as-a-judge-como-construir-pipelines-de-evaluacion-de-ia-que-escalen</id><content type="html" xml:base="https://aboneto.dev/llm-as-a-judge-como-construir-pipelines-de-evaluacion-de-ia-que-escalen"><![CDATA[<p><img src="/assets/img/llm-as-a-judge-eval-pipelines-2.webp" alt="LLM-as-a-Judge"/></p> <p>Los prompts en sistemas con Large Language Models (LLMs) no se comportan como código determinista. En un desarrollo de software tradicional, si modificas una función y todos los tests pasan, puedes desplegar con confianza. Con los LLMs, un cambio mínimo en el prompt para mejorar el tono de una respuesta puede, inadvertidamente, hacer que el modelo deje de extraer una entidad clave o falle al invocar una herramienta externa (tool call).</p> <p>Esta regresión silenciosa es el mayor riesgo al operar IA en producción. Sin un pipeline de evaluación sistemática, iterar prompts es esencialmente una apuesta. La evaluación manual no escala, y usar métricas de similitud de texto tradicional se queda corto. El patrón <strong>LLM-as-a-Judge</strong> resuelve esto usando un modelo para evaluar a otro.</p> <p>Te mostraré cómo construir un pipeline de evaluación que escale económicamente para entornos de producción, basándome en mi experiencia construyendo estos sistemas a gran escala.</p> <h2 id="el-marco-cccd-más-allá-del-cicd-clásico">El marco CC/CD: Más allá del CI/CD clásico</h2> <p>Cuando desarrollamos software tradicional, usamos <strong>CI/CD (Continuous Integration / Continuous Deployment)</strong>, donde el objetivo es construir, probar exhaustivamente y llegar al despliegue como la meta final del ciclo. Pero para los sistemas de IA generativa, este enfoque lineal se queda corto. El nuevo modelo es el <strong>CC/CD (Continuous Calibration / Continuous Development)</strong>, donde el despliegue no es el final del proceso, sino apenas una transición hacia el verdadero ajuste fino.</p> <p><img src="/assets/img/cc-cd-loop.webp" alt="CC/CD Loop"/></p> <p><strong>Fase de Desarrollo Continuo (Continuous Development)</strong></p> <ul> <li>El ciclo comienza al establecer distintas versiones de un prompt enfocadas en un caso de uso particular.</li> <li>Se recopila un conjunto de datos base que contenga interacciones representativas para validar cómo debería responder el sistema.</li> <li>Configuramos métricas a medida y se determinan qué modelos actuarán como jueces para calificar los resultados.</li> </ul> <p><strong>Fase de Calibración Continua (Continuous Calibration)</strong></p> <ul> <li>Ante cualquier ajuste en un prompt, se ejecuta una validación automatizada contra el conjunto de datos de control (<em>ground truth</em>).</li> <li>Se cuantifican atributos clave como la adherencia al formato, el tono y la precisión de la información usando LLMs evaluadores.</li> <li>Un cambio solo recibe luz verde para producción si logra superar las métricas de calidad establecidas previamente.</li> <li>Una vez en vivo, se monitorea el tráfico real para identificar anomalías o degradaciones sutiles.</li> <li>El proceso es cíclico. Los errores detectados en producción alimentan de vuelta el entorno de pruebas para afinar prompts y contextos poco a poco.</li> </ul> <p>La calibración continua significa que asumimos que el modelo nunca es perfecto desde el día 1. Requiere ajustes empíricos basados en interacciones reales.</p> <h2 id="evaluación-offline-vs-online">Evaluación Offline vs. Online</h2> <p>Para implementar CC/CD con éxito, debes estructurar tus evaluaciones en dos frentes complementarios:</p> <h3 id="evaluación-offline">Evaluación Offline</h3> <p>Es tu red de seguridad antes de desplegar. Cada vez que modificas un prompt o cambias de modelo, disparas una evaluación sobre un dataset estático y curado (<em>ground truth</em>).</p> <ul> <li><strong>Contexto / Cuándo usarla</strong> Pre-despliegue, usando un dataset controlado e histórico.</li> <li><strong>Trigger</strong> Modificación de prompt, actualización de modelo o cambio en la lógica RAG.</li> <li><strong>Propósito</strong> Detectar y prevenir regresiones, y comparar versiones base.</li> <li><strong>Costo a Escala</strong> Bajo (volumen fijo).</li> </ul> <h3 id="evaluación-online">Evaluación Online</h3> <p>Es tu radar en producción. Usa tráfico real para puntuar siempre el rendimiento del modelo en interacciones vivas.</p> <ul> <li><strong>Contexto / Cuándo usarla</strong> Post-despliegue, monitoreo en tiempo real con tráfico en vivo de usuarios.</li> <li><strong>Trigger</strong> Trazas generadas por interacciones del usuario en producción (muestreo).</li> <li><strong>Propósito</strong> Detectar degradación progresiva, monitorear la salud y alimentar el dataset Offline con nuevos edge cases.</li> <li><strong>Costo a Escala</strong> Alto (escala con el tráfico real).</li> </ul> <h2 id="el-argumento-económico-para-modelos-open-weights-en-evaluación">El argumento económico para modelos Open-Weights en evaluación</h2> <p>En mi post anterior sobre <a href="/2026-04-13-reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights">reducir costos de LLMs con modelos Open Weights</a> y <a href="/2026-04-16-reduciendo-el-costo-en-produccion-qwen-35-en-aws-vs-openai">Qwen 3.5 en AWS</a>, mencioné que la evaluación automatizada es el caso de uso perfecto para modelos desplegados en infraestructura propia.</p> <p>¿Por qué? Porque aunque la evaluación Offline puede ser costosa usando APIs propietarias (ej. OpenAI, Anthropic), el verdadero quiebre económico ocurre en la evaluación <strong>Online</strong>.</p> <p>Si quieres evaluar un 20% o 30% de tus trazas en producción para tener una muestra estadísticamente significativa de la calidad de tus respuestas, el costo de usar un modelo propietario para puntuar cada interacción se dispara y puede superar el costo de la inferencia principal de tu aplicación. Los modelos open-weights (como la familia Qwen 3.5 o 3.6 desplegada en AWS) no son solo una optimización de costos. Son <strong>una alternativa financieramente viable para escalar la calibración Online</strong>.</p> <h2 id="el-stack-langfuse-self-hosted-y-jueces-propios">El stack: Langfuse Self-Hosted y Jueces Propios</h2> <p>La pieza central de nuestra arquitectura de evaluación es <strong>Langfuse</strong>. Aunque Langfuse Cloud es una excelente puerta de entrada para equipos pequeños, para entornos de producción maduros recomiendo <strong>Langfuse Self-Hosted</strong> sobre infraestructura propia (por ejemplo, en Kubernetes corporativo o AWS ECS).</p> <p><strong>¿Por qué Self-Hosted?</strong></p> <ul> <li><strong>Soberanía de Datos</strong> Los prompts y respuestas en producción a menudo contienen información sensible de los clientes que no debe enviarse a plataformas de observabilidad SaaS de terceros.</li> <li><strong>Costos Predecibles</strong> Un clúster con capacidad fija para Langfuse cuesta una fracción comparado con los tiers basados en volumen a nivel empresarial.</li> <li><strong>Validación en Producción</strong> Es el mismo patrón que he operado con éxito en producción a gran escala.</li> </ul> <p>Langfuse maneja el versionado de prompts, la gestión de datasets y el registro de trazas y scores.</p> <h3 id="jueces-pre-configurados-vs-jueces-propios">Jueces Pre-configurados vs. Jueces Propios</h3> <p>Langfuse ofrece evaluadores pre-configurados (ej. toxicidad, sentimiento), que son un gran punto de partida. Pero para que el patrón LLM-as-a-Judge sea realmente efectivo, necesitas construir <strong>jueces propios</strong>.</p> <p>Un juez propio debe contener:</p> <ul> <li>Un <strong>prompt template</strong> altamente específico para tu caso de uso.</li> <li>Una <strong>rúbrica</strong> clara de puntuación (ej. de 0 a 1).</li> <li>Ejemplos <strong>few-shot</strong> del dominio de negocio (ej. qué significa un 0.2 vs un 0.9 en tu contexto específico).</li> </ul> <h2 id="taxonomía-de-llm-as-a-judge-métricas-y-sesgos">Taxonomía de LLM-as-a-Judge, Métricas y Sesgos</h2> <h3 id="variantes-del-juez">Variantes del Juez</h3> <ul> <li><strong>Single Judge</strong> Un solo modelo evalúa una respuesta basada en una rúbrica. (Más rápido y económico).</li> <li><strong>Pairwise Comparison</strong> El modelo recibe dos respuestas (A y B) y elige la mejor. (Mejor para A/B testing).</li> <li><strong>Reference-Based (Ground Truth)</strong> El modelo compara la respuesta generada con una respuesta ideal de referencia.</li> </ul> <h3 id="métricas-clave">Métricas Clave</h3> <p>Puedes diseñar tus propios prompts de evaluación para métricas como:</p> <ul> <li><strong>Relevancia</strong> ¿Responde la salida a la pregunta del usuario sin divagar?</li> <li><strong>Coherencia</strong> ¿Es la respuesta lógicamente sólida de principio a fin?</li> <li><strong>Faithfulness (Fidelidad en RAG)</strong> ¿La respuesta se basa estrictamente en el contexto provisto o alucina información?</li> <li><strong>Tono/Estilo</strong> ¿La respuesta mantiene la voz definida de la marca corporativa?</li> <li><strong>Adherencia al Formato</strong> ¿Respetó el modelo el formato solicitado (ej. JSON estricto sin preámbulos)?</li> </ul> <p><em>Prompt template de ejemplo para Faithfulness (Single Judge):</em></p> <div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Eres un evaluador experto. Analiza si la RESPUESTA se basa únicamente en el CONTEXTO provisto.
No evalúes si la respuesta es correcta en el mundo real, solo si se infiere directamente del contexto.

[CONTEXTO]<span class="sb">


</span>[RESPUESTA]<span class="sb">


</span>Evalúa en una escala de 0.0 (totalmente alucinado o no relacionado) a 1.0 (perfectamente fiel al contexto).
Devuelve tu evaluación en formato JSON: {"score": 0.x, "reasoning": "tu justificación breve"}
</code></pre></div></div> <p>Un score bajo en <em>Faithfulness</em> indica un alto riesgo de alucinación y la necesidad inmediata de ajustar el prompt del sistema RAG.</p> <h3 id="sesgos-del-juez-y-mitigación">Sesgos del Juez y Mitigación</h3> <p>Los LLMs como jueces no son perfectos e introducen sus propios sesgos:</p> <ul> <li><strong>Position Bias</strong> En comparaciones pairwise, el modelo tiende a favorecer a la respuesta presentada primero. <em>Mitigación</em> Aleatorizar el orden de A y B y promediar.</li> <li><strong>Verbosity Bias</strong> El modelo asume que una respuesta más larga es “mejor”, incluso si incluye relleno. <em>Mitigación</em> Añadir instrucciones explícitas en la rúbrica penalizando la verbosidad excesiva.</li> <li><strong>Self-Enhancement Bias</strong> Si usas Llama 3 para evaluar Llama 3, tenderá a darse puntuaciones más altas a sí mismo. <em>Mitigación</em> Usa un modelo juez de una familia diferente al evaluado (ej. evaluar salidas de OpenAI usando Qwen).</li> </ul> <blockquote> <p><strong>Checklist de Verificación de Sesgos</strong></p> <ul> <li>El orden de las opciones en las evaluaciones Pairwise es aleatorio.</li> <li>La rúbrica penaliza explícitamente respuestas largas e innecesarias (Verbosity Bias).</li> <li>El modelo juez pertenece a una familia o versión distinta al modelo generador.</li> <li>El juez devuelve una justificación o razonamiento (Chain-of-Thought) antes del score numérico.</li> </ul> </blockquote> <h2 id="implementación-con-qwen-3x-y-langfuse-sdk">Implementación con Qwen 3.x y Langfuse SDK</h2> <p>Para el modelo juez local, recomiendo la familia <strong>Qwen 3.x</strong> por su excelente relación calidad-precio y capacidades multilingües.</p> <p><strong>¿Qwen 3.5 o 3.6?</strong></p> <ul> <li>Elige <strong>Qwen 3.5 (72B o 32B)</strong> si vas a evaluar altos volúmenes de trazas Online y necesitas un balance óptimo entre rendimiento (TPS) y presupuesto de infraestructura.</li> <li>Elige <strong>Qwen 3.6</strong> si estás evaluando dominios muy técnicos, razonamiento complejo o matemáticas, donde necesitas la mayor precisión posible sin importar una ligera penalización en costo de computación.</li> </ul> <p>En lugar de construir scripts complejos y aislados, la mejor práctica es orquestar este proceso con <strong>pipelines en Jenkins</strong> (o tu herramienta de CI/CD). Puedes configurar un pipeline que se dispare ante cualquier modificación de un prompt y ejecute un script de evaluación que haga lo siguiente:</p> <ol> <li><strong>Recupera el prompt modificado</strong> desde Langfuse.</li> <li><strong>Recupera el dataset</strong> controlado de pruebas desde Langfuse.</li> <li><strong>Corre el prompt</strong> contra los datos en el dataset de pruebas.</li> <li><strong>Genera las trazas</strong> de las ejecuciones en Langfuse asociándolas a un tag o label en particular.</li> <li><strong>Registra los experimentos</strong> en Langfuse, enlazando las trazas generadas previamente.</li> <li><strong>Ejecuta la evaluación:</strong> Langfuse ejecuta los LLM-as-a-Judge contra el entorno y los tags de las ejecuciones (Evaluación Online controlada).</li> <li><strong>Valida umbrales de calidad</strong> para aprobar o rechazar la modificación del prompt.</li> </ol> <h2 id="análisis-de-costos-el-punto-de-inflexión">Análisis de costos: el punto de inflexión</h2> <p>Veamos los números detrás del argumento.</p> <h3 id="costo-de-evaluación-offline">Costo de Evaluación Offline</h3> <p>Supongamos un ciclo de CC/CD que corre una evaluación completa sobre un dataset de 1,000 interacciones por cada cambio en el prompt (asumiendo ~2,000 tokens de input y ~300 de output por evaluación).</p> <p><strong>Modelo Propietario (Premium)</strong></p> <ul> <li>Costo Input (por 1M): ~$5.00</li> <li>Costo Output (por 1M): ~$15.00</li> <li>Costo de 1,000 Evaluaciones: <strong>~$14.50 por run</strong></li> </ul> <p><strong>Qwen 3.x (Infraestructura propia)</strong></p> <ul> <li>Costo Input (por 1M): Fijo (amortizado)</li> <li>Costo Output (por 1M): Fijo (amortizado)</li> <li>Costo de 1,000 Evaluaciones: <strong>Marginal (~$0)</strong></li> </ul> <p>Para Offline, el ahorro es atractivo pero no determinante. Pero en Online la historia cambia.</p> <h3 id="costo-de-evaluación-online-calibración-en-producción">Costo de Evaluación Online (Calibración en Producción)</h3> <p>Si tienes una aplicación que genera 1,000,000 de trazas al mes, y quieres aplicar CC/CD evaluando una muestra representativa:</p> <p><strong>Muestreo del 10% de las trazas</strong></p> <ul> <li>Volumen Evaluado / Mes: 100,000 evals</li> <li>Costo API Propietaria ($14.5/1K): ~$1,450 / mes</li> <li>Costo Infra Propia (Qwen): Servidor Fijo (~$1,000/mes)</li> </ul> <p><strong>Muestreo del 20% de las trazas</strong></p> <ul> <li>Volumen Evaluado / Mes: 200,000 evals</li> <li>Costo API Propietaria ($14.5/1K): ~$2,900 / mes</li> <li>Costo Infra Propia (Qwen): Servidor Fijo (~$1,000/mes)</li> </ul> <p><strong>Muestreo del 30% de las trazas</strong></p> <ul> <li>Volumen Evaluado / Mes: <strong>300,000 evals</strong></li> <li>Costo API Propietaria ($14.5/1K): <strong>~$4,350 / mes</strong></li> <li>Costo Infra Propia (Qwen): <strong>Servidor Fijo (~$1,000/mes)</strong></li> </ul> <p>El punto de inflexión es claro: tan pronto escalas el monitoreo continuo en producción, depender de APIs propietarias para LLM-as-a-Judge destruye tus márgenes operativos. Usar un modelo open-weights te da la libertad de evaluar agresivamente en Online sin miedo a la factura a fin de mes.</p> <h2 id="conclusión">Conclusión</h2> <p>La madurez en la ingeniería de IA no se trata de escribir el “prompt perfecto”. Se trata de construir un sistema que te permita saber objetivamente cuándo un prompt es mejor que el anterior. El marco CC/CD, impulsado por Langfuse Self-Hosted y modelos Open-Weights como Qwen 3.x como jueces, permite precisamente eso.</p> <p>Las evaluaciones Offline aseguran que no rompas nada al desplegar. Las evaluaciones Online te garantizan que mantienes el pulso de la realidad en producción. Si logras integrar ambas, transformarás los prompts de “cadenas de texto mágicas” a verdaderos componentes de software controlados, calibrados y mejorables.</p> <p>Si quieres profundizar en cómo se ve este flujo aplicado en un caso de negocio real, te recomiendo leer <a href="https://buk.engineering/2026/02/09/evaluaciones-de-prompts-con-llm-as-a-judge-el-marco-cc-cd-en-buk.html">mi artículo invitado detallando el marco CC/CD</a>. Y si estás buscando optimizar tu stack de inferencia, revisa mis posts previos sobre <a href="https://aboneto.medium.com/reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights-20bce7b296de">el impacto de usar modelos Open Weights en lugar de APIs propietarias</a>.</p> <p>¿Cómo estás evaluando tus prompts en producción hoy? El CC/CD podría ser tu siguiente paso natural.</p>]]></content><author><name>Antonio Barbosa</name></author><category term="Continuous Calibration"/><category term="Continuous Development"/><category term="Llm As A Judge"/><category term="Open Weight Model"/><category term="Artificial Intelligence"/><category term="llm-as-a-judge"/><category term="evaluacion"/><category term="langfuse"/><category term="qwen"/><category term="cc-cd"/><category term="prompts"/><summary type="html"><![CDATA[Los prompts en sistemas con Large Language Models (LLMs) no se comportan como código determinista. En un desarrollo de software tradicional, si modificas una función y todos los tests pasan, puedes...]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/llm-as-a-judge-eval-pipelines-2.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/llm-as-a-judge-eval-pipelines-2.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Auditoría de Skills: Protegiendo tu Infraestructura de los Sleeping Payloads</title><link href="https://aboneto.dev/el-uso-indiscriminado-de-skills-lo-necesito-lo-instalo-que-puede-salir-mal" rel="alternate" type="text/html" title="Auditoría de Skills: Protegiendo tu Infraestructura de los Sleeping Payloads"/><published>2026-05-12T00:00:00+00:00</published><updated>2026-05-12T00:00:00+00:00</updated><id>https://aboneto.dev/el-uso-indiscriminado-de-skills-lo-necesito-lo-instalo-que-puede-salir-mal</id><content type="html" xml:base="https://aboneto.dev/el-uso-indiscriminado-de-skills-lo-necesito-lo-instalo-que-puede-salir-mal"><![CDATA[<p><img src="/assets/img/skills-indiscriminado.webp" alt="Skills Security"/></p> <p><em>Las skills y los agentes autónomos son un multiplicador de productividad invaluable, pero instalarlos sin validación previa es la forma más rápida de abrirle la puerta de tu infraestructura a un infostealer.</em></p> <p>Las skills y los agentes son probablemente lo mejor que le ha pasado al ecosistema de IA en los últimos años. Una skill es, en esencia, una abstracción potente: encapsula conocimiento y scripts auxiliares que el agente activa contextualmente. Para un equipo de ingeniería, esto escala la productividad (<em>throughput</em>) de forma increíble y reduce drásticamente el <em>Time to Market</em> (TTM).</p> <p>El problema surge cuando el ciclo de adopción se reduce a un impulso ciego: <code class="language-plaintext highlighter-rouge">lo necesito → lo busco → lo instalo</code>, saltándose cualquier proceso de validación de seguridad. Gran parte de este riesgo nace de la carrera corporativa por integrar flujos de IA en el ecosistema organizacional lo más rápido posible. En el afán de innovar, se adoptan herramientas sin criterio arquitectónico, sin definir una cultura de seguridad y sin la difusión de buenas prácticas, dejando frecuentemente el peso de la decisión y la evaluación de riesgos exclusivamente sobre los hombros de los desarrolladores. Esto no es alarmismo, durante los primeros meses de 2026, ya tuvimos evidencia documentada de campañas activas de malware distribuido vía skills en marketplaces oficiales, dejándonos una lección costosa sobre los riesgos del suministro de software (<em>Supply Chain Risks</em>) en la era de los agentes.</p> <h2 id="lecciones-de-la-campaña-clawhavoc-y-el-costo-del-riesgo">Lecciones de la campaña ClawHavoc y el costo del riesgo</h2> <p>Para quienes no siguieron el caso, <strong>OpenClaw</strong> (un proyecto de asistentes locales) sufrió una infiltración masiva en su marketplace, <strong>ClawHub</strong>. Una auditoría de Koi Security reveló datos escalofriantes que nos obligan a replantear el ROI de nuestro tiempo de auditoría:</p> <ul> <li>De 2.857 skills evaluadas, <strong>341 eran maliciosas</strong> (11,9% de exposición directa al riesgo).</li> <li>Una sola cuenta, <code class="language-plaintext highlighter-rouge">hightower6eu</code>, publicó 677 paquetes maliciosos sin historial previo.</li> <li>La técnica no requería exploits sofisticados: bastaba con nombres atractivos como <code class="language-plaintext highlighter-rouge">solana-wallet-tracker</code> y una sección de “Prerrequisitos” que ejecutaba un simple <code class="language-plaintext highlighter-rouge">curl | sh</code>.</li> </ul> <p>El payload utilizado fue <strong>Atomic Stealer (AMOS)</strong> en macOS y keyloggers en Windows, exfiltrando desde claves SSH hasta sesiones de Telegram y credenciales de AWS. Si calculamos el costo de un incidente de este tipo (remediación, pérdida de confianza, <em>downtime</em> de operaciones), el impacto en el negocio supera con creces cualquier ganancia de productividad temporal obtenida por instalar una skill en segundos.</p> <h2 id="el-sleeping-payload-y-la-arquitectura-del-ataque">El “Sleeping Payload” y la arquitectura del ataque</h2> <p>Lo más inquietante del informe de seguridad fue el uso de técnicas avanzadas aplicadas a la IA. Skills que parecían funcionales y legítimas tenían <em>backdoors</em> enterrados en la línea 180 de sus scripts auxiliares. El malware no se activaba durante la instalación, evadiendo controles superficiales, sino durante el uso normal en producción (el llamado <em>Sleeping Payload</em>).</p> <p>Debemos entender un principio arquitectónico fundamental en el uso de agentes: <strong>Cuando instalas una skill, no estás instalando un simple documento de texto; estás instalando código ejecutable con tus mismos permisos de sistema.</strong> Si tu agente puede leer <code class="language-plaintext highlighter-rouge">~/.ssh/id_rsa</code> o tus variables de entorno, la skill también puede hacerlo y exfiltrar esos datos a un endpoint externo. No existe <em>sandboxing</em> implícito entre la skill y el agente.</p> <h2 id="hacia-una-cultura-de-auditoría-manual-y-proactiva">Hacia una cultura de auditoría (Manual y Proactiva)</h2> <p>El problema no es exclusivo de proyectos hobbistas; es un desafío estructural. Auditorías recientes muestran que hasta el 26% de las skills en diversos ecosistemas presentan vulnerabilidades o dependencias inseguras. ¿Cómo mitigamos este riesgo manteniendo la eficiencia operativa?</p> <h3 id="1-disciplina-de-revisión-manual-el-baseline">1. Disciplina de Revisión Manual (El Baseline)</h3> <p>Antes de instalar cualquier skill en tu entorno de desarrollo, es obligatorio establecer un estándar de revisión:</p> <ul> <li><strong>Lectura íntegra del <code class="language-plaintext highlighter-rouge">SKILL.md</code></strong>: Busca comandos remotos sospechosos o descargas no justificadas.</li> <li><strong>Auditoría integral de componentes adicionales</strong>: Es vital entender que muchas skills dependen de scripts <code class="language-plaintext highlighter-rouge">.sh</code>, ejecutables en Python o llamadas a CLIs externas en su proceso de ejecución. No basta con evaluar únicamente el archivo <code class="language-plaintext highlighter-rouge">SKILL.md</code>; toda y cualquier pieza que componga la solución debe ser revisada para identificar el uso de <code class="language-plaintext highlighter-rouge">eval</code>, <code class="language-plaintext highlighter-rouge">base64</code> ofuscado o accesos a rutas críticas como <code class="language-plaintext highlighter-rouge">~/.aws/</code> o <code class="language-plaintext highlighter-rouge">.env</code>.</li> <li><strong>Evaluación de reputación</strong>: No confíes en las “estrellas” del repositorio (se compran fácilmente). Analiza la actividad histórica del autor y la calidad de sus <em>commits</em>.</li> </ul> <h3 id="2-auditoría-automatizada-maximizando-el-roi-de-la-seguridad">2. Auditoría Automatizada: Maximizando el ROI de la Seguridad</h3> <p>Como la revisión manual no escala (<em>bottleneck</em> de productividad) cuando manejas decenas de herramientas, necesitamos automatizar este proceso. Aquí es donde los propios agentes nos ayudan a vigilar el ecosistema mediante herramientas especializadas como <a href="https://www.skills.sh/sickn33/antigravity-awesome-skills/cc-skill-security-review"><code class="language-plaintext highlighter-rouge">cc-skill-security-review</code></a>.</p> <p>Esta skill actúa como un auditor de primera línea en tu proceso de validación de herramientas, capaz de escanear otras skills antes de su activación. Puede detectar:</p> <ul> <li>Patrones de inyección de <em>prompts</em> diseñados para exfiltrar variables de entorno.</li> <li>Llamadas de red asíncronas no documentadas.</li> <li>Intentos de acceso a configuraciones locales sensibles.</li> </ul> <p>Integrar un paso de <code class="language-plaintext highlighter-rouge">audit-first</code> en tu flujo de trabajo con agentes no es opcional, es una necesidad operativa básica para mantener la integridad de tu arquitectura.</p> <h2 id="conclusión">Conclusión</h2> <p>Tratar a las skills con menos rigor que a un paquete de <code class="language-plaintext highlighter-rouge">npm</code> o una imagen de Docker es un error estratégico grave. Funcionalmente, una skill es <strong>código en formato narrativo</strong> que tu modelo ejecutará literalmente. Cabe destacar que este riesgo no se limita a las skills; cualquier agente autónomo, plugin de LLM u otro tipo de solución agéntica que integremos en nuestro ecosistema representa el mismo vector de ataque y exige exactamente el mismo nivel de escrutinio.</p> <p>La adopción de agentes seguirá creciendo de forma exponencial, pero la velocidad de integración (<em>velocity</em>) no puede superar a nuestra capacidad de auditoría (<em>security posture</em>). Hace falta un cambio cultural hacia un modelo de <em>Zero Trust</em> donde auditar antes de instalar sea el <em>default</em>. Esta disciplina de seguridad cuesta un poco de tiempo e esfuerzo en la implementación inicial, pero no tenerla puede costar muy caro, incluyendo la confianza de toda la organización.</p> <hr/> <p><em>¿Has calculado el nivel de exposición de tu equipo al usar skills no auditadas?</em></p>]]></content><author><name>Antonio Barbosa</name></author><category term="Skills"/><category term="Agentic Ai"/><category term="Software Engineering"/><category term="Sleeping Payloads"/><category term="Security"/><category term="skills"/><category term="seguridad"/><category term="agentes"/><category term="malware"/><category term="supply-chain"/><summary type="html"><![CDATA[Las skills y los agentes son probablemente lo mejor que le ha pasado al ecosistema de IA en los últimos años. Una skill es, en esencia, una abstracción potente: encapsula conocimiento y scripts...]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/skills-indiscriminado.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/skills-indiscriminado.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Reduciendo el costo en producción: Qwen 3.5 en AWS vs OpenAi</title><link href="https://aboneto.dev/reduciendo-el-costo-en-produccion-qwen-35-en-aws-vs-openai" rel="alternate" type="text/html" title="Reduciendo el costo en producción: Qwen 3.5 en AWS vs OpenAi"/><published>2026-04-16T00:00:00+00:00</published><updated>2026-04-16T00:00:00+00:00</updated><id>https://aboneto.dev/reduciendo-el-costo-en-produccion-qwen-35-en-aws-vs-openai</id><content type="html" xml:base="https://aboneto.dev/reduciendo-el-costo-en-produccion-qwen-35-en-aws-vs-openai"><![CDATA[<p>Análisis técnico: AWS SageMaker vs OpenAi. Descubre por qué alojar modelos open-weights es vital para rentabilidad y latencia.</p> <p><img src="/assets/img/qwen-aws-vs-openai.webp" alt=""/></p> <p>Las APIs gestionadas de proveedores LLM son el estándar de la industria hoy en día. Sin embargo, cuando una aplicación pasa de la fase de prototipo a producción y debe soportar usuarios concurrentes de verdad, el modelo de cobrar por token se vuelve rápidamente un problema financiero.</p> <p>Para quienes diseñamos arquitecturas a escala, pasarnos a modelos <em>open-weights</em> en infraestructura propia va más allá de un tema de privacidad de datos. Como exploré recientemente en mi análisis sobre cómo <a href="https://aboneto.medium.com/reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights-20bce7b296de" title="null">reducir hasta un 90% los costos de LLMs</a>, se trata de una decisión puramente de viabilidad económica y control de la latencia.</p> <p>Este artículo desglosa los números exactos de costos y rendimiento al comparar el despliegue de la familia de modelos Qwen 3.5 (9B, 35B y 122B) en AWS SageMaker Real-time Inference contra las versiones comerciales de OpenAI.</p> <h2 id="el-glosario-de-inferencia">El Glosario de Inferencia</h2> <p>Antes de ver los números, repasemos las métricas que definen el rendimiento de un modelo en producción:</p> <ul> <li><strong>AWS SageMaker Real-time Inference:</strong> El entorno que usaremos para levantar los endpoints dedicados. Permite desplegar contenedores optimizados manteniendo el control del hardware.</li> <li><strong>TPS (Tokens Per Second):</strong> El <em>throughput</em> puro del hardware. Cuántos tokens procesa la GPU por segundo.</li> <li><strong>TTFT (Time To First Token):</strong> El tiempo desde que el usuario envía el <em>prompt</em> hasta que el servidor devuelve la primera palabra. Define qué tan rápido se siente el sistema.</li> <li><strong>TPOT (Time Per Output Token):</strong> La velocidad a la que se genera el texto. El ojo humano lee a unos 5–8 tokens por segundo; nuestro sistema tiene que ser más rápido que eso.</li> <li><strong>Continuous Batching:</strong> La técnica de los motores modernos (como vLLM o TGI) que permite procesar varias peticiones concurrentes, solapando la lectura del contexto de un usuario con la generación de palabras de otro para aprovechar la VRAM al máximo.</li> </ul> <h2 id="análisis-de-build-vsbuy">Análisis de Build vs. Buy</h2> <h3 id="el-escenario-base">El Escenario Base</h3> <p>Para sacar estos cálculos, modelamos el siguiente entorno de alta demanda:</p> <ul> <li><strong>Carga de trabajo:</strong> 32 usuarios concurrentes exigiendo al servidor 24/7.</li> <li><strong>Tiempo operativo:</strong> 1 mes completo (2.628.000 segundos o 730 horas).</li> <li><strong>Tráfico por ciclo analizado:</strong> 3.000 millones de tokens de Input (lectura) y 500 millones de tokens de Output (generación).</li> </ul> <h3 id="1-categoría-9b-qwen-35-vsgpt-41">1. Categoría 9B: Qwen 3.5 vs GPT-4.1</h3> <p><img src="/assets/img/qwen-9b-benchmark.webp" alt=""/></p> <p>Para modelos de 9 billones de parámetros (<a href="https://artificialanalysis.ai/models/qwen3-5-9b-non-reasoning?model-size=intelligence-vs-total-parameters#comparisons">qwen3.5 9B Non-reasoning</a>), las instancias base de la serie G de AWS son suficientes. Comparamos los costos asumiendo las tarifas de <a href="https://artificialanalysis.ai/models/gpt-4-1">GPT-4.1</a> ($2 USD por 1M Input / $8 USD por 1M Output).</p> <p><strong>Costo Mensual de Hardware (AWS):</strong></p> <ul> <li><code class="language-plaintext highlighter-rouge">ml.g6.xlarge</code>: $811,22 USD (Costo por segundo: $0,000309)</li> <li><code class="language-plaintext highlighter-rouge">ml.g5.xlarge</code>: $1.014,05 USD (Costo por segundo: $0,000386)</li> </ul> <p><strong>El Costo del Bloque de Prueba (3.000M In / 500M Out):</strong> Si ejecutamos nuestra carga base en la infraestructura propia, calculamos la fracción de tiempo de servidor utilizada y su costo equivalente. En OpenAI, este mismo bloque costaría <strong>$10.000 USD</strong> ($6.000 de lectura + $4.000 de escritura). Veamos cuánto cuesta procesar exactamente ese mismo volumen en nuestro hardware dedicado calculando la fracción de tiempo utilizada:</p> <p><strong>En ml.g6.xlarge:</strong></p> <ul> <li>Input (10.000 TPS) = $92,7 USD en tiempo de máquina</li> <li>Output (900 TPS) = $171,5 USD en tiempo de máquina</li> <li><strong>Costo real en AWS = $264,2 USD</strong></li> </ul> <p><strong>En ml.g5.xlarge:</strong></p> <ul> <li>Input (10.000 TPS) = $115,8 USD</li> <li>Output (1.120 TPS) = $172,5 USD</li> <li><strong>Costo real en AWS = $265,2 USD</strong></li> </ul> <p>Gastar ~$265 dólares de tiempo de máquina frente a $10.000 dólares de API demuestra un quiebre absoluto en la curva de costos.</p> <p><strong>Capacidad Máxima Teórica (Servidor al 100% 24/7):</strong> Llevando el hardware al límite durante todo el mes, el valor de los tokens procesados frente a las tarifas de OpenAI es abrumador. Si saturamos la <code class="language-plaintext highlighter-rouge">ml.g5.xlarge</code>, la matemática de producción es la siguiente:</p> <ul> <li><strong>Input Máximo:</strong> 26.280 Millones de tokens.</li> <li><strong>Output Máximo:</strong> 2.943 Millones de tokens.</li> <li><strong>Costo en AWS</strong>: ~1.014,05 USD (1 servidor mensual)</li> <li><strong>Costo Equivalente en GPT-4.1:</strong> <strong>$76.106 USD</strong> ($52.560 In + $23.546 Out).</li> <li><strong>Retorno Operativo (ROI):</strong> ~75x</li> </ul> <h3 id="2-categoría-35b-qwen-35-vsgpt-52">2. Categoría 35B: Qwen 3.5 vs GPT-5.2</h3> <p><img src="/assets/img/qwen-35b-benchmark.webp" alt=""/></p> <p>Dar el salto a 35B (<a href="https://artificialanalysis.ai/models/qwen3-5-35b-a3b-non-reasoning">qwen3.5 35B Non-reasoning</a>) mejora el razonamiento lógico, pero requiere mayor VRAM y memoria unificada. Comparamos frente a <a href="https://artificialanalysis.ai/models/gpt-5-2-non-reasoning">GPT-5.2</a> ($1,75 USD Input / $14 USD Output).</p> <p><strong>Costo Mensual de Hardware (AWS):</strong></p> <ul> <li><code class="language-plaintext highlighter-rouge">ml.g6.12xlarge</code>: $4.141,44 USD (Costo por segundo: $0,00158)</li> </ul> <p><strong>El Costo del Bloque de Prueba (3.000M In / 500M Out):</strong> En OpenAI, facturar este volumen costaría <strong>$12.250 USD</strong> ($5.250 de lectura + $7.000 de escritura). Veamos cuánto cuesta procesar exactamente ese mismo volumen en nuestra infraestructura:</p> <table> <tbody> <tr> <td>En <strong>ml.g6.12xlarge</strong> (Input 8.200 TPS</td> <td>Output 1.120 TPS):</td> </tr> </tbody> </table> <ul> <li>Input: $578,05 USD en tiempo de máquina</li> <li>Output: $705,35 USD en tiempo de máquina</li> <li><strong>Costo real en AWS = $1.283,40 USD</strong></li> </ul> <p>Gastar ~$1.285 dólares de tiempo de máquina frente a $12.250 dólares de API sigue demostrando un ahorro masivo superior al 89%.</p> <p><strong>Capacidad Máxima Teórica (Servidor al 100% 24/7):</strong> La instancia <code class="language-plaintext highlighter-rouge">g6.12xlarge</code>, impulsada por arquitectura Ada Lovelace, lee tokens sustancialmente más rápido, elevando el techo de procesamiento. Al saturarla durante un mes, esta es su capacidad máxima operativa:</p> <ul> <li><strong>Input Máximo:</strong> 21.549 Millones de tokens.</li> <li><strong>Output Máximo:</strong> 2.943 Millones de tokens.</li> <li><strong>Costo en AWS</strong>: ~4.141,44 USD (1 servidor mensual)</li> <li><strong>Costo Equivalente en GPT-5.2:</strong> <strong>$78.918 USD</strong> ($37.711 In + $41.207 Out).</li> <li><strong>Retorno Operativo (ROI):</strong> ~19x</li> </ul> <h3 id="3-categoría-heavyweight-122b-arquitectura-l40s-vsgpt-54">3. Categoría Heavyweight (122B): Arquitectura L40S vs GPT-5.4</h3> <p><img src="/assets/img/qwen-122b-benchmark.webp" alt=""/></p> <p>Para desplegar un modelo de clase 120B+ (<a href="https://artificialanalysis.ai/models/qwen3-5-122b-a10b-non-reasoning">qwen3.5 122B Non-reasoning</a>) cuantizado en 4-bit (AWQ), el peso del modelo ronda los 81GB de VRAM. Sumando la memoria necesaria para el KV Cache de 32 usuarios concurrentes, las máquinas anteriores colapsarían por Out Of Memory (OOM).</p> <p>La solución arquitectónica óptima es la instancia <code class="language-plaintext highlighter-rouge">ml.g6e.12xlarge</code>, que proporciona 4 GPUs NVIDIA L40S, sumando 192GB de VRAM total con un ancho de banda masivo de 864 GB/s por tarjeta. Comparamos contra tarifas de <a href="https://artificialanalysis.ai/models/gpt-5-4-non-reasoning">GPT-5.4</a> (<strong>$2,5 USD Input / $15 USD Output</strong>).</p> <p><strong>Costo Mensual de Hardware (AWS):</strong></p> <ul> <li><code class="language-plaintext highlighter-rouge">ml.g6e.12xlarge</code>: $9.500,00 USD (Costo por segundo: $0,00361)</li> </ul> <p><strong>El Costo del Bloque de Prueba (3.000M In / 500M Out):</strong> En OpenAI (GPT-5.4), este volumen exige exactamente <strong>$15.000 USD</strong> ($7.500 de lectura + $7.500 de escritura). Veamos la comparativa en nuestro servidor dedicado:</p> <ul> <li> <table> <tbody> <tr> <td><strong>En ml.g6e.12xlarge</strong> (Input 4.000 TPS</td> <td>Output 700 TPS):</td> </tr> </tbody> </table> </li> <li>Input: $2.711,99 USD en tiempo de máquina</li> <li>Output: $2.582,00 USD en tiempo de máquina</li> <li><strong>Costo real en AWS = $5.293,99 USD</strong></li> </ul> <p>Aún en la categoría más pesada de modelos comerciales, la infraestructura propia es casi un 65% más barata para este lote específico.</p> <p><strong>Capacidad Máxima Teórica (Servidor al 100% 24/7):</strong> Al saturar esta máquina 24/7, obtenemos un ROI multiplicador de 5.6x. Pagamos $9.500 por hardware dedicado para obtener casi $54K de valor en facturación de API:</p> <ul> <li><strong>Input Máximo:</strong> 10.512 Millones de tokens.</li> <li><strong>Output Máximo:</strong> 1.839 Millones de tokens.</li> <li><strong>Costo Equivalente en GPT-5.4:</strong> <strong>$53.874 USD</strong> ($26.280 In + $27.594 Out).</li> <li><strong>Retorno Operativo (ROI):</strong> ~5.6x</li> </ul> <h3 id="escalamiento-y-concurrencia">Escalamiento y Concurrencia</h3> <p>Hay que tener en cuenta que estos números asumen <strong>un solo servidor</strong> respondiéndole a 32 usuarios al mismo tiempo para mantener la latencia lo más baja posible. En la vida real, esto es mucho más flexible.</p> <p>El servidor aguanta más usuarios concurrentes si aceptamos bajar un poco los <em>Tokens Per Second</em> (TPS) por usuario, siempre y cuando no bajemos de la velocidad de lectura humana (TPOT).</p> <p>Además, al usar AWS SageMaker no dependemos de un solo nodo. Configuramos políticas de <strong>Auto-Scaling</strong> para levantar más instancias automáticamente si hay picos de tráfico, y apagarlas cuando no hay usuarios. Esto nos permite escalar bajo demanda sin inflar demasiado los costos. Sin embargo, hay que considerar que el tiempo de escalado del nodo nuevo tarda entre <strong>5 y 15 min en quedar listo</strong> (pull del container, descarga de pesos del LLM, carga en VRAM, etc.).</p> <h3 id="la-velocidad-y-la-experiencia-de-usuarioux">La Velocidad y la Experiencia de Usuario (UX)</h3> <p>Los números hablan por sí solos, pero administrar tus propios servidores también mejora la experiencia del usuario. Las APIs comerciales de OpenAI son entornos <em>multi-tenant</em>; tu tráfico compite en colas públicas y pasa por rate-limits, lo que mete picos de latencia que no puedes controlar.</p> <p>Al tener tus propios endpoints en SageMaker:</p> <ol> <li><strong>TTFT Instantáneo:</strong> Como no hay colas globales, el tiempo hasta que aparece la primera palabra baja a milisegundos. La app se siente rápida.</li> <li><strong>TPOT Constante:</strong> GPUs como la L40S escupen texto mucho más rápido de lo que un usuario puede leer.</li> <li><strong>Latencia de Red:</strong> Tener la inferencia en la misma región de AWS que tu base de datos y tu backend te quita de encima los retrasos de red de estar haciendo peticiones a internet público.</li> </ol> <p>Los modelos de OpenAI en output:</p> <ul> <li>GPT-4.1: 37 TPS</li> <li>GPT-5.2: 46 TPS</li> <li>GPT-5.4: 43 TPS</li> </ul> <p>El modelo qwen3.5 en AWS con 32 usuarios concurrentes en 2 servidores:</p> <ul> <li>9B: 70 TPS (35 x 2)</li> <li>35B: 70 TPS (35 x 2)</li> <li>122B: 43,74 TPS (21,87 x 2)</li> </ul> <p>Con 16 usuarios concurrentes:</p> <ul> <li>9B: 140 TPS (70 x 2)</li> <li>35B: 140 TPS (70 x 2)</li> <li>122B: 87,48 TPS (43,74 x 2)</li> </ul> <p>Con 8 usuarios concurrentes:</p> <ul> <li>9B: 280 TPS (140 x 2)</li> <li>35B: 280 TPS (140 x 2)</li> <li>122B: 174,96 TPS (87,48 x 2)</li> </ul> <p>Como podemos ver, la capacidad de los servidores es finita y la capacidad de TPS en output va a depender de la cantidad de solicitudes simultáneas que el servidor puede estar experimentando al instante de responder la solicitud.</p> <h2 id="maximizando-la-inversión-enhardware">Maximizando la inversión en hardware</h2> <p>Un detalle técnico que suele pasar desapercibido al rentar instancias de gran tamaño (como la <code class="language-plaintext highlighter-rouge">ml.g6e.12xlarge</code> con sus 4 GPUs y 192GB de VRAM total) es que no estás obligado a dedicar todo ese hardware a un solo modelo monolítico.</p> <p>Si tu arquitectura lo requiere, puedes consolidar cargas de trabajo para exprimir la inversión al máximo. Por ejemplo, si el modelo de 122B cuantizado ocupa unos 81GB de VRAM, te queda más de la mitad de la memoria libre. Ese espacio sobrante te permite correr modelos adicionales en la misma máquina sin pagar un dólar extra.</p> <p>Podrías tener el modelo <em>heavyweight</em> (122B) atendiendo tareas de razonamiento complejo, y corriendo al lado, en el mismo servidor, un par de modelos más pequeños y rápidos (como versiones de 9B) dedicados exclusivamente a tareas de clasificación, extracción de datos o <em>routing</em>.</p> <p>Incluso si usas técnicas como LoRA (<em>Low-Rank Adaptation</em>), motores como vLLM te permiten cargar un solo modelo base en la memoria y aplicarle múltiples adaptadores sobre la marcha para diferentes casos de uso. Básicamente, dejas de pagar por “el modelo” y pasas a ser dueño de una “capacidad de cómputo” bruta, exprimiendo cada gigabyte de memoria y multiplicando aún más el ROI frente a las APIs comerciales.</p> <h2 id="costos-reales-yred">Costos Reales y Red</h2> <p>El análisis matemático anterior se centra en el gasto principal y más pesado: el cómputo puro (precio por hora de la instancia). Sin embargo, en un despliegue de producción real, la factura final tendrá una variación marginal debido a costos periféricos propios del ecosistema de nube.</p> <p>Al levantar <em>endpoints</em> en SageMaker, debes contemplar cargos adicionales menores. Estos incluyen el almacenamiento EBS necesario para alojar los pesos del modelo y los contenedores, así como posibles cargos por <em>Data Transfer In</em> dependiendo de cómo inyectes la información al sistema.</p> <p>Pero aquí es donde el diseño de la arquitectura juega a tu favor: el temido <em>Data Transfer Out</em>, que suele ser el costo oculto más agresivo y destructivo en la nube, queda neutralizado. Si tu backend o microservicios consultan el modelo operando estrictamente dentro de la misma VPC (<em>Virtual Private Cloud</em>), la transferencia de salida de esos millones de tokens generados es gratuita.</p> <p>Todo el volumen pesado de texto transita de forma segura por la red interna de AWS. Esto asegura que los costos periféricos se mantengan en un porcentaje mínimo y no alteren el abrumador ROI que ofrece el hardware dedicado frente a las APIs públicas.</p> <h3 id="savings-plans">Savings Plans</h3> <p>Es posible economizar hasta 43% sin pagar ninguno USD por adelantado con <a href="https://aws.amazon.com/es/savingsplans/ml-pricing/">Savings Plans</a>, para esto solo debemos elegir la duración de 3 años, sin gastos iniciales, definir el monto de USD por hora que gustaría ahorrar y todo gasto adicional se cobrará con el precio bajo demanda. Por ejemplo, si sabemos que vamos a ocupar mínimamente por 3 años modelos 9B o superior, podemos definir un ahorro por hora de 1522 USD (precio de 2 instancias <code class="language-plaintext highlighter-rouge">ml.g5.xlarge</code> mensuales).</p> <p>Ejemplos de uso con 3 años:</p> <ul> <li><code class="language-plaintext highlighter-rouge">ml.g5.xlarge</code> mansual normal $1.014 USD (Costo por segundo: $0,000386), con saving plans $547,92 USD (Costo por segundo: $0,0002084)</li> <li><code class="language-plaintext highlighter-rouge">ml.g6.12xlarge</code> mansual normal $4.141,44 USD (Costo por segundo: $0,00158), con saving plans $23767,15 USD (Costo por segundo: $0,009043)</li> <li><code class="language-plaintext highlighter-rouge">ml.g6e.12xlarge</code> mansual normal $9.500,00 USD (Costo por segundo: $0,00361), con saving plans $4895,44 USD (Costo por segundo: $0,00186)</li> </ul> <h3 id="resiliencia">Resiliencia</h3> <p>Minimamente para un ambiente productivo real, debemos mantener dos instancias en dos AZs (zonas de disponibilidad) para mantener la alta disponibilidad del servicio. Esto representa un costo doble de servidor, pero garantiza el doble de TPS, lo que garantiza el ROI descrito anteriormente, una vez que tendremos más capacidad de interpretación y generación de tokens.</p> <h2 id="opción-serveless-con-amazonbedrock">Opción Serveless con Amazon Bedrock</h2> <p>Amazon Bedrock proporciona acceso a modelos open-weight de código abierto a través de una API unificada, de forma completamente gestionada y serverless, sin necesidad de gestionar infraestructura.</p> <p><a href="https://aws.amazon.com/es/blogs/aws/qwen-models-are-now-available-in-amazon-bedrock/?refid=769a1a2b-8c19-4976-9c45-b6b1226c7d20">La familia Qwen ya está disponible</a> en esta plataforma: los cuatro modelos Qwen3 disponibles incluyen Qwen3-Coder-480B-A35B-Instruct, Qwen3-Coder-30B-A3B-Instruct, Qwen3–235B-A22B-Instruct-2507 y Qwen3–32B Dense, con arquitecturas tanto de Mixture-of-Experts (MoE) como densa.</p> <p>La propuesta de Bedrock es simple: pagas exclusivamente por los tokens que consumes, sin comprometerte con un servidor dedicado. Amazon Bedrock utiliza un modelo de precios basado en tokens, pagando por millón de tokens procesados, donde los tokens de entrada siempre son más baratos que los de salida, típicamente entre 3 y 5 veces más baratos. A modo de referencia, el modelo Qwen3-Coder-480B en Bedrock tiene un precio de $1,50 por millón de tokens de entrada y $7,50 por millón de tokens de salida.</p> <p>Que significa esto, si no quieres pagar por servidores fijos o por hora, aún así podría ocupar modelos <a href="https://aws.amazon.com/es/blogs/aws/amazon-bedrock-adds-fully-managed-open-weight-models/">open-weight con Amazon Bedrock</a> con precios mucho más bajos que proveedores tradicionales como OpenAi.</p> <h3 id="comparación">Comparación</h3> <ul> <li><strong>Input:</strong> 21.549 Millones de tokens.</li> <li><strong>Output:</strong> 2.943 Millones de tokens.</li> <li><strong>Qwen3 235B A22B 2507 con Amazon Bedrock: $7.331,069 USD</strong> ($4.740,912 In + $2.590,157 Out)</li> <li><strong>qwen3.5 35B en</strong> <strong>SageMaker</strong>: ~8.282,88 USD (2 servidores mensuales)</li> <li><strong>qwen3.5 9B en</strong> <strong>SageMaker</strong>: ~2.028,1 USD (2 servidores mensuales)</li> <li><strong>Costo Equivalente en GPT-5.2:</strong> $78.918 USD ($37.711 In + $41.207 Out).</li> </ul> <p>Como podemos ver <strong>Qwen3 235B A22B 2507 con Amazon Bedrock</strong> puede ser más barato que incluso <strong>Qwen3.5 35B en SageMaker</strong>, sin embargo el modelo es inferior en inteligencia y velocidad. Como podemos ver en <a href="https://artificialanalysis.ai/models/qwen3-5-35b-a3b-non-reasoning?models=qwen3-5-9b-non-reasoning%2Cqwen3-5-35b-a3b-non-reasoning%2Cqwen3-235b-a22b-instruct-2507">esta comparativa</a>, hasta mismo el modelo de <strong>9B de Qwen3.5 en SageMaker</strong> es más inteligente, rápido y barato que <strong>Bedrock</strong>. Esto demuestra que las generaciones de modelos pesan más que el tamaño de los parámetros al determinar la inteligencia y la capacidad de los modelos en la ejecución de las tareas.</p> <h3 id="cuándo-tiene-sentidobedrock">Cuándo Tiene Sentido Bedrock</h3> <p><strong>Bedrock</strong> no compite directamente con un despliegue propio en <strong>SageMaker</strong>; en realidad, encaja en una etapa muy específica del ciclo de vida del producto.</p> <p>Si durante tus pruebas alguno modelo de <strong>Amazon Bedrock</strong> te atende perfectamente en inteligencia y tiempos de respuestas, acredito que sería una mejor opción que servidores dedicados de <strong>SageMaker</strong>, principalmente porque <strong>Bedrock</strong> es Ideal para:</p> <ul> <li><strong>Fases de validación extendida.</strong> Cuando ya superaste el prototipo pero aún no tienes certeza sobre el volumen de producción. Pagas solo por lo que usas, sin comprometerte con un servidor que puede quedar ocioso.</li> <li><strong>Tráfico muy irregular o bajo.</strong> Si tu aplicación tiene picos esporádicos separados por horas de inactividad, pagar por un servidor dedicado 24/7 destruye el ROI. Bedrock factura al milisegundo de uso real.</li> <li><strong>Equipos pequeños sin DevOps dedicado.</strong> Bedrock elimina la complejidad de la gestión de infraestructura con acceso serverless y pago por consumo. No hay contenedores que mantener, no hay actualizaciones de drivers de CUDA, no hay alertas de errores a las 3 AM.</li> <li><strong>Múltiples modelos en experimentación.</strong> Con Bedrock no solo puedes usar modelos propietarios de Amazon, sino también modelos open-source como Qwen, Llama o Mistral cambiando únicamente el campo del modelo en tu código, sin despliegues de endpoints adicionales.</li> </ul> <h2 id="conclusión">Conclusión</h2> <p>A nivel de arquitectura, el ciclo de vida de un producto con IA es bastante predecible. La elección entre OpenAI, Amazon Bedrock y SageMaker es una progresión natural dictada por el volumen y la madurez de tu producto. Proveedores como OpenAI es el punto de entrada ideal: sin fricción, sin infraestructura, perfecto para validar la idea. Bedrock ocupa el escalón intermedio: te mantiene en el ecosistema AWS con modelos open-weight como Qwen, elimina el riesgo del costo fijo y te da flexibilidad para crecer sin compromisos, aunque sigues pagando por token y compartiendo infraestructura con otros clientes. SageMaker es la etapa final: cuando el volumen es predecible y constante, el costo fijo se convierte en tu mayor ventaja competitiva, dándote control absoluto sobre la latencia, el hardware y los márgenes. La señal para migrar de una etapa a la siguiente es siempre la misma: cuando el modelo de cobro actual empieza a castigar tu crecimiento, es momento de subir un nivel.</p> <p>Sin embargo, si a tu aplicación le va bien, depender de un proveedor externo trae dos problemas críticos. Primero, el modelo de pago por token castiga tu crecimiento: a más usuarios, menores márgenes. Segundo, delegas por completo la experiencia de tus usuarios a una cola pública; si la API de terceros se satura, tu aplicación se vuelve lenta e inestable, y no puedes hacer nada al respecto.</p> <p>Desplegar modelos <em>open-weight</em> robustos (como Qwen 3.5) en AWS soluciona ambas partes de la ecuación. En lo financiero, pasas de un gasto variable a un costo mensual fijo y predecible, logrando ahorros de hasta un 98%. En lo técnico, al ser dueño del hardware eliminas los picos de latencia, reduces el tiempo de respuesta a milisegundos y garantizas una interacción fluida en todo momento.</p> <p>En resumen: cuando llegas a la etapa de producción seria, levantar tu propia infraestructura deja de ser un simple experimento para ahorrar dinero. Se convierte en la única forma de garantizar que tu negocio sea rentable y que tus usuarios tengan un producto rápido, privado y confiable sin importar cuánto escales.</p> <p><em>Lee también mi post reciente sobre este tema:</em> <a href="https://aboneto.medium.com/reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights-20bce7b296de" title="null"><em>Reduciendo hasta un 90% los costos de LLMs con modelos open-weights</em></a></p>]]></content><author><name>Antonio Barbosa</name></author><category term="LLM"/><category term="Open Weight Model"/><category term="Aws Sagemaker"/><category term="Software Architecture"/><category term="Cloud Computing"/><category term="qwen"/><category term="aws"/><category term="sagemaker"/><category term="openai"/><category term="costos"/><category term="llm"/><category term="bedrock"/><summary type="html"><![CDATA[Análisis técnico: AWS SageMaker vs OpenAi. Descubre por qué alojar modelos open-weights es vital para rentabilidad y latencia.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/qwen-aws-vs-openai.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/qwen-aws-vs-openai.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Reduciendo hasta un 90% los costos de LLMs con modelos Open-Weights</title><link href="https://aboneto.dev/reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights" rel="alternate" type="text/html" title="Reduciendo hasta un 90% los costos de LLMs con modelos Open-Weights"/><published>2026-04-13T00:00:00+00:00</published><updated>2026-04-13T00:00:00+00:00</updated><id>https://aboneto.dev/reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights</id><content type="html" xml:base="https://aboneto.dev/reduciendo-hasta-un-90-los-costos-de-llms-con-modelos-open-weights"><![CDATA[<p><img src="/assets/img/open-weights-costs.webp" alt="Open Weights en Sandbox"/></p> <p>Últimamente se habla mucho de los LLM “gratuitos”, muy promocionados por <strong><em>influencers</em></strong> de tecnología. Pero, ¿son realmente gratuitos? Hay que leer la letra chica de las políticas de uso, que suelen ser confusas. La gran mayoría de estos modelos utilizan tus datos para retroalimentar su entrenamiento, lo que descarta su uso en entornos empresariales, de alta seguridad o productivos. Para modelos gratuitos realmente con posibilidad de uso en producción y total seguridad, recomiendo los modelos <strong><em>open-weights</em></strong> con licencia <strong>Apache</strong> y <strong><em>self-hosting</em></strong>.</p> <p>Tras semanas de <em>benchmarking</em> con <a href="https://opensource.org/ai/open-weights">modelos <em>open-weights</em></a> para tareas críticas (como RAG y <em>Tool Calling</em>), los resultados hablan por sí solos: modelos como <a href="https://ollama.com/library/qwen3.5">Qwen 3.5</a> (<a href="https://www.alibabagroup.com/en-US/about-alibaba#culture-and-values">Alibaba</a>) o <a href="https://ollama.com/library/gemma4">Gemma 4</a> (<a href="https://deepmind.google/models/gemma/gemma-4/">Google</a>) ya tienen la capacidad de desplazar a <a href="https://developers.openai.com/api/docs/models/gpt-4.1">GPT-4</a> o hasta <a href="https://developers.openai.com/api/docs/models/gpt-5.2">GTP-5.2</a> en flujos productivos masivos, bajando los costos operativos hasta en un 90%.</p> <p>Probé a fondo escenarios de <a href="https://aws.amazon.com/es/what-is/retrieval-augmented-generation/">RAG</a>, <a href="https://www.ibm.com/think/topics/tool-calling"><em>tool calling</em></a>, generación de código, entre otros. Corriendo en local, <a href="https://ollama.com/library/qwen3.5"><strong>Qwen3.5 9B</strong></a> (sin razonamiento avanzado) superó todas las pruebas sin problemas. Y un detalle importante: ni siquiera es la versión más potente de la familia <a href="https://ollama.com/library/qwen3.5">Qwen 3.5</a>; por encima están los modelos de 27B, 35B, 122B y 397B para Cloud.</p> <p>La evolución de los <em>open-weights</em> en los últimos meses fue brutal. Gracias al trabajo de <a href="https://www.alibabagroup.com/en-US/about-alibaba#culture-and-values">Alibaba</a>, <a href="https://www.llama.com/models/llama-3/">Meta</a> y <a href="https://deepmind.google/models/gemma/gemma-4/">Google</a>, la comunidad de desarrolladores logró crear versiones cuantizadas que corren en dispositivos con poca memoria. Esto está sacando la innovación del monopolio de las grandes <em>big tech</em>.</p> <h2 id="casos-de-usoideales">Casos de Uso Ideales</h2> <p>Uno de los usos más rentables para estos modelos locales está en la automatización en <em>background</em>:</p> <ul> <li><strong>Pipelines de CI/CD:</strong> Análisis de código y automatización de despliegues.</li> <li><a href="https://buk.engineering/2026/02/09/evaluaciones-de-prompts-con-llm-as-a-judge-el-marco-cc-cd-en-buk.html"><strong>Entrenamiento de prompts con CC/CD</strong></a><strong>:</strong> Pruebas automatizadas de comportamiento de la IA.</li> <li><strong>Evaluación con LLM-as-a-judge:</strong> Usar un modelo local para validar la calidad de las respuestas de otros modelos.</li> <li><strong>Procesamiento de datos en procesos batch:</strong> Tareas de largo aliento donde la velocidad no es el problema, pero el volumen de tokens es altísimo.</li> <li><strong>Optimización y limpieza de datos masivos:</strong> Estructurar toneladas de texto suelto.</li> </ul> <p>Hasta hace poco, era impensado procesar todo esto de forma masiva por lo caras que son las APIs comerciales. Hoy, un modelo local cubre perfectamente lo básico: RAG, uso de <em>tools</em> y orquestación de agentes.</p> <h2 id="características-principales-de-los-modelos-open-weights">Características principales de los modelos Open-Weights</h2> <ul> <li><strong>Portabilidad:</strong> El archivo del modelo se puede descargar y ejecutar en servidores privados, nubes propias o incluso hardware local si se cuenta con la potencia necesaria.</li> <li><strong>Ajuste Fino (Fine-tuning):</strong> Al tener acceso a los pesos, los desarrolladores pueden realizar entrenamientos adicionales con datos específicos para especializar el modelo en una tarea o dominio particular.</li> <li><strong>Privacidad y Control:</strong> Como el modelo no reside en los servidores de un tercero, los datos procesados no salen de la infraestructura del usuario, lo que es crítico para empresas con normativas de seguridad estrictas.</li> <li><strong>Transparencia Limitada:</strong> Aunque se pueden ver los pesos, a menudo no se conoce con exactitud qué datos se utilizaron para entrenarlo o los algoritmos específicos de filtrado, por lo que no siempre cumplen con la definición estricta de “Open Source” de la Open Source Initiative (OSI).</li> </ul> <h3 id="cómo-ejecutar-los-modelos-localmente">Cómo ejecutar los modelos localmente</h3> <p>Levantar estos modelos vía API en local es muy fácil usando <a href="https://docs.ollama.com/"><strong>Ollama</strong></a> (o el motor de inferencia que prefieras).</p> <p>Para instalar Ollama en Mac o Linux, simplemente tira esto en la terminal:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://ollama.com/install.sh | sh
</code></pre></div></div> <p>Inicia el servidor:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama serve
</code></pre></div></div> <p>Y baja el modelo:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama pull &lt;nombre_del_modelo&gt;
</code></pre></div></div> <p>Puedes controlar cómo se comporta el modelo desde la API, pero a veces necesitas dejar parámetros fijos. Esto es clave si lo vas a enchufar a herramientas como <a href="https://opencode.ai/docs/es/">OpenCode</a>, Copilot o Claude Code, ya que estos asistentes requieren que el modelo esté configurado desde el principio; no es posible personalizar sus parámetros (como la ventana de contexto o la temperatura) directamente desde las configuraciones de su chat o editor. Para armar una versión personalizada lista para usar:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Ejecutar el modelo</span>
ollama run &lt;nombre_del_modelo&gt;

<span class="c"># Definir la ventana de contexto</span>
/set parameter num_ctx 65536
<span class="c"># Definir la temperatura inicial</span>
/set parameter temperature 0.3
<span class="c"># Guardar el modelo con un nombre personalizado</span>
/save qwen3.5:9b-64k  
<span class="c"># Salir del modelo  </span>
/bye
</code></pre></div></div> <p><a href="https://docs.ollama.com/modelfile#valid-parameters-and-values">Lista de parámetros</a> disponibles en ollama.</p> <h2 id="algunas-pruebas-realizadas">Algunas pruebas realizadas</h2> <h3 id="1-detección-e-invocación-de-tools-toolcalling">1. Detección e Invocación de Tools (Tool Calling)</h3> <p>Armé un ejemplo usando una tool ficticia (<code class="language-plaintext highlighter-rouge">consultar_bd_libreria</code>) para ver qué tan bien el modelo entendía la intención del usuario y le pasaba los parámetros correctos al tool.</p> <blockquote> <p><strong><em>Veredicto rápido:</em></strong> <em>Qwen 3.5 9B resolvió todo a la primera. La versión más chica (4B) sirvió para consultas simples, pero empezó a alucinar con requerimientos complejos cuando el</em> system prompt <em>no era lo suficientemente estricto.</em></p> </blockquote> <p>Consulta sobre “libros de amor de Gabriel García Márquez” con el modelo <strong>qwen3.5:9b</strong> con ventana de 64.000 tokens:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl  <span class="nt">-X</span> POST <span class="se">\</span>
  <span class="s1">'http://localhost:11434/api/chat'</span> <span class="se">\</span>
  <span class="nt">--header</span> <span class="s1">'Accept: application/json'</span> <span class="se">\</span>
  <span class="nt">--header</span> <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
  <span class="nt">--data-raw</span> <span class="s1">'{  
  "model": "qwen3.5:9b-64k",  
  "messages": [  
    {  
      "role": "system",  
      "content": "Eres un asistente virtual de una librería encargado de facilitar información sobre el catálogo de libros y autores disponibles."  
    },  
    {  
      "role": "user",  
      "content": "¡Hola! Muy buenos días. Oye, ¿de casualidad tendrías algun libro de Gabriel García Marquéz que sea de amor?"  
    }  
  ],  
  "tools": [  
    {  
      "type": "function",  
      "function": {  
        "name": "consultar_bd_libreria",  
        "description": "Busca información en la base de datos de la librería sobre autores y libros.",  
        "parameters": {  
          "type": "object",  
          "properties": {  
            "query": {  
              "type": "string",  
              "description": "La consulta del usuario optimizada: sin saludos, corregida gramaticalmente y enfocada exclusivamente en los criterios de búsqueda (ej: '</span><span class="se">\'</span><span class="s1">'libros de amor de Gabriel García Márquez'</span><span class="se">\'</span><span class="s1">')."
            }  
          },  
          "required": ["query"]
        }  
      }  
    }  
  ],  
  "think": false,  
  "stream": false  
}'</span>
</code></pre></div></div> <p><em>Respuesta (Qwen 3.5 9B):</em></p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:9b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T05:04:18.274354Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"tool_calls"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">  
      </span><span class="p">{</span><span class="w">  
        </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"call_y9mljhip"</span><span class="p">,</span><span class="w">  
        </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
          </span><span class="nl">"index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">  
          </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"consultar_bd_libreria"</span><span class="p">,</span><span class="w">  
          </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
            </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="s2">"libros de amor de Gabriel García Márquez"</span><span class="w">  
          </span><span class="p">}</span><span class="w">  
        </span><span class="p">}</span><span class="w">  
      </span><span class="p">}</span><span class="w">  
    </span><span class="p">]</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">7161121041</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">186818208</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">382</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">4331394542</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">38</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">2460080082</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p>Consulta compleja con el modelo <strong>qwen3.5:9b</strong> con ventana de 64.000 tokens:</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl  <span class="nt">-X</span> POST <span class="se">\</span>
  <span class="s1">'http://localhost:11434/api/chat'</span> <span class="se">\</span>
  <span class="nt">--header</span> <span class="s1">'Accept: application/json'</span> <span class="se">\</span>
  <span class="nt">--header</span> <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
  <span class="nt">--data-raw</span> <span class="s1">'{  
  "model": "qwen3.5:9b-64k",  
  "messages": [  
    {  
      "role": "system",  
      "content": "Eres un asistente virtual de una librería encargado de facilitar información sobre el catálogo de libros y autores disponibles."  
    },  
    {  
      "role": "user",  
      "content": "¡Buenas! ¿Cómo va todo? Mira, estoy buscando algo de Isabel Allende o tal vez de Gabriel García Márquez, pero que sea de realismo mágico y que no me cueste más de 25 dólares, ¿ya? Ah, y solo si lo tienen ahí en la tienda para pasar a buscarlo hoy mismo, que es para un regalo."  
    }  
  ],  
  "tools": [  
    {  
      "type": "function",  
      "function": {  
        "name": "consultar_bd_libreria",  
        "description": "Busca información en la base de datos de la librería sobre autores y libros.",  
        "parameters": {  
          "type": "object",  
          "properties": {  
            "query": {  
              "type": "string",  
              "description": "La consulta del usuario optimizada: sin saludos, corregida gramaticalmente y enfocada exclusivamente en los criterios de búsqueda (ej: '</span><span class="se">\'</span><span class="s1">'libros de amor de Gabriel García Márquez'</span><span class="se">\'</span><span class="s1">')."  
            }  
          },  
          "required": ["query"]  
        }  
      }  
    }  
  ],  
  "think": false,  
  "stream": false  
}'</span>
</code></pre></div></div> <p><em>Respuesta (Qwen 3.5 9B):</em></p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:9b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T04:59:53.121743Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"tool_calls"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">  
      </span><span class="p">{</span><span class="w">  
        </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"call_fqw4hdq7"</span><span class="p">,</span><span class="w">  
        </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
          </span><span class="nl">"index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">  
          </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"consultar_bd_libreria"</span><span class="p">,</span><span class="w">  
          </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
            </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="s2">"libros de realismo mágico de Isabel Allende o Gabriel García Márquez con precio menor a 25 dólares disponibles en tienda"</span><span class="w">  
          </span><span class="p">}</span><span class="w">  
        </span><span class="p">}</span><span class="w">  
      </span><span class="p">}</span><span class="w">  
    </span><span class="p">]</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">15120528125</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">8777821167</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">431</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">2368185708</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">57</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">3715160875</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p>Podemos ver que con un modelo menor como <strong>qwen3.5:4b</strong>, una instrucción simple no hay problemas:</p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:4b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T05:37:48.126052Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"tool_calls"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">  
      </span><span class="p">{</span><span class="w">  
        </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"call_emre4xhh"</span><span class="p">,</span><span class="w">  
        </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
          </span><span class="nl">"index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">  
          </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"consultar_bd_libreria"</span><span class="p">,</span><span class="w">  
          </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
            </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="s2">"libros de amor de Gabriel García Márquez"</span><span class="w">  
          </span><span class="p">}</span><span class="w">  
        </span><span class="p">}</span><span class="w">  
      </span><span class="p">}</span><span class="w">  
    </span><span class="p">]</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">8853187542</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">5582010334</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">382</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">1257315083</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">38</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">1791458750</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p>Pero para una consulta compleja, el modelo <strong>qwen3.5:4b</strong> ya no logra ser eficiente, alucinando fácilmente sin un system prompt más robusto. Ante el mismo texto complejo, el de 4B se mareó, ignoró la herramienta y empezó a chatear:</p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:4b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T05:38:48.359164Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"¡Hola! Todo muy bien por aquí, gracias por preguntar. Me alegra que estés buscando un regalo; el realismo mágico es un género fascinante.</span><span class="se">\n\n</span><span class="s2">Para poder ayudarte a encontrar exactamente qué tienen en stock hoy en la tienda y que cumpla con tu presupuesto de 25 dólares, necesito que me des una pequeña ayuda con la búsqueda.</span><span class="se">\n\n</span><span class="s2">Por favor, dime: **¿Prefieres que busque primero por los libros de Isabel Allende o por los de Gabriel García Márquez?** (O si tienes algún título específico en mente, también me lo puedes decir)."</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">11457394291</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">4015661708</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">431</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">1329063875</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">121</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">5790543085</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <h3 id="2-extracción-rag-con-razonamiento-matemáticas-ytono">2. Extracción RAG con Razonamiento, Matemáticas y Tono</h3> <p>Le pasé un texto con las reglas de “EcoMóvil”, una empresa ficticia de scooters. Le pedí que calculara el costo de un viaje, resolviera una avería y pregunté por un dato que derechamente no existía en el documento. Todo esto con una regla de sistema estricta: tono amable, cero emojis.</p> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl  <span class="nt">-X</span> POST <span class="se">\</span>
  <span class="s1">'http://localhost:11434/api/chat'</span> <span class="se">\</span>
  <span class="nt">--header</span> <span class="s1">'Accept: application/json'</span> <span class="se">\</span>
  <span class="nt">--header</span> <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
  <span class="nt">--data-raw</span> <span class="s1">'{  
  "model": "qwen3.5:9b-64k",  
  "messages": [  
    {  
      "role": "system",  
      "content": "Eres '</span><span class="se">\'</span><span class="s1">'EcoBot'</span><span class="se">\'</span><span class="s1">', el asistente virtual de atención al cliente de '</span><span class="se">\'</span><span class="s1">'EcoMóvil'</span><span class="se">\'</span><span class="s1">', una empresa de alquiler de scooters eléctricos. Tu tono debe ser amable, entusiasta, ecológico y muy profesional. INSTRUCCIÓN ESTRICTA: Tienes absolutamente prohibido utilizar emojis, emoticonos o caracteres gráficos similares en tus respuestas. Mantén un formato de texto limpio. Tu tarea es responder las dudas de los usuarios basándote EXCLUSIVAMENTE en el contexto proporcionado. Si la respuesta no se encuentra en el texto, discúlpate amablemente y explica que no tienes esa información a mano, sin inventar datos.\n\n&lt;contexto_recuperado&gt;\n[ARTICULO_SOPORTE: TARIFAS_Y_USO_2026]\n- Tarifas: Desbloquear un scooter cuesta $1.00 USD. El costo por minuto de uso es de $0.25 USD.\n- Horarios: El servicio opera todos los días desde las 06:00 AM hasta las 11:00 PM. Los scooters se bloquean automáticamente y no pueden iniciarse fuera de este horario.\n- Zonas permitidas: Los scooters solo pueden circular y ser estacionados dentro del '</span><span class="se">\'</span><span class="s1">'Área Metropolitana Centro'</span><span class="se">\'</span><span class="s1">' y el '</span><span class="se">\'</span><span class="s1">'Campus Universitario'</span><span class="se">\'</span><span class="s1">'. Estacionar fuera de estas zonas conlleva una multa automática de $25.00 USD en la tarjeta asociada.\n- Averías: Si un scooter presenta fallas mecánicas durante el viaje, el usuario debe finalizar el viaje inmediatamente en la app para detener el cobro y presionar el botón '</span><span class="se">\'</span><span class="s1">'Reportar Problema'</span><span class="se">\'</span><span class="s1">' para notificar al equipo técnico.\n&lt;/contexto_recuperado&gt;"  
    },  
    {  
      "role": "user",  
      "content": "¡Hola! Quería saber cuánto me costaría exactamente un viaje de 20 minutos. También, ¿qué pasa si al scooter se le pincha una rueda a mitad de camino? Ah, y ¿tienen planeado expandir el servicio a la zona norte de la ciudad el próximo mes?"  
    }  
  ],  
  "think": false,  
  "stream": false  
}'</span>
</code></pre></div></div> <p><strong>Qwen 3.5 9B:</strong> Respuesta precisa y natural. Respetó la regla de no usar emojis, admitió no saber la respuesta sobre el dato inventado y el cálculo matemático ($1.00 de desbloqueo + (20 min * $0.25) = $6.00) fue exacto.</p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:9b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T06:06:54.100627Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"¡Hola! Es un gusto saludarte. En EcoMóvil nos encanta que quieras conocer más sobre nuestros servicios.</span><span class="se">\n\n</span><span class="s2">Para calcular el costo de un viaje de 20 minutos, primero debes considerar que el desbloqueo del scooter cuesta $1.00 USD. Luego, el costo por minuto de uso es de $0.25 USD. Por lo tanto, el viaje de 20 minutos tendría un costo de uso de $5.00 USD (20 minutos multiplicados por $0.25). Sumando el costo de desbloqueo, el total a pagar sería de $6.00 USD.</span><span class="se">\n\n</span><span class="s2">En cuanto a la situación de una rueda pinchada, si el scooter presenta fallas mecánicas durante el viaje, es fundamental que finalices el viaje inmediatamente en la aplicación para detener el cobro. Posteriormente, debes presionar el botón 'Reportar Problema' dentro de la app para notificar al equipo técnico y que puedan asistirte.</span><span class="se">\n\n</span><span class="s2">Por último, respecto a la expansión del servicio a la zona norte de la ciudad, lamentablemente no tengo esa información a mano en este momento. Te recomiendo consultar nuestras redes sociales o la sección de noticias en nuestra aplicación para estar al tanto de los planes de expansión futuros.</span><span class="se">\n\n</span><span class="s2">¿Hay algo más en lo que pueda ayudarte hoy?"</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">28816119625</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">8543402584</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">442</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">2152467708</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">272</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">17493256088</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p><strong>Qwen 3.5 4B:</strong> Mantuvo bien el tono de atención al cliente, pero metió la pata en la lógica matemática en varios de los ejercicios que le tiré después.</p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:4b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T05:48:37.869663Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"¡Hola! Es un placer saludarte. Como asistente de EcoMóvil, estoy aquí para ayudarte a planificar tu viaje de manera eficiente y responsable.</span><span class="se">\n\n</span><span class="s2">Para calcular el costo de tu viaje de 20 minutos, debemos considerar el costo base por desbloqueo y la tarifa por minuto. El costo inicial para desbloquear un scooter es de 1.00 USD. Además, la tarifa de uso es de 0.25 USD por minuto. Al multiplicar 20 minutos por 0.25 USD, obtenemos un costo de 5.00 USD por el tiempo de uso. Sumando el costo de desbloqueo, el precio total para un viaje de 20 minutos sería de 6.00 USD.</span><span class="se">\n\n</span><span class="s2">En cuanto a tu pregunta sobre averías, si un scooter presenta fallas mecánicas durante el viaje, es fundamental que finalices el viaje inmediatamente a través de la aplicación para detener cualquier cobro adicional. Posteriormente, debes presionar el botón 'Reportar Problema' en la app para notificar al equipo técnico, quien se encargará de gestionar la reparación.</span><span class="se">\n\n</span><span class="s2">Respecto a la expansión del servicio a la zona norte de la ciudad, lamentablemente no tengo esa información disponible en mis registros actuales. Mi base de datos se limita a las tarifas, horarios y zonas permitidas actuales, que son el Área Metropolitana Centro y el Campus Universitario. Estacionar fuera de estas zonas conlleva una multa automática de 25.00 USD, por lo que te recomiendo verificar las rutas oficiales para evitar multas.</span><span class="se">\n\n</span><span class="s2">Quedo atento si necesitas más información sobre nuestros servicios o tienes alguna otra duda. ¡Espero que tengas un viaje seguro y ecológico!"</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">25273808667</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">5406114208</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">442</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">1319714917</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">359</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">17672467651</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p><strong>Qwen 3.5 2B:</strong> Gramaticalmente bien, pero se equivocó en cálculos básicos y ofreció respuestas demasiado escuetas que cortaban la conversación de golpe.</p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:2b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T05:58:35.337881Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"¡Hola! Claro que sí, estoy aquí para ayudarte a planificar tu viaje con EcoMóvil.</span><span class="se">\n\n</span><span class="s2">Un viaje de 20 minutos costará exactamente $5.00 USD, calculado como $0.25 USD por minuto multiplicado por 20 minutos.</span><span class="se">\n\n</span><span class="s2">Si al scooter se le pincha una rueda a mitad de camino, te recomendamos finalizar el viaje inmediatamente en la aplicación para detener el cobro y presionar el botón </span><span class="se">\"</span><span class="s2">Reportar Problema</span><span class="se">\"</span><span class="s2"> para notificar al equipo técnico.</span><span class="se">\n\n</span><span class="s2">En cuanto a la expansión de zonas, actualmente el servicio opera dentro del Área Metropolitana Centro y el Campus Universitario. No tengo información disponible sobre planes específicos para expandir el servicio a la zona norte de la ciudad en el próximo mes, pero te recomiendo consultar directamente con nuestro equipo de soporte o revisar nuestra página web para obtener la información más actualizada.</span><span class="se">\n\n</span><span class="s2">Espero que esta información te sea útil para tu próxima aventura en EcoMóvil. ¡Que tengas un buen día!"</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">11193157167</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">4680604292</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">442</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">535022292</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">205</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">5662032366</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p>Cuando cambiamos el system prompt para una lógica de calculo un poco más compleja, pero simples, solamente el modelo de <strong>qwen3.5:9b</strong> logra pasar con precisión.</p> <p><strong>qwen3.5:9b:</strong></p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:9b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T06:27:43.570695Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hola. Para calcular el costo total de su viaje de 10 minutos en el Área Centro, aplicaremos los siguientes conceptos:</span><span class="se">\n\n</span><span class="s2">1.  **Costo de desbloqueo:** Dado que la duración del viaje es de 10 minutos (menos de 15 minutos), se aplica una tarifa de desbloqueo de $2.00 USD.</span><span class="se">\n</span><span class="s2">2.  **Tarifa por minuto:** Se cobra $0.25 USD por minuto. Para 10 minutos, el costo es de $2.50 USD.</span><span class="se">\n</span><span class="s2">3.  **Multa por zona:** El viaje se realiza dentro del Área Centro, por lo que no se aplica ninguna multa.</span><span class="se">\n\n</span><span class="s2">**Cálculo final:**</span><span class="se">\n</span><span class="s2">$2.00 (desbloqueo) + $2.50 (tarifa por minuto) = $4.50 USD.</span><span class="se">\n\n</span><span class="s2">El costo total de su viaje será de **$4.50 USD**."</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">22793113666</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">8255305416</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">186</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">1053119459</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">197</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">12840003246</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p><strong>qwen3.5:4b:</strong></p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:4b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T06:26:00.84569Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hola. Para calcular el costo total de su viaje de 10 minutos dentro de la Zona Centro, primero debemos determinar el costo del desbloqueo.</span><span class="se">\n\n</span><span class="s2">Dado que su viaje dura 10 minutos, que es menos de 15 minutos, el desbloqueo no es gratuito y se calcula según la tarifa de $0.25 USD por minuto. El costo del desbloqueo es de $2.50 USD (10 minutos x $0.25).</span><span class="se">\n\n</span><span class="s2">Asumiendo que no hay otros cargos adicionales como multas por salir de la zona, el costo total del viaje es de $2.50 USD."</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">9396311125</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">480919291</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">186</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">779439167</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">135</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">6620469968</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <p><strong>qwen3.5:2b:</strong></p> <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">  
  </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"qwen3.5:2b-64k"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T06:22:52.715915Z"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">  
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">  
    </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Hola. Para realizar un viaje de 10 minutos dentro del Centro, la tarifa de desbloqueo es de $2.00 USD."</span><span class="w">  
  </span><span class="p">},</span><span class="w">  
  </span><span class="nl">"done"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"done_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"total_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">5984044125</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"load_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">4802225125</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">186</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"prompt_eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">290848333</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">31</span><span class="p">,</span><span class="w">  
  </span><span class="nl">"eval_duration"</span><span class="p">:</span><span class="w"> </span><span class="mi">796598664</span><span class="w">  
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div> <h3 id="3-como-asistente-de-desarrollo">3. Como asistente de desarrollo</h3> <p>Lo conecté a OpenCode, Copilot y Claude Code. La versión de 9B funciona bien para autocompletar y refactorizar en local. Si vas a armar arquitecturas complejas, vas a necesitar los modelos más grandes, y ahí sí o sí necesitas un servidor Cloud o un equipo local bastante robusto (como una Mac Mini con 32GB o 64GB de RAM).</p> <h2 id="benchmarks-qwen35"><strong>Benchmarks qwen3.5</strong></h2> <p>En el <a href="https://qwen.ai/blog?id=qwen3.5">benchmark oficial</a> podemos ver todo su poder comparado a otros modelos:</p> <p><img src="/assets/img/qwen35-benchmarks-overview.webp" alt=""/></p> <p>Si miramos los números oficiales contra modelos comerciales, la diferencia de rendimiento vs precio es abismal:</p> <p>El verdadero salto de Qwen 3.5 está en su uso como agente autónomo. En el benchmark <em>BrowseComp</em> (búsqueda y navegación web automatizada), llega a <strong>78.6</strong> puntos. Supera por bastante a Gemini 3 Pro (59.2) y pisa los talones de Claude 4.5 Opus (84.0).</p> <p>Al orquestar APIs o procesar datos externos, Qwen 3.5 le compite cara a cara a modelos de pago mucho más caros. Es la prueba de que hoy una empresa puede dejar de depender exclusivamente de proveedores externos para su <em>core</em> de IA.</p> <p><img src="/assets/img/qwen35-benchmarks-agent.webp" alt=""/></p> <h2 id="cuándo-vale-la-pena-ir-por-modelos-open-weights">¿Cuándo vale la pena ir por modelos Open-Weights?</h2> <ul> <li><strong>Uso masivo de tokens:</strong> Si tu producto quema millones de tokens al mes, la factura de las APIs va a doler. Hay que hacer bien la matemática (servidores vs API), pero alojar un modelo como <code class="language-plaintext highlighter-rouge">qwen3.5</code> puede bajar la cuenta mensual en más del 90%.</li> <li><strong>Reglas estrictas de privacidad:</strong> Si trabajas con datos médicos, PII o financieros, tu VPC es tu refugio. Ejecutar todo en local te garantiza que los datos nunca tocan un servidor de terceros.</li> <li><strong>Personalización a medida:</strong> Cuando necesitas hacer <em>fine-tuning</em> para que el modelo hable el lenguaje técnico de tu industria sin tener que entrenar un modelo fundacional desde cero.</li> </ul> <h2 id="conclusión">Conclusión</h2> <p>La realidad es que para el 80% de las operaciones con LLMs en producción (clasificar textos, RAG, <em>tool calling</em>), no hace falta pagar por el modelo más inteligente del mercado.</p> <p>Puedes delegar gran parte de la carga de trabajo a modelos <em>open-weights</em> alojados por ti, sobre todo en tareas en segundo plano. La arquitectura ideal hoy es tener un buen enrutador: usas modelos locales rápidos y baratos para las tareas simples, y solo llamas a los modelos gigantes comerciales cuando el razonamiento complejo lo exige.</p> <p>Mi recomendación es que antes de hacer este cambio te asegures de tener buena observabilidad, conjuntos de datos de pruebas sólidos y una gestión de prompts adecuada (con herramientas como Langfuse). Aquí es donde los modelos <strong><em>open-weights</em></strong> también brillan, permitiendo invocar miles de <strong><em>LLM-as-a-Judge</em></strong> sin impacto en los costos, aumentando las trazas evaluadas y mejorando las métricas en las evaluaciones online.</p> <p><strong>Y tú, ¿ya estás moviendo tus cargas de trabajo a modelos locales o sigues dependiendo al 100% de APIs de terceros?</strong></p>]]></content><author><name>Antonio Barbosa</name></author><category term="Artificial Intelligence"/><category term="Open Weight Model"/><category term="Qwen 3"/><category term="Open Source"/><category term="LLM"/><category term="llm"/><category term="open-weights"/><category term="qwen"/><category term="ollama"/><category term="costos"/><category term="self-hosting"/><summary type="html"><![CDATA[Últimamente se habla mucho de los LLM “gratuitos”, muy promocionados por influencers de tecnología. Pero, ¿son realmente gratuitos? Hay que…]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/open-weights-costs.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/open-weights-costs.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry><entry xml:lang="es"><title type="html">Claude, Vibe Coding y la falsa promesa de la autonomía operativa</title><link href="https://aboneto.dev/claude-vibe-coding-y-la-falsa-promesa-de-la-autonomia-operativa" rel="alternate" type="text/html" title="Claude, Vibe Coding y la falsa promesa de la autonomía operativa"/><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://aboneto.dev/claude-vibe-coding-y-la-falsa-promesa-de-la-autonomia-operativa</id><content type="html" xml:base="https://aboneto.dev/claude-vibe-coding-y-la-falsa-promesa-de-la-autonomia-operativa"><![CDATA[<p><img src="/assets/img/vibe-coding-autonomia.webp" alt="Vibe Coding"/></p> <p>Se habla mucho de <a href="https://en.wikipedia.org/wiki/Vibe_coding"><em>Vibe Coding</em></a> y flujos basados en agentes con Claude, y con razón. Ya no estamos limitados al autocompletado; el objetivo hoy es que la IA tome un requerimiento, consuma el contexto del repositorio, escriba la lógica, arme los tests y levante un <em>Pull Request</em> listo para revisión. Esa capacidad operativa existe.</p> <p>El problema es el malentendido gigante que hay en la industria: creer que pagar la licencia corporativa te da independencia operativa desde el día uno. La realidad es más dura. La mayoría de las organizaciones no tienen la infraestructura ni los procesos para soportar este nivel de automatización.</p> <p>La autonomía de un agente no es un <em>feature</em> que venga incluido en la API. Exige disciplina de ingeniería, adoptar <a href="https://en.wikipedia.org/wiki/Spec-driven_development"><em>Spec Driven Development (SDD)</em></a> en serio cuando sea necesario y, sobre todo, diseñar una arquitectura de contexto bien pensada.</p> <p>No alcanza con un <em>system prompt</em> global y un buen SDD. Si tienes un sistema con varios módulos, el error de novato es meter todas las directrices en un único archivo <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> en la raíz del proyecto o tener multiples skills y reglas en una única carpeta <code class="language-plaintext highlighter-rouge">.claude</code>. Si el agente va a tocar el módulo de pagos, necesita las reglas y el contexto exclusivo de facturación; no le sirve de nada tener en memoria el esquema de base de datos de otros dominios.</p> <p>Podríamos modularizarlo en múltiples <em>skills</em>, pero hay un claro <em>trade-off</em>: inyectar el listado y sus descripciones penaliza la ventana de contexto. A gran escala, este <em>overhead</em> genera un consumo ineficiente de tokens, por lo que esta estrategia solo escala bien en proyectos o repositorios más acotados.</p> <p>Para que esto escale, necesitas diseñar contextos y agentes especializados. En un entorno <em>backend</em> maduro no usas una sola instancia para todo. Tienes un orquestador que analiza el ticket y rutea, un agente aislado en su dominio que escribe la lógica, un revisor de código estricto (con reglas de performance y linters) y quizás otro dedicado solo a la documentación.</p> <p>Si le inyectas todo el repositorio en cada iteración por simple flojera de segmentar, el modelo se va a perder en el ruido, va a alucinar y vas a quemar millones de tokens. Eventualmente resolverá la tarea a base de correcciones, pero el costo de la API se va a ir a las nubes tratando de que la IA adivine una arquitectura mal gestionada.</p> <p>Piénsalo como cuando sumamos a un ingeniero al equipo. No le tiras un ticket de dos líneas y lo dejas solo frente a todo el código fuente. Requiere un <em>onboarding</em>, colaboración constante, empatía para entender el problema del usuario final y adaptabilidad para encajar en las convenciones de cada módulo. Pedirle automatización a la IA requiere un <em>onboarding</em> igual de estructurado: definirle los límites de su especialidad y darle un marco donde los agentes interactúen sin pisarse.</p> <p>Es un proceso muy similar a cuando implementamos una funcionalidad de IA en nuestro propio código para automatizar un proceso que requiere modificación de datos: es necesario partir con un <a href="https://www.ibm.com/es-es/think/topics/human-in-the-loop">HITL (Human In The Loop)</a> más cercano. Con Claude es lo mismo, al principio, revisas cada código o <em>commit</em> con lupa. A medida que el agente va ganando confianza, madurez y demuestra consistencia en el dominio, vas automatizando más y dándole mayor libertad.</p> <h2 id="conclusión">Conclusión</h2> <p>Pretender saltarse esta etapa de madurez técnica para forzar una automatización temprana es un error grave de gestión. La inteligencia artificial no viene a arreglar tu falta de arquitectura o tus malos procesos internos.</p> <p>La verdadera automatización y autonomía operativa se conquistan iteración tras iteración: gestionando contextos con precisión clínica, segmentando responsabilidades en agentes especializados y exigiendo calidad absoluta en las especificaciones. No se compran con una tarjeta de crédito. Si tienes una cultura de buena ingeniería, Claude va a automatizar partes enteras de tu ciclo de desarrollo. Pero si tu configuración es un desorden, simplemente vas a terminar pagando facturas altísimas por iteraciones infinitas que pudiste evitar estructurando bien el trabajo desde el principio.</p> <p>Estoy convencido de que Vibe Coding ya es un estándar. Lo aplico en mi día a día, pero con mucha responsabilidad. No estoy de acuerdo con empresas que lo aplican solamente, porque está de moda, sin al menos preocuparse con lo mínimo requerido, la seguridad y la eficiencia.</p>]]></content><author><name>Antonio Barbosa</name></author><category term="Software Engineering"/><category term="Software Architecture"/><category term="Artificial Intelligence"/><category term="Claude"/><category term="Vibe Coding"/><category term="claude"/><category term="vibe-coding"/><category term="agentes"/><category term="autonomia"/><category term="sdd"/><summary type="html"><![CDATA[Se habla mucho de Vibe Coding y flujos basados en agentes con Claude, y con razón. Ya no estamos limitados al autocompletado; el objetivo…]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aboneto.dev/assets/img/vibe-coding-autonomia.webp"/><media:content medium="image" url="https://aboneto.dev/assets/img/vibe-coding-autonomia.webp" xmlns:media="http://search.yahoo.com/mrss/"/></entry></feed>