Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Inferencia con LLMs","local":"inference-with-llms","sections":[{"title":"Entender lo básico","local":"entender-lo-básico","sections":[],"depth":2},{"title":"El papel de la atención","local":"el-papel-de-la-atención","sections":[{"title":"Longitud de contexto y span de atención","local":"longitud-de-contexto-y-span-de-atención","sections":[],"depth":3},{"title":"El arte del prompting","local":"el-arte-del-prompting","sections":[],"depth":3}],"depth":2},{"title":"El proceso de inferencia en dos fases","local":"el-proceso-de-inferencia-en-dos-fases","sections":[{"title":"La fase de prefill","local":"la-fase-de-prefill","sections":[],"depth":3},{"title":"La fase de decode","local":"la-fase-de-decode","sections":[],"depth":3}],"depth":2},{"title":"Estrategias de muestreo","local":"estrategias-de-muestreo","sections":[{"title":"De probabilidades a elecciones de tokens","local":"de-probabilidades-a-elecciones-de-tokens","sections":[],"depth":3},{"title":"Gestionar la repetición: mantener la salida fresca","local":"gestionar-la-repetición-mantener-la-salida-fresca","sections":[],"depth":3},{"title":"Controlar la longitud de generación: poner límites","local":"controlar-la-longitud-de-generación-poner-límites","sections":[],"depth":3},{"title":"Beam search: mirar por adelantado para ganar coherencia","local":"beam-search-mirar-por-adelantado-para-ganar-coherencia","sections":[],"depth":3}],"depth":2},{"title":"Desafíos prácticos y optimización","local":"desafíos-prácticos-y-optimización","sections":[{"title":"Métricas clave de rendimiento","local":"métricas-clave-de-rendimiento","sections":[],"depth":3},{"title":"El reto de la longitud de contexto","local":"el-reto-de-la-longitud-de-contexto","sections":[],"depth":3},{"title":"La optimización con caché KV","local":"la-optimización-con-caché-kv","sections":[],"depth":3}],"depth":2},{"title":"Conclusión","local":"conclusión","sections":[],"depth":2}],"depth":1}"> | |
| <link href="/docs/course/pr_1213/es/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/entry/start.36d27295.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/scheduler.505acc25.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/singletons.6865fa96.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/index.001f95d5.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/paths.ec28c642.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/entry/app.3b43d7f3.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/preload-helper.8c2bab6b.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/index.e22abd30.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/nodes/0.e2c0ea78.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/nodes/12.a50be0e4.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.a144e953.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/Youtube.7545e4b1.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/CourseFloatingBanner.f0a2dc21.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"Inferencia con LLMs","local":"inference-with-llms","sections":[{"title":"Entender lo básico","local":"entender-lo-básico","sections":[],"depth":2},{"title":"El papel de la atención","local":"el-papel-de-la-atención","sections":[{"title":"Longitud de contexto y span de atención","local":"longitud-de-contexto-y-span-de-atención","sections":[],"depth":3},{"title":"El arte del prompting","local":"el-arte-del-prompting","sections":[],"depth":3}],"depth":2},{"title":"El proceso de inferencia en dos fases","local":"el-proceso-de-inferencia-en-dos-fases","sections":[{"title":"La fase de prefill","local":"la-fase-de-prefill","sections":[],"depth":3},{"title":"La fase de decode","local":"la-fase-de-decode","sections":[],"depth":3}],"depth":2},{"title":"Estrategias de muestreo","local":"estrategias-de-muestreo","sections":[{"title":"De probabilidades a elecciones de tokens","local":"de-probabilidades-a-elecciones-de-tokens","sections":[],"depth":3},{"title":"Gestionar la repetición: mantener la salida fresca","local":"gestionar-la-repetición-mantener-la-salida-fresca","sections":[],"depth":3},{"title":"Controlar la longitud de generación: poner límites","local":"controlar-la-longitud-de-generación-poner-límites","sections":[],"depth":3},{"title":"Beam search: mirar por adelantado para ganar coherencia","local":"beam-search-mirar-por-adelantado-para-ganar-coherencia","sections":[],"depth":3}],"depth":2},{"title":"Desafíos prácticos y optimización","local":"desafíos-prácticos-y-optimización","sections":[{"title":"Métricas clave de rendimiento","local":"métricas-clave-de-rendimiento","sections":[],"depth":3},{"title":"El reto de la longitud de contexto","local":"el-reto-de-la-longitud-de-contexto","sections":[],"depth":3},{"title":"La optimización con caché KV","local":"la-optimización-con-caché-kv","sections":[],"depth":3}],"depth":2},{"title":"Conclusión","local":"conclusión","sections":[],"depth":2}],"depth":1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg></button></div> </div> <h1 class="relative group"><a id="inference-with-llms" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#inference-with-llms"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Inferencia con LLMs</span></h1> <div class="flex space-x-1 absolute z-10 right-0 top-0" style=""><a href="https://discuss.huggingface.co/t/chapter-1-questions" target="_blank"><img alt="Ask a Question" class="!m-0" src="https://img.shields.io/badge/Ask%20a%20question-ffcb4c.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTEgMTA0IDEwNiI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMyMzFmMjA7fS5jbHMtMntmaWxsOiNmZmY5YWU7fS5jbHMtM3tmaWxsOiMwMGFlZWY7fS5jbHMtNHtmaWxsOiMwMGE5NGY7fS5jbHMtNXtmaWxsOiNmMTVkMjI7fS5jbHMtNntmaWxsOiNlMzFiMjM7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5EaXNjb3Vyc2VfbG9nbzwvdGl0bGU+PGcgaWQ9IkxheWVyXzIiPjxnIGlkPSJMYXllcl8zIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MS44NywwQzIzLjcxLDAsMCwyMi44MywwLDUxYzAsLjkxLDAsNTIuODEsMCw1Mi44MWw1MS44Ni0uMDVjMjguMTYsMCw1MS0yMy43MSw1MS01MS44N1M4MCwwLDUxLjg3LDBaIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNTIuMzcsMTkuNzRBMzEuNjIsMzEuNjIsMCwwLDAsMjQuNTgsNjYuNDFsLTUuNzIsMTguNEwzOS40LDgwLjE3YTMxLjYxLDMxLjYxLDAsMSwwLDEzLTYwLjQzWiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTc3LjQ1LDMyLjEyYTMxLjYsMzEuNiwwLDAsMS0zOC4wNSw0OEwxOC44Niw4NC44MmwyMC45MS0yLjQ3QTMxLjYsMzEuNiwwLDAsMCw3Ny40NSwzMi4xMloiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik03MS42MywyNi4yOUEzMS42LDMxLjYsMCwwLDEsMzguOCw3OEwxOC44Niw4NC44MiwzOS40LDgwLjE3QTMxLjYsMzEuNiwwLDAsMCw3MS42MywyNi4yOVoiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik0yNi40Nyw2Ny4xMWEzMS42MSwzMS42MSwwLDAsMSw1MS0zNUEzMS42MSwzMS42MSwwLDAsMCwyNC41OCw2Ni40MWwtNS43MiwxOC40WiIvPjxwYXRoIGNsYXNzPSJjbHMtNiIgZD0iTTI0LjU4LDY2LjQxQTMxLjYxLDMxLjYxLDAsMCwxLDcxLjYzLDI2LjI5YTMxLjYxLDMxLjYxLDAsMCwwLTQ5LDM5LjYzbC0zLjc2LDE4LjlaIi8+PC9nPjwvZz48L3N2Zz4="></a> </div> <iframe class="w-full xl:w-4/6 h-80" src="https://www.youtube-nocookie.com/embed/Xp2w1_LKZN4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p data-svelte-h="svelte-1y1bogj">Hasta ahora hemos explorado la arquitectura Transformer en relación con una serie de tareas discretas, como clasificación de texto o resumen. Sin embargo, el uso más habitual de los Large Language Models es la generación de texto, y eso es lo que exploraremos en este capítulo.</p> <p data-svelte-h="svelte-1v1xyk9">En esta página veremos los conceptos centrales detrás de la inferencia con LLM, con una explicación más completa de cómo generan texto estos modelos y de cuáles son los componentes clave que intervienen en el proceso.</p> <h2 class="relative group"><a id="entender-lo-básico" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#entender-lo-básico"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Entender lo básico</span></h2> <p data-svelte-h="svelte-fjwnlj">Empecemos por los fundamentos. La inferencia es el proceso de usar un LLM entrenado para generar texto parecido al humano a partir de un prompt de entrada. Los modelos de lenguaje usan el conocimiento adquirido durante el entrenamiento para formular respuestas un token cada vez.</p> <p data-svelte-h="svelte-1suvebz">El modelo aprovecha probabilidades aprendidas a partir de miles de millones de parámetros para predecir y generar el siguiente token de una secuencia. Esa generación secuencial es lo que permite a los LLM producir texto coherente y relevante en contexto.</p> <h2 class="relative group"><a id="el-papel-de-la-atención" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#el-papel-de-la-atención"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>El papel de la atención</span></h2> <p data-svelte-h="svelte-5qghqg">El mecanismo de atención es lo que da a los LLM la capacidad de entender el contexto y generar respuestas coherentes. Cuando el modelo predice la siguiente palabra, no todas las palabras de una frase tienen el mismo peso. Por ejemplo, en la frase <em>“La capital de Francia es …”</em>, las palabras “Francia” y “capital” son decisivas para inferir que la siguiente palabra debería ser “París”. Esa capacidad de centrarse en la información relevante es lo que llamamos atención.</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/AttentionSceneFinal.gif" alt="Visualización del mecanismo de atención" width="60%"> <p data-svelte-h="svelte-z9fte4">Este proceso de identificar las palabras más relevantes para predecir el siguiente token ha demostrado ser extremadamente efectivo. Aunque el principio básico del entrenamiento de LLM, predecir el siguiente token, se ha mantenido razonablemente constante desde BERT y GPT-2, ha habido avances importantes en cómo escalar redes neuronales y en cómo hacer que el mecanismo de atención funcione con secuencias cada vez más largas y a costes cada vez menores.</p> <blockquote class="tip" data-svelte-h="svelte-yxfp4z"><p>En resumen, el mecanismo de atención es la clave de que los LLM puedan generar texto coherente y sensible al contexto. Es una de las diferencias fundamentales entre los LLM modernos y generaciones anteriores de modelos de lenguaje.</p></blockquote> <h3 class="relative group"><a id="longitud-de-contexto-y-span-de-atención" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#longitud-de-contexto-y-span-de-atención"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Longitud de contexto y span de atención</span></h3> <p data-svelte-h="svelte-v5xqkv">Ahora que entendemos la atención, veamos cuánto contexto puede manejar realmente un LLM. Eso nos lleva a la longitud de contexto, o el “span de atención” del modelo.</p> <p data-svelte-h="svelte-i2z097">La longitud de contexto se refiere al número máximo de tokens, ya sean palabras completas o fragmentos de palabras, que el LLM puede procesar de una vez. Puedes pensar en ello como el tamaño de la memoria de trabajo del modelo.</p> <p data-svelte-h="svelte-1e3b5ur">Estas capacidades están limitadas por varios factores prácticos:</p> <ul data-svelte-h="svelte-1wqhsgm"><li>La arquitectura y el tamaño del modelo.</li> <li>Los recursos computacionales disponibles.</li> <li>La complejidad de la entrada y de la salida que queremos generar.</li></ul> <p data-svelte-h="svelte-serngq">En un mundo ideal, podríamos pasar al modelo un contexto ilimitado, pero las limitaciones de hardware y los costes computacionales lo vuelven impracticable. Por eso distintos modelos se diseñan con longitudes de contexto diferentes para equilibrar capacidad y eficiencia.</p> <blockquote class="tip" data-svelte-h="svelte-cfhq7h"><p>La longitud de contexto es el número máximo de tokens que el modelo puede tener en cuenta al mismo tiempo cuando genera una respuesta.</p></blockquote> <h3 class="relative group"><a id="el-arte-del-prompting" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#el-arte-del-prompting"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>El arte del prompting</span></h3> <p data-svelte-h="svelte-12gbj7w">Cuando pasamos información a un LLM, estructuramos la entrada de una forma que guíe la generación hacia la salida deseada. A eso lo llamamos <em>prompting</em>.</p> <p data-svelte-h="svelte-1tv3eac">Entender cómo procesan la información los LLM nos ayuda a construir mejores prompts. Como la tarea principal del modelo es predecir el siguiente token analizando la importancia de cada token de entrada, la redacción exacta de la secuencia de entrada se vuelve crucial.</p> <blockquote class="tip" data-svelte-h="svelte-3m0pea"><p>Diseñar con cuidado el prompt facilita <strong>guiar la generación del LLM hacia la salida que queremos obtener</strong>.</p></blockquote> <h2 class="relative group"><a id="el-proceso-de-inferencia-en-dos-fases" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#el-proceso-de-inferencia-en-dos-fases"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>El proceso de inferencia en dos fases</span></h2> <p data-svelte-h="svelte-1ek2kkc">Ahora que entendemos los componentes básicos, veamos cómo generan texto realmente los LLM. El proceso puede dividirse en dos fases principales: prefill y decode. Puedes pensar en ellas como una cadena de montaje en la que cada fase cumple un papel clave para producir texto coherente.</p> <h3 class="relative group"><a id="la-fase-de-prefill" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#la-fase-de-prefill"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>La fase de prefill</span></h3> <p data-svelte-h="svelte-18b3kl0">La fase de prefill es como la etapa de preparación en una cocina: es donde se procesan todos los ingredientes iniciales y se dejan listos. Esta fase incluye tres pasos importantes:</p> <ol data-svelte-h="svelte-134mewf"><li><strong>Tokenización</strong>: convertir el texto de entrada en tokens, que son las unidades básicas que entiende el modelo.</li> <li><strong>Conversión a embeddings</strong>: transformar esos tokens en representaciones numéricas que capturan su significado.</li> <li><strong>Procesamiento inicial</strong>: pasar esos embeddings por las redes neuronales del modelo para construir una comprensión rica del contexto.</li></ol> <p data-svelte-h="svelte-f5ie9c">Esta fase es intensiva en cómputo porque necesita procesar todos los tokens de entrada a la vez. Es parecido a leer y comprender un párrafo completo antes de empezar a redactar una respuesta.</p> <p data-svelte-h="svelte-n7vj0k">Puedes experimentar con diferentes tokenizadores en el playground interactivo de abajo:</p> <iframe src="https://agents-course-the-tokenizer-playground.static.hf.space" frameborder="0" width="850" height="450"></iframe> <h3 class="relative group"><a id="la-fase-de-decode" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#la-fase-de-decode"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>La fase de decode</span></h3> <p data-svelte-h="svelte-44uppa">Una vez que la fase de prefill ha procesado la entrada, pasamos a la fase de decode, que es donde ocurre la generación real de texto. El modelo genera un token cada vez en un proceso autorregresivo, es decir, cada token nuevo depende de todos los tokens anteriores.</p> <p data-svelte-h="svelte-1ml6vw9">La fase de decode incluye varios pasos que se repiten para cada nuevo token:</p> <ol data-svelte-h="svelte-m7r7ar"><li><strong>Cálculo de atención</strong>: mirar hacia atrás a todos los tokens previos para entender el contexto.</li> <li><strong>Cálculo de probabilidades</strong>: determinar la probabilidad de cada posible siguiente token.</li> <li><strong>Selección del token</strong>: elegir el siguiente token basándose en esas probabilidades.</li> <li><strong>Comprobación de continuación</strong>: decidir si la generación debe seguir o detenerse.</li></ol> <p data-svelte-h="svelte-145l4rp">Esta fase es intensiva en memoria porque el modelo necesita conservar el rastro de todos los tokens generados anteriormente y de sus relaciones.</p> <h2 class="relative group"><a id="estrategias-de-muestreo" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#estrategias-de-muestreo"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Estrategias de muestreo</span></h2> <p data-svelte-h="svelte-1g59y2h">Ahora que entendemos cómo genera texto el modelo, podemos explorar distintas maneras de controlar ese proceso. Igual que una persona que escribe puede optar por ser más creativa o más precisa, nosotros también podemos ajustar cómo el modelo selecciona tokens.</p> <p data-svelte-h="svelte-srdozf">Puedes interactuar tú mismo con el proceso básico de decodificación con SmolLM2 en este Space. Recuerda que el modelo decodifica hasta llegar al token de fin de secuencia, que para este modelo es <strong><|im_end|></strong>:</p> <iframe src="https://agents-course-decoding-visualizer.hf.space" frameborder="0" width="850" height="450"></iframe> <h3 class="relative group"><a id="de-probabilidades-a-elecciones-de-tokens" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#de-probabilidades-a-elecciones-de-tokens"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>De probabilidades a elecciones de tokens</span></h3> <p data-svelte-h="svelte-28snrb">Cuando el modelo necesita elegir el siguiente token, empieza con probabilidades sin normalizar, llamadas logits, para cada palabra de su vocabulario. ¿Cómo convertimos esas probabilidades en una elección concreta? Veámoslo paso a paso:</p> <p data-svelte-h="svelte-1sebdze"><img src="https://huggingface.co/reasoning-course/images/resolve/main/inference/1.png" alt="image"></p> <ol data-svelte-h="svelte-h9813m"><li><strong>Raw logits</strong>: puedes pensar en ellos como la intuición inicial del modelo sobre qué palabra debería venir después.</li> <li><strong>Temperature</strong>: actúa como un control de creatividad. Valores altos, mayores que 1.0, hacen las elecciones más aleatorias y creativas; valores bajos, menores que 1.0, las hacen más deterministas y enfocadas.</li> <li><strong>Top-p (nucleus sampling)</strong>: en lugar de considerar todas las palabras posibles, solo se consideran las más probables hasta alcanzar un umbral de probabilidad acumulada, por ejemplo el 90%.</li> <li><strong>Top-k</strong>: es una alternativa en la que solo se tienen en cuenta las <code>k</code> palabras más probables.</li></ol> <h3 class="relative group"><a id="gestionar-la-repetición-mantener-la-salida-fresca" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#gestionar-la-repetición-mantener-la-salida-fresca"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Gestionar la repetición: mantener la salida fresca</span></h3> <p data-svelte-h="svelte-1ha65gt">Un reto frecuente de los LLM es su tendencia a repetirse, un poco como una persona que vuelve una y otra vez al mismo punto. Para evitarlo, se usan dos tipos de penalizaciones:</p> <ol data-svelte-h="svelte-1g38sr0"><li><strong>Presence penalty</strong>: aplica una penalización fija a cualquier token que ya haya aparecido antes, independientemente de cuántas veces haya aparecido.</li> <li><strong>Frequency penalty</strong>: aplica una penalización creciente según la frecuencia de aparición de ese token. Cuantas más veces aparece una palabra, menos probable es que vuelva a elegirse.</li></ol> <p data-svelte-h="svelte-1lk0dqv"><img src="https://huggingface.co/reasoning-course/images/resolve/main/inference/2.png" alt="image"></p> <p data-svelte-h="svelte-1h86m3c">Estas penalizaciones se aplican pronto en el proceso de selección del token, ajustando las probabilidades iniciales antes de aplicar otras estrategias de muestreo. Puedes pensar en ellas como pequeños empujones para animar al modelo a explorar vocabulario nuevo.</p> <h3 class="relative group"><a id="controlar-la-longitud-de-generación-poner-límites" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#controlar-la-longitud-de-generación-poner-límites"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Controlar la longitud de generación: poner límites</span></h3> <p data-svelte-h="svelte-5t070r">Igual que una buena historia necesita un ritmo y una longitud adecuados, necesitamos mecanismos para controlar cuánto texto genera un LLM. Esto es importante en aplicaciones reales, tanto si queremos una respuesta del tamaño de un tuit como una entrada completa de blog.</p> <p data-svelte-h="svelte-gbqk7z">Podemos controlar la longitud de varias formas:</p> <ol data-svelte-h="svelte-i5gups"><li><strong>Límites de tokens</strong>: definir mínimos y máximos de tokens.</li> <li><strong>Secuencias de parada</strong>: definir patrones específicos que indiquen el final de la generación.</li> <li><strong>Detección de fin de secuencia</strong>: dejar que el modelo cierre de forma natural su respuesta.</li></ol> <p data-svelte-h="svelte-wuyzgv">Por ejemplo, si queremos generar un solo párrafo, podríamos fijar un máximo de 100 tokens y usar <code>"\n\n"</code> como secuencia de parada. Así la salida se mantiene acotada y adecuada a su propósito.</p> <p data-svelte-h="svelte-dm4r1s"><img src="https://huggingface.co/reasoning-course/images/resolve/main/inference/3.png" alt="image"></p> <h3 class="relative group"><a id="beam-search-mirar-por-adelantado-para-ganar-coherencia" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#beam-search-mirar-por-adelantado-para-ganar-coherencia"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Beam search: mirar por adelantado para ganar coherencia</span></h3> <p data-svelte-h="svelte-s33t5o">Mientras que las estrategias anteriores toman decisiones token a token, beam search adopta una visión más global. En vez de comprometerse con una sola opción en cada paso, explora varios caminos posibles a la vez, como una persona jugando ajedrez que piensa varias jugadas por adelantado.</p> <p data-svelte-h="svelte-vqpudp"><img src="https://huggingface.co/reasoning-course/images/resolve/main/inference/4.png" alt="image"></p> <p data-svelte-h="svelte-1vy2u4q">Así es como funciona:</p> <ol data-svelte-h="svelte-1bg0v61"><li>En cada paso se mantienen varias secuencias candidatas, normalmente entre 5 y 10.</li> <li>Para cada candidata se calculan las probabilidades del siguiente token.</li> <li>Solo se conservan las combinaciones más prometedoras de secuencias y siguientes tokens.</li> <li>El proceso continúa hasta alcanzar la longitud deseada o una condición de parada.</li> <li>Al final se selecciona la secuencia con mayor probabilidad global.</li></ol> <p data-svelte-h="svelte-3yvpik">Puedes explorar beam search de forma visual aquí:</p> <iframe src="https://agents-course-beam-search-visualizer.hf.space" frameborder="0" width="850" height="450"></iframe> <p data-svelte-h="svelte-1r1jv4p">Este enfoque suele producir texto más coherente y gramaticalmente correcto, aunque requiere más recursos computacionales que métodos más simples.</p> <h2 class="relative group"><a id="desafíos-prácticos-y-optimización" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#desafíos-prácticos-y-optimización"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Desafíos prácticos y optimización</span></h2> <p data-svelte-h="svelte-r9ib00">Ahora que cerramos esta exploración de la inferencia con LLM, veamos los desafíos prácticos que aparecen al desplegar estos modelos y cómo medir y optimizar su rendimiento.</p> <h3 class="relative group"><a id="métricas-clave-de-rendimiento" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#métricas-clave-de-rendimiento"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Métricas clave de rendimiento</span></h3> <p data-svelte-h="svelte-x1e2rg">Cuando trabajas con LLM, hay cuatro métricas críticas que condicionan muchas decisiones de implementación:</p> <ol data-svelte-h="svelte-1t891q2"><li><strong>Time to First Token (TTFT)</strong>: cuánto tarda en llegar el primer token. Es crucial para la experiencia de usuario y depende principalmente de la fase de prefill.</li> <li><strong>Time Per Output Token (TPOT)</strong>: cuán rápido se generan los tokens posteriores. Determina la velocidad global de generación.</li> <li><strong>Throughput</strong>: cuántas peticiones puedes atender simultáneamente. Afecta tanto a la escalabilidad como a la eficiencia de costes.</li> <li><strong>VRAM Usage</strong>: cuánta memoria de GPU necesitas. En muchas aplicaciones reales, este acaba siendo el principal cuello de botella.</li></ol> <h3 class="relative group"><a id="el-reto-de-la-longitud-de-contexto" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#el-reto-de-la-longitud-de-contexto"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>El reto de la longitud de contexto</span></h3> <p data-svelte-h="svelte-jtyxh6">Uno de los mayores desafíos de la inferencia con LLM es gestionar bien la longitud de contexto. Los contextos largos aportan más información, pero vienen acompañados de costes importantes:</p> <ul data-svelte-h="svelte-prrl0f"><li><strong>Uso de memoria</strong>: crece de forma cuadrática con la longitud del contexto.</li> <li><strong>Velocidad de procesamiento</strong>: disminuye a medida que crece el contexto.</li> <li><strong>Asignación de recursos</strong>: exige equilibrar con cuidado el uso de VRAM.</li></ul> <p data-svelte-h="svelte-12ytc0d">Modelos recientes como <a href="https://huggingface.co/Qwen/Qwen2.5-14B-Instruct-1M" rel="nofollow">Qwen2.5-1M</a> ofrecen ventanas de contexto de hasta 1 millón de tokens, pero a costa de tiempos de inferencia mucho más lentos. La clave está en encontrar el equilibrio correcto para tu caso de uso.</p> <div style="max-width: 800px; margin: 20px auto; padding: 20px; font-family: system-ui;" data-svelte-h="svelte-11qbbw1"><div style="border: 2px solid #ddd; border-radius: 8px; padding: 20px; margin-bottom: 20px;"><div style="display: flex; align-items: center; margin-bottom: 15px;"><div style="flex: 1; text-align: center; padding: 10px; background: #f0f0f0; border-radius: 4px;">Texto de entrada (en bruto)</div> <div style="margin: 0 10px;">→</div> <div style="flex: 1; text-align: center; padding: 10px; background: #e1f5fe; border-radius: 4px;">Entrada tokenizada</div></div> <div style="display: flex; margin-bottom: 15px;"><div style="flex: 1; border: 1px solid #ccc; padding: 10px; margin: 5px; background: #e8f5e9; border-radius: 4px; text-align: center;">Ventana de contexto<br>(por ejemplo, 4K tokens) | |
| <div style="display: flex; margin-top: 10px;"><div style="flex: 1; background: #81c784; margin: 2px; height: 20px; border-radius: 2px;"></div> <div style="flex: 1; background: #81c784; margin: 2px; height: 20px; border-radius: 2px;"></div> <div style="flex: 1; background: #81c784; margin: 2px; height: 20px; border-radius: 2px;"></div> <div style="flex: 1; background: #81c784; margin: 2px; height: 20px; border-radius: 2px;"></div></div></div></div> <div style="display: flex; justify-content: space-between; text-align: center; font-size: 0.9em; color: #666;"><div style="flex: 1;"><div style="border: 1px solid #ffcc80; padding: 8px; margin: 5px; background: #fff3e0; border-radius: 4px;">Uso de memoria<br>∝ Longitud²</div></div> <div style="flex: 1;"><div style="border: 1px solid #90caf9; padding: 8px; margin: 5px; background: #e3f2fd; border-radius: 4px;">Tiempo de procesamiento<br>∝ Longitud</div></div></div></div></div> <h3 class="relative group"><a id="la-optimización-con-caché-kv" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#la-optimización-con-caché-kv"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>La optimización con caché KV</span></h3> <p data-svelte-h="svelte-ya6ar9">Para afrontar estos desafíos, una de las optimizaciones más potentes es la caché KV (Key-Value cache). Esta técnica mejora mucho la velocidad de inferencia al almacenar y reutilizar cálculos intermedios. En la práctica:</p> <ul data-svelte-h="svelte-9907ab"><li>Reduce cálculos repetidos.</li> <li>Mejora la velocidad de generación.</li> <li>Hace viable la generación con contextos largos.</li></ul> <p data-svelte-h="svelte-11rxgf6">La contrapartida es un mayor uso de memoria, pero normalmente la mejora de rendimiento compensa con creces ese coste.</p> <h2 class="relative group"><a id="conclusión" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#conclusión"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Conclusión</span></h2> <p data-svelte-h="svelte-1gn6ptj">Entender la inferencia con LLM es clave para desplegar y optimizar estos modelos de manera efectiva. Hemos cubierto:</p> <ul data-svelte-h="svelte-1qeje66"><li>El papel fundamental de la atención y del contexto.</li> <li>El proceso de inferencia en dos fases.</li> <li>Distintas estrategias de muestreo para controlar la generación.</li> <li>Desafíos prácticos y optimizaciones.</li></ul> <p data-svelte-h="svelte-8sbnnd">Al dominar estos conceptos, estarás mejor preparado para construir aplicaciones que aprovechen los LLM de forma eficaz y eficiente.</p> <p data-svelte-h="svelte-1uleant">Recuerda que el campo de la inferencia con LLM evoluciona rápidamente, con nuevas técnicas y optimizaciones apareciendo con frecuencia. Merece la pena seguir experimentando para encontrar qué funciona mejor en cada caso de uso.</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/course/blob/main/chapters/es/chapter1/8.mdx" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg> <span data-svelte-h="svelte-zjs2n5"><span class="underline">Update</span> on GitHub</span></a> <p></p> | |
| <script> | |
| { | |
| __sveltekit_1nznq34 = { | |
| assets: "/docs/course/pr_1213/es", | |
| base: "/docs/course/pr_1213/es", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/course/pr_1213/es/_app/immutable/entry/start.36d27295.js"), | |
| import("/docs/course/pr_1213/es/_app/immutable/entry/app.3b43d7f3.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 12], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 50.7 kB
- Xet hash:
- 929bd6a25f5a8d232fb40570075036bd750477caab0ec1ddacb1d77d5fc729b9
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.