<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Razonamiento on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/razonamiento/</link><description>Recent content in Razonamiento on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Fri, 12 Jun 2026 05:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/razonamiento/index.xml" rel="self" type="application/rss+xml"/><item><title>Servir modelos de razonamiento: el borrador invisible que decide tu latencia y tu factura</title><link>https://blog.lo0.es/posts/serving-modelos-razonamiento-test-time-compute/</link><pubDate>Fri, 12 Jun 2026 05:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/serving-modelos-razonamiento-test-time-compute/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Un modelo de razonamiento genera, antes de la respuesta que ves, un &lt;strong>bloque de pensamiento&lt;/strong> —cientos o miles de tokens encerrados entre &lt;code>&amp;lt;think&amp;gt;&lt;/code> y &lt;code>&amp;lt;/think&amp;gt;&lt;/code>— que el usuario no lee pero que &lt;strong>consume el mismo cómputo, la misma VRAM y la misma factura&lt;/strong> que cualquier otro token. Servirlos en producción no es &amp;ldquo;servir un modelo más grande&amp;rdquo;: es servir un modelo cuyo coste por petición es &lt;strong>variable y, por defecto, descontrolado&lt;/strong>. Tres palancas cambian la ecuación: elegir bien entre &lt;strong>modo think / non-think&lt;/strong> (los modelos híbridos de 2026 lo permiten en el mismo peso), poner un &lt;strong>presupuesto de razonamiento&lt;/strong> (&lt;code>thinking_token_budget&lt;/code> en vLLM, &lt;em>budget forcing&lt;/em> tipo s1) y &lt;strong>medir el impacto en el KV cache&lt;/strong> (una cadena de 30k tokens de razonamiento puede comerse ~9 GB de KV en FP16). Bien gestionado, ganas precisión donde importa; mal gestionado, pagas hasta &lt;strong>113× más energía&lt;/strong> por una respuesta que no necesitaba pensar tanto.&lt;/p>
&lt;hr>
&lt;h2 id="la-analogía">La analogía&lt;/h2>
&lt;p>Imagina a un opositor en el examen. Antes de escribir la respuesta buena en el folio oficial, llena tres folios de sucio: tantea enfoques, se corrige, descarta. Esos folios de sucio &lt;strong>no se entregan&lt;/strong> —el tribunal solo lee la respuesta final— pero el opositor ha gastado tinta, tiempo y media hora de examen en ellos.&lt;/p>
&lt;p>Un modelo de razonamiento hace exactamente eso. El bloque &lt;code>&amp;lt;think&amp;gt;…&amp;lt;/think&amp;gt;&lt;/code> es el folio de sucio: razona en voz alta, se contradice, vuelve atrás, y al final emite la respuesta &amp;ldquo;limpia&amp;rdquo;. El problema de producción es que &lt;strong>tú pagas también el sucio&lt;/strong>: cada token de razonamiento ocupa una ranura en el batch, crece el KV cache y suma a la factura igual que un token de salida. Y, como cualquier opositor nervioso, el modelo tiende a &lt;strong>sobrepensar&lt;/strong>: escribe cinco folios cuando con uno bastaba.&lt;/p>
&lt;p>La pregunta operativa de este post no es &amp;ldquo;¿razona bien?&amp;rdquo;, sino &amp;ldquo;¿cuánto sucio le dejo escribir, y cuándo le quito el boli?&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="qué-cambia-cuando-el-modelo-piensa">Qué cambia cuando el modelo &amp;ldquo;piensa&amp;rdquo;&lt;/h2>
&lt;p>En un modelo normal, una petición es: prompt → tokens de salida. En un modelo de razonamiento la secuencia tiene &lt;strong>dos tramos&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Bloque de razonamiento&lt;/strong> (&lt;code>&amp;lt;think&amp;gt; … &amp;lt;/think&amp;gt;&lt;/code>): la cadena de pensamiento (CoT). Largo, variable, normalmente oculto al usuario final.&lt;/li>
&lt;li>&lt;strong>Respuesta final&lt;/strong>: lo que el usuario ve.&lt;/li>
&lt;/ol>
&lt;p>vLLM modela esto explícitamente. Al arrancar con un &lt;em>reasoning parser&lt;/em>, la salida trae un campo &lt;code>reasoning_content&lt;/code> separado del &lt;code>content&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-32B &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --reasoning-parser deepseek_r1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El parser detecta los delimitadores de pensamiento y separa ambos tramos en la respuesta de la API (&lt;a href="https://docs.vllm.ai/en/stable/features/reasoning_outputs/">vLLM · Reasoning Outputs&lt;/a>). Esto importa para serving por una razón práctica: si tu gateway o tu UI no separan &lt;code>reasoning_content&lt;/code> de &lt;code>content&lt;/code>, acabarás &lt;strong>mostrando el folio de sucio&lt;/strong> —o, peor, registrándolo en logs y trazas sin querer.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 210" role="img" aria-label="Anatomía de una petición a un modelo de razonamiento: prompt, bloque de pensamiento con presupuesto, respuesta final" xmlns="http://www.w3.org/2000/svg">
&lt;defs>&lt;marker id="rzm" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dsh{fill:none;stroke:currentColor;stroke-width:1.3;stroke-dasharray:5 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.3;marker-end:url(#rzm)}&lt;/style>
&lt;text x="20" y="28" class="tl">Petición&lt;/text>
&lt;rect class="bx" x="20" y="38" width="120" height="50" rx="6"/>
&lt;text x="32" y="60" class="ts">prompt + sistema&lt;/text>
&lt;text x="32" y="76" class="ts">(visible · facturable)&lt;/text>
&lt;path class="ar" d="M140,63 L180,63"/>
&lt;text x="190" y="28" class="tl">Bloque de razonamiento &amp;lt;think&amp;gt; … &amp;lt;/think&amp;gt;&lt;/text>
&lt;rect class="dsh" x="190" y="38" width="360" height="80" rx="6"/>
&lt;text x="204" y="60" class="ts">cientos–miles de tokens OCULTOS al usuario&lt;/text>
&lt;text x="204" y="78" class="ts">crecen el KV cache · suman a la factura como salida&lt;/text>
&lt;text x="204" y="96" class="ts">tope: thinking_token_budget → fuerza &amp;lt;/think&amp;gt;&lt;/text>
&lt;path class="ar" d="M550,78 L590,78"/>
&lt;text x="600" y="28" class="tl">Respuesta&lt;/text>
&lt;rect class="bx" x="600" y="38" width="150" height="80" rx="6"/>
&lt;text x="612" y="64" class="ts">content final&lt;/text>
&lt;text x="612" y="82" class="ts">(lo único que&lt;/text>
&lt;text x="612" y="98" class="ts">ve el usuario)&lt;/text>
&lt;text x="20" y="150" class="tl">Coste por petición = prompt + razonamiento + respuesta&lt;/text>
&lt;text x="20" y="172" class="ts">El razonamiento es invisible en la UI pero NO en la GPU ni en la factura. Es la variable que descontrola tu coste por request.&lt;/text>
&lt;text x="20" y="192" class="ts">Regla operativa: separa reasoning_content del content en el gateway, y pon un presupuesto de pensamiento por ruta.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="el-panorama-2026-del-modelo-que-razona-siempre-al-híbrido-conmutable">El panorama 2026: del modelo &amp;ldquo;que razona siempre&amp;rdquo; al híbrido conmutable&lt;/h2>
&lt;p>La primera generación (o1, DeepSeek-R1, QwQ-32B) eran modelos que &lt;strong>siempre&lt;/strong> razonaban. En 2026 el patrón dominante es el &lt;strong>híbrido&lt;/strong>: un único peso que conmuta entre &lt;em>think&lt;/em> y &lt;em>non-think&lt;/em>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DeepSeek-V3.1&lt;/strong> introdujo una arquitectura de razonamiento híbrido en un solo modelo: &lt;code>DeepSeek-V3.1-Think&lt;/code> para problemas complejos y un modo directo más rápido para lo trivial, conmutables por el usuario (&lt;a href="https://www.infoq.com/news/2025/09/deepseek-v31-hybrid/">InfoQ&lt;/a>). Importante para serving: el razonamiento viene &lt;strong>desactivado por defecto&lt;/strong> y se activa con &lt;code>thinking=True&lt;/code> en &lt;code>chat_template_kwargs&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Qwen3&lt;/strong> trae &lt;em>Hybrid Thinking Modes&lt;/em> y un &lt;strong>Thinking Budget&lt;/strong> explícito para acotar el cómputo de razonamiento; en su serie el pensamiento viene &lt;strong>activado por defecto&lt;/strong> (como QwQ-32B).&lt;/li>
&lt;li>&lt;strong>gpt-oss&lt;/strong> muestra una estructura de razonamiento distinta a la de la familia R1/Qwen, lo que en la práctica significa que &lt;strong>el parser y los delimitadores no son universales&lt;/strong>: cada familia tiene los suyos.&lt;/li>
&lt;/ul>
&lt;p>La consecuencia arquitectónica es clara: en 2026 ya &lt;strong>no decides &amp;ldquo;modelo que razona&amp;rdquo; vs &amp;ldquo;modelo que no&amp;rdquo;&lt;/strong>, sino &lt;strong>cuándo dejas que el mismo modelo razone&lt;/strong>. Eso convierte el razonamiento en una decisión de &lt;em>routing&lt;/em> y de presupuesto, no de catálogo de modelos. Conecta directamente con &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">el router de inferencia L7&lt;/a>: la ruta &amp;ldquo;barata&amp;rdquo; desactiva el pensamiento; la &amp;ldquo;cara&amp;rdquo; lo activa con un tope.&lt;/p>
&lt;hr>
&lt;h2 id="la-economía-por-qué-el-folio-de-sucio-dispara-la-factura">La economía: por qué el folio de sucio dispara la factura&lt;/h2>
&lt;p>Aquí está el corazón del problema. Los tokens de razonamiento son &lt;strong>invisibles para el usuario pero reales en cómputo y en facturación&lt;/strong>. Los proveedores los cobran como tokens de salida —por ejemplo, los proveedores de API facturan esos &lt;em>reasoning tokens&lt;/em> al precio de salida, no gratis (&lt;a href="https://medium.com/@Elongated_musk/test-time-compute-quietly-changed-the-economics-of-inference-9d0b8d77641c">Test-Time Compute Quietly Changed the Economics of Inference&lt;/a>). En on-premise no hay factura externa, pero &lt;strong>sí hay coste&lt;/strong>: ocupan ranuras de batch, VRAM de KV y vatios.&lt;/p>
&lt;p>El coste facturable (o el coste-equivalente en GPU·hora) de una petición es:&lt;/p>
&lt;p>$$\text{tokens de cómputo} = \text{prompt} + \underbrace{\text{tokens de razonamiento}}_{\text{ocultos, variables}} + \text{respuesta visible}$$&lt;/p>
&lt;p>El término del medio es el que se descontrola. En tareas difíciles la ratio razonamiento/respuesta visible puede ser enorme, y el análisis empírico llega a medir &lt;strong>hasta 113× el coste energético&lt;/strong> frente a la inferencia estándar en ciertas tareas de código (&lt;a href="https://towardsdatascience.com/inference-scaling-test-time-compute-why-reasoning-models-raise-your-compute-bill/">Towards Data Science · Inference Scaling&lt;/a>).&lt;/p>
&lt;p>Y no siempre compra precisión. El fenómeno del &lt;strong>overthinking&lt;/strong> está documentado: más pensamiento no garantiza mejor respuesta, y a partir de cierto punto &lt;strong>empeora&lt;/strong>. Hay trabajos que muestran que &lt;strong>las cadenas más cortas son hasta un 34,5 % más precisas&lt;/strong> que la más larga muestreada para la misma pregunta (&lt;a href="https://arxiv.org/pdf/2505.17813">Don&amp;rsquo;t Overthink it&lt;/a>), y estudios sobre el &amp;ldquo;espejismo&amp;rdquo; del test-time scaling (&lt;a href="https://arxiv.org/pdf/2506.04210">Mirage of Test-Time Scaling&lt;/a>) y sobre cuándo &lt;em>pensar de más hace daño&lt;/em> (&lt;a href="https://arxiv.org/html/2604.10739v1">When More Thinking Hurts&lt;/a>). El primer estudio a gran escala del test-time scaling —más de &lt;strong>30.000 millones de tokens&lt;/strong> generados con 8 LLM open source de 7B a 235B sobre 4 datasets de razonamiento— sistematiza dónde escala y dónde no (&lt;a href="https://arxiv.org/abs/2512.02008">The Art of Scaling Test-Time Compute&lt;/a>).&lt;/p>
&lt;p>La lectura operativa: &lt;strong>el razonamiento es un coste que hay que presupuestar, no un interruptor de &amp;ldquo;más calidad&amp;rdquo; que dejas siempre a tope.&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="controlar-el-presupuesto-de-pensamiento">Controlar el presupuesto de pensamiento&lt;/h2>
&lt;p>Tres mecanismos, de menos a más fino.&lt;/p>
&lt;h3 id="1-conmutar-think--non-think">1. Conmutar think / non-think&lt;/h3>
&lt;p>Lo más barato es &lt;strong>no razonar cuando no hace falta&lt;/strong>. En modelos híbridos, desactiva el pensamiento para clasificación, extracción, formato, respuestas triviales:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># DeepSeek-V3.1: razonamiento OFF por defecto; se activa explícitamente&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">chat_template_kwargs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;thinking&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="c1"># solo en la ruta &amp;#34;difícil&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Esto es el 80 % del ahorro con el 20 % del esfuerzo: enruta por dificultad y reserva el pensamiento para lo que de verdad lo paga.&lt;/p>
&lt;h3 id="2-poner-un-tope-thinking_token_budget">2. Poner un tope: &lt;code>thinking_token_budget&lt;/code>&lt;/h3>
&lt;p>vLLM incorpora un &lt;em>sampling parameter&lt;/em> &lt;code>thinking_token_budget&lt;/code> que &lt;strong>cuenta los tokens de razonamiento y, al llegar al límite, fuerza el cierre&lt;/strong> del bloque (&lt;code>reasoning_end_str&lt;/code>, típicamente &lt;code>&amp;lt;/think&amp;gt;&lt;/code>), obligando al modelo a responder ya. Si no se especifica, no hay más límite que &lt;code>max_tokens&lt;/code> (&lt;a href="https://github.com/vllm-project/vllm/pull/37112">PR #37112&lt;/a>, &lt;a href="https://shuyo.wordpress.com/2026/03/26/adding-reasoning-budget-to-vllm-reasoning-token-limit/">nota de implementación&lt;/a>). Por debajo, un &lt;code>ReasoningBudgetLogitsProcessor&lt;/code> inyecta algo como &lt;em>&amp;ldquo;Let me stop thinking and answer now.&lt;code>&amp;lt;/think&amp;gt;&lt;/code>&amp;rdquo;&lt;/em> cuando se alcanza el tope.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Define los delimitadores del bloque de razonamiento&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vllm serve Qwen/Qwen3-32B &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --reasoning-parser qwen3 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --reasoning-config &lt;span class="s1">&amp;#39;{&amp;#34;reasoning_start_str&amp;#34;:&amp;#34;&amp;lt;think&amp;gt;&amp;#34;,&amp;#34;reasoning_end_str&amp;#34;:&amp;#34;&amp;lt;/think&amp;gt;&amp;#34;}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// por petición: corta el sucio a 1024 tokens
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nt">&amp;#34;messages&amp;#34;&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;thinking_token_budget&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1024&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-budget-forcing-estado-del-arte">3. Budget forcing (estado del arte)&lt;/h3>
&lt;p>La técnica que popularizó el control fino es &lt;strong>budget forcing&lt;/strong>, del paper &lt;strong>s1&lt;/strong>: para gastar &lt;em>menos&lt;/em>, se termina el pensamiento forzando el delimitador de fin; para gastar &lt;em>más&lt;/em>, se &lt;strong>suprime&lt;/strong> el fin y se anexa la palabra &lt;strong>&amp;ldquo;Wait&amp;rdquo;&lt;/strong>, lo que empuja al modelo a revisar y a menudo &lt;strong>corregir&lt;/strong> su propio razonamiento. Con esto, &lt;code>s1-32B&lt;/code> (un Qwen2.5-32B-Instruct afinado sobre solo 1.000 ejemplos) &lt;strong>superó a o1-preview hasta en un 27 %&lt;/strong> en AIME24/MATH (&lt;a href="https://arxiv.org/abs/2501.19393">s1: Simple Test-Time Scaling&lt;/a>). La lección de serving: el presupuesto no es solo un tope de coste, es una &lt;strong>palanca de calidad bidireccional&lt;/strong>.&lt;/p>
&lt;p>$$\text{precisión} \approx f(\text{tokens de razonamiento}) \quad\text{con un máximo, no monótona}$$&lt;/p>
&lt;p>La curva sube, satura y en muchas tareas &lt;strong>baja&lt;/strong>. Tu trabajo es operarla cerca del codo, no en el extremo.&lt;/p>
&lt;hr>
&lt;h2 id="el-impacto-que-casi-nadie-mide-el-kv-cache">El impacto que casi nadie mide: el KV cache&lt;/h2>
&lt;p>Aquí es donde el razonamiento muerde el serving de verdad. Cada token del folio de sucio &lt;strong>es un token más en el KV cache&lt;/strong>. Una cadena larga de razonamiento infla la memoria de trabajo igual que un contexto largo de entrada.&lt;/p>
&lt;p>El tamaño del KV crece linealmente con la secuencia (incluido el razonamiento):&lt;/p>
&lt;p>$$\text{KV bytes} = 2 \times L \times h_{kv} \times d_{head} \times s \times b$$&lt;/p>
&lt;p>donde (L) son capas, (h_{kv}) cabezas KV (con GQA, pocas), (d_{head}) la dimensión por cabeza, (s) la longitud de secuencia y (b) los bytes por elemento. El término que dispara el razonamiento es (s): una respuesta &amp;ldquo;normal&amp;rdquo; de 500 tokens y una con 8.000 tokens de pensamiento &lt;strong>no ocupan lo mismo, ni de lejos&lt;/strong>.&lt;/p>
&lt;p>Los números reales asustan: para un modelo destilado de razonamiento con atención estándar como &lt;code>DeepSeek-R1-Distill-Llama-70B&lt;/code>, &lt;strong>una sola cadena de 30.000 tokens de razonamiento consume ~9 GB de KV en FP16&lt;/strong>, que la cuantización de KV a FP8 reduce a ~4,5 GB —una de las optimizaciones de mayor impacto para cargas de cadena-de-pensamiento (&lt;a href="https://www.spheron.network/blog/kv-cache-optimization-guide/">Spheron · KV Cache Optimization&lt;/a>). Multiplica eso por la concurrencia y entiendes por qué un cluster que servía 200 peticiones simultáneas de un modelo &amp;ldquo;normal&amp;rdquo; se queda en 40 con el mismo modelo razonando.&lt;/p>
&lt;p>Dos matices del estado del arte que conviene conocer:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prefix caching no es gratis aquí.&lt;/strong> El estudio empírico de serving de modelos de razonamiento encuentra que el &lt;em>prefix caching&lt;/em> mejora claramente la velocidad en modelos de &lt;strong>14B o más&lt;/strong>, pero &lt;strong>perjudica&lt;/strong> en modelos de 7B (la gestión del caché cuesta más de lo que ahorra) (&lt;a href="https://arxiv.org/pdf/2510.18672">Reasoning Language Model Inference Serving Unveiled&lt;/a>). Y como el grueso del coste del razonamiento está en el &lt;strong>decode&lt;/strong> (generar tokens uno a uno), el prefix caching —que solo acelera el prefill— &lt;strong>apenas toca&lt;/strong> la fase cara. Conecta con &lt;a href="https://blog.lo0.es/posts/prefix-cache-hit-rate-engineering/">prefix cache: ingeniería del hit rate&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Compresión de KV específica de razonamiento.&lt;/strong> Han aparecido técnicas como &lt;strong>R-KV&lt;/strong>, que comprime el KV explotando la &lt;strong>redundancia&lt;/strong> típica de las cadenas de pensamiento (el modelo repite y divaga), recuperando memoria sin tocar la calidad (&lt;a href="https://arxiv.org/pdf/2505.24133">R-KV&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>La palanca más rentable y disponible hoy sigue siendo &lt;strong>KV en FP8&lt;/strong> (ver &lt;a href="https://blog.lo0.es/posts/fp8-end-to-end-pesos-kv-calidad/">FP8 end-to-end&lt;/a>) combinada con un &lt;strong>presupuesto de razonamiento&lt;/strong> que evite las colas de 30k tokens en primer lugar.&lt;/p>
&lt;hr>
&lt;h2 id="razonamiento--salida-estructurada-el-orden-importa">Razonamiento + salida estructurada: el orden importa&lt;/h2>
&lt;p>Si sirves &lt;em>structured output&lt;/em> (JSON con esquema) y razonamiento a la vez, hay una trampa sutil: la gramática &lt;strong>no debe aplicarse durante el bloque de pensamiento&lt;/strong>. El modelo necesita texto libre para razonar; forzarle el esquema dentro del &lt;code>&amp;lt;think&amp;gt;&lt;/code> rompe el razonamiento. vLLM lo resuelve haciendo que el motor de structured output (xgrammar) use el &lt;code>end_token_id&lt;/code> del razonador para &lt;strong>saltarse la restricción mientras dura el bloque&lt;/strong> y aplicarla solo a la respuesta final (&lt;a href="https://docs.vllm.ai/en/stable/features/reasoning_outputs/">vLLM · Reasoning Outputs&lt;/a>). Si montas esto a mano en otro motor, recuérdalo: &lt;strong>primero deja pensar, luego impón el formulario&lt;/strong>. Enlaza con &lt;a href="https://blog.lo0.es/posts/structured-output-fundamentos/">structured output&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="arquitectura-de-referencia">Arquitectura de referencia&lt;/h2>
&lt;p>Sobre el cluster de ejemplo del blog —un nodo &lt;strong>4×H100 SXM (80 GB, NVLink)&lt;/strong>— una topología sensata para servir razonamiento sin arruinar el SLO:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Clasificador de dificultad barato&lt;/strong> delante (un modelo pequeño o reglas) que decide ruta. La mayoría del tráfico &lt;strong>no necesita pensar&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Ruta rápida (non-think):&lt;/strong> el mismo modelo híbrido con razonamiento desactivado. TTFT bajo, coste predecible.&lt;/li>
&lt;li>&lt;strong>Ruta de razonamiento (think):&lt;/strong> razonamiento activado &lt;strong>con &lt;code>thinking_token_budget&lt;/code> por defecto&lt;/strong> (p. ej. 1–2k tokens) y posibilidad de subirlo por petición para los casos de verdad difíciles.&lt;/li>
&lt;li>&lt;strong>KV en FP8&lt;/strong> en el motor de la ruta de razonamiento, y métricas de longitud de razonamiento por petición exportadas a tu observabilidad (&lt;a href="https://blog.lo0.es/posts/vllm-otel-instrumentacion-optimizaciones/">instrumentar vLLM con OTel&lt;/a>).&lt;/li>
&lt;/ol>
&lt;p>Para &lt;strong>prototipar&lt;/strong> este routing fuera del cluster, una &lt;strong>RTX 5090 (Blackwell, 32 GB)&lt;/strong> sirve un modelo de razonamiento de 7–14B y te deja validar parsers, presupuestos y separación &lt;code>reasoning_content&lt;/code>/&lt;code>content&lt;/code> antes de tocar las H100. No esperes servir 32B en &lt;em>think&lt;/em> a concurrencia alta en una tarjeta de consumo: el KV del razonamiento se come los 32 GB enseguida.&lt;/p>
&lt;p>El dimensionamiento parte, como siempre, de un SLO; la diferencia es que ahora el &amp;ldquo;tamaño de respuesta&amp;rdquo; de tu &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a> debe contar &lt;strong>el sucio&lt;/strong>, no solo la respuesta visible.&lt;/p>
&lt;hr>
&lt;h2 id="pitfalls-operativos-y-escepticismo-honesto">Pitfalls operativos (y escepticismo honesto)&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Fugar el &lt;code>reasoning_content&lt;/code>.&lt;/strong> Si el gateway no lo separa, acabas mostrando o logueando el folio de sucio —que puede contener tanteos incorrectos, datos sensibles o lenguaje que no quieres en tu UI. Sepáralo siempre en el L7.&lt;/li>
&lt;li>&lt;strong>Servir razonamiento &amp;ldquo;por si acaso&amp;rdquo;.&lt;/strong> El overthinking es real y a veces &lt;strong>baja&lt;/strong> la precisión. No actives &lt;em>think&lt;/em> por defecto: actívalo por ruta, con presupuesto.&lt;/li>
&lt;li>&lt;strong>Olvidar el KV.&lt;/strong> El error más común: dimensionar concurrencia con la longitud de la respuesta visible. El KV lo dicta la &lt;strong>secuencia total&lt;/strong>, razonamiento incluido. Mide &lt;code>tokens de razonamiento&lt;/code> p50/p95 por endpoint.&lt;/li>
&lt;li>&lt;strong>Prefix caching como bala de plata.&lt;/strong> En modelos pequeños puede empeorar, y en cualquier caso no toca el decode, que es donde se va el coste del razonamiento.&lt;/li>
&lt;li>&lt;strong>Asumir delimitadores universales.&lt;/strong> R1, Qwen3 y gpt-oss no comparten estructura de razonamiento. Usa el &lt;code>--reasoning-parser&lt;/code> correcto por familia y prueba el &lt;em>streaming&lt;/em> (el parser tiene que separar bien token a token).&lt;/li>
&lt;li>&lt;strong>Creer que más cómputo = más inteligencia.&lt;/strong> El estado del arte (s1, short-m@k, &amp;ldquo;When More Thinking Hurts&amp;rdquo;) apunta a lo contrario en muchos casos: hay un &lt;strong>codo&lt;/strong> y operar más allá es quemar vatios. El test-time compute es una herramienta con rendimientos decrecientes —y a veces negativos—, no una palanca lineal.&lt;/li>
&lt;/ol>
&lt;p>Una nota de prudencia para junio de 2026: el campo del control de razonamiento (budget forcing, compresión de KV específica, &lt;em>early-exit&lt;/em> del pensamiento) se mueve &lt;strong>rápido y casi todo es muy reciente&lt;/strong>. Las cifras concretas —el 113×, el 34,5 %, los 9 GB— dependen de modelo, tarea y configuración; tómalas como &lt;strong>orden de magnitud para diseñar&lt;/strong>, no como constantes. Mide en tu carga antes de comprometer SLOs.&lt;/p>
&lt;hr>
&lt;h2 id="cierre">Cierre&lt;/h2>
&lt;p>Servir un modelo de razonamiento es servir un modelo cuyo coste por petición &lt;strong>lo decides tú con el presupuesto de pensamiento&lt;/strong>, no el catálogo. La cadena va: enruta por dificultad → desactiva &lt;em>think&lt;/em> donde no aporta → pon &lt;code>thinking_token_budget&lt;/code> por defecto en la ruta que piensa → cuantiza el KV a FP8 → mide la longitud de razonamiento como una métrica de primera clase. Hazlo, y el razonamiento se convierte en una capacidad que pagas solo cuando compra precisión. No lo hagas, y tu cluster servirá la quinta parte de usuarios mientras el modelo escribe folios de sucio que nadie va a leer.&lt;/p>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>vLLM · Reasoning Outputs — &lt;a href="https://docs.vllm.ai/en/stable/features/reasoning_outputs/">https://docs.vllm.ai/en/stable/features/reasoning_outputs/&lt;/a>&lt;/li>
&lt;li>vLLM PR #37112 · reasoning_budget — &lt;a href="https://github.com/vllm-project/vllm/pull/37112">https://github.com/vllm-project/vllm/pull/37112&lt;/a>&lt;/li>
&lt;li>Adding Reasoning Budget to vLLM — &lt;a href="https://shuyo.wordpress.com/2026/03/26/adding-reasoning-budget-to-vllm-reasoning-token-limit/">https://shuyo.wordpress.com/2026/03/26/adding-reasoning-budget-to-vllm-reasoning-token-limit/&lt;/a>&lt;/li>
&lt;li>s1: Simple Test-Time Scaling — &lt;a href="https://arxiv.org/abs/2501.19393">https://arxiv.org/abs/2501.19393&lt;/a>&lt;/li>
&lt;li>The Art of Scaling Test-Time Compute — &lt;a href="https://arxiv.org/abs/2512.02008">https://arxiv.org/abs/2512.02008&lt;/a>&lt;/li>
&lt;li>Don&amp;rsquo;t Overthink it (short-m@k) — &lt;a href="https://arxiv.org/pdf/2505.17813">https://arxiv.org/pdf/2505.17813&lt;/a>&lt;/li>
&lt;li>Mirage of Test-Time Scaling — &lt;a href="https://arxiv.org/pdf/2506.04210">https://arxiv.org/pdf/2506.04210&lt;/a>&lt;/li>
&lt;li>When More Thinking Hurts — &lt;a href="https://arxiv.org/html/2604.10739v1">https://arxiv.org/html/2604.10739v1&lt;/a>&lt;/li>
&lt;li>Reasoning Language Model Inference Serving Unveiled — &lt;a href="https://arxiv.org/pdf/2510.18672">https://arxiv.org/pdf/2510.18672&lt;/a>&lt;/li>
&lt;li>R-KV: Redundancy-aware KV Cache Compression — &lt;a href="https://arxiv.org/pdf/2505.24133">https://arxiv.org/pdf/2505.24133&lt;/a>&lt;/li>
&lt;li>Spheron · KV Cache Optimization Guide (2026) — &lt;a href="https://www.spheron.network/blog/kv-cache-optimization-guide/">https://www.spheron.network/blog/kv-cache-optimization-guide/&lt;/a>&lt;/li>
&lt;li>Test-Time Compute Quietly Changed the Economics of Inference — &lt;a href="https://medium.com/@Elongated_musk/test-time-compute-quietly-changed-the-economics-of-inference-9d0b8d77641c">https://medium.com/@Elongated_musk/test-time-compute-quietly-changed-the-economics-of-inference-9d0b8d77641c&lt;/a>&lt;/li>
&lt;li>Inference Scaling (Test-Time Compute) · Towards Data Science — &lt;a href="https://towardsdatascience.com/inference-scaling-test-time-compute-why-reasoning-models-raise-your-compute-bill/">https://towardsdatascience.com/inference-scaling-test-time-compute-why-reasoning-models-raise-your-compute-bill/&lt;/a>&lt;/li>
&lt;li>DeepSeek-V3.1 Hybrid Reasoning · InfoQ — &lt;a href="https://www.infoq.com/news/2025/09/deepseek-v31-hybrid/">https://www.infoq.com/news/2025/09/deepseek-v31-hybrid/&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>