Objetivo del módulo

Dominar el patrón de reflexión (reflection): pedir a un modelo de lenguaje que revise su propia salida y la mejore. Al terminar, el lector sabrá:

Ruta del módulo

Qué es la reflexión → por qué supera a la generación directa → reflexión sobre gráficos → evaluar su impacto → retroalimentación externa → autoevaluación final.

Revisar el propio borrador

Cuando una persona escribe deprisa, el primer borrador rara vez es el mejor. Al releerlo detecta cosas: «el mes que viene» no deja claro qué días está libre, hay una errata y se le olvidó firmar. Con esa crítica escribe una segunda versión más concreta: «¿estás libre para cenar entre el 5 y el 7?».

Un LLM (large language model, modelo de lenguaje grande) puede hacer lo mismo. Se le pide un primer borrador, la versión 1, y después se le pasa ese borrador, al mismo modelo pero con otro prompt, para que lo revise y escriba una versión 2 mejorada.

Escribe uncorreo…LLMcorreo v1LLMredacta elprimer borradorreflexiona yescribe v2correo v2paso fijado en el códigov1: fechas vagas, errata y sin firmaHola Tommy:Estaré en Madrid el mes que biene,¿te apetece cenar?v2: concreto, corregido y firmadoHola Tommy:Estaré en Madrid del 5 al 7 del mes que viene.¿Te viene bien cenar alguno de esos días?Un abrazo, Ana
Fig. 1 — Reflexión en dos llamadas: el mismo modelo, con otro prompt, revisa su borrador.

En este flujo, el paso de reflexión está fijado en el código (hard-coded): siempre se hace una primera llamada para el borrador y una segunda para revisarlo. Es uno de los patrones agénticos más fáciles de implementar:

# Paso 1: primer borrador v1 = llm(f"Escribe un correo a Tommy para proponerle cenar. Datos: {contexto}") # Paso 2 (fijado en el código): reflexionar y reescribir v2 = llm(f"""Revisa este borrador de correo. Comprueba que las fechas sean concretas, que no haya erratas y que esté firmado. Después escribe una versión mejorada. Borrador: {v1}""")

Reflexión sobre código

El mismo esquema mejora otras salidas. Para programar, se pide al LLM el código de una tarea, se obtiene la versión 1 y se pide al mismo modelo, o a otro, que busque errores y escriba una versión corregida.

Escribe códigopara la tarea XLLM 1código v1LLM 2código v2primer borrador(generación directa)busca erroresy reescribepuede ser otro modelo, por ejemploun modelo de razonamiento
Fig. 2 — Generar con un modelo y reflexionar con otro: cada uno aporta sus puntos fuertes.

Cada modelo tiene puntos fuertes distintos, así que conviene probar combinaciones. Una que funciona bien: generar el primer borrador con un modelo rápido, por generación directa, y revisarlo con un modelo de razonamiento (también llamado thinking model, «modelo que piensa»), que suele ser bueno encontrando errores.

# Un modelo rápido escribe; un modelo de razonamiento revisa codigo_v1 = llm(f"Escribe una función Python para: {tarea}", modelo="generador") codigo_v2 = llm(f"""Busca errores en este código (casos límite, tipos, lógica) y devuelve una versión corregida completa. {codigo_v1}""", modelo="razonamiento")

Retroalimentación externa

Hasta aquí, el modelo reflexiona solo con la información que ya tenía. La reflexión se vuelve mucho más potente cuando entra información nueva desde fuera del LLM (retroalimentación externa, external feedback). En el caso del código, la fuente más directa es ejecutarlo: la salida y los mensajes de error dicen exactamente qué falla.

