<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Context-Compression on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/context-compression/</link><description>Recent content in Context-Compression on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Tue, 09 Jun 2026 02:20:00 +0000</lastBuildDate><atom:link href="https://blog.lo0.es/tags/context-compression/index.xml" rel="self" type="application/rss+xml"/><item><title>RAG agresivo en modelos pequeños: compensar parámetros con recuperación</title><link>https://blog.lo0.es/posts/rag-agresivo-modelos-pequenos/</link><pubDate>Tue, 09 Jun 2026 02:20:00 +0000</pubDate><guid>https://blog.lo0.es/posts/rag-agresivo-modelos-pequenos/</guid><description>&lt;blockquote>
&lt;p>Este post pertenece a la serie sobre rendimiento de inferencia en modelos pequeños. Su pieza hermana, &lt;a href="https://blog.lo0.es/posts/roofline-invertido-modelos-pequenos/">El roofline se invierte en modelos pequeños&lt;/a>, explica por qué el prefill compute-bound es el cuello de botella que aquí da forma a toda la discusión. Conviene leerlo antes: aquí asumimos que &lt;strong>meter más contexto no es gratis&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Un SLM (digamos 1B–8B de parámetros) sabe &lt;strong>menos hechos&lt;/strong> que un modelo de 70B–700B, simplemente porque tiene menos pesos donde memorizarlos. Pero su capacidad de &lt;strong>razonar sobre texto que tiene delante&lt;/strong> —seguir instrucciones, extraer, sintetizar, comparar— se degrada mucho menos con el tamaño que su conocimiento enciclopédico. La consecuencia operacional es directa: usa el SLM como &lt;strong>motor de razonamiento sobre contexto curado&lt;/strong>, no como base de datos. Mueve el conocimiento de los pesos al contexto vía recuperación. El problema es que &amp;ldquo;recuperación agresiva&amp;rdquo; se interpreta a menudo como &amp;ldquo;meter muchos chunks&amp;rdquo;, y eso choca de frente con tres hechos sobre los SLM: ventanas de contexto más cortas, peor aprovechamiento del contexto largo (el efecto &lt;em>lost in the middle&lt;/em> es más severo cuanto más pequeño el modelo) y un &lt;strong>prefill compute-bound&lt;/strong> cuyo coste crece con la longitud del contexto $C$ —lineal en las proyecciones, cuadrático en la atención—. No puedes simplemente añadir tokens. La salida no es recuperar menos, sino recuperar &lt;strong>mejor&lt;/strong>: reranking de precisión sobre recall, compresión de contexto antes de inyectarlo, prefix caching de los documentos estables, caché semántico de respuestas y structured output con herramientas externas que sustituyen al conocimiento interno. Este post trabaja las matemáticas y da un número de TTFT antes y después de comprimir un contexto de 4000 a 1000 tokens en una RTX 4090.&lt;/p>
&lt;h2 id="la-analogía-el-examen-a-libro-abierto">La analogía: el examen a libro abierto&lt;/h2>
&lt;p>Dos estudiantes se presentan al mismo examen. El primero tiene una memoria prodigiosa: ha memorizado el temario entero, párrafo a párrafo. El segundo tiene una memoria normal —olvida fechas, confunde nombres— pero le permiten entrar con una &lt;strong>chuleta&lt;/strong>.&lt;/p>
&lt;p>Si la chuleta del segundo estudiante es un caos de fotocopias amontonadas, pierde: tarda en encontrar lo que busca, se distrae con páginas irrelevantes y se le acaba el tiempo. Pero si su chuleta es &lt;strong>excelente&lt;/strong> —recortada a lo esencial, reordenada por relevancia, con lo importante arriba y sin paja—, entonces no solo no pierde: a menudo &lt;strong>gana&lt;/strong>, porque razona igual de bien que el primero y además trabaja sobre material verificado en lugar de sobre recuerdos borrosos que puede estar inventando.&lt;/p>
&lt;p>La moraleja tiene tres capas, y cada una mapea a una decisión de ingeniería:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Memorizarlo todo es caro.&lt;/strong> El primer estudiante invirtió meses. Un modelo grande invierte parámetros —y VRAM, y FLOPs de inferencia— en memorizar hechos.&lt;/li>
&lt;li>&lt;strong>La chuleta importa más que su tamaño.&lt;/strong> Una chuleta de una página bien hecha bate a diez páginas mal organizadas. Más contexto recuperado no es mejor contexto: la precisión del material gana al volumen.&lt;/li>
&lt;li>&lt;strong>Saber buscar y sintetizar es una habilidad distinta de saber.&lt;/strong> Es la que el SLM conserva. La estrategia entera consiste en apoyarse en esa habilidad y subcontratar la memoria.&lt;/li>
&lt;/ul>
&lt;p>El resto del post es, esencialmente, cómo construir una chuleta excelente bajo la restricción de que el estudiante (el SLM) lee despacio y se cansa con los textos largos.&lt;/p>
&lt;h2 id="el-argumento-de-capacidad-cuántos-hechos-caben-en-los-pesos">El argumento de capacidad: cuántos hechos caben en los pesos&lt;/h2>
&lt;p>Empecemos por justificar la tesis con orden de magnitud, no con fe. ¿Cuánto conocimiento factual cabe realmente en los pesos de un modelo?&lt;/p>
&lt;p>Hay una estimación empírica recurrente en la literatura de interpretabilidad y memorización: un modelo denso es capaz de almacenar del orden de &lt;strong>2 bits de información memorizada por parámetro&lt;/strong> antes de saturar (la cifra exacta varía según el estudio y el régimen de entrenamiento; tómese como orden de magnitud, no como ley). Un modelo de 8B parámetros tiene entonces un techo de almacenamiento de información del orden de:&lt;/p>
&lt;p>$$8 \times 10^9 \text{ params} \times 2 \text{ bits/param} = 1.6 \times 10^{10} \text{ bits} \approx 2 \text{ GB de información}$$&lt;/p>
&lt;p>Y ese presupuesto &lt;strong>no es solo para hechos&lt;/strong>: la inmensa mayoría se gasta en gramática, sintaxis, capacidad de razonamiento, código, formato, y solo una fracción queda para conocimiento enciclopédico. Compáralo con el otro lado: un corpus recuperable de varios millones de documentos —una wiki corporativa, un repositorio documental, una base de conocimiento técnica— ocupa fácilmente &lt;strong>cientos de GB a terabytes&lt;/strong> de texto, indexado y consultable con latencia de milisegundos. La asimetría es de &lt;strong>dos o tres órdenes de magnitud&lt;/strong> a favor del corpus externo.&lt;/p>
&lt;p>La conclusión no es que los pesos sean inútiles —son donde vive el razonamiento, que es lo caro de replicar— sino que &lt;strong>competir con un índice externo por capacidad de hechos es perder por construcción&lt;/strong>. Un modelo de 70B tiene ~9× más presupuesto de memorización que uno de 8B, pero sigue siendo despreciable frente al corpus. Por eso el modelo grande &lt;em>también&lt;/em> hace RAG en producción. La diferencia es que el SLM &lt;strong>lo necesita&lt;/strong>: sin recuperación, su conocimiento factual es demasiado escaso y, peor, &lt;strong>propenso a alucinar&lt;/strong> justo en los huecos que no memorizó.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 780 250" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Conocimiento en pesos frente a conocimiento en contexto">
&lt;text x="390" y="24" text-anchor="middle" font-size="15" font-weight="700" fill="currentColor">Dónde vive el conocimiento&lt;/text>
&lt;p>&lt;text x="200" y="58" text-anchor="middle" font-size="13" font-weight="700" fill="currentColor">En los pesos (memorizado)&lt;/text>
&lt;rect x="90" y="70" width="220" height="60" fill="#d4ecff" stroke="#1f5fa8" stroke-width="1.4"/>
&lt;text x="200" y="95" text-anchor="middle" font-size="12" fill="#1f3550">~2 GB de info útil en 8B&lt;/text>
&lt;text x="200" y="113" text-anchor="middle" font-size="11" fill="#1f3550">fijo, caro de actualizar, alucina en huecos&lt;/text>&lt;/p>
&lt;p>&lt;text x="580" y="58" text-anchor="middle" font-size="13" font-weight="700" fill="currentColor">En el contexto (recuperado)&lt;/text>
&lt;rect x="430" y="70" width="300" height="60" fill="#cdebd0" stroke="#2a7a40" stroke-width="1.4"/>
&lt;text x="580" y="95" text-anchor="middle" font-size="12" fill="#1c3a26">cientos de GB – TB indexados&lt;/text>
&lt;text x="580" y="113" text-anchor="middle" font-size="11" fill="#1c3a26">fresco, citable, verificable, sin reentrenar&lt;/text>&lt;/p>
&lt;p>&lt;text x="390" y="165" text-anchor="middle" font-size="13" font-weight="700" fill="currentColor">El SLM como motor de razonamiento&lt;/text>
&lt;rect x="240" y="178" width="300" height="46" fill="#fff4d6" stroke="#a48000" stroke-width="1.4"/>
&lt;text x="390" y="200" text-anchor="middle" font-size="12" fill="#5a4500">razona sobre el contexto curado&lt;/text>
&lt;text x="390" y="216" text-anchor="middle" font-size="11" fill="#5a4500">no es la base de datos: es quien la lee y sintetiza&lt;/text>&lt;/p>
&lt;path d="M200,130 L360,178" stroke="currentColor" stroke-width="1.2" fill="none"/>
&lt;path d="M580,130 L420,178" stroke="currentColor" stroke-width="1.2" fill="none"/>
&lt;/svg>
&lt;/div>
&lt;h2 id="la-tensión-central-recuperar-más-no-es-meter-más">La tensión central: recuperar más no es meter más&lt;/h2>
&lt;p>Aquí es donde la mayoría de los diseños ingenuos se rompen. &amp;ldquo;Recuperación agresiva&amp;rdquo; suena a &lt;em>top-k&lt;/em> grande: si recuperar ayuda, recupera 20 chunks en vez de 5. Pero en un SLM eso falla por dos razones independientes, una de &lt;strong>calidad&lt;/strong> y otra de &lt;strong>coste&lt;/strong>.&lt;/p>
&lt;h3 id="a-los-slm-usan-peor-el-contexto-largo">(a) Los SLM usan peor el contexto largo&lt;/h3>
&lt;p>El efecto &lt;em>lost in the middle&lt;/em> (Liu et al., 2023) es bien conocido: los LLM recuperan mejor la información situada al principio y al final del contexto, y peor la del medio. Lo que se enfatiza menos es que &lt;strong>el efecto es más severo cuanto más pequeño el modelo&lt;/strong>. Un SLM tiene menos cabezas de atención, menos capas y representaciones internas más pobres para &amp;ldquo;rastrear&amp;rdquo; un hecho relevante enterrado en la posición 14 de 20 chunks. Además, su ventana de contexto nominal suele ser más corta (4K–32K frente a los 128K+ de los grandes), y la &lt;strong>ventana efectiva&lt;/strong> —la longitud a partir de la cual la calidad se desploma— es todavía menor. Meter 20 chunks no significa que el modelo los lea los 20: significa que probablemente ignore o malinterprete los del medio, mientras paga el coste de todos.&lt;/p>
&lt;h3 id="b-el-prefill-crece-con-el-contexto-y-es-compute-bound">(b) El prefill crece con el contexto y es compute-bound&lt;/h3>
&lt;p>Este es el golpe que la gente subestima. El &lt;strong>prefill&lt;/strong> —procesar el prompt completo antes de emitir el primer token— es la fase &lt;strong>compute-bound&lt;/strong> de la inferencia (a diferencia del decode, memory-bound; el detalle vive en &lt;a href="https://blog.lo0.es/posts/roofline-invertido-modelos-pequenos/">El roofline se invierte&lt;/a>). Su coste &lt;strong>crece con la longitud del contexto&lt;/strong> $C$, y determina el &lt;strong>TTFT&lt;/strong> (time to first token). Más chunks → más tokens de prefill → más TTFT y más coste de cómputo por petición. En un SLM, donde el prefill es proporcionalmente más caro respecto al modelo, esto duele especialmente.&lt;/p>
&lt;p>La conclusión operacional es incómoda pero clara: &lt;strong>no puedes compensar menos parámetros simplemente metiendo más contexto.&lt;/strong> Cada token recuperado se paga dos veces —en calidad degradada y en TTFT— y el SLM es el peor situado para absorber ambos costes. La salida es recuperar &lt;strong>menos pero mejor&lt;/strong>, y &lt;strong>comprimir&lt;/strong> lo que recuperas.&lt;/p>
&lt;h2 id="las-matemáticas-del-prefill">Las matemáticas del prefill&lt;/h2>
&lt;p>Pongamos números a &amp;ldquo;el prefill crece con el contexto&amp;rdquo;. Para un contexto de $C$ tokens, una capa transformer hace dos clases de trabajo:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Proyecciones lineales&lt;/strong> (QKV, salida de atención, FFN): cada token se multiplica por matrices de pesos de tamaño fijo. El coste es $O(C)$ en FLOPs —lineal en el número de tokens.&lt;/li>
&lt;li>&lt;strong>Atención&lt;/strong> ($QK^\top$ y la multiplicación por $V$): cada token atiende a todos los demás. El coste es $O(C^2)$ —cuadrático en el número de tokens.&lt;/li>
&lt;/ol>
&lt;p>El coste total de prefill por capa es de la forma:&lt;/p>
&lt;p>$$\text{FLOPs}&lt;em>{\text{prefill}} \approx \underbrace{a \cdot C}&lt;/em>{\text{proyecciones}} + \underbrace{b \cdot C^2}_{\text{atención}}$$&lt;/p>
&lt;p>con $a$ y $b$ constantes que dependen de la dimensión del modelo. Para contextos moderados (unos pocos miles de tokens) en un SLM, el término lineal aún domina o es comparable al cuadrático; el término cuadrático se vuelve dominante a contextos largos. Lo relevante: &lt;strong>si comprimes el contexto&lt;/strong> $C \to C/k$, el término lineal cae $\times k$ y el cuadrático cae $\times k^2$. Comprimir es la única palanca que ataca &lt;strong>ambos&lt;/strong> términos a la vez, y ataca el peor de forma desproporcionada.&lt;/p>
&lt;h3 id="ejemplo-numérico-ttft-antes-y-después-de-comprimir-rtx-4090">Ejemplo numérico: TTFT antes y después de comprimir, RTX 4090&lt;/h3>
&lt;p>Modelemos el TTFT como el tiempo de procesar los tokens de prefill a un throughput de prefill dado. Tomemos una RTX 4090 (24 GB, Ada Lovelace) sirviendo un SLM cuantizado, con un &lt;strong>throughput de prefill de ~5000 tok/s&lt;/strong> (cifra ilustrativa; el valor real depende del modelo, la cuantización y el batch —mídelo, no lo asumas).&lt;/p>
&lt;p>Sea un contexto recuperado de &lt;strong>4000 tokens&lt;/strong> (8 chunks de ~500 tokens). Aproximando el TTFT como dominado por el prefill del contexto:&lt;/p>
&lt;p>$$\text{TTFT}_{\text{antes}} \approx \frac{4000 \text{ tok}}{5000 \text{ tok/s}} = 0.80 \text{ s}$$&lt;/p>
&lt;p>Ahora comprimimos ese contexto a &lt;strong>1000 tokens&lt;/strong> ($k = 4$). El throughput de prefill no es constante con $C$ —baja un poco a contextos largos por el término cuadrático— pero, tomando la aproximación lineal conservadora de tokens/throughput:&lt;/p>
&lt;p>$$\text{TTFT}_{\text{después}} \approx \frac{1000 \text{ tok}}{5000 \text{ tok/s}} = 0.20 \text{ s}$$&lt;/p>
&lt;p>El TTFT cae de &lt;strong>0.80 s a 0.20 s&lt;/strong>, una reducción de $4\times$ en la parte lineal. Pero la cuenta de FLOPs es más favorable todavía en la componente de atención: esa parte del trabajo cae $\sim k^2 = 16\times$. En la práctica el TTFT total no cae 16× porque el coste no es puramente cuadrático a esta escala, pero la reducción real está &lt;strong>entre 4× y un valor mayor según cuánto pesara la atención&lt;/strong>, y el ahorro de cómputo agregado (lo que paga la factura eléctrica y libera la GPU para otra petición) es sustancialmente mayor que el simple 4× del recuento de tokens.&lt;/p>
&lt;p>El argumento se generaliza: &lt;strong>comprimir el contexto un factor $k$ reduce el TTFT al menos $\sim k\times$ y el coste de atención $\sim k^2\times$.&lt;/strong> Para un SLM, donde el TTFT es a menudo el SLA que importa, esto es la diferencia entre un asistente que responde al instante y uno que se siente lento.&lt;/p>
&lt;h2 id="las-cinco-palancas-para-resolver-la-tensión">Las cinco palancas para resolver la tensión&lt;/h2>
&lt;p>La estrategia no es &amp;ldquo;recuperar menos y conformarse&amp;rdquo;. Es &lt;strong>recuperar agresivamente del índice y luego destilar agresivamente lo recuperado&lt;/strong> antes de que llegue al SLM. Cinco palancas, en orden de aplicación dentro del pipeline.&lt;/p>
&lt;h3 id="1-reranking-agresivo-precisión-sobre-recall">1. Reranking agresivo: precisión sobre recall&lt;/h3>
&lt;p>El retriever inicial (denso, sparse o híbrido) optimiza &lt;strong>recall&lt;/strong>: trae 50–100 candidatos para no dejarse nada fuera. El reranker —un cross-encoder que ve la query y el documento juntos— optimiza &lt;strong>precisión&lt;/strong>: reordena esos candidatos y te quedas con los &lt;strong>3–5 mejores&lt;/strong>. Para un SLM esto no es un lujo, es estructural: como el modelo usa mal el contexto largo, cada chunk que entra debe &lt;strong>ganarse su sitio&lt;/strong>. Mejor 4 chunks de altísima relevancia que 15 mediocres. El detalle de retrieval híbrido y reranking está en &lt;a href="#ver-tambi%C3%A9n">Reranking e hybrid retrieval&lt;/a>; aquí basta con la regla: &lt;strong>maximiza recall en el retriever, maximiza precisión en el reranker, e inyecta pocos&lt;/strong>.&lt;/p>
&lt;h3 id="2-compresión-de-contexto-destilar-la-chuleta">2. Compresión de contexto: destilar la chuleta&lt;/h3>
&lt;p>Una vez tienes los mejores chunks, todavía contienen paja —frases de relleno, redundancia, contexto irrelevante a la query concreta. La &lt;strong>compresión de contexto&lt;/strong> los recorta antes de inyectarlos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Compresión extractiva&lt;/strong> (estilo LLMLingua / LongLLMLingua, Jiang et al. 2023): un modelo pequeño puntúa la &lt;em>perplejidad&lt;/em> o relevancia de cada token/frase respecto a la query y &lt;strong>elimina&lt;/strong> los de baja información, quedándose con el subconjunto extractivo más denso. Reduce tokens sin un segundo modelo generativo grande de por medio. LongLLMLingua añade reordenación consciente de la posición para mitigar &lt;em>lost in the middle&lt;/em>.&lt;/li>
&lt;li>&lt;strong>Compresión abstractiva&lt;/strong>: un modelo resume los chunks recuperados en un texto más corto. Más agresiva en reducción de tokens, pero introduce un paso generativo (coste y posible pérdida de fidelidad).&lt;/li>
&lt;li>&lt;strong>Soft prompts / context distillation&lt;/strong>: comprimir el contexto recuperado no a texto, sino a un puñado de &lt;strong>embeddings/soft tokens&lt;/strong> que el modelo consume directamente. Reduce el número de tokens de prefill al mínimo, a costa de un componente entrenado y específico del modelo.&lt;/li>
&lt;/ul>
&lt;p>El punto clave conecta con las matemáticas de arriba: &lt;strong>comprimir lo recuperado un factor $k$ reduce los tokens de prefill $\times k$, y por tanto el TTFT $\sim\times k$ y el coste de atención $\sim\times k^2$.&lt;/strong> Es la palanca con mejor retorno cuando el contexto largo es el cuello de botella.&lt;/p>
&lt;h3 id="3-prefix-caching-del-contexto-estable">3. Prefix caching del contexto estable&lt;/h3>
&lt;p>No todo el contexto cambia entre peticiones. Instrucciones de sistema, definiciones, documentos de referencia recurrentes, esquemas: son &lt;strong>prefijos estables&lt;/strong>. El &lt;strong>prefix caching&lt;/strong> guarda el KV cache ya computado de esos prefijos y lo reutiliza, de modo que el prefill solo procesa la parte nueva (la query y los chunks específicos). Si el 60 % de tu contexto es estable, te ahorras el 60 % del prefill de ese segmento en cada hit. Para que funcione, &lt;strong>el contexto estable debe ir al principio del prompt&lt;/strong> (el KV cache es prefijo-dependiente) y conviene maximizar el &lt;em>hit rate&lt;/em>; el detalle de ingeniería de hit rate está en &lt;a href="#ver-tambi%C3%A9n">Prefix cache hit rate&lt;/a>. Combina especialmente bien con RAG: documentos recuperados que se repiten entre sesiones se cachean una vez.&lt;/p>
&lt;h3 id="4-caché-semántico-de-respuestas">4. Caché semántico de respuestas&lt;/h3>
&lt;p>Una capa por delante del modelo: si una query es &lt;strong>semánticamente equivalente&lt;/strong> a una respondida antes (similitud de embeddings por encima de un umbral), devuelve la respuesta cacheada y &lt;strong>sáltate el modelo entero&lt;/strong> —retrieval, prefill y decode incluidos. En cargas reales con colas largas de preguntas repetidas o casi-repetidas (FAQ, soporte), el ahorro es enorme porque elimina el coste completo, no solo el de prefill. La trampa es el umbral: demasiado laxo y sirves respuestas equivocadas a preguntas parecidas-pero-distintas. El diseño está en &lt;a href="#ver-tambi%C3%A9n">Caché semántico para RAG&lt;/a>.&lt;/p>
&lt;h3 id="5-structured-output-y-function-calling-apoyarse-en-herramientas-no-en-memoria">5. Structured output y function calling: apoyarse en herramientas, no en memoria&lt;/h3>
&lt;p>La última palanca cambia de qué depende el SLM. En lugar de pedirle que &lt;strong>sepa&lt;/strong> un dato (su punto débil), haz que &lt;strong>llame a una herramienta&lt;/strong> que lo sabe: una consulta a base de datos, una API, una calculadora, un validador. El &lt;strong>structured output&lt;/strong> (forzar JSON conforme a un esquema) y el &lt;strong>function calling&lt;/strong> convierten al SLM en un orquestador que extrae argumentos del contexto y delega el cálculo o la consulta. Un SLM razonablemente capaz emite un &lt;em>tool call&lt;/em> bien formado mucho más fiablemente de lo que recuerda un hecho concreto. Esto reduce la presión sobre el conocimiento paramétrico &lt;strong>y&lt;/strong> sobre la recuperación: para datos estructurados y frescos (precios, inventario, estados), consultar bate a recuperar texto y a memorizar. Los fundamentos están en &lt;a href="#ver-tambi%C3%A9n">Structured output&lt;/a> y &lt;a href="#ver-tambi%C3%A9n">Function calling&lt;/a>.&lt;/p>
&lt;h2 id="el-pipeline-completo">El pipeline completo&lt;/h2>
&lt;p>Las cinco palancas no son alternativas: se encadenan. El flujo, con el contador de tokens cayendo en cada paso:&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 780 290" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Pipeline retrieve, rerank, comprimir, SLM con el contador de tokens cayendo">
&lt;defs>&lt;marker id="rag1" 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;p>&lt;text x="390" y="22" text-anchor="middle" font-size="15" font-weight="700" fill="currentColor">Recuperar agresivo, destilar agresivo, razonar barato&lt;/text>&lt;/p>
&lt;rect x="20" y="50" width="120" height="60" fill="#d4ecff" stroke="#1f5fa8" stroke-width="1.4"/>
&lt;text x="80" y="76" text-anchor="middle" font-size="12" font-weight="700" fill="#1f3550">Retriever&lt;/text>
&lt;text x="80" y="93" text-anchor="middle" font-size="11" fill="#1f3550">híbrido, recall&lt;/text>
&lt;text x="80" y="130" text-anchor="middle" font-size="12" font-weight="700" fill="#1f5fa8">~80 chunks&lt;/text>
&lt;rect x="180" y="50" width="120" height="60" fill="#e6d0ff" stroke="#5a2db0" stroke-width="1.4"/>
&lt;text x="240" y="76" text-anchor="middle" font-size="12" font-weight="700" fill="#3a1d70">Reranker&lt;/text>
&lt;text x="240" y="93" text-anchor="middle" font-size="11" fill="#3a1d70">precisión&lt;/text>
&lt;text x="240" y="130" text-anchor="middle" font-size="12" font-weight="700" fill="#5a2db0">5 chunks · 4000 tok&lt;/text>
&lt;rect x="340" y="50" width="120" height="60" fill="#fff4d6" stroke="#a48000" stroke-width="1.4"/>
&lt;text x="400" y="76" text-anchor="middle" font-size="12" font-weight="700" fill="#5a4500">Compresión&lt;/text>
&lt;text x="400" y="93" text-anchor="middle" font-size="11" fill="#5a4500">extractiva k=4&lt;/text>
&lt;text x="400" y="130" text-anchor="middle" font-size="12" font-weight="700" fill="#a48000">1000 tok&lt;/text>
&lt;rect x="500" y="50" width="120" height="60" fill="#cdebd0" stroke="#2a7a40" stroke-width="1.4"/>
&lt;text x="560" y="73" text-anchor="middle" font-size="12" font-weight="700" fill="#1c3a26">Prefix cache&lt;/text>
&lt;text x="560" y="90" text-anchor="middle" font-size="11" fill="#1c3a26">+ caché&lt;/text>
&lt;text x="560" y="103" text-anchor="middle" font-size="11" fill="#1c3a26">semántico&lt;/text>
&lt;text x="560" y="130" text-anchor="middle" font-size="12" font-weight="700" fill="#2a7a40">prefill mínimo&lt;/text>
&lt;rect x="660" y="50" width="100" height="60" fill="#f6caca" stroke="#a52a2a" stroke-width="1.4"/>
&lt;text x="710" y="73" text-anchor="middle" font-size="12" font-weight="700" fill="#6a1a1a">SLM&lt;/text>
&lt;text x="710" y="90" text-anchor="middle" font-size="11" fill="#6a1a1a">razona +&lt;/text>
&lt;text x="710" y="103" text-anchor="middle" font-size="11" fill="#6a1a1a">tool calls&lt;/text>
&lt;text x="710" y="130" text-anchor="middle" font-size="12" font-weight="700" fill="#a52a2a">respuesta&lt;/text>
&lt;path d="M140,80 L180,80" stroke="currentColor" stroke-width="1.6" fill="none" marker-end="url(#rag1)"/>
&lt;path d="M300,80 L340,80" stroke="currentColor" stroke-width="1.6" fill="none" marker-end="url(#rag1)"/>
&lt;path d="M460,80 L500,80" stroke="currentColor" stroke-width="1.6" fill="none" marker-end="url(#rag1)"/>
&lt;path d="M620,80 L660,80" stroke="currentColor" stroke-width="1.6" fill="none" marker-end="url(#rag1)"/>
&lt;p>&lt;text x="390" y="180" text-anchor="middle" font-size="13" font-weight="700" fill="currentColor">El contador de tokens de prefill cae a lo largo del pipeline&lt;/text>
&lt;rect x="100" y="200" width="560" height="22" fill="none" stroke="currentColor" stroke-width="1"/>
&lt;rect x="100" y="200" width="560" height="22" fill="#d4ecff"/>
&lt;rect x="240" y="200" width="280" height="22" fill="#fff4d6"/>
&lt;rect x="240" y="200" width="70" height="22" fill="#cdebd0"/>
&lt;text x="180" y="216" text-anchor="middle" font-size="11" fill="#1f3550">retrieve: mucho&lt;/text>
&lt;text x="380" y="216" text-anchor="middle" font-size="11" fill="#5a4500">rerank: 4000 tok&lt;/text>
&lt;text x="275" y="216" text-anchor="middle" font-size="11" fill="#1c3a26">1000&lt;/text>&lt;/p>
&lt;p>&lt;text x="390" y="252" text-anchor="middle" font-size="12" fill="currentColor">TTFT en RTX 4090 a ~5000 tok/s · 4000 tok = 0.80 s → 1000 tok = 0.20 s&lt;/text>
&lt;text x="390" y="272" text-anchor="middle" font-size="11" fill="currentColor">atención cae ~k² = 16× en esa parte del cómputo&lt;/text>
&lt;/svg>&lt;/p>
&lt;/div>
&lt;p>El orden importa. Recuperar agresivo (recall alto) &lt;strong>antes&lt;/strong> de filtrar garantiza que el material correcto está entre los candidatos; rerankear y comprimir &lt;strong>después&lt;/strong> garantiza que solo lo denso y relevante paga el peaje del prefill; cachear envuelve todo para no repetir trabajo. El SLM solo ve la chuleta final, corta y ordenada.&lt;/p>
&lt;h2 id="implicaciones-para-inferencia-on-premise">Implicaciones para inferencia on-premise&lt;/h2>
&lt;p>La trampa mental a evitar: tratar el SLM como un modelo grande con menos calidad. No lo es. Es un &lt;strong>perfil de coste distinto&lt;/strong> que premia un diseño distinto. Tres consecuencias prácticas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>El presupuesto de tokens es un recurso de primera clase.&lt;/strong> Con un modelo grande de 128K de ventana, &amp;ldquo;meter un poco más&amp;rdquo; es barato relativo al modelo. Con un SLM, cada token de contexto se nota en el TTFT y en la calidad. Trata el tamaño del contexto como una cantidad a &lt;strong>minimizar bajo restricción de cubrir la respuesta&lt;/strong>, no a maximizar.&lt;/li>
&lt;li>&lt;strong>La inversión vale la pena precisamente porque el modelo es barato.&lt;/strong> Reranker, compresor y cachés añaden complejidad, pero el modelo que sirven es lo suficientemente económico como para correr muchas réplicas. El cuello de botella se desplaza del modelo al pipeline de datos, que es justo donde quieres que esté.&lt;/li>
&lt;li>&lt;strong>Recuperar no sustituye a adaptar; se combinan.&lt;/strong> Para conocimiento de dominio profundo y recurrente, adaptar el SLM con LoRA (ver el hermano &lt;a href="https://blog.lo0.es/posts/qlora-multi-lora-agresivo-slm/">QLoRA y multi-LoRA agresivo&lt;/a>) puede meter parte del conocimiento &amp;ldquo;en los pesos&amp;rdquo; de forma barata, reduciendo lo que hay que recuperar. RAG agresivo y adaptación agresiva no compiten: la primera da frescura y citabilidad, la segunda da fluidez y formato de dominio. El diseño bueno usa ambas.&lt;/li>
&lt;/ul>
&lt;h3 id="en-la-rtx-4090-24-gb-ada-lovelace">En la RTX 4090 (24 GB, Ada Lovelace)&lt;/h3>
&lt;p>El escenario canónico: un SLM cuantizado (4B–8B en INT4/FP8) cabe holgado, dejando VRAM para un KV cache generoso —imprescindible para el prefix caching— y para el reranker (un cross-encoder de unos cientos de MB). El compresor extractivo tipo LLMLingua corre en un modelo pequeño aparte o en CPU. El cálculo de TTFT de arriba (0.80 s → 0.20 s comprimiendo 4× a ~5000 tok/s) es representativo de esta tarjeta. La regla de pulgar: si el TTFT se va por encima de tu SLA, &lt;strong>el primer ajuste es comprimir el contexto, no cambiar de modelo&lt;/strong>.&lt;/p>
&lt;h3 id="en-un-cluster-genérico-4h100-sxm-320-gb-nvlink-fp8-nativo">En un cluster genérico 4×H100 SXM (320 GB, NVLink, FP8 nativo)&lt;/h3>
&lt;p>Con 320 GB y FP8 nativo el prefill es mucho más rápido, así que la tentación es relajar la disciplina de tokens. No conviene del todo: la palanca cambia de &lt;strong>TTFT&lt;/strong> a &lt;strong>throughput agregado&lt;/strong>. Comprimir el contexto no solo acelera cada petición sino que &lt;strong>libera cómputo de prefill&lt;/strong> para servir más peticiones por GPU —el prefill compute-bound es exactamente el recurso que satura primero bajo carga. Aquí el prefix caching y el caché semántico, compartidos entre réplicas, son los que más rinden: a alto QPS, el trabajo de prefill que evitas cachear es throughput puro que ganas. El SLM sigue siendo el motor de razonamiento barato; la diferencia es que ahora corres muchos en paralelo y el pipeline de datos es lo que decide cuántas peticiones caben.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto">Lo que no hemos cubierto&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Evaluación de la compresión&lt;/strong>: cómo medir que comprimir $k=4$ no tira respuestas correctas (faithfulness, answer recall sobre un set de preguntas con ground truth).&lt;/li>
&lt;li>&lt;strong>Compresión consciente de la query frente a agnóstica&lt;/strong>: comprimir antes o después de conocer la pregunta cambia qué se puede cachear y qué se puede tirar.&lt;/li>
&lt;li>&lt;strong>Chunking y granularidad&lt;/strong>: el tamaño de chunk interactúa con el reranking y la compresión; queda para el post de curación de corpus.&lt;/li>
&lt;li>&lt;strong>Multi-hop y agentes&lt;/strong>: cuando una pregunta requiere varias rondas de recuperación, el presupuesto de tokens se reparte entre hops y la disciplina de compresión se vuelve crítica.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/rag-reranker-hybrid-retrieval-fundamentos/">Reranking e hybrid retrieval para RAG&lt;/a> — la palanca 1 en detalle: maximizar recall en el retriever y precisión en el reranker para inyectar pocos chunks pero excelentes, que es lo que un SLM necesita.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">Curación del corpus para RAG&lt;/a> — un corpus limpio y bien chunked reduce la paja que el compresor tiene que eliminar; la calidad de la chuleta empieza aguas arriba.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/semantic-cache-rag/">Caché semántico para RAG&lt;/a> — la palanca 4: saltarse el modelo entero cuando una query es semánticamente equivalente a una ya respondida.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/embeddings-modelos-2026-dense-sparse-multivector/">Embeddings 2026: dense, sparse y multivector&lt;/a> — la base del retrieval híbrido y del umbral del caché semántico; qué representación recupera mejor con menos ruido.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prefix-cache-hit-rate-engineering/">Ingeniería del prefix cache hit rate&lt;/a> — la palanca 3: cómo estructurar el prompt (contexto estable primero) para maximizar la reutilización del KV cache del contexto recuperado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prefill-optimizaciones-vllm/">Optimizaciones de prefill en vLLM&lt;/a> — el prefill compute-bound es el coste que toda esta discusión intenta minimizar; aquí están los parámetros concretos para acelerarlo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/structured-output-fundamentos/">Structured output: fundamentos&lt;/a> — la palanca 5: forzar JSON conforme a esquema para que el SLM orqueste herramientas en vez de recordar datos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/function-calling-tool-augmented-retrieval/">Function calling y recuperación aumentada con herramientas&lt;/a> — cuando consultar una API o base de datos bate a recuperar texto y a memorizar; el SLM como orquestador de tools.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/roofline-invertido-modelos-pequenos/">El roofline se invierte en modelos pequeños&lt;/a> — por qué el prefill compute-bound es el cuello de botella que da forma a todo este post: meter más contexto no es gratis.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/qlora-multi-lora-agresivo-slm/">QLoRA y multi-LoRA agresivo en SLM&lt;/a> — la alternativa complementaria: adaptar el SLM por dominio para meter parte del conocimiento &amp;ldquo;en los pesos&amp;rdquo; y reducir lo que hay que recuperar.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>Lewis, P., et al. &lt;em>Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&lt;/em>. NeurIPS 2020. &lt;a href="https://arxiv.org/abs/2005.11401">https://arxiv.org/abs/2005.11401&lt;/a>&lt;/li>
&lt;li>Liu, N.F., et al. &lt;em>Lost in the Middle: How Language Models Use Long Contexts&lt;/em>. TACL 2024. &lt;a href="https://arxiv.org/abs/2307.03172">https://arxiv.org/abs/2307.03172&lt;/a>&lt;/li>
&lt;li>Jiang, H., et al. &lt;em>LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models&lt;/em>. EMNLP 2023. &lt;a href="https://arxiv.org/abs/2310.05736">https://arxiv.org/abs/2310.05736&lt;/a>&lt;/li>
&lt;li>Jiang, H., et al. &lt;em>LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression&lt;/em>. ACL 2024. &lt;a href="https://arxiv.org/abs/2310.06839">https://arxiv.org/abs/2310.06839&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>