{"id":201,"date":"2026-05-03T09:51:59","date_gmt":"2026-05-03T09:51:59","guid":{"rendered":"https:\/\/pulki.es\/blog\/?p=201"},"modified":"2026-05-03T09:51:59","modified_gmt":"2026-05-03T09:51:59","slug":"large-language-model-llm-from-scratch-large-language-models","status":"publish","type":"post","link":"https:\/\/pulki.es\/blog\/index.php\/2026\/05\/03\/large-language-model-llm-from-scratch-large-language-models\/","title":{"rendered":"Large Language Model (LLM) from scratch. Large Language Models."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En esta entrada introduciremos los <strong>LLMs<\/strong>. Al igual que el resto de las publicaciones relacionadas con este t\u00f3pico, seguiremos fielmente el libro de <strong><a href=\"https:\/\/web.stanford.edu\/~jurafsky\/slp3\/\">Jurafsky y Martin (2026)<\/a><\/strong>, puesto que es extremadamente ilustrativo. En esta l\u00ednea, partiremos la presente entrada definiendo los LLM&#8217;s tal y como lo hacen estos autores en el cap\u00edtulo 7. En particular, los definen como agentes que pueden interactuar conversacionalmente con gente. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Naturalmente, para que esos agentes sean funcionales, no s\u00f3lo hay que tener una estrategia estad\u00edstica, si no tambi\u00e9n, conjuntos de dato especiales. En esta publicaci\u00f3n, veremos dicha estrategia y el tipo de datos necesario para que este agente sea funcional.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La estructura de esta publicaci\u00f3n es la siguiente. Primero definiremos algunos conceptos b\u00e1sicos detr\u00e1s de la construcci\u00f3n de un <strong>LLM<\/strong>; luego veremos cu\u00e1les son las arquitecturas est\u00e1ndar utilizadas para construir uno; despu\u00e9s introduciremos el concepto de <strong>prompting<\/strong>; y finalmente uniremos todas las piezas para entender el flujo habitual de entrenamiento de un LLM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1) Introduciendo conceptos&#8230;<\/h2>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--1 wp-block-paragraph\">\u00bfQu\u00e9 es un LLM?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un <em>Large Language Model<\/em> (LLM) es s\u00f3lo un <strong>modelo de lenguaje<\/strong> en una escala relativamente m\u00e1s grande. En este sentido, vale la pena recordar qu\u00e9 es un <strong>modelo de lenguaje<\/strong>. En pocas palabras, es un sistema computacional que predice la siguiente palabra dada palabras previas, o contexto. Para llevar a cabo esta predicci\u00f3n, se realiza una etapa de <strong>preentrenamiento<\/strong>. <\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--2 wp-block-paragraph\">Preentrenamiento<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Preentrenamiento<\/strong> es la primera gran etapa de entrenamiento de un LLM. Consiste en tomar una cantidad enorme de texto y entrenar al modelo para <strong>predecir el siguiente token\/palabra dado el contexto anterior<\/strong>. La idea clave es que, al hacer esto millones o billones de veces, el modelo aprende patrones de lenguaje, gram\u00e1tica, sem\u00e1ntica, hechos del mundo, asociaciones entre conceptos y regularidades del discurso. En la siguiente secci\u00f3n veremos esto con mayor detalle.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--3 wp-block-paragraph\">\u00bfQu\u00e9 pueden aprender los LLM de la predicci\u00f3n del siguiente token?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como sabemos, LLM como Claude, ChatGPT o Gemini son capaces de responder preguntas de matem\u00e1ticas, geograf\u00eda, gram\u00e1tica, etc. Esto es posible en gran medida gracias a la etapa de preentrenamiento. \u00bfPor qu\u00e9? Imaginemos que el corpus sobre el que estamos trabajando contiene repetidamente las siguientes oraciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dos m\u00e1s dos es cuatro.<\/li>\n\n\n\n<li>La capital de Chile es Santiago.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, despu\u00e9s del preentrenamiento, si queremos calcular cu\u00e1l es el token que tiene la probabilidad m\u00e1s alta condicional a la cadena \u00bbDos m\u00e1s dos es \u00bb, es decir,<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><math data-latex=\"\\max_{x_{i} \\in X}\"><semantics><mrow><msub><mi>max<\/mi><mrow><msub><mi>x<\/mi><mi>i<\/mi><\/msub><mo>\u2208<\/mo><mi>X<\/mi><\/mrow><\/msub><mo>\u2061<\/mo><mspace width=\"0.1667em\"><\/mspace><\/mrow><annotation encoding=\"application\/x-tex\">\\max_{x_{i} \\in X}<\/annotation><\/semantics><\/math>P(<math data-latex=\"x_{i}\"><semantics><msub><mi>x<\/mi><mi>i<\/mi><\/msub><annotation encoding=\"application\/x-tex\">x_{i}<\/annotation><\/semantics><\/math> | \u00bbDos m\u00e1s dos es \u00bb)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">donde <math data-latex=\"X\"><semantics><mi>X<\/mi><annotation encoding=\"application\/x-tex\">X<\/annotation><\/semantics><\/math> es el conjunto de todas las palabras de nuestro vocabulario, es de esperar que <math data-latex=\"x_{i} = \\text{``cuatro''}\"><semantics><mrow><msub><mi>x<\/mi><mi>i<\/mi><\/msub><mo>=<\/mo><mtext>\u201ccuatro\u201d<\/mtext><\/mrow><annotation encoding=\"application\/x-tex\">x_{i} = \\text{\u00abcuatro\u00bb}<\/annotation><\/semantics><\/math> sea el token que maximice esa expresi\u00f3n. Este mismo ejercicio se puede repetir con la siguiente frase:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><math data-latex=\"\\max_{x_{i} \\in X}\"><semantics><mrow><msub><mi>max<\/mi><mrow><msub><mi>x<\/mi><mi>i<\/mi><\/msub><mo>\u2208<\/mo><mi>X<\/mi><\/mrow><\/msub><mo>\u2061<\/mo><mspace width=\"0.1667em\"><\/mspace><\/mrow><annotation encoding=\"application\/x-tex\">\\max_{x_{i} \\in X}<\/annotation><\/semantics><\/math>P(<math data-latex=\"x_{i}\"><semantics><msub><mi>x<\/mi><mi>i<\/mi><\/msub><annotation encoding=\"application\/x-tex\">x_{i}<\/annotation><\/semantics><\/math> | \u00bbLa capital de Chile es  \u00bb)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, \u201cSantiago\u201d ser\u00eda la opci\u00f3n esperable. Y as\u00ed sucesivamente. Por tanto, mediante esta estrategia el sistema puede aprender relaciones estad\u00edsticas y sem\u00e1nticas presentes en el lenguaje, lo que le permite responder preguntas sobre matem\u00e1ticas, geograf\u00eda, gram\u00e1tica, entre muchos otros temas.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--4 wp-block-paragraph\">Generaci\u00f3n de texto<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el apartado anterior vimos que un modelo de lenguaje puede predecir la siguiente palabra. Empleando esta misma estrategia, tambi\u00e9n es posible generar cadenas de texto. En particular, la generaci\u00f3n se lleva a cabo mediante muestreo desde la distribuci\u00f3n de probabilidad de la siguiente palabra. Esta idea es uno de los fundamentos de la <strong>IA generativa<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Habiendo explicado en grandes rasgos lo que es un LLM y c\u00f3mo funciona, en el resto de la entrada veremos sus principios computacionales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2) Arquitectura para modelos de lenguaje<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las tres arquitecturas m\u00e1s comunes en los modelos de lenguaje modernos son <em>encoder,<\/em> <em>decoder<\/em> y <em>encoder-decoder<\/em>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--5 wp-block-paragraph\">Decoder<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un decodificador toma como entrada una serie de tokens y, de manera iterativa, predice el siguiente token de la secuencia. Un ejemplo de modelo con una arquitectura decoder-only es GPT-2.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La siguiente imagen resume su arquitectura:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"874\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-8-1024x874.png\" alt=\"\" class=\"wp-image-214\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-8-1024x874.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-8-300x256.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-8-768x655.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-8.png 1358w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A pesar de que en las pr\u00f3ximas publicaciones veremos con mayor profundidad c\u00f3mo trabaja un <em>decoder<\/em>, podemos adelantar brevemente qu\u00e9 ocurre en una capa de GPT-2. Antes de entrar a la pila de decoders, el texto de entrada se convierte primero en una secuencia de tokens. Luego, cada token se transforma en un <em>embedding<\/em>, es decir, en una representaci\u00f3n vectorial. Por tanto, si el input contiene tres tokens, el modelo trabajar\u00e1 inicialmente con tres vectores. En el caso de GPT-2 small, la dimensionalidad del modelo es 768, por lo que cada uno de esos vectores contiene 768 valores num\u00e9ricos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez dentro de la capa <em>decoder<\/em>, estos vectores son modificados mediante mecanismos como la masked self-attention y una red <em>feedforward<\/em>. El resultado son representaciones m\u00e1s ricas y dependientes del contexto. A estas representaciones podemos llamarlas vectores contextualizados: son versiones actualizadas de los vectores iniciales, ajustadas seg\u00fan el lugar que cada token ocupa dentro de la secuencia. En otras palabras, el modelo ya no representa cada token de forma aislada, sino en funci\u00f3n del contexto disponible. Para m\u00e1s informaci\u00f3n sobre los modelos GPT puedes consultar esta <a href=\"https:\/\/jalammar.github.io\/illustrated-gpt2\/\">web<\/a>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--6 wp-block-paragraph\">Encoder<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un <em>encoder<\/em> toma como input una secuencia de tokens, y genera como output una representaci\u00f3n vectorial de cada uno. La diferencia clave con <strong>GPT-2<\/strong> es que el <em>encoder<\/em> no genera el siguiente token de izquierda a derecha. En cambio, procesa la secuencia completa y produce una representaci\u00f3n enriquecida de cada token. En otras palabras, un <em>encoder<\/em> transforma cada token en una representaci\u00f3n ajustada por el contexto completo. Es decir, el modelo no representa cada token de manera aislada, sino considerando c\u00f3mo se relaciona con los dem\u00e1s tokens de la secuencia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los modelos BERT son conocidos por usar esta arquitectura. Si quieres saber m\u00e1s sobre ellos, puedes consultar esta <a href=\"https:\/\/jalammar.github.io\/illustrated-bert\/\">web<\/a>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--7 wp-block-paragraph\">Encoder-decoder<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, un <em>encoder-decoder<\/em> toma como entrada una secuencia de tokens y como salida m\u00faltiples tokens.  Esta arquitectura se usa especialmente cuando el input y el output pueden ser secuencias distintas: por ejemplo, traducci\u00f3n autom\u00e1tica, resumen, o reconocimiento de voz. Un ejemplo de un modelo <em>encoder-decoder<\/em> es el BART. En esta <a href=\"https:\/\/huggingface.co\/docs\/transformers\/model_doc\/bart\">web<\/a> puedes encontrar informaci\u00f3n sobre \u00e9l.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3) Generaci\u00f3n condicional de texto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La generaci\u00f3n condicional de texto consiste en darle al modelo una secuencia inicial, llamada <em>prompt<\/em>, y pedirle que contin\u00fae generando texto a partir de ella. En otras palabras, el modelo no genera texto \u00bbdesde cero\u00bb, sino condicionado por los tokens que ya recibi\u00f3 como entrada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La idea b\u00e1sica es la siguiente. Dado un prompt, el modelo calcula una distribuci\u00f3n de probabilidad para el siguiente token. Luego selecciona uno de esos tokens y lo agrega al texto. Despu\u00e9s repite el mismo procedimiento: vuelve a calcular la distribuci\u00f3n del siguiente token, ahora considerando tanto el prompt original como el token que acaba de generar. As\u00ed, el texto se produce paso a paso, token por token.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, si entregamos al modelo el siguiente prompt (ejemplo sacado de <strong><a href=\"https:\/\/web.stanford.edu\/~jurafsky\/slp3\/\">Jurafsky y Martin (2026)<\/a><\/strong>):<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The sentiment of the sentence \u201cI like Jackie Chan\u201d is:<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">el modelo deber\u00eda generar como continuaci\u00f3n algo como:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">positive<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfPor qu\u00e9? Porque, dado ese contexto, es esperable que el token \u00bbpositive\u00bb tenga una probabilidad mayor que alternativas como \u00bbnegative\u00bb. En t\u00e9rminos simples, el modelo compara cu\u00e1l continuaci\u00f3n es m\u00e1s probable bajo el contexto entregado:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">P(\u00bbpositive\u00bb\u2223prompt)>P(\u00bbnegative\u00bb\u2223prompt)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta misma l\u00f3gica puede utilizarse para responder preguntas. Por ejemplo, si escribimos:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Q: Who wrote the book \u201cThe Origin of Species\u201d?<br>A:<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">el modelo interpretar\u00e1 que debe completar la respuesta despu\u00e9s de A:. En ese caso, una continuaci\u00f3n probable ser\u00eda:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Charles Darwin<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Por tanto, la generaci\u00f3n condicional permite transformar una gran variedad de tareas \u2014clasificaci\u00f3n, traducci\u00f3n, resumen o respuesta a preguntas\u2014 en un mismo problema general: <strong>dado un contexto, predecir una continuaci\u00f3n probable<\/strong>. En la siguiente secci\u00f3n veremos c\u00f3mo esta idea se puede perfeccionar mediante mejores estrategias de prompting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4) Prompting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ChatGPT, Claude y otros LLM modernos, adem\u00e1s de predecir texto, est\u00e1n entrenados para responder preguntas y seguir instrucciones. Una de las t\u00e9cnicas m\u00e1s importantes para lograr este comportamiento es el <em>instruction-tuning<\/em>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--8 wp-block-paragraph\">Instruction-tuning<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de entrenar un modelo de lenguaje para predecir el siguiente token, es posible continuar su entrenamiento utilizando un conjunto de datos compuesto por pares instrucci\u00f3n-respuesta. Este proceso suele llamarse <em>instruction-tuning<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La idea es exponer al modelo a ejemplos donde una instrucci\u00f3n dada por un usuario va acompa\u00f1ada de una respuesta esperada. De esta forma, el modelo aprende patrones sobre c\u00f3mo responder preguntas, seguir \u00f3rdenes, resumir textos, traducir contenido, entre muchas otras tareas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un ejemplo pr\u00e1ctico de esta idea puede encontrarse en el proyecto <a href=\"https:\/\/www.latamgpt.org\/\">Latam-GPT<\/a>. En la <a href=\"https:\/\/huggingface.co\/datasets\/latam-gpt\/personas-instruct-messages\">siguiente p\u00e1gina <\/a>publican algunas de las instrucciones utilizadas para entrenar el modelo. Una instrucci\u00f3n que podemos encontrar en esta web viene dada por la siguiente:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">[ { \u00abcontent\u00bb: \u00abNecesito ideas para una acci\u00f3n comunitaria visual que muestre el impacto del abandono rural en los territorios de monta\u00f1a, que pueda organizar con vecinos en una localidad de Castilla-La Mancha esta semana.\u00bb, \u00abrole\u00bb: \u00abuser\u00bb }, { \u00abcontent\u00bb: \u00ab\u00a1Qu\u00e9 hermosa iniciativa! El abandono rural en zonas de monta\u00f1a de Castilla-La Mancha \u2014como en los municipios de la Sierra de Alcaraz, la Serran\u00eda de Cuenca, o las sierras de Toledo\u2014 es un tema profundamente humano y visualmente potente. Aqu\u00ed tienes una propuesta de **acci\u00f3n comunitaria visual** que puedes organizar esta semana con vecinos, sencilla de implementar, con gran impacto emocional y simb\u00f3lico, y que puede convertirse en un \\\u00bbdocumento visual\\\u00bb del territorio:\\n\\n&#8212;\\n\\n### \ud83c\udfa8 **Acci\u00f3n Comunitaria Visual: \\\u00bbEl Silencio que Habla\\\u00bb**\\n\\n#### \ud83d\udccc **Concepto central:**\\nCrear una **instalaci\u00f3n art\u00edstica en espacios p\u00fablicos** (plaza, camino, escuela, iglesia) que muestre el abandono rural a trav\u00e9s de **im\u00e1genes y objetos del pasado** que han sido dejados atr\u00e1s, pero que a\u00fan \\\u00bbhablan\\\u00bb del territorio.\\n\\n&#8212;\\n\\n### \u2705 **C\u00f3mo hacerlo (pasos pr\u00e1cticos para esta semana):**\\n\\n#### 1. **Recolectar objetos simb\u00f3licos (antes del s\u00e1bado):**\\n- Invita a vecinos a traer **objetos de sus casas, granjas, escuelas o almacenes abandonados** que representen la vida rural: \\n &#8211; Una puerta de madera con herrajes oxidados. \\n &#8211; Una silla de madera desvencijada. \\n &#8211; Un sill\u00edn de caballo. \\n &#8211; Una campana de ganado. \\n &#8211; Un libro escolar viejo. \\n &#8211; Una maquinaria agr\u00edcola peque\u00f1a (si est\u00e1 en buen estado). \\n &#8211; L\u00e1minas de revistas antiguas con publicidad de productos rurales.\\n\\n&gt; \ud83d\udccc **Importante:** No se trata de \\\u00bbtirar\\\u00bb objetos, sino de rescatarlos y darles nuevo sentido.\\n\\n#### 2. **Crear una \\\u00bbCasa abandonada en el pueblo\\\u00bb (instalaci\u00f3n visual):**\\n- Elige un espacio p\u00fablico (plaza, jard\u00edn, camino de acceso principal).\\n- Construye una **estructura de madera o cart\u00f3n** con forma de casa peque\u00f1a, como si fuera una casita de mu\u00f1ecas, pero desvencijada: puerta torcida, ventanas rotas, techo medio ca\u00eddo.\\n- Coloca los objetos recolectados **dentro y alrededor** de la casa.\\n- A\u00f1ade **fotograf\u00edas enmarcadas** de personas del pueblo en sus trabajos (labores agr\u00edcolas, escuela, fiestas, mercado).\\n- Puedes iluminarla con luces de bajo consumo para que se vea de noche.\\n\\n#### 3. **Incorpora una \\\u00bbvoz\\\u00bb del abandono:**\\n- Pide a personas mayores o antiguos vecinos que **graben un audio** (en 1 minuto) contando:\\n &#8211; Una memoria del pueblo.\\n &#8211; Una reflexi\u00f3n sobre el cambio.\\n &#8211; Una pregunta: *\\\u00bb\u00bfD\u00f3nde est\u00e1 el ni\u00f1o que jugaba aqu\u00ed?\\\u00bb*\\n- Coloca un **altavoz con sonido ambiental** (viento, palomas, silencio) y reproduzca el audio en bucle.\\n\\n#### 4. **Involucra a los m\u00e1s j\u00f3venes:**\\n- Organiza un **taller de dibujo o pintura** con ni\u00f1os y j\u00f3venes: que dibujen **\\\u00bbel pueblo que quisieran tener\\\u00bb o \\\u00bbel pueblo que se fue\\\u00bb**.\\n- Exp\u00f3n los dibujos en una pared o en carteles alrededor de la instalaci\u00f3n.\\n\\n#### 5. **Llamado al pueblo (difusi\u00f3n):**\\n- Crea un **cartel con el t\u00edtulo: \\\u00bbEl Silencio que Habla\\\u00bb** y el mensaje: \\n &gt; *\\\u00bbEste pueblo no se ha ido. Est\u00e1 aqu\u00ed, en lo que dej\u00f3. \u00bfQu\u00e9 hacemos con esto?\\\u00bb* \\n- Col\u00f3calo en la entrada del pueblo, redes sociales, y en la web del ayuntamiento (si hay).\\n\\n&#8212;\\n\\n### \ud83d\udcf8 **\u00bfQu\u00e9 se ve? (Impacto visual):**\\n- Una casa vac\u00eda que grita con objetos.\\n- Fotos que recuerdan.\\n- Voces que susurran el pasado.\\n- Dibujos que imaginen el futuro.\\n\\n\ud83d\udc49 Es una **instalaci\u00f3n ef\u00edmera** (para que dure solo 7 d\u00edas), pero que deja huella.\\n\\n&#8212;\\n\\n### \ud83c\udf31 **Posibles seguimientos (una vez terminada la acci\u00f3n):**\\n- Publicar una **galer\u00eda fotogr\u00e1fica** del proyecto en redes o en el peri\u00f3dico local.\\n- Proponer al ayuntamiento una **\\\u00bbRuta del Abandono y la Memoria\\\u00bb** con puntos como este.\\n- Iniciar un **archivo oral** de historias del pueblo.\\n\\n&#8212;\\n\\n### \ud83d\udcac Frase clave para usar:\\n&gt; *\\\u00bbNo es que el pueblo se haya ido. Es que lo que queda es lo que m\u00e1s importa.\\\u00bb*\\n\\n&#8212;\\n\\n### \u2705 Beneficios de esta acci\u00f3n:\\n- F\u00e1cil de organizar con pocos recursos. \\n- Incluye a todas las edades. \\n- Genera di\u00e1logo sobre el futuro del territorio. \\n- Se puede hacer en una finca, en el centro del pueblo o en un camino de monta\u00f1a.\\n\\n&#8212;\\n\\n\u00bfTe gustar\u00eda que te ayude a crear el cartel, el cartel de invitaci\u00f3n, o el guion para el audio? Puedo hacerlo ahora mismo. \u00a1Tu iniciativa puede inspirar a otros pueblos de Castilla-La Mancha! \ud83d\udc9a\ud83c\udf04\u00bb, \u00abrole\u00bb: \u00abassistant\u00bb } ]<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Este ejemplo tiene exactamente la estructura t\u00edpica de un dato usado para <em>instruction tuning<\/em>: un usuario formula una instrucci\u00f3n y el asistente entrega una respuesta considerada adecuada. Al entrenar con muchos ejemplos de este tipo, el modelo aprende no s\u00f3lo a continuar texto, como en el <em>pretraining<\/em>, sino a comportarse como un asistente: interpretar solicitudes, organizar respuestas, seguir instrucciones y adoptar un formato conversacional.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que el modelo ha sido entrenado con esta base de datos, puede ser debidamente <strong>prompteado<\/strong>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--9 wp-block-paragraph\">Prompt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es una cadena de texto que env\u00eda el usuario a un modelo de lenguaje para producir alguna respuesta \u00fatil. Si bien el objetivo principal de los <em>prompts<\/em> es generar texto, tambi\u00e9n cumplen el rol de entender si el modelo ha aprendido correctamente, es por esto, que este concepto ser\u00e1 especialmente importante para este proyecto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el contexto del <em>prompting<\/em>, tambi\u00e9n aparece el concepto de <em>in-context learning<\/em>, que es el tipo de \u00bbaprendizaje\u00bb que ocurre cuando el modelo mejora su comportamiento gracias a la informaci\u00f3n contenida en el prompt, pero sin actualizar sus par\u00e1metros. Es decir, el modelo parece adaptarse a una nueva tarea porque el prompt le dio suficientes pistas, pero internamente sus pesos no cambiaron.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por \u00faltimo, tambi\u00e9n est\u00e1 el concepto de <em>system-prompt<\/em>, que es un <em>prompt<\/em> normalmente invisible para el usuario, que define el rol general del modelo, su tono y sus instrucciones de comportamiento. Por ejemplo, puede decirle al modelo que act\u00fae como asistente \u00fatil, que responda de forma clara, que mantenga cierto tono o que siga ciertas restricciones. Ese <em>system prompt<\/em> se antepone al mensaje del usuario, de modo que el modelo genera su respuesta condicionado por ambos: primero las instrucciones del sistema y luego el mensaje del usuario.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--10 wp-block-paragraph\">Generaci\u00f3n y sampleo<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En la secci\u00f3n sobre generaci\u00f3n condicional de texto vimos que la estrategia est\u00e1ndar para generar el siguiente token viene dada por una probabilidad condicional, es decir, si tenemos un conjunto X de palabras candidatas para ser la pr\u00f3xima en nuestro proceso de generaci\u00f3n:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">X = {\u00bbsoluci\u00f3n\u00bb, \u00bbimagen\u00bb,\u00bbrespuesta\u00bb,\u00bbidea\u00bb},<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">un criterio natural para elegir la siguiente palabra que viene despu\u00e9s de la cadena \u00bbHoy vamos a crear una \u00bb, es mediante el siguiente c\u00e1lculo<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">P(x | \u00bbHoy vamos a crear una \u00bb),<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">que se puede ilustrar como<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-9-1024x576.png\" alt=\"\" class=\"wp-image-227\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-9-1024x576.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-9-300x169.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-9-768x432.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-9-1536x864.png 1536w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-9.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En este punto, necesitamos una estrategia de elecci\u00f3n. Evidentemente, el criterio m\u00e1s intuitivo es elegir la\/el palabra\/token que tiene la probabilidad m\u00e1s alta de seguir en la secuencia, es decir, en este caso ser\u00eda \u00bbsoluci\u00f3n\u00bb, con un 41%. Este criterio se llama <strong><em>greedy decoding<\/em><\/strong>. En la siguiente secci\u00f3n lo veremos en detalle.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--11 wp-block-paragraph\">Greedy decoding<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formalmente, en este m\u00e9todo elegimos el token con la probabilidad m\u00e1s alta en cada iteraci\u00f3n. Si bien dicha estrategia parece ser la correcta -dada la tendencia que tenemos de elegir \u00f3ptimos locales-, lo cierto es que este m\u00e9todo no es muy usado en LLMs. \u00bfLa raz\u00f3n? Produce salidas extremadamente deterministas, y los textos que produce parecen gen\u00e9ricos. Por este motivo, se suelen implementar otros m\u00e9todos, como <strong><em>random sampling<\/em><\/strong>, que explicaremos en la siguiente secci\u00f3n.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--12 wp-block-paragraph\">Random sampling<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este procedimiento implica seleccionar el pr\u00f3ximo token sampleando la distribuci\u00f3n sobre la pr\u00f3xima palabra. En t\u00e9rminos concretos, ilustramos este principio en la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-10-1024x576.png\" alt=\"\" class=\"wp-image-230\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-10-1024x576.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-10-300x169.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-10-768x432.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-10-1536x864.png 1536w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-10.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver, primero debemos tener cada token\/palabra con su respectiva probabilidad. En este punto, las probabilidades suman 1, puesto que la <em>softmax<\/em> ya fue aplicada sobre el vector <em>logit<\/em> (si no entendiste nada de esto, revisa la secci\u00f3n \u00ab<strong><em>Estructura de una red neuronal<\/em><\/strong>\u00bb de <a href=\"https:\/\/pulki.es\/blog\/index.php\/2026\/04\/11\/large-language-model-llm-from-scratch-neural-networks\/\">esta<\/a> entrada). Luego, tomamos un n\u00famero aleatorio de una distribuci\u00f3n uniforme con soporte [0,1], y vemos en qu\u00e9 punto de la cdf cay\u00f3. Dependiendo de la regi\u00f3n, ser\u00e1 la pr\u00f3xima palabra que elegiremos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pesar de que este m\u00e9todo a\u00f1ade novedad a las respuestas, tampoco funciona muy bien, puesto que los textos que produce son algunas veces demasiado aleatorios. El principio de esta idea se muestra en la siguiente imagen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-11-1024x576.png\" alt=\"\" class=\"wp-image-231\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-11-1024x576.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-11-300x169.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-11-768x432.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-11-1536x864.png 1536w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-11.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver, despu\u00e9s de la distribuci\u00f3n inicial, si el n\u00famero que sali\u00f3 de la distribuci\u00f3n uniforme es consistente con la palabra \u00bbsoluci\u00f3n\u00bb, entonces ahora el nuevo contexto es \u00bbHoy vamos a crear una soluci\u00f3n \u00bb. Luego, si queremos generar la palabra siguiente, la distribuci\u00f3n parece m\u00e1s id\u00f3nea, o al menos, las palabras siguientes son relativamente id\u00f3neas comparadas al caso 2B. En este caso, si por alg\u00fan motivo el n\u00famero que sale de la distribuci\u00f3n uniforme favorece a la palabra \u00bbidea\u00bb, las palabras siguientes generan una oraci\u00f3n menos elocuente. En la siguiente secci\u00f3n veremos una soluci\u00f3n intermedia: <em><strong>temperature sampling<\/strong><\/em>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--13 wp-block-paragraph\">Temperature sampling <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este m\u00e9todo cambia la forma de la distribuci\u00f3n de probabilidad, por tanto, seg\u00fan un par\u00e1metro que usualmente es  <math data-latex=\"\\tau\"><semantics><mi>\u03c4<\/mi><annotation encoding=\"application\/x-tex\">\\tau<\/annotation><\/semantics><\/math>, podemos aumentar la probabilidad de las palabras\/tokens con probabilidad alta, y disminuir la probabilidad de las palabras con probabilidad baja. Esto, se hace mediante la siguiente transformaci\u00f3n (nuevamente, si no entiendes esto, debes leer <a href=\"https:\/\/pulki.es\/blog\/index.php\/2026\/04\/11\/large-language-model-llm-from-scratch-neural-networks\/\">esta<\/a> entrada)<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><math data-latex=\"y = softmax(\\frac{u}{\\tau})\"><semantics><mrow><mi>y<\/mi><mo>=<\/mo><mi>s<\/mi><mi>o<\/mi><mi>f<\/mi><mi>t<\/mi><mi>m<\/mi><mi>a<\/mi><mi>x<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mfrac><mi>u<\/mi><mi>\u03c4<\/mi><\/mfrac><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">y = softmax(\\frac{u}{\\tau})<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, en la siguiente l\u00e1mina mostramos como quedar\u00eda la distribuci\u00f3n de probabilidad para distintos valores de <math data-latex=\"\\tau\"><semantics><mi>\u03c4<\/mi><annotation encoding=\"application\/x-tex\">\\tau<\/annotation><\/semantics><\/math>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-12-1024x576.png\" alt=\"\" class=\"wp-image-233\" srcset=\"https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-12-1024x576.png 1024w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-12-300x169.png 300w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-12-768x432.png 768w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-12-1536x864.png 1536w, https:\/\/pulki.es\/blog\/wp-content\/uploads\/2026\/04\/image-12.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver, un valor alto de <math data-latex=\"\\tau\"><semantics><mi>\u03c4<\/mi><annotation encoding=\"application\/x-tex\">\\tau<\/annotation><\/semantics><\/math> (en nuestro ejemplo, <math data-latex=\"\\tau=2.0\"><semantics><mrow><mi>\u03c4<\/mi><mo>=<\/mo><mn>2.0<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">\\tau=2.0<\/annotation><\/semantics><\/math>), aplana la distribuci\u00f3n, haci\u00e9ndola similar a la uniforme, mientras que valores bajos hacen que el extremo superior acumule m\u00e1s masa, y el inferior menos. Esto es muy \u00fatil, puesto que el modelo ahora tendr\u00e1 espacio para generar cadenas de texto relativamente m\u00e1s creativas que <em>greedy decoding<\/em> (para <math data-latex=\"\\tau <1\"><semantics><mrow><mi>\u03c4<\/mi><mo>&lt;<\/mo><mn>1<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">\\tau &lt;1<\/annotation><\/semantics><\/math>), pero m\u00e1s elocuentes que <em>random sampling<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5) Entrenando LLM&#8217;s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hasta ahora, hemos descrito conceptos clave para entender qu\u00e9 es un LLM. En esta secci\u00f3n veremos c\u00f3mo algunas de esas partes se organizan, para conformar el proceso de entrenamiento de este.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seg\u00fan nuestra referencia, <strong><a href=\"https:\/\/web.stanford.edu\/~jurafsky\/slp3\/\">Jurafsky y Martin (2026)<\/a><\/strong>, existen tres grandes etapas, <em>pretraining<\/em>, <em>instruction tuning<\/em> y <em>alignment<\/em>. A continuaci\u00f3n explicaremos cada una de ellas.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--14 wp-block-paragraph\">5.1) Pretraining<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta es la primera etapa del entrenamiento, y consta de entrenar al modelo para predecir la siguiente palabra sobre un corpus de texto gigante. En t\u00e9rminos estad\u00edsticos, en esta etapa se usan las herramientas vistas en <a href=\"https:\/\/pulki.es\/blog\/index.php\/2026\/04\/11\/large-language-model-llm-from-scratch-neural-networks\/\">esta<\/a> entrada, es decir, para llevarla a cabo es preciso entender ideas como neural networks, cross-entropy loss, etc. Con respecto al volumen de datos, es enorme. Para que te hagas una idea, GPT-3 fue entrenado con 300 billones de tokens (ver <em>footnote<\/em> de la <a href=\"https:\/\/arxiv.org\/pdf\/2005.14165\">tabla 2.1<\/a>), es decir, si aproximamos 1 token como 4 caracteres, y 1 car\u00e1cter como 1 byte, llegamos a una cifra estimativa de 1200GB de texto plano (debes ser cauteloso con esta cifra, es una aproximaci\u00f3n, y como tal, puede variar).<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--15 wp-block-paragraph\">5.2) Instruction tuning (o Supervised finetuning)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En esta etapa el modelo es entrenado nuevamente, pero esta vez para seguir instrucciones tales como escribir c\u00f3digo, traducir oraciones, etc. Como vimos anteriormente, es entrenado en un corpus especial, similar al que mostramos en la secci\u00f3n <em>instruction-tuning<\/em>.<\/p>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--16 wp-block-paragraph\">5.3) Alignment<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como lo expresa su palabra en ingl\u00e9s, esta etapa alinea el modelo para evitar que sea da\u00f1ino, y mejorar su utilidad. En este punto, los investigadores usan un conjunto de datos que consiste en un contexto y dos potenciales continuaciones, una continuaci\u00f3n aceptada y otra rechazada, cuya continuaci\u00f3n es generalmente curada por seres humanos. Entonces, el modelo es entrenado para seguir la aceptada, y no la rechazada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En conjunto, estas tres etapas permiten construir los LLM modernos. Durante el <strong>pretraining<\/strong>, el modelo aprende regularidades estad\u00edsticas, sint\u00e1cticas y sem\u00e1nticas del lenguaje a partir de enormes cantidades de texto. Luego, mediante <strong>instruction tuning<\/strong>, aprende a responder instrucciones de forma m\u00e1s \u00fatil para los usuarios. Finalmente, en la etapa de <strong>alignment<\/strong>, el modelo es ajustado para generar respuestas m\u00e1s seguras, \u00fatiles y alineadas con preferencias humanas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pesar de toda esta complejidad, la idea fundamental sigue siendo sorprendentemente simple: en cada paso, el modelo intenta predecir cu\u00e1l es el siguiente token m\u00e1s probable dado el contexto disponible. Sin embargo, cuando esta estrategia se escala a corpus gigantescos, redes neuronales profundas y grandes capacidades computacionales, emergen habilidades que hacen posible sistemas como ChatGPT, Claude o Gemini.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Notas finales, y pr\u00f3xima entrada\u2026<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En esta entrada vimos los componentes b\u00e1sicos de un LLM, y en qu\u00e9 consiste su entrenamiento. Todos estos conceptos ser\u00e1n vistos en detalle en las pr\u00f3ximas entradas, no obstante, antes de abordarlos era preciso tener una imagen panor\u00e1mica de c\u00f3mo se interconectan. Stay Tuned!!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jos\u00e9 Miguel Mu\u00f1oz Urra \u2013&nbsp;<a href=\"mailto:jmunozu@pulki.es\">jmunozu@pulki.es<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta entrada introduciremos los LLMs. Al igual que el resto de las publicaciones relacionadas con este t\u00f3pico, seguiremos fielmente el libro de Jurafsky y Martin (2026), puesto que es extremadamente ilustrativo. En esta l\u00ednea, partiremos la presente entrada definiendo los LLM&#8217;s tal y como lo hacen estos autores en el cap\u00edtulo 7. En particular, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-201","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=201"}],"version-history":[{"count":28,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts\/201\/revisions"}],"predecessor-version":[{"id":241,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/posts\/201\/revisions\/241"}],"wp:attachment":[{"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pulki.es\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}