Escribe códigopara la tarea XLLMcódigo v1ejecutarcódigosalida yerroresLLMcódigo v2SyntaxError: unterminated stringliteral (detected at line 1)información nueva que el LLM no teníareflexiona
Fig. 3 — Ejecutar el código aporta una señal externa: la salida real y los mensajes de error.
import subprocess def ejecutar(codigo): r = subprocess.run(["python", "-c", codigo], capture_output=True, text=True, timeout=30) return r.stdout, r.stderr salida, errores = ejecutar(codigo_v1) codigo_v2 = llm(f"""Este código produjo la siguiente salida y errores. Reflexiona sobre ellos y escribe una versión corregida. Código: {codigo_v1} Salida: {salida} Errores: {errores}""")

Una advertencia: la reflexión no es magia. No hace que el modelo acierte siempre; a menudo aporta una mejora modesta. Pero la decisión de diseño es clara: siempre que exista la oportunidad de aportar información externa al paso de reflexión, hay que aprovecharla.

Mini-quiz · El patrón de reflexión

1. En el flujo básico de reflexión, ¿qué recibe la segunda llamada al LLM?

2. ¿Por qué tiene sentido usar un modelo de razonamiento en el paso de reflexión sobre código?

3. ¿Qué hace más potente a la reflexión?

Ejercicio 1.1 · Buscar la señal externa

Para cada salida, propone una fuente de retroalimentación externa que pueda alimentar el paso de reflexión: (a) una función Python que debe ordenar facturas por fecha; (b) un objeto JSON (notación de objetos de JavaScript) que debe cumplir un esquema; (c) un texto que debe ocupar como máximo 150 palabras; (d) una consulta SQL (lenguaje de consulta estructurado).

Solución

(a) Ejecutar pruebas unitarias con casos conocidos y pasar los fallos al modelo. (b) Un validador de esquema: los errores de validación indican qué campo falta o tiene el tipo equivocado. (c) Un contador de palabras. (d) Ejecutar la consulta en una base de datos de prueba: el mensaje de error, o un resultado vacío, es la crítica.

Ejercicio 1.2 · Diagnosticar un borrador

Un LLM redacta: «Estimado cliente: su pedido llegará pronto. Disculpe las molestias». Los datos del contexto son: pedido #8847, entrega prevista el 14 de marzo, retraso causado por el transportista. Escribe los criterios que pondrías en el prompt de reflexión y una versión 2 plausible.

Solución

Criterios: (1) ¿incluye el número de pedido?; (2) ¿da una fecha concreta en lugar de «pronto»?; (3) ¿explica la causa con datos del contexto?; (4) ¿todos los datos coinciden con el contexto? Versión 2: «Estimado cliente: su pedido #8847 llegará el 14 de marzo. El retraso se debe a una incidencia del transportista. Lamentamos las molestias».

Generación directa

En la generación directa se da una instrucción al LLM y este produce la respuesta de una sola vez: «escribe un ensayo sobre agujeros negros», «escribe una función Python que calcule el interés compuesto anual». A estos prompts se les llama zero-shot (de cero ejemplos), por contraste con técnicas que incluyen ejemplos de la salida deseada:

Convierte a formato DD/MM/AAAAEntrada: {fecha}Zero-shot (sin ejemplos)Convierte a formato DD/MM/AAAAEntrada: 1 de enero de 2025Salida: 01/01/2025Entrada: {fecha}One-shot (un ejemplo)Convierte a formato DD/MM/AAAAEntrada: 1 de enero de 2025Salida: 01/01/2025Entrada: 21 de junio de 2025Salida: 21/06/2025Entrada: {fecha}Few-shot (varios ejemplos)
Fig. 4 — El número de ejemplos incluidos en el prompt da nombre a la técnica; los ejemplos van en violeta.
prompt_few_shot = f"""Convierte la fecha a formato DD/MM/AAAA. Entrada: 1 de enero de 2025 Salida: 01/01/2025 Entrada: 21 de junio de 2025 Salida: 21/06/2025 Entrada: {fecha} Salida:"""

Lo importante para este módulo es la idea común: tanto con cero como con varios ejemplos, el modelo genera la respuesta de un tirón, sin revisarla.

La evidencia

