{"id":164,"date":"2026-05-22T03:42:14","date_gmt":"2026-05-22T01:42:14","guid":{"rendered":"https:\/\/atlaszn.com\/blog\/?p=164"},"modified":"2026-05-24T21:28:51","modified_gmt":"2026-05-24T19:28:51","slug":"como-piensan-los-llm-fundamentos-de-inferencia","status":"publish","type":"post","link":"https:\/\/atlaszn.com\/blog\/2026\/05\/22\/como-piensan-los-llm-fundamentos-de-inferencia\/","title":{"rendered":"C\u00f3mo piensan los LLM: Fundamentos de Inferencia"},"content":{"rendered":"\n<nav style=\"padding: 1em 1.5em; border-radius: 8px; margin-bottom: 2em;\">\n  <strong>\u00cdndice de contenido<\/strong><p><\/p>\n<ol style=\"margin: 0.5em 0 0 1.5em; padding: 0;\">\n<li><a href=\"#el-bucle\">El bucle de inferencia<\/a><\/li>\n<li><a href=\"#tokens\">Tokens: la unidad de trabajo<\/a><\/li>\n<li><a href=\"#transformers\">Transformers: el esqueleto<\/a><\/li>\n<li><a href=\"#atencion\">Atenci\u00f3n y eficiencia de memoria<\/a><\/li>\n<li><a href=\"#cache-kv\">Cach\u00e9 KV: la factura oculta de memoria<\/a><\/li>\n<li><a href=\"#prefill-decode\">Prefill y Decode: dos reg\u00edmenes de rendimiento<\/a><\/li>\n<li><a href=\"#decodificacion\">Decodificaci\u00f3n: de logits a texto<\/a><\/li>\n<li><a href=\"#plantillas-chat\">Plantillas de chat: el contrato de API<\/a><\/li>\n<li><a href=\"#tipos-modelos\">Tipos de modelos<\/a><\/li>\n<li><a href=\"#faq-fundamentos\">Preguntas frecuentes<\/a><\/li>\n<\/ol>\n<\/nav>\n\n\n\n<p class=\"wp-block-paragraph\">Un LLM no genera una respuesta completa de una sola vez. Produce texto token a token, en un ciclo iterativo gobernado por la arquitectura del modelo, la memoria disponible y el motor de inferencia que lo ejecuta. Comprender este proceso es el requisito fundamental para tomar decisiones informadas sobre hardware, software y despliegue local.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta gu\u00eda explica los fundamentos reales de la inferencia en LLMs: c\u00f3mo se procesan los tokens, c\u00f3mo funciona el mecanismo de atenci\u00f3n, por qu\u00e9 el cach\u00e9 KV consume memoria de forma proporcional al contexto y por qu\u00e9 la decodificaci\u00f3n es inherentemente secuencial. Cuando esta mec\u00e1nica se entiende de verdad, conceptos como VRAM, cuantizaci\u00f3n, throughput o selecci\u00f3n de runtimes dejan de ser magia negra y empiezan a convertirse en decisiones t\u00e9cnicas razonables.<\/p>\n\n\n\n<h2 id=\"el-bucle\" class=\"wp-block-heading\">El ciclo de inferencia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El proceso de ejecuci\u00f3n de un modelo se denomina&nbsp;<strong>inferencia<\/strong>. En los modelos de arquitectura&nbsp;<em>decoder-only<\/em>&nbsp;(solo decodificador), la inferencia opera mediante un bucle iterativo que sigue estos pasos:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Tokenizaci\u00f3n:<\/strong>&nbsp;El texto de entrada se convierte en una secuencia de tokens.<\/li>\n\n\n\n<li><strong>Procesamiento (Forward Pass):<\/strong>&nbsp;Los tokens se introducen en el modelo para procesar la informaci\u00f3n.<\/li>\n\n\n\n<li><strong>C\u00e1lculo de logits:<\/strong>&nbsp;El modelo genera puntuaciones (logits) para cada token posible en el vocabulario, representando su probabilidad de aparici\u00f3n.<\/li>\n\n\n\n<li><strong>Decodificaci\u00f3n:<\/strong>&nbsp;Se selecciona un token bas\u00e1ndose en una pol\u00edtica de muestreo o decodificaci\u00f3n (como&nbsp;<em>greedy search<\/em>&nbsp;o&nbsp;<em>top-p sampling<\/em>).<\/li>\n\n\n\n<li><strong>Concatenaci\u00f3n:<\/strong>&nbsp;El token seleccionado se a\u00f1ade a la secuencia existente para formar el nuevo contexto.<\/li>\n\n\n\n<li><strong>Iteraci\u00f3n o finalizaci\u00f3n:<\/strong>&nbsp;El ciclo se repite hasta que el modelo genera un token de parada (<em>EOS<\/em>), se alcanza el l\u00edmite de tokens predefinido o el proceso es interrumpido por el usuario.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Matem\u00e1ticamente, el modelo es una funci\u00f3n aprendida:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>f(\u03b8, secuencia) \u2192 distribuci\u00f3n de probabilidad sobre el pr\u00f3ximo token<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Donde <code>\u03b8<\/code> representa los pesos del modelo, la secuencia incluye el prompt m\u00e1s los tokens generados hasta el momento, los logits son las puntuaciones crudas antes de softmax, y las probabilidades son las puntuaciones normalizadas despu\u00e9s de aplicar softmax.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es por esto que la velocidad de generaci\u00f3n local se mide en <strong>tokens por segundo<\/strong> (tok\/s). El sistema ejecuta repetidamente una pasada hacia adelante (<em>forward pass<\/em>), elige o muestrea un token, actualiza el cach\u00e9 KV y contin\u00faa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Percepci\u00f3n vs. realidad<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un <strong>prefill largo<\/strong> significa una pausa prolongada antes de que aparezca la primera palabra. Un <strong>decode lento<\/strong> significa que la respuesta fluye con retraso. Los usuarios locales suelen obsesionarse con la velocidad de decodificaci\u00f3n porque es lo que perciben directamente, pero el tiempo de prefill es lo que impacta cuando se procesa un documento de 10.000 tokens.<\/p>\n\n\n\n<h2 id=\"tokens\" class=\"wp-block-heading\">Tokens: la unidad de trabajo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los LLM no procesan texto bruto como palabras. Ven <strong>tokens<\/strong>: fragmentos de texto representados internamente como IDs enteros. Un token puede ser:<\/p>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li>Una palabra completa: <code>\"hola\"<\/code><\/li>\n\n\n\n<li>Un fragmento de palabra: <code>\"inter\"<\/code>, <code>\"nacional\"<\/code>, <code>\"izaci\u00f3n\"<\/code><\/li>\n\n\n\n<li>Un signo de puntuaci\u00f3n<\/li>\n\n\n\n<li>Una cadena con prefijo de espacio en blanco<\/li>\n\n\n\n<li>Un fallback a nivel de bytes para caracteres no soportados<\/li>\n\n\n\n<li>Un marcador de control especial como <code>&lt;|user|&gt;<\/code> o <code>&lt;|assistant|&gt;<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El tokenizer mapea texto a IDs de tokens y viceversa. Las familias comunes incluyen tokenizadores estilo <strong>BPE<\/strong> (Byte-Pair Encoding) y estilo <strong>SentencePiece<\/strong>. Diferentes familias de modelos usan diferentes tokenizadores, y eso tiene consecuencias pr\u00e1cticas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El mismo texto, diferentes conteos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un documento de 4.000 palabras puede representar 5.000 tokens en un tokenizador y 7.500 en otro. El tama\u00f1o del vocabulario tambi\u00e9n importa: un tokenizador con vocabulario m\u00e1s grande puede comprimir cierto texto en menos tokens, pero cambia el tama\u00f1o del embedding y de la proyecci\u00f3n de salida. Esta es una raz\u00f3n por la que los \u00abtokens por segundo\u00bb no son perfectamente comparables entre familias de modelos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Por qu\u00e9 los tokens importan<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los tokens determinan directamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li>Cu\u00e1nto texto cabe en la ventana de contexto<\/li>\n\n\n\n<li>Qu\u00e9 tan grande se vuelve el cach\u00e9 KV<\/li>\n\n\n\n<li>Cu\u00e1nta latencia se paga durante el procesamiento del prompt<\/li>\n\n\n\n<li>Si el texto multiling\u00fce o de c\u00f3digo es eficiente<\/li>\n\n\n\n<li>Si el modelo interpreta correctamente los marcadores especiales de chat<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La ventana de contexto de un modelo es el n\u00famero m\u00e1ximo de tokens a los que puede prestar atenci\u00f3n simult\u00e1neamente. En 2026, los modelos locales comunes van desde contextos de 8K y 32K hasta 128K, 256K e incluso contextos de 1M de tokens en sistemas de frontera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El contexto soportado no es lo mismo que un contexto barato, r\u00e1pido o igualmente preciso.<\/strong> Un modelo que t\u00e9cnicamente puede manejar 128K tokens puede volverse extremadamente lento a los 64K y perder coherencia a los 100K. Siempre valida las longitudes de contexto que realmente planeas usar.<\/p>\n\n\n\n<h2 id=\"transformers\" class=\"wp-block-heading\">Transformers: el esqueleto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La mayor\u00eda de los LLM modernos se basan en la arquitectura <strong>Transformer<\/strong>. Los LLM de chat locales son t\u00edpicamente Transformers de solo decodificador: predicen el siguiente token mientras miran hacia atr\u00e1s a los tokens anteriores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una capa simplificada de Transformer contiene:<\/p>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li><strong>Token embeddings:<\/strong> Los IDs de tokens se convierten en vectores de dimensi\u00f3n fija<\/li>\n\n\n\n<li><strong>Informaci\u00f3n posicional:<\/strong> El modelo necesita conocer el orden de los tokens. Muchos LLM modernos usan <strong>RoPE<\/strong> (Rotary Position Embeddings), que codifica la posici\u00f3n mediante la rotaci\u00f3n de las representaciones de consulta y clave<\/li>\n\n\n\n<li><strong>Self-attention:<\/strong> Cada representaci\u00f3n de token eval\u00faa las representaciones de los tokens previos y decide qu\u00e9 informaci\u00f3n es relevante<\/li>\n\n\n\n<li><strong>Bloque MLP \/ feed-forward:<\/strong> Una computaci\u00f3n no lineal densa que expande y comprime las representaciones. Una gran fracci\u00f3n de los par\u00e1metros reside aqu\u00ed<\/li>\n\n\n\n<li><strong>Normalizaci\u00f3n de capa y conexiones residuales:<\/strong> Estabilizan las redes profundas y facilitan el flujo de informaci\u00f3n a trav\u00e9s de m\u00faltiples capas<\/li>\n\n\n\n<li><strong>Proyecci\u00f3n de salida:<\/strong> El estado oculto final se convierte en logits sobre el vocabulario completo<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Apilar esta estructura docenas o cientos de veces produce un modelo de lenguaje funcional.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">RoPE y extrapolaci\u00f3n de contexto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">RoPE aplica rotaciones de frecuencia a los vectores de consulta y clave, lo que permite que el modelo generalice a longitudes de contexto no vistas durante el entrenamiento. <strong>YaRN<\/strong> (Yet another RoPE extension) es una extensi\u00f3n que permite extrapolaci\u00f3n de contexto m\u00e1s all\u00e1 del l\u00edmite de entrenamiento, aunque con degradaci\u00f3n de calidad predecible.<\/p>\n\n\n\n<h2 id=\"atenci\u00f3n\" class=\"wp-block-heading\">Atenci\u00f3n y eficiencia de memoria<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La atenci\u00f3n determina c\u00f3mo un token decide qu\u00e9 tokens anteriores son importantes para la pr\u00f3xima predicci\u00f3n. Tambi\u00e9n es una de las razones principales por las que la inferencia local es sensible a la memoria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La <strong>MHA<\/strong> (Multi-Head Attention) cl\u00e1sica almacena estados de clave-valor separados para m\u00faltiples cabezas. Esto da flexibilidad al modelo, pero hace que el cach\u00e9 KV sea grande.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dise\u00f1os de atenci\u00f3n eficientes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los modelos locales modernos suelen usar variantes m\u00e1s eficientes:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Tipo<\/th><th class=\"has-text-align-left\" data-align=\"left\">Descripci\u00f3n<\/th><th class=\"has-text-align-left\" data-align=\"left\">Impacto en memoria<\/th><\/tr><\/thead><tbody><tr><td><strong>MHA<\/strong><\/td><td>Atenci\u00f3n multi-cabezal completa<\/td><td>Cach\u00e9 KV m\u00e1ximo<\/td><\/tr><tr><td><strong>GQA<\/strong><\/td><td>Grupos de cabezas comparten clave-valor<\/td><td>Reducci\u00f3n moderada<\/td><\/tr><tr><td><strong>MQA<\/strong><\/td><td>Todas las cabezas comparten una sola clave-valor<\/td><td>Reducci\u00f3n m\u00e1xima<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Los kernels modernos como <strong>FlashAttention<\/strong> y las implementaciones estilo <strong>SDPA<\/strong> reducen el tr\u00e1fico de memoria de la atenci\u00f3n. FlashAttention evita escribir la matriz de atenci\u00f3n completa a la VRAM, lo que es cr\u00edtico en contexto largo donde la atenci\u00f3n O(n\u00b2) en memoria puede ser el cuello de botella real.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un runtime con buenos kernels de atenci\u00f3n puede ser significativamente m\u00e1s r\u00e1pido que uno sin ellos, incluso con el mismo modelo y hardware.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Consecuencia pr\u00e1ctica<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dos modelos de 7B pueden comportarse de forma muy distinta en contexto largo. El conteo de par\u00e1metros no es toda la historia: un modelo de 7B con MHA a 128K de contexto puede agotar una GPU de 24 GB, mientras que un modelo de 7B con GQA con el mismo contexto anunciado puede caber con espacio disponible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al comparar modelos, eval\u00faa el tipo de atenci\u00f3n, las cabezas KV, la longitud del contexto y el soporte del runtime, no solo el conteo de par\u00e1metros.<\/p>\n\n\n\n<h2 id=\"cache-kv\" class=\"wp-block-heading\">Cach\u00e9 KV: la factura oculta de memoria<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El <strong>cach\u00e9 KV<\/strong> es la memoria de trabajo del modelo durante la generaci\u00f3n. Almacena los estados de atenci\u00f3n clave-valor para los tokens anteriores, evitando que el modelo tenga que volver a computar todo el historial desde cero en cada token generado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin un cach\u00e9 KV, la generaci\u00f3n ser\u00eda ineficiente. Con un cach\u00e9 KV, la generaci\u00f3n es utilizable, pero el cach\u00e9 consume memoria proporcional a:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tokens \u00d7 capas \u00d7 cabezas_kv \u00d7 dimensi\u00f3n_cabeza \u00d7 precisi\u00f3n \u00d7 2<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El multiplicador de 2 corresponde a las claves (<em>keys<\/em>) y los valores (<em>values<\/em>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Regla de oro<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para modelos tipo Llama de 7B con MHA, el cach\u00e9 KV en FP16 consume aproximadamente <strong>0.5 MiB por token<\/strong>. Eso significa:<\/p>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li>4K tokens \u2248 2 GiB solo de cach\u00e9 KV<\/li>\n\n\n\n<li>32K tokens \u2248 16 GiB solo de cach\u00e9 KV<\/li>\n\n\n\n<li>128K tokens \u2248 64 GiB (requiere m\u00faltiples GPUs o cuantizaci\u00f3n del cach\u00e9)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Los modelos m\u00e1s nuevos con GQA\/MQA reducen esta cifra sustancialmente. Algunos runtimes tambi\u00e9n soportan cach\u00e9 KV en <strong>FP8 o INT8<\/strong>, lo que representa una base pr\u00e1ctica de compresi\u00f3n para usuarios locales en 2026.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cuantizaci\u00f3n del cach\u00e9 KV vs. cuantizaci\u00f3n de pesos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No confundas la cuantizaci\u00f3n del cach\u00e9 KV con la cuantizaci\u00f3n de pesos. La cuantizaci\u00f3n de pesos reduce el tama\u00f1o del modelo almacenado. La cuantizaci\u00f3n del cach\u00e9 KV reduce la memoria del contexto activo. Son mecanismos diferentes con implicaciones distintas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No trates la cuantizaci\u00f3n del cach\u00e9 KV por debajo de 8 bits como algo est\u00e1ndar. Sistemas de investigaci\u00f3n como KIVI, KVQuant y kernels de cach\u00e9 comprimido muestran que un KV de 2 a 4 bits puede funcionar con algoritmos cuidadosos, calibraci\u00f3n y kernels personalizados. Eso no equivale a activar un par\u00e1metro Q4 en un runtime de escritorio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tampoco confundas la cuantizaci\u00f3n del cach\u00e9 KV con la <strong>decodificaci\u00f3n especulativa<\/strong>. DFlash y DDTree atacan la latencia de decodificaci\u00f3n mediante borrador paralelo y verificaci\u00f3n eficiente. Pueden mejorar la velocidad, pero no eliminan la factura de memoria del cach\u00e9 KV.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por eso un modelo puede caber con un prompt vac\u00edo, pero colapsar cuando cargas un documento largo. Los pesos cab\u00edan. La memoria de trabajo no.<\/p>\n\n\n\n<h2 id=\"prefill-decode\" class=\"wp-block-heading\">Prefill y Decode: dos reg\u00edmenes de rendimiento<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La inferencia de LLM tiene dos fases con perfiles de rendimiento diferentes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prefill<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Procesa el prompt que proporcionaste al modelo. Si cargas un documento de 20.000 tokens, el modelo debe procesar esos 20.000 tokens antes de poder producir el primer token de respuesta. El prefill es relativamente paralelizable, por lo que las GPUs pueden procesarlo eficientemente, pero sigue siendo costoso en t\u00e9rminos de tiempo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El tiempo que esperas antes de que aparezca el primer token es generalmente el tiempo de prefill.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Decode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Genera nuevos tokens de uno en uno. Cada nuevo token depende de la secuencia completa hasta el momento, por lo que el decode es inherentemente secuencial. Aqu\u00ed es donde proviene el efecto de escritura en streaming, y suele ser la fase que determina si un modelo se percibe como r\u00e1pido o lento.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reglas pr\u00e1cticas<\/h3>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li>Los prompts largos impactan en el prefill.<\/li>\n\n\n\n<li>Las respuestas largas impactan en el decode.<\/li>\n\n\n\n<li>Las conversaciones largas impactan ambos, porque el cach\u00e9 KV crece con cada turno.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En una sesi\u00f3n de chat, cada turno a\u00f1ade tokens al cach\u00e9. Si una conversaci\u00f3n alcanza los 16K tokens, est\u00e1s pagando el costo de memoria de todos esos 16K tokens en cada nuevo token generado. Las interfaces de chat que mantienen un historial infinito eventualmente se vuelven lentas o colapsan por agotamiento de memoria.<\/p>\n\n\n\n<h2 id=\"decodificacion\" class=\"wp-block-heading\">Decodificaci\u00f3n: de logits a texto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de que el modelo produce logits, a\u00fan no ha generado texto. Solo ha puntuado cada siguiente posible token. La <strong>decodificaci\u00f3n<\/strong> es la pol\u00edtica que convierte esas puntuaciones en un token real, lo a\u00f1ade al contexto y repite el bucle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los controles de decodificaci\u00f3n responden a tres preguntas pr\u00e1cticas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Aleatoriedad:<\/strong> \u00bfCu\u00e1nta variaci\u00f3n se permite?<\/li>\n\n\n\n<li><strong>Alcance de la cola:<\/strong> \u00bfQu\u00e9 tan lejos puede llegar el muestreador hacia tokens de menor probabilidad?<\/li>\n\n\n\n<li><strong>L\u00edmites:<\/strong> \u00bfQu\u00e9 evita los bucles, el divagar, las roturas de esquema o la salida descontrolada?<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Configuraciones por caso de uso<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Caso de uso<\/th><th class=\"has-text-align-left\" data-align=\"left\">Temperatura<\/th><th class=\"has-text-align-left\" data-align=\"left\">Estrategia<\/th><\/tr><\/thead><tbody><tr><td><strong>Trabajo preciso<\/strong><\/td><td>Baja (0.1-0.3)<\/td><td>Top-k restringido, tokens m\u00e1ximos cortos, secuencias de parada expl\u00edcitas, decodificaci\u00f3n restringida para JSON<\/td><\/tr><tr><td><strong>Trabajo creativo<\/strong><\/td><td>Media-alta (0.7-1.2)<\/td><td>Top-p amplio, m\u00faltiples candidatos con clasificaci\u00f3n posterior<\/td><\/tr><tr><td><strong>Programaci\u00f3n<\/strong><\/td><td>Baja (0.1-0.5)<\/td><td>Primera pasada conservadora, muestreo de alternativas solo en exploraci\u00f3n intencional<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La decodificaci\u00f3n codiciosa (<em>greedy decoding<\/em>) no siempre es m\u00e1s precisa. A menudo es fr\u00e1gil: un decodificador greedy puede quedarse atrapado en bucles o producir respuestas gen\u00e9ricas porque nunca explora alternativas. Para evaluaciones, usa configuraciones deterministas. Para ideaci\u00f3n, permite mayor variabilidad.<\/p>\n\n\n\n<h2 id=\"plantillas-chat\" class=\"wp-block-heading\">Plantillas de chat: el contrato de API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un modelo de chat fue entrenado con un formato de conversaci\u00f3n espec\u00edfico. Cada familia de modelos usa su propio esquema de marcadores:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>&lt;|system|&gt; Eres un asistente \u00fatil. &lt;|user|&gt; Explica el cach\u00e9 KV. &lt;|assistant|&gt;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Otro modelo puede esperar:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>[BOS] [INST] Explica el cach\u00e9 KV. [\/INST]<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usar el formato incorrecto puede causar galimat\u00edas, confusi\u00f3n de roles, ignorar los prompts de sistema, repetici\u00f3n de prompts, comportamientos de rechazo inesperados, roturas en llamadas a herramientas y la conclusi\u00f3n err\u00f3nea de que el modelo es \u00abdeficiente\u00bb cuando el error era la plantilla.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mejores pr\u00e1cticas<\/h3>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li>Usa <code>apply_chat_template<\/code> del tokenizer cuando uses la librer\u00eda Transformers<\/li>\n\n\n\n<li>Usa plantillas espec\u00edficas del modelo en frontends compatibles con llama.cpp, vLLM o SGLang<\/li>\n\n\n\n<li>Verifica si el modelo es base, instruct, chat, reasoning o tool-tuned<\/li>\n\n\n\n<li>Aseg\u00farate de que los tokens BOS\/EOS sean correctos<\/li>\n\n\n\n<li>Mant\u00e9n los prompts de sistema concisos<\/li>\n\n\n\n<li>Para el uso de herramientas, sigue exactamente el esquema esperado por el modelo o el runtime<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Si construyes una aplicaci\u00f3n que permite cambiar de modelo, debes cambiar la plantilla tambi\u00e9n. Hardcodear un formato de plantilla y luego cargar un modelo que espera otro es una fuente com\u00fan de evaluaciones incorrectas de modelos locales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trata la plantilla como un contrato de API. Si no lo cumples, no est\u00e1s evaluando realmente el modelo que crees que est\u00e1s evaluando.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tipos de modelos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No todos los LLM est\u00e1n ajustados para el mismo comportamiento. La divisi\u00f3n pr\u00e1ctica es:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Tipo<\/th><th class=\"has-text-align-left\" data-align=\"left\">Uso principal<\/th><th class=\"has-text-align-left\" data-align=\"left\">Recomendado para<\/th><\/tr><\/thead><tbody><tr><td><strong>Base<\/strong><\/td><td>Preentrenamiento, investigaci\u00f3n<\/td><td>Fine-tuning, pipelines personalizados<\/td><\/tr><tr><td><strong>Instruct<\/strong><\/td><td>Seguir instrucciones directas<\/td><td>Tareas puntuales, Q&amp;A<\/td><\/tr><tr><td><strong>Chat<\/strong><\/td><td>Di\u00e1logos de m\u00faltiples turnos<\/td><td>Asistentes conversacionales<\/td><\/tr><tr><td><strong>Reasoning<\/strong><\/td><td>Razonamiento multietapa<\/td><td>Matem\u00e1ticas, l\u00f3gica, verificaci\u00f3n<\/td><\/tr><tr><td><strong>Tool-tuned<\/strong><\/td><td>Llamadas a herramientas estructuradas<\/td><td>Agentes, JSON, funciones<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Para la mayor\u00eda de los usuarios, el punto de partida por defecto deber\u00eda ser un modelo instruct\/chat reciente en un tama\u00f1o que quepa c\u00f3modamente en memoria. No empieces con un modelo base a menos que conozcas el motivo espec\u00edfico.<\/p>\n\n\n\n<h2 id=\"faq-fundamentos\" class=\"wp-block-heading\">Preguntas frecuentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfQu\u00e9 es un token en un LLM?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un token es la unidad m\u00ednima de texto que un LLM procesa. Puede ser una palabra completa, un fragmento de palabra, un signo de puntuaci\u00f3n o un car\u00e1cter individual. Los tokenizadores convierten texto en IDs num\u00e9ricos que el modelo puede procesar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPor qu\u00e9 el cach\u00e9 KV consume tanta memoria?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El cach\u00e9 KV almacena los estados de atenci\u00f3n clave-valor para cada token del contexto activo. Su tama\u00f1o crece linealmente con el n\u00famero de tokens, el n\u00famero de capas del modelo y el n\u00famero de cabezas KV. A 32K tokens con un modelo de 7B y MHA, el cach\u00e9 KV puede consumir hasta 16 GiB solo en FP16.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPrefill y decode son lo mismo?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. El prefill procesa el prompt de entrada de forma paralelizable. El decode genera tokens nuevos de forma secuencial, uno a la vez. El prefill determina la latencia del primer token; el decode determina la velocidad de generaci\u00f3n percibida.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfQu\u00e9 pasa si uso la plantilla de chat incorrecta?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes obtener galimat\u00edas, confusi\u00f3n de roles, ignorancia del prompt de sistema, repetici\u00f3n de prompts o comportamientos inesperados. La plantilla es un contrato entre el modelo y el runtime: si no se cumple, la evaluaci\u00f3n del modelo es inv\u00e1lida.<\/p>\n\n\n<div class=\"acb-callout acb-callout--default\"><div class=\"acb-callout__content\"><strong>\u00bfQu\u00e9 sigue?<\/strong>\u00a0Una vez que entiendes la mec\u00e1nica de la inferencia, el siguiente paso es aprender a ejecutar modelos localmente. En\u00a0<a href=\"https:\/\/atlaszn.com\/blog\/?p=182\" data-type=\"link\" data-id=\"https:\/\/atlaszn.com\/blog\/?p=182\">Ejecuci\u00f3n Local: Runtimes, Operaci\u00f3n y Cuantizaci\u00f3n<\/a>\u00a0cubrimos runtimes, cuantizaci\u00f3n, formatos de archivo, selecci\u00f3n de modelos y operaciones. Para el lado del hardware, consulta\u00a0<a href=\"https:\/\/atlaszn.com\/blog\/2026\/05\/21\/ancho-de-banda-de-memoria\/\" data-type=\"link\" data-id=\"https:\/\/atlaszn.com\/blog\/2026\/05\/21\/ancho-de-banda-de-memoria\/\">Ancho de Banda de Memoria<\/a>.<\/div><\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gu\u00eda t\u00e9cnica sobre c\u00f3mo funcionan los LLM localmente: tokens, transformers, atenci\u00f3n, cach\u00e9 KV, prefill y decodificaci\u00f3n. Fundamentos esenciales para ejecutar IA local en 2026.<\/p>\n","protected":false},"author":1,"featured_media":167,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[50,6,24],"tags":[56,52,55,10,51,57,53,54],"class_list":["post-164","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fundamentos","category-ia-automatizacion","category-ia-local","tag-atencion","tag-cache-kv","tag-decodificacion","tag-ia-local","tag-inferencia-llm","tag-modelos-locales","tag-tokens","tag-transformers"],"_links":{"self":[{"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/posts\/164","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/comments?post=164"}],"version-history":[{"count":9,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/posts\/164\/revisions"}],"predecessor-version":[{"id":265,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/posts\/164\/revisions\/265"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/media\/167"}],"wp:attachment":[{"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/media?parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/categories?post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atlaszn.com\/blog\/wp-json\/wp\/v2\/tags?post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}