Guía Avanzada de Prompt Engineering

Introducción al Prompt Engineering

El "prompt engineering" o ingeniería de instrucciones es el arte y la ciencia de diseñar entradas (prompts) efectivas para obtener los resultados deseados de los modelos de lenguaje grandes (LLMs). Un buen prompt es claro, conciso y guía al modelo hacia la respuesta o acción específica que buscamos. No se trata solo de hacer una pregunta, sino de cómo se formula esa pregunta, el contexto que se proporciona y las instrucciones que se dan.

La calidad del prompt impacta directamente en la calidad de la respuesta. Un prompt vago o ambiguo puede llevar a respuestas irrelevantes, incorrectas o incompletas. Por el contrario, un prompt bien elaborado puede desbloquear el vasto potencial de los LLMs, permitiéndoles realizar tareas complejas, generar contenido creativo y proporcionar información precisa.

Principios Clave de un Buen Prompt Engineer

Los ingenieros de prompts exitosos suelen seguir ciertos principios fundamentales:

¿Por qué son buenos estos principios? Estos principios son cruciales porque los LLMs, a pesar de su gran capacidad, no "entienden" en el sentido humano. Funcionan identificando patrones en los datos con los que fueron entrenados. Un prompt bien estructurado ayuda al modelo a encontrar los patrones más relevantes para la tarea solicitada, reduciendo la probabilidad de "alucinaciones" o respuestas fuera de tema.

Técnicas Avanzadas de Prompt Engineering

Existen diversas técnicas para optimizar los prompts. Aquí comparamos algunas de las más efectivas:

Técnica Descripción Ventajas Desventajas Cuándo Usarla
Zero-Shot Prompting Se le pide al modelo que realice una tarea sin ejemplos previos. Rápido y sencillo de implementar. Menos preciso para tareas complejas o novedosas. Para tareas simples y bien definidas donde el modelo ya tiene un buen entendimiento.
Few-Shot Prompting Se proporcionan al modelo algunos ejemplos (shots) de la tarea y el resultado esperado antes de pedirle que realice una nueva instancia de la tarea. Mejora significativamente la precisión y la capacidad del modelo para entender tareas complejas o matizadas. Requiere la creación de buenos ejemplos, lo que puede llevar tiempo. El prompt se vuelve más largo. Para tareas que requieren un formato específico, un estilo particular o cuando el modelo necesita más contexto para entender la intención.
Chain-of-Thought (CoT) Prompting Se le pide al modelo que "piense paso a paso" o que muestre su razonamiento antes de dar la respuesta final. Esto se logra a menudo proporcionando ejemplos donde el razonamiento está explícito. Mejora drásticamente el rendimiento en tareas de razonamiento complejo (matemáticas, lógica, etc.). Permite entender cómo el modelo llega a una conclusión. Puede hacer que la respuesta sea más verbosa. No siempre es necesario para tareas simples. Para problemas que requieren múltiples pasos de inferencia o razonamiento lógico.
Self-Consistency Se generan múltiples respuestas usando CoT con cierta aleatoriedad (temperatura alta) y luego se elige la respuesta más frecuente o consistente. Aumenta la robustez y precisión en tareas de razonamiento complejas, superando a menudo al CoT simple. Computacionalmente más costoso ya que requiere múltiples inferencias. Cuando la máxima precisión es crítica en tareas de razonamiento.
Generated Knowledge Prompting Primero se le pide al modelo que genere información o hechos relevantes sobre una pregunta, y luego se usa esa información generada como parte del contexto para responder la pregunta original. Ayuda al modelo a "recordar" o acceder a conocimiento relevante que podría no estar inmediatamente disponible, mejorando la calidad de las respuestas en tareas basadas en conocimiento. Introduce un paso adicional, lo que puede aumentar la latencia. La calidad de la información generada es crucial. Para preguntas que requieren conocimiento específico que el modelo podría no tener "a mano".
Prompt Chaining / Decomposition Se descompone una tarea compleja en una secuencia de prompts más simples. La salida de un prompt se convierte en la entrada del siguiente. Maneja tareas muy complejas de manera más efectiva. Permite un control más granular sobre el proceso. Requiere un diseño cuidadoso de la cadena de prompts. La propagación de errores puede ser un problema. Para flujos de trabajo complejos que involucran múltiples pasos o la integración de diferentes capacidades del LLM.

Ejemplos Prácticos de Prompting

Ejemplo 1: Zero-Shot (Simple)

Objetivo: Traducir una frase a francés.

Prompt:

Traduce la siguiente frase a francés: "Hola, ¿cómo estás?"

Resultado Esperado:

Salut, comment ça va ?