Varios estudios muestran que la reflexión mejora a la generación directa en tareas muy variadas. El trabajo de Madaan y colaboradores (2023), Self-Refine: refinamiento iterativo con autorretroalimentación, comparó distintos modelos (entre ellos GPT-3.5 y GPT-4) con y sin reflexión en tareas como:

TareaQué se pide al modelo
Inversión del sentimientoReescribir una reseña con el sentimiento opuesto
Respuesta en diálogoContestar de forma útil en una conversación
Optimización de códigoHacer más eficiente un programa
Legibilidad de códigoHacer más claro un programa
Razonamiento matemáticoResolver problemas de matemáticas
Generación de acrónimosProponer acrónimos adecuados
Generación con restriccionesEscribir un texto que incluya una lista de palabras

En casi todas las combinaciones de modelo y tarea, la versión con reflexión quedó claramente por encima de la versión directa. Aun así, la mejora depende de cada aplicación: hay que medirla, como se verá en la sección de evaluación.

Dónde rinde más

EjemploProblema típicoPrompt de reflexión
Generar una tabla HTML (lenguaje de marcado de hipertexto)Formato incorrecto, por ejemplo una > que faltaValidar el código HTML
Instrucciones para preparar una taza de té perfectaPasos que faltanComprobar la coherencia y la completitud de las instrucciones
Proponer nombres de dominioSignificados no deseados o difíciles de pronunciar¿Tiene el nombre connotaciones negativas? ¿Es difícil de pronunciar?

Un matiz: con HTML básico, la reflexión aporta poco porque los modelos ya lo hacen bien. Rinde más con salidas estructuradas complejas, como un JSON con mucho anidamiento, donde es más probable que haya errores que detectar.

Prompts de reflexión

Dos reglas guían un buen prompt de reflexión: indicar claramente que se revise el borrador y especificar los criterios con los que debe criticarse. Los criterios concretos orientan al modelo hacia lo que de verdad importa.

prompt_reflexion_dominios = f"""Revisa los nombres de dominio que propusiste: {dominios} 1. Comprueba si cada nombre es fácil de pronunciar (y por tanto de difundir de boca en boca). 2. Valora si algún nombre podría significar algo negativo en otros idiomas. 3. Devuelve una lista corta solo con los nombres que cumplan ambos criterios."""
prompt_reflexion_correo = f"""Revisa el primer borrador del correo: {borrador} 1. Comprueba que el tono sea profesional y señala frases que puedan resultar bruscas o poco sensibles. 2. Verifica que todos los datos, fechas y compromisos coincidan con esta información: {hechos} 3. Después escribe la siguiente versión del correo."""

El segundo prompt tiene sentido cuando el modelo recibió en su contexto los datos, fechas y compromisos que el correo debe respetar: así puede contrastarlos. Una forma eficaz de aprender a escribir buenos prompts es leer prompts escritos por otros; por ejemplo, los de proyectos de código abierto bien hechos.

Error común

Escribir un prompt de reflexión sin criterios, del tipo «revisa y mejora». El modelo reescribe a su gusto: cambia lo que estaba bien, añade relleno y, a veces, introduce errores nuevos. Sin criterios concretos tampoco hay forma de comprobar si la versión 2 es realmente mejor.

Mini-quiz · Reflexión frente a generación directa

1. Un prompt incluye dos pares de entrada y salida de ejemplo antes de la entrada real. ¿Cómo se llama?

2. ¿En cuál de estas salidas es más probable que la reflexión aporte una mejora apreciable?

3. ¿Qué caracteriza a un buen prompt de reflexión?

Ejercicio 2.1 · De zero-shot a few-shot

Un prompt zero-shot dice: «Clasifica la prioridad de esta incidencia como ALTA, MEDIA o BAJA: {incidencia}». El modelo clasifica como ALTA casi todo. Reescríbelo como few-shot.

Solución

Se añaden ejemplos que muestren la frontera entre categorías:

«Clasifica la prioridad como ALTA, MEDIA o BAJA.
Incidencia: el servidor de correo está caído para toda la oficina → ALTA
Incidencia: una impresora de planta imprime con rayas → MEDIA
Incidencia: petición de cambiar el fondo de pantalla corporativo → BAJA
Incidencia: {incidencia} →»

