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.
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.
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. |
Objetivo: Traducir una frase a francés.
Prompt:
Resultado Esperado:
Explicación: Este es un prompt directo. El modelo entiende la tarea de "traducir" y el idioma de destino "francés".
Objetivo: Clasificar el sentimiento de una reseña de película como positivo, negativo o neutral.
Prompt:
Resultado Esperado (para la última reseña):
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?".
Objetivo: Resolver un problema matemático simple.
Prompt:
Resultado Esperado:
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".
Objetivo: Obtener una explicación sobre un concepto complejo.
Prompt Deficiente:
Prompt Mejorado (con asignación de rol):
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.
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.
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.
Este sería el prompt que podrías usar (o adaptar) para guiarme en la tarea completa:
Prompt Objetivo (para el LLM):
¿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.