Explicación: Este es un prompt directo. El modelo entiende la tarea de "traducir" y el idioma de destino "francés".

Ejemplo 2: Few-Shot (Con ejemplos)

Objetivo: Clasificar el sentimiento de una reseña de película como positivo, negativo o neutral.

Prompt:

Clasifica el sentimiento de las siguientes reseñas de películas: Reseña: "¡Esta película fue absolutamente increíble! La trama, los actores, todo fue perfecto." Sentimiento: Positivo Reseña: "No me gustó nada. Aburrida y predecible." Sentimiento: Negativo Reseña: "Es una película más, ni buena ni mala." Sentimiento: Neutral Reseña: "Me encantó la cinematografía, pero la historia era un poco floja." Sentimiento:

Resultado Esperado (para la última reseña):

Neutral (o Positivo, dependiendo de la interpretación del modelo, lo que demuestra la necesidad de buenos ejemplos)

Explicación: Al proporcionar ejemplos, el modelo aprende el patrón y el formato esperado para la clasificación de sentimientos. Esto es mucho más efectivo que simplemente preguntar "¿Cuál es el sentimiento de esta reseña?".

Ejemplo 3: Chain-of-Thought (Razonamiento paso a paso)

Objetivo: Resolver un problema matemático simple.

Prompt:

Pregunta: Natalia vendió 10 cajas de galletas. Cada caja contenía 12 galletas. Luego, horneó 20 galletas más. ¿Cuántas galletas tiene Natalia en total ahora? Explica tu razonamiento paso a paso antes de dar la respuesta final. Paso 1: Calcular cuántas galletas vendió inicialmente. Natalia vendió 10 cajas * 12 galletas/caja = 120 galletas. Paso 2: Sumar las galletas que horneó después. Total de galletas = 120 galletas + 20 galletas = 140 galletas. La respuesta final es 140. Pregunta: Roger tiene 5 manzanas. Compra 2 bolsas más de manzanas. Cada bolsa tiene 3 manzanas. ¿Cuántas manzanas tiene ahora? Explica tu razonamiento paso a paso.

Resultado Esperado:

Paso 1: Calcular cuántas manzanas compró en las bolsas. Roger compró 2 bolsas * 3 manzanas/bolsa = 6 manzanas. Paso 2: Sumar las manzanas que ya tenía con las que compró. Total de manzanas = 5 manzanas + 6 manzanas = 11 manzanas. La respuesta final es 11.

Explicación: Al guiar al modelo para que desglose el problema y muestre su trabajo, se mejora la precisión en tareas que requieren razonamiento. El ejemplo proporcionado establece el patrón de cómo "pensar en voz alta".

Ejemplo 4: Asignación de Rol (Persona)

Objetivo: Obtener una explicación sobre un concepto complejo.

Prompt Deficiente:

Explícame la computación cuántica.

Prompt Mejorado (con asignación de rol):

Actúa como un profesor de física experto en divulgación científica. Explícame el concepto de computación cuántica de manera sencilla, como si se lo estuvieras explicando a un estudiante de secundaria con curiosidad por la ciencia. Utiliza analogías simples si es posible.

Explicación: Al asignar un rol ("profesor de física experto en divulgación") y especificar la audiencia ("estudiante de secundaria"), se guía al modelo para que adapte el lenguaje, la profundidad y el estilo de la explicación, resultando en una respuesta mucho más útil y comprensible.

Análisis de Tu Prompt Original (prompt.md)

A continuación, analizaremos tu prompt original y cómo se puede interpretar y mejorar aplicando los principios de prompt engineering.