Incluir al menos un ejemplo de MEDIA y otro de BAJA corrige la tendencia a sobreclasificar.

Ejercicio 2.2 · Prompt de reflexión para instrucciones

Un LLM genera instrucciones paso a paso para preparar una taza de té y a veces omite pasos. Escribe el prompt de reflexión.

Solución

«Revisa las instrucciones que escribiste: {instrucciones}. 1. Comprueba que estén en un orden lógico y que cada paso dependa solo de pasos anteriores. 2. Verifica que no falte ningún paso necesario (calentar el agua, la temperatura y el tiempo de infusión según el tipo de té, retirar las hojas). 3. Si encuentras problemas, escribe la versión corregida completa; si no, devuélvelas sin cambios.» Las claves son nombrar la revisión, dar criterios (coherencia y completitud) y definir el formato de salida.

Visualizar ventas de café

La reflexión no se limita al texto. Se parte de los datos de una máquina de café: cada fila registra la fecha, el precio y la bebida vendida.

datepricecoffee_name
2024-01-123.87Latte
2024-01-283.87Hot Chocolate
2024-03-012.89Cappuccino
………
2025-03-233.57Latte

Se quiere que un agente cree un gráfico que compare las ventas del primer trimestre (T1) de 2024 y 2025 a partir de un archivo CSV (valores separados por comas).

El flujo de gráficos

Gráfico: ventas T12024 frente a 2025(coffee_sales.csv)LLMcódigo v1ejecutarcódigo v1+ plot.pngLLMmultimodalcódigo v2ejecutarescribe códigoPythongeneraplot.pngcritica la imagen ycorrige el códigogeneraplot_v2.png
Fig. 5 — Flujo agéntico de generación de gráficos con reflexión sobre la imagen producida.

El LLM escribe código Python (por ejemplo, con pandas y matplotlib) y, al ejecutarlo, se obtiene plot.png. En una ejecución real, la primera versión resultó ser un gráfico de barras apiladas, poco claro para comparar. El paso clave es entregar el código v1 y la imagen a un LLM multimodal, un modelo que también acepta imágenes, y pedirle que examine el gráfico, lo critique, proponga una visualización mejor y actualice el código. Los modelos multimodales razonan visualmente: «ven» el gráfico.

Antes: barras apiladas20242025LatteCapuchinoAmericanoChocolateEspressodifícil compararcada bebidaentre añosDespués: barras agrupadas por bebidaLatteCapuchinoAmericanoChocolateEspressoT1 2024T1 2025
Fig. 6 — Esquema ilustrativo del cambio que propone la reflexión multimodal (datos ficticios).

La versión 2 separa las ventas de 2024 y 2025 en barras normales agrupadas, mucho más fáciles de comparar.

Un modelo para cada paso

Como cada LLM tiene puntos fuertes distintos, es habitual usar uno para la generación inicial y otro para la reflexión. El prompt de reflexión asigna un rol (analista de datos experto), aporta el contexto (código v1, imagen y, si se quiere, el historial de la conversación) y fija criterios concretos: legibilidad, claridad y completitud.

prompt_generacion = f"""Escribe código Python que genere una visualización que responda a la pregunta del usuario. {pregunta_usuario}""" prompt_reflexion = f"""Eres un analista de datos experto que da opiniones constructivas sobre visualizaciones. Paso 1: critica el gráfico adjunto en cuanto a legibilidad, claridad y completitud. Paso 2: escribe código nuevo que aplique tus mejoras. Código v1: {codigo_v1}""" codigo_v1 = llm(prompt_generacion, modelo="generador") ejecutar(codigo_v1) # produce plot.png codigo_v2 = llm(prompt_reflexion, imagenes=["plot.png"], modelo="razonamiento_multimodal")

A veces un modelo de razonamiento funciona mejor en la reflexión que uno sin razonamiento. Qué modelo usar en cada paso es una configuración más que se puede probar en distintas combinaciones.

