<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prompt Engineering on kenji.blog</title><link>http://kenji.blog/es/tags/prompt-engineering/</link><description>Recent content in Prompt Engineering on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 20:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/es/tags/prompt-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Para ingenieros: Fundamentos de la ingeniería de prompts y su aplicación al desarrollo</title><link>http://kenji.blog/es/p/prompt-engineering-for-engineers/</link><pubDate>Fri, 11 Sep 2026 20:00:00 +0900</pubDate><guid>http://kenji.blog/es/p/prompt-engineering-for-engineers/</guid><description>&lt;img src="http://kenji.blog/p/prompt-engineering-for-engineers/img/eyecatch.jpg" alt="Featured image of post Para ingenieros: Fundamentos de la ingeniería de prompts y su aplicación al desarrollo" />&lt;h1 id="introducción-por-qué-los-ingenieros-deben-aprender-la-ingeniería-de-prompts">Introducción: Por qué los ingenieros deben aprender la ingeniería de prompts
&lt;/h1>&lt;p>El mundo del desarrollo de software se encuentra en medio de un cambio de paradigma sin precedentes debido a la rápida evolución de los Modelos de Lenguaje Grande (LLM). No es exagerado decir que estamos haciendo la transición del &amp;ldquo;Software 2.0 (desarrollo basado en redes neuronales)&amp;rdquo; propuesto por Andrejs Karpathy, al &amp;ldquo;Software 3.0 (desarrollo impulsado por prompts en lenguaje natural)&amp;rdquo;.&lt;/p>
&lt;p>Con la popularización de herramientas de asistencia de IA como GitHub Copilot, Cursor o varias API de LLM, la tarea principal de los ingenieros está cambiando de &amp;ldquo;escribir código desde cero&amp;rdquo; a &amp;ldquo;diseñar instrucciones para que la IA genere el código previsto, y luego revisar e integrar el código generado&amp;rdquo;.&lt;/p>
&lt;p>La habilidad más importante en esta nueva metodología de desarrollo es la &lt;strong>ingeniería de prompts&lt;/strong>. La ingeniería de prompts a menudo se considera una palabra de moda para no ingenieros, como &amp;ldquo;charlar hábilmente con la IA&amp;rdquo;, pero su esencia es &lt;strong>una nueva forma de lenguaje de programación para sistemas computacionales no deterministas (Non-deterministic)&lt;/strong>.&lt;/p>
&lt;p>En este artículo, dirigido a ingenieros de software y arquitectos, explicaremos con extremo detalle (alrededor de 10,000 caracteres) desde los fundamentos matemáticos y arquitectónicos detrás de los LLM, hasta técnicas avanzadas de ingeniería de prompts como Few-Shot, Chain-of-Thought y ReAct, y cómo integrarlas en flujos de trabajo de desarrollo reales y APIs.&lt;/p>
&lt;hr>
&lt;h2 id="1-fundamentos-y-antecedentes-matemáticos-de-los-modelos-de-lenguaje-grande-llm">1. Fundamentos y antecedentes matemáticos de los Modelos de Lenguaje Grande (LLM)
&lt;/h2>&lt;p>Para optimizar los prompts y obtener de manera estable los resultados deseados, es esencial comprender matemática y estructuralmente el &amp;ldquo;interior de la caja negra&amp;rdquo;: cómo el LLM procesa y genera texto o código internamente. La mayoría de los LLM modernos son modelos de lenguaje autorregresivos (Auto-regressive) que utilizan la arquitectura Transformer.&lt;/p>
&lt;h3 id="11-tokenización-tokenization-y-bpe">1.1 Tokenización (Tokenization) y BPE
&lt;/h3>&lt;p>Los LLM no procesan cadenas de texto en bruto directamente. El texto se divide en unidades pequeñas llamadas &lt;strong>tokens (Token)&lt;/strong>. Muchos modelos utilizan un algoritmo llamado Byte-Pair Encoding (BPE).&lt;/p>
&lt;p>Comprender la tokenización es importante para los ingenieros. Esto se debe a que la forma en que se tokeniza la sangría (espacios) y los símbolos especiales en los lenguajes de programación afecta directamente la calidad del código generado. Por ejemplo, en la generación de código Python, el número de espacios (ya sean 4 espacios o una tabulación) a menudo se trata como un token independiente, y si las reglas de sangría no se especifican claramente en el prompt, puede ser causa de errores de sintaxis.&lt;/p>
&lt;h3 id="12-predicción-del-siguiente-token-next-token-prediction">1.2 Predicción del siguiente token (Next Token Prediction)
&lt;/h3>&lt;p>La tarea fundamental de un LLM autorregresivo es predecir &amp;ldquo;el siguiente 1 token más probable&amp;rdquo; que sigue a una secuencia de entrada dada (contexto). Expresado matemáticamente, esto se convierte en un problema de maximización de la probabilidad condicional de la siguiente manera:&lt;/p>
$$ P(w_t | w_{1}, w_{2}, \dots, w_{t-1}) $$
&lt;p>Aquí, $w_i$ representa un token y $t$ es el paso de tiempo (time step) actual. El modelo calcula la distribución de probabilidad del siguiente token a partir del conjunto de tokens de entrada a través de su red neuronal interna. El token generado se agrega autorregresivamente como entrada para el siguiente paso, y este proceso se repite hasta que se emite un token de finalización (como &lt;code>&amp;lt;EOS&amp;gt;&lt;/code>).&lt;/p>
&lt;h3 id="13-mecanismo-de-atención-attention-mechanism-y-ventana-de-contexto">1.3 Mecanismo de Atención (Attention Mechanism) y Ventana de Contexto
&lt;/h3>&lt;p>El núcleo de la arquitectura Transformer es el mecanismo de Autoatención (Self-Attention). Esto permite que el modelo calcule las dependencias entre tokens que están muy separados en una secuencia.&lt;/p>
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
&lt;p>Aquí, $Q$ (Query), $K$ (Key) y $V$ (Value) son matrices generadas a partir de la representación de entrada, y $d_k$ es un factor de escala. Lo que significa esta fórmula es un proceso en el que &amp;ldquo;se calcula a qué palabra pasada (Key) debe prestar atención (Attention) la palabra que se está procesando actualmente (Query), y se incorpora esa información (Value)&amp;rdquo;.&lt;/p>
&lt;p>¿Por qué es importante comprender este mecanismo en la ingeniería de prompts? Porque está directamente relacionado con el concepto de &lt;strong>ventana de contexto (Context Window)&lt;/strong>. Si el prompt de entrada es demasiado largo, las instrucciones importantes pueden quedar enterradas en medio del contexto, lo que dispersa el peso de la Atención y provoca un fenómeno llamado &amp;ldquo;Lost in the middle&amp;rdquo; (pérdida de información intermedia). En lugar de enviar documentos masivos o bases de código enteras en un prompt, se requiere la habilidad de extraer y pasar con precisión solo los fragmentos necesarios.&lt;/p>
&lt;h3 id="14-control-de-muestreo-mediante-el-parámetro-de-temperatura-temperature">1.4 Control de muestreo mediante el parámetro de temperatura (Temperature)
&lt;/h3>&lt;p>En la capa de salida, generalmente se utiliza la función Softmax para convertir los logits (salida en bruto del modelo) en una distribución de probabilidad. Aquí, se introduce la &lt;strong>Temperatura (parámetro de temperatura $T$)&lt;/strong> para controlar la diversidad (aleatoriedad) de la generación.&lt;/p>
$$ p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} $$
&lt;ul>
&lt;li>$z_i$ es el logit (puntuación) del token $i$ en el vocabulario.&lt;/li>
&lt;li>Cuando $T = 1.0$, es un Softmax estándar.&lt;/li>
&lt;li>A medida que $T \to 0$, la distribución de probabilidad se vuelve más nítida y solo se seleccionan los tokens con la probabilidad más alta (determinista, Greedy Decoding).&lt;/li>
&lt;li>Cuando $T > 1.0$, la distribución de probabilidad se aplana y los tokens menores que normalmente no se eligen tienen más probabilidades de ser seleccionados (aumenta la creatividad).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Enfoque práctico para ingenieros:&lt;/strong>
Cuando se utiliza una API para generar código o extraer datos JSON (Structured Output), la práctica habitual es establecer un valor extremadamente bajo de $T=0.0 \sim 0.2$ para prevenir alucinaciones (hallucinations) y mejorar la reproducibilidad. Por otro lado, en tareas exploratorias como la lluvia de ideas de arquitectura o la ideación de convenciones de nomenclatura, se establece en $T=0.7 \sim 1.0$.&lt;/p>
&lt;hr>
&lt;h2 id="2-arquitectura-de-estructura-del-prompt-system-prompt-vs-user-prompt">2. Arquitectura de estructura del prompt: System Prompt vs User Prompt
&lt;/h2>&lt;p>Al construir aplicaciones de IA utilizando la API de OpenAI (GPT-4, etc.) o la API de Anthropic (Claude, etc.), un prompt no es un solo bloque de texto, sino que se estructura como un arreglo de mensajes. Lo más importante en esto es la separación entre &amp;ldquo;System Prompt (Prompt del sistema)&amp;rdquo; y &amp;ldquo;User Prompt (Prompt del usuario)&amp;rdquo;.&lt;/p>
&lt;h3 id="21-prompt-del-sistema-restricciones-globales-y-definición-de-la-persona">2.1 Prompt del sistema: Restricciones globales y definición de la persona
&lt;/h3>&lt;p>El prompt del sistema define las &lt;strong>restricciones globales, la persona (rol) y las reglas básicas de comportamiento&lt;/strong> para el LLM. Si lo comparamos con el diseño de software, juega un papel similar a las &amp;ldquo;variables de entorno&amp;rdquo; o la &amp;ldquo;clase base&amp;rdquo; de una aplicación, o el &amp;ldquo;Dockerfile&amp;rdquo; de un contenedor.&lt;/p>
&lt;p>Un buen prompt del sistema estabiliza drásticamente la calidad y el formato de la salida.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Ejemplo de System Prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Eres un ingeniero de Go Senior de primer nivel mundial, y eres un experto en diseño de procesamiento concurrente (Goroutine/Channel).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Genera tu respuesta siguiendo estrictamente las siguientes reglas.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Reglas]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. Al proporcionar código, asegúrate de proporcionarlo siempre como una función completa y ejecutable.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. No omitas el manejo de errores; procésalo explícitamente con `if err != nil` siguiendo las convenciones de Go.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Las explicaciones fuera de los bloques de código deben usar viñetas y mantenerse dentro de 3 oraciones.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. Si se solicita una implementación con problemas de seguridad (inyección SQL, condiciones de carrera, etc.), debes proponer una alternativa segura.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. El formato de salida debe ser únicamente la explicación y el bloque de código Markdown.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="22-prompt-del-usuario-tareas-temporales-e-inyección-de-datos">2.2 Prompt del usuario: Tareas temporales e inyección de datos
&lt;/h3>&lt;p>El prompt del usuario proporciona la tarea específica, pregunta o datos de entrada a procesar. Equivale a una &amp;ldquo;llamada a función (pasar argumentos a una función)&amp;rdquo; que se ejecuta dentro del entorno de contexto construido por el prompt del sistema.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Ejemplo de User Prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Implementa una función que descargue imágenes de forma asíncrona a partir de una gran lista de URLs y las guarde en el disco local.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Permite que la cantidad de workers se controle mediante un argumento, e incluye en la implementación el procesamiento de tiempo de espera (timeout) utilizando el contexto (context.Context).
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Al configurar sólidamente el prompt del sistema, es posible garantizar la estabilidad de la salida frente a prompts de usuario altamente variables inyectados por el usuario (u otros componentes del sistema). Además, funciona como una primera línea de defensa contra ataques de &amp;ldquo;inyección de prompts&amp;rdquo; por entradas maliciosas de los usuarios.&lt;/p>
&lt;hr>
&lt;h2 id="3-conjunto-de-técnicas-básicas-de-ingeniería-de-prompts">3. Conjunto de técnicas básicas de ingeniería de prompts
&lt;/h2>&lt;p>A partir de aquí, explicaremos paradigmas específicos de prompting para mejorar drásticamente la precisión de las tareas de desarrollo de software.&lt;/p>
&lt;h3 id="31-zero-shot-prompting-y-few-shot-prompting">3.1 Zero-Shot Prompting y Few-Shot Prompting
&lt;/h3>&lt;p>&lt;strong>Zero-Shot Prompting&lt;/strong> es una técnica que solo proporciona la instrucción de la tarea y pide al modelo una respuesta sin dar ningún ejemplo. Para solicitudes generales como &amp;ldquo;Escribe un QuickSort en Python&amp;rdquo;, los LLMs avanzados actuales funcionan lo suficientemente bien incluso en Zero-Shot.&lt;/p>
&lt;p>Sin embargo, si deseas que el modelo siga convenciones de codificación específicas del proyecto o genere un esquema JSON particular, es muy probable que el formato se rompa con Zero-Shot. Lo que resuelve esto es el &lt;strong>Few-Shot Prompting&lt;/strong>.&lt;/p>
&lt;p>Few-Shot Prompting es una técnica que presenta unos cuantos &amp;ldquo;pares de entrada y salida esperada (demostraciones)&amp;rdquo; dentro del prompt. Aprovecha un fenómeno llamado &amp;ldquo;In-Context Learning (aprendizaje en contexto)&amp;rdquo;, donde el modelo aprende patrones dentro del contexto del prompt sin actualizar sus parámetros.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Ejemplo de Few-Shot Prompting (Tarea de análisis de logs)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Analiza los siguientes logs en bruto y extrae objetos JSON estructurados.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ejemplo 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Entrada: &amp;#34;[2023-10-01 10:00:05] ERROR [AuthService] Failed to authenticate user id=12345: Invalid password&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Salida: {&amp;#34;timestamp&amp;#34;: &amp;#34;2023-10-01T10:00:05Z&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;ERROR&amp;#34;, &amp;#34;service&amp;#34;: &amp;#34;AuthService&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;Failed to authenticate user&amp;#34;, &amp;#34;user_id&amp;#34;: 12345}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ejemplo 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Entrada: &amp;#34;[2023-10-01 10:05:12] WARN [DBPool] Connection timeout approaching for query_id=987&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Salida: {&amp;#34;timestamp&amp;#34;: &amp;#34;2023-10-01T10:05:12Z&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;WARN&amp;#34;, &amp;#34;service&amp;#34;: &amp;#34;DBPool&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;Connection timeout approaching&amp;#34;, &amp;#34;query_id&amp;#34;: 987}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Entrada de la tarea:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Entrada: &amp;#34;[2023-10-01 10:15:30] FATAL [PaymentGateway] API rate limit exceeded. Retry after 60s&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Salida:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Al proporcionar ejemplos de esta manera, el modelo aprende implícitamente el formato del &lt;code>timestamp&lt;/code> (conversión a ISO 8601) y las reglas de nomenclatura de las claves, y producirá un JSON perfecto.&lt;/p>
&lt;h3 id="32-chain-of-thought-cot-y-zero-shot-cot">3.2 Chain-of-Thought (CoT) y Zero-Shot CoT
&lt;/h3>&lt;p>Un avance significativo en la capacidad de razonamiento de los LLM fue el &lt;strong>Chain-of-Thought (CoT: Cadena de Pensamiento)&lt;/strong>. En tareas que requieren lógica compleja (ej. implementación de algoritmos complejos, seguimiento de errores difíciles, construcción de expresiones regulares, etc.), si se le pide al LLM que emita el código final directamente, es probable que ocurran saltos lógicos o errores (alucinaciones).&lt;/p>
&lt;p>CoT es una técnica que hace que el modelo verbalice el proceso de razonamiento intermedio (proceso de pensamiento) antes de generar la respuesta final. Al hacer que el modelo mismo analice la situación paso a paso, el contexto se enriquece con cada token generado y la precisión de la conclusión final mejora drásticamente.&lt;/p>
&lt;p>La técnica más simple y poderosa es el &lt;strong>Zero-Shot CoT&lt;/strong>, que consiste en agregar la palabra mágica &amp;ldquo;&lt;strong>Pensemos paso a paso (Let&amp;rsquo;s think step by step)&lt;/strong>&amp;rdquo; al final del prompt.&lt;/p>
&lt;p>En el desarrollo, aplicamos este concepto y estructuramos los prompts de la siguiente manera:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Crea un componente de React que cumpla con las siguientes especificaciones.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Especificaciones]...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Antes de generar el código, describe tu proceso de pensamiento (dentro de las etiquetas &amp;lt;thinking&amp;gt;) siguiendo estos pasos.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. Identificación del estado (State) necesario y diseño de la estructura de datos.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Consideración de casos extremos posibles y manejo de errores.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Consideración de la unidad de división del componente.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Una vez completado el proceso de pensamiento, escribe el código final en TypeScript.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="mermaid">graph TD
A["Prompt del usuario: Definición de requisitos complejos"] --> B["Inicio del proceso de razonamiento del LLM"]
B --> C["Paso 1: Descomposición lógica de los requisitos"]
C --> D["Paso 2: Diseño de estructura de datos y tipos"]
D --> E["Paso 3: Selección de algoritmos y evaluación de complejidad temporal"]
E --> F["Paso 4: Consideración de casos extremos y seguridad"]
F --> G["Generación del código final optimizado"]&lt;/div>
&lt;h3 id="33-tree-of-thoughts-tot">3.3 Tree of Thoughts (ToT)
&lt;/h3>&lt;p>Una extensión del concepto de CoT es el &lt;strong>Tree of Thoughts (ToT)&lt;/strong>. Mientras que CoT sigue una ruta de razonamiento única (lineal), ToT expande múltiples rutas de razonamiento (ramas) en paralelo como un árbol de búsqueda, haciendo que el modelo autoevalúe cada ruta, realizando un retroceso (backtracking) y llegando a la solución óptima.&lt;/p>
&lt;p>ToT es extremadamente efectivo para problemas con un gran espacio de búsqueda y propensos a caer en óptimos locales, como el diseño de arquitectura de sistemas, diseño de esquemas de bases de datos complejos o planes de refactorización a gran escala.&lt;/p>
&lt;div class="mermaid">graph TD
Root["Problema inicial: Estrategia de división de monolito a microservicios"]
Root --> Path1["Ruta de pensamiento A: División basada en Diseño Guiado por el Dominio (DDD)"]
Root --> Path2["Ruta de pensamiento B: División por tablas de base de datos"]
Root --> Path3["Ruta de pensamiento C: División basada en tráfico/carga"]
Path1 --> Eval1["Autoevaluación: Alta cohesión, pero gran costo de modelado en fases tempranas."]
Path2 --> Eval2["Autoevaluación: Implementación fácil, pero alto riesgo de acoplamiento entre servicios en el futuro."]
Path3 --> Eval3["Autoevaluación: Escalabilidad asegurada, pero gestión de transacciones compleja."]
Eval1 --> Select["Decisión: Priorizando mantenibilidad a largo plazo, se adopta la Ruta A (basada en DDD)."]
Eval2 --> Discard1["Rechazado"]
Eval3 --> Discard2["Rechazado"]
Select --> Detail["Generar propuesta detallada de división de servicios y diseño de API basada en la estrategia adoptada."]&lt;/div>
&lt;p>Para implementar ToT en un prompt, puedes instruir: &amp;ldquo;Propón múltiples enfoques, evalúa las ventajas y desventajas de cada uno, y luego adopta e implementa el mejor enfoque&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="4-flujo-de-trabajo-agente-agentic-workflow-y-react-reasoning-and-acting">4. Flujo de trabajo Agente (Agentic Workflow) y ReAct (Reasoning and Acting)
&lt;/h2>&lt;p>La aplicación de los LLM está evolucionando rápidamente de simples entradas y salidas de texto a la era de los &lt;strong>Agentes de IA (AI Agents)&lt;/strong>, que planifican de manera autónoma e interactúan con entornos externos para completar tareas. El paradigma central de esta arquitectura de agentes es &lt;strong>ReAct (Reasoning and Acting)&lt;/strong>.&lt;/p>
&lt;h3 id="41-concepto-del-framework-react">4.1 Concepto del framework ReAct
&lt;/h3>&lt;p>Los LLM tradicionales podían &amp;ldquo;pensar antes de responder (CoT)&amp;rdquo;, pero no podían &amp;ldquo;actuar&amp;rdquo; para compensar su falta de conocimiento. El framework ReAct supera esta limitación al hacer que el LLM alterne entre el &amp;ldquo;Pensamiento (Thought)&amp;rdquo; y la &amp;ldquo;Acción (Action)&amp;rdquo;.&lt;/p>
&lt;p>El modelo analiza el problema (Thought), y si determina que le falta información, ejecuta una herramienta externa (búsqueda web, consulta de base de datos, comando de shell, llamada a API, etc.) (Action). Recibe el resultado de la ejecución de la herramienta (Observation), lo utiliza como un nuevo contexto para seguir pensando, y repite este ciclo hasta llegar a la respuesta final (Finish).&lt;/p>
&lt;div class="mermaid">graph LR
Start["Inicio de la tarea"] --> Thought["Thought (Análisis de situación y planificación)"]
Thought --> Action["Action (Selección y ejecución de la herramienta adecuada)"]
Action --> Environment["Entorno externo (API / DB / Shell / Code Interpreter)"]
Environment --> Observation["Observation (Resultados de ejecución o logs de error de la herramienta)"]
Observation --> Thought
Thought -->|Suficiente información recopilada| Finish["Finish (Respuesta final / salida de código)"]&lt;/div>
&lt;h3 id="42-implementación-mediante-function-calling-uso-de-herramientas">4.2 Implementación mediante Function Calling (Uso de herramientas)
&lt;/h3>&lt;p>La interfaz estándar para integrar ReAct en sistemas es el &lt;strong>Function Calling (Llamada a funciones / Uso de herramientas)&lt;/strong> proporcionado por OpenAI y Anthropic.&lt;/p>
&lt;p>El ingeniero proporciona al LLM &amp;ldquo;una definición de las herramientas disponibles (esquema JSON)&amp;rdquo; junto con el prompt del sistema. El LLM analiza el contexto del prompt, y si decide que debe usar una herramienta, emite el &amp;ldquo;nombre de la función a llamar&amp;rdquo; y el &amp;ldquo;JSON de sus argumentos&amp;rdquo; en lugar de texto normal. La aplicación ejecuta esa función y devuelve el resultado al LLM, cerrando así el ciclo.&lt;/p>
&lt;p>&lt;strong>Ejemplo de aplicación en desarrollo (Agente de depuración autónomo):&lt;/strong>
Si quieres construir un agente que investigue la causa y genere un parche cuando falla una prueba en un pipeline de CI/CD, proporcionarías las siguientes herramientas al LLM:&lt;/p>
&lt;ol>
&lt;li>&lt;code>search_codebase(regex_pattern)&lt;/code>: Busca en el código del repositorio con una expresión regular.&lt;/li>
&lt;li>&lt;code>view_file_content(file_path, start_line, end_line)&lt;/code>: Lee el contenido de un archivo especificado.&lt;/li>
&lt;li>&lt;code>run_unit_test(test_file_path)&lt;/code>: Ejecuta una prueba unitaria específica y obtiene el traceback.&lt;/li>
&lt;li>&lt;code>propose_patch(file_path, diff_content)&lt;/code>: Propone un parche con la corrección.&lt;/li>
&lt;/ol>
&lt;p>El LLM razonará y actuará de manera autónoma de la siguiente manera:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Thought&lt;/strong>: Mirando el log de la prueba, hay un &lt;code>KeyError: 'user_id'&lt;/code> en la línea 45 de &lt;code>src/auth.py&lt;/code>. Necesito revisar el código circundante.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: &lt;code>view_file_content(file_path=&amp;quot;src/auth.py&amp;quot;, start_line=30, end_line=60)&lt;/code>&lt;/li>
&lt;li>&lt;strong>Observation&lt;/strong>: (La aplicación lee el contenido del archivo y lo devuelve al LLM)&lt;/li>
&lt;li>&lt;strong>Thought&lt;/strong>: Ya veo, falta la validación del caso donde el JSON de respuesta de la API no contiene &lt;code>user_id&lt;/code>. Crearé un parche para reescribirlo usando el método seguro &lt;code>.get()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: &lt;code>propose_patch(...)&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>De esta manera, la ingeniería de prompts se eleva de &amp;ldquo;controlar la generación de texto&amp;rdquo; a la &amp;ldquo;definición de herramientas y orquestación del ciclo del agente&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="5-rag-retrieval-augmented-generation-e-integración-de-bases-de-código">5. RAG (Retrieval-Augmented Generation) e integración de bases de código
&lt;/h2>&lt;p>Una de las mayores debilidades de los LLM es que no conocen &amp;ldquo;información privada&amp;rdquo; o &amp;ldquo;información más reciente&amp;rdquo; que no estaba incluida en sus datos de preentrenamiento. Si preguntas sobre un repositorio interno privado o especificaciones de API patentadas, el LLM mentirá con tranquilidad (alucinación) o solo podrá dar una respuesta general.&lt;/p>
&lt;p>La arquitectura que resuelve esto es &lt;strong>RAG (Generación Aumentada por Recuperación)&lt;/strong>. RAG es una tecnología que combina la recuperación de información (Retrieval) y la capacidad de generación del LLM (Generation).&lt;/p>
&lt;h3 id="51-embeddings-y-búsqueda-vectorial">5.1 Embeddings y Búsqueda Vectorial
&lt;/h3>&lt;p>En el fondo de RAG se encuentra un modelo matemático de espacio vectorial. El código fuente y los documentos internos se convierten en vectores de alta dimensionalidad (por ejemplo, un arreglo de 1536 números de punto flotante) mediante un modelo de Embedding (por ejemplo, &lt;code>text-embedding-3-small&lt;/code>) y se almacenan en una base de datos vectorial (Vector Database).&lt;/p>
&lt;p>Cuando un usuario introduce una pregunta (consulta o query), la consulta también se vectoriza utilizando el mismo modelo, y se calcula la &lt;strong>similitud de coseno (Cosine Similarity)&lt;/strong> con los vectores de documentos en la base de datos.&lt;/p>
$$ \text{Cosine Similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} $$
&lt;p>Se obtienen los fragmentos de código o documentos con la mayor similitud (los más cercanos semánticamente), y estos se inyectan dinámicamente en el prompt del usuario como &amp;ldquo;contexto&amp;rdquo;.&lt;/p>
&lt;h3 id="52-aplicación-de-rag-al-flujo-de-trabajo-de-desarrollo">5.2 Aplicación de RAG al flujo de trabajo de desarrollo
&lt;/h3>&lt;p>Al integrar RAG en herramientas de desarrollo, se habilitan funcionalidades potentes dentro del IDE como:&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Engineer["Ingeniero"]
participant RAG_System["Plugin IDE (RAG)"]
participant VectorDB["Vector Database (Código base)"]
participant LLM["LLM API"]
Engineer->>RAG_System: "¿Dónde se implementa el proceso de rollback de transacciones en el flujo de pago actual?"
RAG_System->>VectorDB: "Vectoriza la consulta y ejecuta búsqueda semántica"
VectorDB-->>RAG_System: "Bloques de código relacionados (payment_service.go, db_tx.go, etc.)"
RAG_System->>LLM: "Prompt del sistema + Bloques de código recuperados + Pregunta del ingeniero"
LLM-->>RAG_System: "Explicación precisa y desglose de la arquitectura basados en el código extraído"
RAG_System-->>Engineer: "Presenta la respuesta y un enlace a la línea correspondiente del código fuente"&lt;/div>
&lt;p>Una técnica de ingeniería de prompts clave al construir RAG para un código base es que la precisión de búsqueda mejora drásticamente si, en lugar de simplemente fragmentar el código, también se incluyen en la vectorización los &amp;ldquo;resúmenes generados a partir de los Docstrings de cada función y del árbol de sintaxis abstracta (AST) de las clases&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="6-casos-de-uso-prácticos-en-ingeniería-y-ejemplos-avanzados-de-prompts">6. Casos de uso prácticos en ingeniería y ejemplos avanzados de prompts
&lt;/h2>&lt;p>Presentamos casos de uso prácticos y técnicas de prompts sobre cómo aplicar la teoría de la ingeniería de prompts para automatizar y agilizar las tareas de desarrollo diarias.&lt;/p>
&lt;h3 id="61-automatización-de-revisión-de-código-y-complemento-de-análisis-estático">6.1 Automatización de revisión de código y complemento de análisis estático
&lt;/h3>&lt;p>Integrar LLMs en la canalización de CI para realizar automáticamente revisiones de código cuando se crea un Pull Request (PR). El objetivo es que señale inconsistencias en la lógica de negocio y antipatrones de diseño que las herramientas de Lint o análisis estático no pueden detectar.&lt;/p>
&lt;p>&lt;strong>Ejemplo de prompt (Solicitando salida estructurada):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Eres un ingeniero de software senior estricto y experimentado.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Analiza la diferencia del Pull Request (Git Diff) proporcionado y realiza una revisión de código.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Áreas de enfoque de la revisión]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. Vulnerabilidades de seguridad (Inyección, XSS, derivación de autorización, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Cuellos de botella en rendimiento (Problema de consultas N+1, cálculos de bucle ineficientes, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Mantenibilidad y legibilidad (Violaciones de principios SOLID, anidamiento demasiado complejo, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Restricciones]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- No señales simples infracciones de formato (como sangrías), ya que esa es la función de una herramienta de Lint.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Si no hay problemas, no fuerces comentarios; devuelve un arreglo vacío.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- La salida DEBE seguir estrictamente el siguiente esquema JSON. No la encierres en comillas invertidas de Markdown (```json).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Formato de salida JSON esperado]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;review_comments&amp;#34;: [
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;file_path&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;line_number&amp;#34;: &amp;#34;integer&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;severity&amp;#34;: &amp;#34;High | Medium | Low&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;issue_title&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;detailed_description&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;suggested_code_fix&amp;#34;: &amp;#34;string&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Datos Git Diff]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{PR_DIFF}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>El punto clave de este prompt es forzar la salida del LLM a un JSON fácil de parsear, y definir claramente la división entre el rol de la herramienta Lint y el rol del LLM (definición de los límites del sistema).&lt;/p>
&lt;h3 id="62-prompting-defensivo-defensive-prompting-en-la-generación-de-código-zero-shot">6.2 &amp;ldquo;Prompting defensivo (Defensive Prompting)&amp;rdquo; en la generación de código Zero-Shot
&lt;/h3>&lt;p>Un problema común que ocurre al hacer que la IA escriba código son fenómenos como &amp;ldquo;importar bibliotecas inexistentes (alucinación)&amp;rdquo; y &amp;ldquo;omitir definiciones de variables necesarias (por ejemplo, omitir con &lt;code># Escribe el procesamiento aquí&lt;/code>)&amp;rdquo;. Para evitar esto, configuramos fuertes medidas de seguridad dentro del prompt mediante el &amp;ldquo;Prompting defensivo&amp;rdquo;.&lt;/p>
&lt;p>&lt;strong>Elementos importantes de un prompt defensivo:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Prohibición de omisiones:&lt;/strong> &amp;ldquo;No omitas el código ni uses marcadores de posición (por ejemplo, &lt;code>// ...&lt;/code>); genera un archivo completo que se pueda copiar, pegar y ejecutar directamente.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Prevención de alucinaciones:&lt;/strong> &amp;ldquo;Si no existe una biblioteca estándar para cumplir con los requisitos, no inventes una biblioteca de terceros inexistente por tu cuenta. En ese caso, especifica que es necesaria la instalación de una biblioteca externa y propón un código usando la biblioteca más estándar (ej: requests).&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Requisito de autosuficiencia:&lt;/strong> &amp;ldquo;Todas las variables y funciones deben estar adecuadamente definidas dentro del bloque de código.&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;h3 id="63-generación-automática-de-pruebas-basadas-en-propiedades--pruebas-de-casos-extremos">6.3 Generación automática de pruebas basadas en propiedades / pruebas de casos extremos
&lt;/h3>&lt;p>Se pide al LLM que encuentre casos extremos para una función implementada por un ingeniero y genere código de prueba. Es muy efectivo para eliminar los sesgos humanos.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">La siguiente función en Python determina si una cadena dada es una dirección IPv4 válida.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Escribe un conjunto de pruebas unitarias completas basadas en pytest para esta función.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Condiciones]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- No solo cubras los casos de prueba exitosos, sino también casos extremos (edge cases) como:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Valores límite (0, 255, 256, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Entradas de diferentes tipos (entero, None, lista, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Cadenas con espacios o caracteres especiales
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Casos con número incorrecto de puntos (menos de 3, 4 o más)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Utiliza pruebas parametrizadas (`@pytest.mark.parametrize`) para mantener el código de prueba conciso.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Código de la función]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">def is_valid_ipv4(ip_str):
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> # Implementación...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-evaluación-de-prompts-y-llmops-eval">7. Evaluación de prompts y LLMOps (Eval)
&lt;/h2>&lt;p>En el mundo de la ingeniería de software, el código no probado se denomina código heredado (legacy code). Lo mismo ocurre con la ingeniería de prompts. Implementar en producción un &amp;ldquo;prompt que probaste un par de veces localmente y funcionó bien&amp;rdquo; es extremadamente peligroso.&lt;/p>
&lt;p>A medida que se actualizan los modelos fundacionales o cambian los datos del dominio procesado, el comportamiento del prompt se rompe fácilmente. Para evitar esto, es fundamental construir un sistema de &lt;strong>Evaluación (Eval)&lt;/strong> para evaluar cuantitativamente el resultado del prompt (LLMOps).&lt;/p>
&lt;h3 id="71-llm-as-a-judge-evaluación-de-llm-por-llm">7.1 LLM-as-a-Judge (Evaluación de LLM por LLM)
&lt;/h3>&lt;p>En tareas como la generación de código o el resumen de textos, no es posible realizar pruebas de coincidencia exacta (Exact Match). Las métricas clásicas de procesamiento de lenguaje natural (BLEU o ROUGE) también se quedan cortas para medir la precisión del significado.&lt;/p>
&lt;p>El estándar actual de la industria es utilizar un modelo potente (por ejemplo, GPT-4o o Claude 3.5 Sonnet) como &amp;ldquo;Juez (Judge)&amp;rdquo; para evaluar el resultado generado por el LLM objetivo, una técnica llamada &lt;strong>LLM-as-a-Judge&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Preparación del conjunto de pruebas&lt;/strong>: Prepara desde decenas hasta cientos de pares de datos de entrada y salidas ideales (o criterios de evaluación).&lt;/li>
&lt;li>&lt;strong>Ejecución&lt;/strong>: Genera las salidas contra el conjunto de pruebas usando el prompt y el modelo a evaluar.&lt;/li>
&lt;li>&lt;strong>Evaluación&lt;/strong>: Prepara un prompt de evaluación (meta-prompt) e instruye al Judge LLM a &amp;ldquo;calificar en una escala de 1 a 5 si la salida generada cumple con los requisitos&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;p>Esto permite detectar regresiones de rendimiento (degradación) de forma automática en la canalización CI/CD al modificar el prompt. La ingeniería de prompts está evolucionando de un &amp;ldquo;ajuste artesanal de prompts&amp;rdquo; a una &amp;ldquo;ingeniería&amp;rdquo; estructurada, impulsada por datos y reproducible.&lt;/p>
&lt;hr>
&lt;h2 id="8-conclusión-el-prompt-es-un-nuevo-componente-de-software">8. Conclusión: El prompt es un nuevo componente de software
&lt;/h2>&lt;p>En una era donde la IA escribe código, a menudo se proclama el &amp;ldquo;fin de la programación&amp;rdquo;, pero la realidad es diferente. Es solo que la capa de abstracción requerida de los ingenieros ha subido un nivel.&lt;/p>
&lt;p>En el pasado, al pasar del lenguaje ensamblador al lenguaje C, y luego a los lenguajes de alto nivel con recolección de basura, fuimos liberados de la molestia de la gestión de memoria y pudimos centrarnos en construir lógica de negocio más compleja. Los LLMs y la ingeniería de prompts son la siguiente ola de abstracción después de eso.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Comprender la arquitectura&lt;/strong>: Entender la naturaleza probabilística de los LLM (autorregresión, Atención, Temperatura) y controlar el no determinismo del sistema.&lt;/li>
&lt;li>&lt;strong>Diseño de contexto&lt;/strong>: Transmitir intenciones claras aprovechando restricciones mediante System Prompts y técnicas como Few-Shot/CoT.&lt;/li>
&lt;li>&lt;strong>Pensamiento de agente e integración de herramientas&lt;/strong>: Utilizar el paradigma ReAct para aprovechar el LLM como orquestador del sistema.&lt;/li>
&lt;li>&lt;strong>Evaluación continua&lt;/strong>: Controlar versiones de los prompts como parte del código y continuar mejorándolos impulsados por pruebas a través de Evals.&lt;/li>
&lt;/ol>
&lt;p>Al dominar estos principios, los prompts dejarán de ser simples cadenas de texto y se convertirán en componentes de software robustos y escalables. Esperamos que integren las técnicas avanzadas de ingeniería de prompts explicadas en este artículo en sus flujos de trabajo de desarrollo y productos, y prosperen como ingenieros que lideran el &amp;ldquo;Software 3.0&amp;rdquo; de la próxima generación.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Generated using Prompt Engineering Techniques.&lt;/em>&lt;/p></description></item></channel></rss>