Paso 1: Lee el Jupyter que tenemos aquí y lee el texto que he estado pegando: [Texto pegado #1 +148 Líneas].

Paso 2: ¿Qué prompt puedo enviarte para que al final tenga el mismo archivo .ipynb pero completamente terminado, etc.? ¿Y completamente terminado? Y que tú ejecutes los comandos perfectos para interactuar con esto, probablemente convirtiéndolo a Python y, bueno, otras bibliotecas para trabajar con .ipynb, pero tú encuentras la manera más eficiente. Y así, ejecutas las celdas y todo funcionará. Pero primero, supongo que convierte todo a un solo archivo Python... no sé. Y una vez que sea Jupyter, podemos transformarlo de markdown a Jupyter nuevamente y luego ejecutarlo... no sé.

Paso 3: Critica, ya que debe haber scripts más eficientes en Python relacionados con esto y realiza 7 búsquedas continuas para esto con diferentes términos.

Paso 4: Con todo lo aprendido, crea el mejor prompt.

Paso 5: Síguelo y el entregable debe ser el archivo .ipynb como el `@docs/INITIAL_PPO_Bipedal_Walker_student (1).ipynb` pero completamente hecho correctamente. Usa la manera más eficiente y, obviamente, debes ejecutar el notebook.

Desglose y Propuesta de Prompt Mejorado

Tu prompt original es una descripción de un flujo de trabajo deseado. Para interactuar con un LLM como yo de manera efectiva para lograr tu objetivo final (un notebook Jupyter completado y funcional), podríamos reestructurarlo en un prompt más directo y accionable. La clave es ser claro sobre el estado inicial, las acciones a realizar y el resultado esperado.

Propuesta de "Mega-Prompt" para el LLM (Tú):

Este sería el prompt que podrías usar (o adaptar) para guiarme en la tarea completa:

Prompt Objetivo (para el LLM):

**Rol:** Eres un asistente experto en Python, ciencia de datos y Jupyter Notebooks. Tu objetivo es completar y asegurar la correcta ejecución de un notebook de aprendizaje por refuerzo (PPO con BipedalWalker). **Contexto Inicial:** 1. El notebook base es `docs/INITIAL PPO_Bipedal_Walker_student (1).ipynb`. 2. Dispongo de información adicional relevante en un texto previamente compartido (referido como "[Texto pegado #1 +148 Líneas]"). Considera esta información como conocimiento complementario esencial. **Tareas a Realizar (en secuencia y de la manera más eficiente):** 1. **Análisis y Comprensión Profunda:** * Lee y analiza exhaustivamente el contenido del notebook `docs/INITIAL PPO_Bipedal_Walker_student (1).ipynb`. Identifica las celdas incompletas, errores potenciales, y las secciones que requieren código o explicaciones adicionales. * Integra la información del "[Texto pegado #1 +148 Líneas]" para rellenar lagunas, corregir o mejorar el notebook. 2. **Investigación y Optimización (Simulada o Real, según tus capacidades):** * Basándote en el contenido del notebook y el objetivo (PPO para BipedalWalker), realiza el equivalente a 7 búsquedas web con términos variados para encontrar: * Implementaciones de PPO más eficientes o actualizadas. * Mejores prácticas para entrenar agentes en el entorno BipedalWalker. * Bibliotecas o fragmentos de código Python útiles para visualización, preprocesamiento o evaluación en este contexto. * Critica el enfoque actual del notebook si encuentras alternativas superiores y considera cómo integrarlas. 3. **Transformación y Completitud del Código (Si es necesario):** * Si el notebook contiene celdas de markdown que deberían ser código, o viceversa, realiza las conversiones necesarias. * La estrategia preferida es trabajar directamente sobre el formato `.ipynb`. Sin embargo, si consideras que convertirlo temporalmente a un script `.py` para una reestructuración mayor es más eficiente y luego volver a `.ipynb` es factible y beneficioso, explícame brevemente por qué y procede. El objetivo final siempre es un `.ipynb`. * Completa todas las celdas de código. Asegúrate de que el flujo del notebook sea lógico y que las dependencias entre celdas estén correctamente gestionadas. * Añade comentarios explicativos en el código donde sea necesario para mayor claridad. * Completa las celdas de markdown con explicaciones, análisis de resultados o cualquier texto que sea necesario para que el notebook sea un documento autocontenido y comprensible. 4. **Ejecución y Depuración:** * Simula o ejecuta (si tienes la capacidad y el entorno configurado) todas las celdas del notebook en orden. * Identifica y corrige cualquier error de ejecución. * Asegúrate de que los resultados generados (gráficas, métricas, etc.) sean coherentes y se muestren correctamente. 5. **Entrega Final:** * El entregable final debe ser el archivo `docs/INITIAL PPO_Bipedal_Walker_student (1).ipynb` (o un nuevo archivo si se prefiere, por ejemplo, `docs/COMPLETED_PPO_Bipedal_Walker.ipynb`) completamente funcional, con todas las celdas ejecutadas (o listas para ser ejecutadas sin errores) y con contenido completo tanto en código como en explicaciones. * El notebook debe ser eficiente y seguir las mejores prácticas identificadas durante la fase de investigación. **Consideraciones Adicionales:** * Prioriza la eficiencia en cada paso. * Si encuentras ambigüedades o necesitas tomar una decisión de diseño importante, elige la opción que consideres más robusta y alineada con los objetivos de un proyecto de ciencia de datos estándar.

¿Por qué este prompt es mejor?

Este prompt mejorado proporciona una estructura mucho más clara para que un LLM pueda seguir tus intenciones y, con las capacidades adecuadas, entregar el notebook Jupyter funcional que deseas.