¿Mejora siempre la reflexión? Los estudios muestran que mejora un poco en algunas aplicaciones, mucho en otras y casi nada en algunas. Por eso hace falta medir su impacto en cada caso concreto.

Mini-quiz · Reflexión sobre gráficos

1. ¿Qué tipo de modelo se necesita en el paso de reflexión del flujo de gráficos?

2. ¿Qué entradas recibe el paso de reflexión en este flujo?

3. ¿Por qué el prompt de reflexión enumera criterios como legibilidad, claridad y completitud?

Ejercicio 3.1 · Criterios para un gráfico de temperaturas

Un agente genera gráficos de líneas con la temperatura horaria de una estación meteorológica durante una semana. Escribe el paso 1 del prompt de reflexión con criterios específicos.

Solución

«Paso 1: critica el gráfico adjunto comprobando: (1) que el título indique la estación y el periodo; (2) que el eje X muestre fechas legibles, sin etiquetas solapadas; (3) que el eje Y indique la unidad (°C) y tenga un rango ajustado a los datos; (4) que el tipo de gráfico (líneas) sea adecuado para una serie temporal; (5) que los huecos de datos se vean como huecos y no como rectas que los unen.» Criterios así son verificables mirando la imagen.

Ejercicio 3.2 · Elegir la configuración

Tienes tres modelos: A (rápido, solo texto), B (multimodal) y C (multimodal y de razonamiento, más lento). ¿Qué combinaciones de generación y reflexión probarías y cómo elegirías?

Solución

La reflexión necesita ver la imagen, así que solo B o C pueden reflexionar. Combinaciones razonables: A→B, A→C, B→B y B→C. Para elegir, se prepara un conjunto de 10–15 peticiones de gráficos, se ejecuta cada configuración y se puntúan los gráficos con una rúbrica (sección siguiente), teniendo en cuenta también la latencia y el coste. Se escoge la configuración con mejor puntuación que encaje en el presupuesto de tiempo.

¿Merece la pena?

La reflexión suele mejorar el rendimiento, pero añade una llamada más y ralentiza el sistema. Antes de mantenerla conviene comprobar cuánto mejora realmente.

Evaluación objetiva

Ejemplo: una tienda responde preguntas como «¿qué color de producto tiene más ventas?». Un LLM genera una consulta SQL; otro LLM, o el mismo, reflexiona sobre ella y la mejora; se ejecuta la consulta y un LLM redacta la respuesta. ¿Mejora la reflexión la respuesta final?

«¿Qué color deproducto vendemás?»generaSQL v1reflexiona:SQL v2ejecutarSQLresultadosresponderpaso evaluadoSin reflexión87 % correctasCon reflexión95 % correctasMismo conjunto de 10–15 preguntas con respuesta correcta conocida
Fig. 7 — Evaluación objetiva: comparar el porcentaje de aciertos con y sin el paso de reflexión.

Para medirlo se reúnen entre 10 y 15 preguntas con su respuesta correcta conocida (ground truth): «¿cuántos artículos se vendieron en mayo de 2025?» (1201), «¿cuál es el artículo más caro?» (Airflow sneaker), «¿cuántos estilos hay?» (14). Se ejecuta el flujo sin reflexión, usando la consulta v1, y con reflexión, usando la v2, y se cuenta el porcentaje de aciertos.

conjunto = [ {"pregunta": "¿Cuántos artículos se vendieron en mayo de 2025?", "verdad": "1201"}, {"pregunta": "¿Cuál es el artículo más caro del inventario?", "verdad": "Airflow sneaker"}, {"pregunta": "¿Cuántos estilos tiene la tienda?", "verdad": "14"}, # ... entre 10 y 15 preguntas con su respuesta correcta ] def exactitud(con_reflexion): aciertos = 0 for ej in conjunto: respuesta = flujo_sql(ej["pregunta"], reflexion=con_reflexion) aciertos += respuesta == ej["verdad"] return aciertos / len(conjunto) print("Sin reflexión:", exactitud(False)) # p. ej. 0.87 print("Con reflexión:", exactitud(True)) # p. ej. 0.95

Con 87 % frente a 95 %, la reflexión mejora de forma apreciable la calidad de las consultas.

Iterar sobre los prompts

Con la evaluación en marcha, se pueden probar ideas rápidamente: añadir al prompt de reflexión «haz que la consulta sea más rápida» o «más clara», reescribir el prompt de generación… Se vuelve a ejecutar el conjunto y se compara el porcentaje de aciertos. Si se prueban muchos prompts, construir evaluaciones es imprescindible: es la forma sistemática de elegir entre ellos.

Evaluación subjetiva

¿Cómo se sabe si el gráfico de barras agrupadas es mejor que el apilado? Es un criterio subjetivo. Una primera idea es dar ambas imágenes a un LLM multimodal y preguntarle cuál es mejor. Funciona peor de lo que parece:

Comparar por paresRúbrica binariagráfico Agráfico BLLM juez«A esmejor»Juicios poco fiables y sensiblesa la redacción del prompt;sesgo de posición: suele elegirla primera opciónun solográficoLLM juez✓ título claro1✓ ejes con etiqueta1✗ tipo adecuado0✓ rango numérico1✓ leyenda legible1Puntuación4 / 5Cada criterio es un 0 o un 1: resultadosmás consistentes que una escala del 1 al 5
Fig. 8 — Dos formas de usar un LLM como juez para criterios subjetivos.

Rúbricas binarias

En lugar de comparar parejas, se evalúa una sola imagen con una rúbrica: una lista de criterios claros (¿tiene título claro?, ¿están las etiquetas de los ejes?, ¿el tipo de gráfico es adecuado?, ¿el rango numérico de los ejes es apropiado?…). Y en vez de una nota del 1 al 5, en la que los modelos están mal calibrados, cada criterio recibe un 0 o un 1; la suma da la puntuación.

import json rubrica = """Evalúa la imagen adjunta con esta rúbrica de calidad. Cada criterio recibe 1 (se cumple) o 0 (no se cumple). Devuelve solo un objeto JSON con las puntuaciones. 1. titulo_claro 2. ejes_con_etiqueta 3. tipo_de_grafico_adecuado 4. rango_numerico_adecuado 5. leyenda_legible""" notas = json.loads(llm(rubrica, imagenes=["plot_v2.png"])) puntuacion = sum(notas.values()) # de 0 a 5

Con 10 criterios binarios, la puntuación va de 0 a 10. Se reúnen 10–15 peticiones de gráficos, se generan con y sin reflexión y se puntúan:

PeticiónSin reflexiónCon reflexión
Petición 146
Petición 258
………
Petición 1057

La media de las filas mostradas pasa de unos 4,7 a 7 puntos. Igual que antes, la evaluación permite volver a medir cada vez que cambia un prompt.

Tipo de criterioHerramienta de evaluaciónEsfuerzo
Objetivo (hay una respuesta correcta)Código que compara con un conjunto de respuestas correctasMás fácil de gestionar
Subjetivo (calidad, claridad…)LLM como juez, mejor con rúbrica binariaRequiere ajustar la rúbrica para que el juez esté bien calibrado

Error común

Dar por buena la comparación de un LLM juez presentando las dos opciones siempre en el mismo orden (por ejemplo, la versión con reflexión siempre en segundo lugar). El sesgo de posición puede fabricar una «mejora» o esconderla. Si se compara por pares, hay que alternar el orden; mejor aún, puntuar cada salida por separado con una rúbrica.

Mini-quiz · Evaluar la reflexión

1. ¿Qué se necesita para evaluar objetivamente si la reflexión mejora un flujo de consultas SQL?

2. ¿Qué es el sesgo de posición de un LLM juez?

3. ¿Por qué una rúbrica de criterios binarios da resultados más consistentes que una nota del 1 al 5?

Ejercicio 4.1 · ¿Compensa la reflexión?

Con un conjunto de 20 preguntas, el flujo acierta 17 sin reflexión y 19 con reflexión. La reflexión añade 2 segundos a cada respuesta. Calcula la mejora y razona en qué casos la mantendrías.

Solución

Diez puntos de mejora es mucho si una respuesta errónea tiene coste (decisiones de negocio, datos para clientes): se mantiene. Si la aplicación es interactiva y la latencia es crítica, se puede probar a reflexionar solo cuando la consulta v1 falla o devuelve un resultado vacío. Con 20 preguntas, conviene confirmar el resultado ampliando el conjunto.

Ejercicio 4.2 · Neutralizar el sesgo de posición

Si aun así necesitas comparar dos gráficos por pares, ¿cómo reducirías el sesgo de posición? Esboza el código.

Solución

Se pregunta dos veces intercambiando el orden; solo se acepta un ganador si gana en ambos órdenes:

def comparar_sin_sesgo(a, b, criterios): # Se pregunta dos veces intercambiando el orden de presentación r1 = llm(f"¿Cuál es mejor según {criterios}? Responde A o B.", imagenes=[a, b]) r2 = llm(f"¿Cuál es mejor según {criterios}? Responde A o B.", imagenes=[b, a]) if r1 == "A" and r2 == "B": return a # gana a en ambos órdenes if r1 == "B" and r2 == "A": return b # gana b en ambos órdenes return None # resultado inconsistente: probable sesgo de posición

La proporción de resultados inconsistentes es, además, una medida útil de lo poco fiable que es el juez en esa tarea.

El techo del ajuste de prompts

Al ajustar el prompt de un sistema de generación directa, el rendimiento mejora al principio y después se estanca: por mucho que se retoque el prompt, cuesta avanzar. Añadir reflexión antes da un salto, a veces pequeño y a veces grande, a cambio de algo más de complejidad. Y si además se aporta información externa, de modo que el modelo no reflexione solo sobre lo que ya sabía, el techo sube todavía más.

Tiempo dedicado a ajustar promptsRendimientose añade la reflexiónSin reflexión (meseta)Con reflexiónReflexión conretroalimentación externa
Fig. 9 — Curva cualitativa: ajustar solo el prompt se estanca; la reflexión, y más aún la información externa, elevan el techo.

Regla práctica: si el esfuerzo de ajustar prompts da cada vez menos, conviene plantearse añadir reflexión o, mejor aún, alguna fuente de retroalimentación externa.

Herramientas de verificación

Además de ejecutar código, muchas herramientas de software producen hechos objetivos sobre la salida que se pueden pasar al paso de reflexión:

Salida con problemaHerramientaInformación nuevaLLM de reflexión«Nuestras zapatillas sonmejores que las de RivalCo»búsqueda por patrones(expresión regular)«menciona a RivalCo»reescribe sinla mención«El Taj Mahal seconstruyó en 1648»búsqueda web«encargado en 1631,terminado en 1648»precisa lafecha«Resumen de 412 palabras»(límite: 300)contador de palabras«412 palabras > 300»acorta eltexto
Fig. 10 — Tres fuentes de retroalimentación externa generadas por software.
import re COMPETIDORES = re.compile(r"\b(CompCo|RivalCo|The Other Co)\b", re.IGNORECASE) LIMITE = 300 texto = llm(f"Escribe el texto promocional: {encargo}") for intento in range(3): problemas = [] menciones = COMPETIDORES.findall(texto) if menciones: problemas.append(f"Menciona a competidores: {sorted(set(menciones))}") palabras = len(texto.split()) if palabras > LIMITE: problemas.append(f"Tiene {palabras} palabras; el límite es {LIMITE}") if not problemas: break # Los hechos medidos por código son la crítica externa texto = llm(f"Corrige el texto. Problemas detectados: {problemas}\n\n{texto}")

El patrón común: un fragmento de código encuentra hechos adicionales sobre la salida inicial (un nombre de competidor, un dato verificado, un recuento exacto) y esos hechos se convierten en la crítica del paso de reflexión.

Mini-quiz · Retroalimentación externa

1. Un equipo lleva semanas ajustando un prompt y cada cambio aporta menos. ¿Qué sugiere la curva de retorno?

2. ¿Qué herramienta aporta mejor retroalimentación cuando el modelo no respeta un límite de 300 palabras?

3. En el ejemplo del Taj Mahal, ¿qué aporta la búsqueda web a la reflexión?

Ejercicio 5.1 · Diseñar la herramienta de retroalimentación

Propón una herramienta de software que genere información externa para cada caso: (a) un agente de investigación cita direcciones web (URL, localizador uniforme de recursos) que a veces no existen; (b) un traductor técnico no usa los términos del glosario de la empresa; (c) un generador de SQL produce consultas correctas pero muy lentas.

Solución

(a) Comprobar cada URL con una petición HTTP (protocolo de transferencia de hipertexto) y pasar al modelo las que devuelven error. (b) Un verificador de glosario: código que busca los términos de origen y comprueba si la traducción usa el término aprobado; las discrepancias son la crítica. (c) Medir el tiempo de ejecución o pedir el plan de ejecución de la base de datos; si supera un umbral, se le pasa el plan al modelo para que optimice la consulta.

Ejercicio 5.2 · Bucle de reflexión con dos comprobaciones

Explica qué hace el bucle de reflexión con comprobaciones por código de la sección «Herramientas de verificación» (detector de competidores más contador de palabras) y por qué limita el número de intentos.

Solución

Genera un texto y, en cada vuelta, ejecuta dos comprobaciones por código: una expresión regular que busca competidores y un recuento de palabras. Si no hay problemas, termina; si los hay, se los pasa al LLM como crítica concreta y pide una versión corregida. El límite de 3 intentos evita bucles infinitos y costes descontrolados si el modelo no consigue cumplir las restricciones; en ese caso, la salida se puede derivar a revisión humana.

Términos clave

TérminoSignificado
ReflexiónPatrón en el que un modelo revisa una salida (suya o de otro) con un prompt distinto y produce una versión mejorada.
Retroalimentación externaInformación nueva, obtenida fuera del LLM (ejecución de código, búsqueda web, contadores…), que alimenta la reflexión.
Zero-shot / one-shot / few-shotPrompts con cero, uno o varios ejemplos de entrada y salida.
Modelo de razonamientoLLM que dedica cómputo a «pensar» antes de responder; suele ser bueno detectando errores.
LLM multimodalModelo que acepta también imágenes (u otros formatos), por ejemplo para criticar un gráfico.
Respuesta correcta conocidaValor de referencia (ground truth) con el que se compara la salida en una eval objetiva.
LLM como juezUso de un modelo para evaluar salidas con criterios subjetivos.
Sesgo de posiciónTendencia de un juez a preferir la opción que se le presenta primero.
Rúbrica binariaLista de criterios de sí/no cuya suma da la puntuación.

Síntesis del módulo

Autoevaluación

1. ¿Qué diferencia un flujo de reflexión de una generación directa con few-shot?

2. Un generador de código falla a menudo por errores de sintaxis. ¿Qué mejora es más eficaz?

3. ¿Cuál de estos prompts de reflexión está mejor planteado?

4. En el flujo de gráficos, ¿por qué se ejecuta el código v1 antes de reflexionar?

5. Quieres saber si un cambio en el prompt de reflexión mejora las consultas SQL. ¿Qué haces?

6. Un LLM juez prefiere el gráfico A cuando va primero y el B cuando va primero el B. ¿Qué indica?

7. Una rúbrica tiene 8 criterios binarios. Un gráfico cumple 6. ¿Cuál es su puntuación?

8. ¿En qué tipo de evaluación es más laborioso conseguir resultados fiables?

9. ¿Qué tienen en común el detector de competidores, la búsqueda web y el contador de palabras?

10. ¿Qué afirmación sobre la reflexión es correcta?