Capítulo 1. Los cinco principios de la incitación

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Laingeniería de prompts es el proceso de descubrir prompts que produzcan de forma fiable resultados útiles o deseados.

Un prompt es la entrada que proporcionas, normalmente texto, cuando interactúas con un modelo de IA como ChatGPT o Midjourney. El prompt sirve como conjunto de instrucciones que el modelo utiliza para predecir la respuesta deseada: texto de grandes modelos lingüísticos (LLM) como ChatGPT, o imágenes de modelos de difusión como Midjourney.

Aquí tienes un ejemplo sencillo de una entrada para un generador de nombres de productos (inspirado en uno de los ejemplos de OpenAI), y la salida resultante de ChatGPT.

Entrada:

Can I have a list of product names for a pair of shoes that
can fit any foot size?

Salida:

Certainly! Here's a list of product names for a pair of shoes
that can fit any foot size:

UniFit SoleStrides
FlexiSize All-Fit Shoes
OmniFit FootFlex
...
AnyStep AdaptiWalkers
FlexiRange UniversalSteps
PerfectGlide MultiFit Shoes

Esto ya es una respuesta notable para una solicitud ingenua, que parece magia porque hemos llegado hasta aquí con muy poco esfuerzo. A medida que mejoran los modelos de última generación, aumenta la probabilidad de que obtengas resultados suficientemente buenos en tu primer intento. Para cualquier interacción desechable con una IA, en la que no pienses volver a realizar la misma tarea, el enfoque ingenuo es todo lo que necesitas.

Sin embargo, si planeas poner en producción esta petición, te convendría invertir más trabajo en hacerla bien. Los errores te cuestan dinero en términos de las tarifas que OpenAI cobra en función de la duración de la consulta y la respuesta, así como del tiempo empleado en corregirlos. Si estuvieras construyendo un generador de nombres de productos con miles de usuarios, hay algunos problemas obvios que querrías intentar solucionar:

Dirección imprecisa

No estás informando a la IA del estilo de nombre que quieres, ni de los atributos que debe tener. ¿Quieres una sola palabra o una concatenación? ¿Se pueden inventar las palabras o es importante que estén en inglés real? ¿Quieres que la IA emule a alguien a quien admiras y que es famoso por los grandes nombres de sus productos?

Salida sin formato

Te devuelve una lista de nombres separados línea por línea, de longitud no especificada. Si ejecutas esta consulta varias veces, verás que a veces te devuelve una lista numerada, y a menudo tiene texto al principio, lo que dificulta su análisis mediante programación.

Ejemplos que faltan

No le has dado a la IA ningún ejemplo de cómo son los buenos nombres. Está autocompletando utilizando una media de sus datos de entrenamiento, es decir, todo Internet (con todos sus sesgos inherentes), pero ¿es eso lo que quieres? Lo ideal sería que le dieras ejemplos de nombres de éxito, nombres comunes en un sector, o incluso simplemente otros nombres que te gusten.

Evaluación limitada

No tienes una forma coherente o escalable de definir qué nombres son buenos o malos, así que tienes que revisar manualmente cada respuesta. Si puedes instituir un sistema de puntuación u otra forma de medición, podrás optimizar el aviso para obtener mejores resultados e identificar cuántas veces falla.

No hay división de tareas

Le estás pidiendo mucho a una sola consulta de : hay muchos factores que intervienen en la denominación de un producto, y esta importante tarea se está subcontratando ingenuamente a la IA de una sola vez, sin especialización de tareas ni visibilidad de cómo está gestionando esta tarea por ti.

Abordar estos problemas es la base de los principios fundamentales que utilizamos a lo largo de este libro. Hay muchas formas distintas de pedir a un modelo de IA que haga la misma tarea, e incluso los cambios más pequeños pueden suponer una gran diferencia. Los LLM funcionan prediciendo continuamente el siguiente token (aproximadamente tres cuartas partes de una palabra), partiendo de lo que había en tu pregunta. Cada nuevo token se selecciona en función de su probabilidad de aparecer a continuación, con un elemento de aleatoriedad (controlado por el parámetro temperatura ). Como se muestra en la Figura 1-1, la palabra zapatos tenía una probabilidad menor de aparecer después del inicio del nombre AnyFit (0,88%), donde una respuesta más predecible sería Athletic (72,35%).

pega 0101
Figura 1-1. Cómo se descompone la respuesta en fichas

A los LLM se les entrena básicamente en todo el texto de Internet, y luego se les afina aún más para que den respuestas útiles. Las preguntas medias darán respuestas medias, por lo que algunos se sentirán decepcionados cuando sus resultados no estén a la altura de las expectativas. Lo que pones en tu pregunta cambia la probabilidad de cada palabra generada, por lo que es muy importante para los resultados que obtendrás. Estos modelos han visto lo mejor y lo peor de lo que han producido los humanos y son capaces de emular casi cualquier cosa si conoces la forma correcta de preguntar. OpenAI cobra en función del número de tokens utilizados en la pregunta y la respuesta, por lo que los ingenieros de prompts deben hacer que estos tokens cuenten optimizando las preguntas en cuanto a coste, calidad y fiabilidad.

He aquí el mismo ejemplo con la aplicación de varias técnicas de ingeniería de prompts. Pedimos nombres al estilo de Steve Jobs, indicamos que queremos una lista separada por comas y proporcionamos ejemplos de la tarea bien hecha.

Entrada:

Brainstorm a list of product names for a shoe that fits any
foot size, in the style of Steve Jobs.

Return the results as a comma-separated list, in this format:
Product description: A shoe that fits any foot size
Product names: [list of 3 product names]

## Examples
Product description: A refrigerator that dispenses beer
Product names: iBarFridge, iFridgeBeer, iDrinkBeerFridge

Product description: A watch that can tell accurate time in
space
Product names: iNaut, iSpace, iTime

Product description: A home milkshake maker
Product names: iShake, iSmoothie, iShake Mini

Salida:

Product description: A shoe that fits any foot size
Product names: iFitFoot, iPerfectFit, iShoeSize

Aunque ningún indicador es perfecto, este indicador está optimizado para ofrecer de forma fiable nombres de productos sólidos en el formato adecuado. El usuario de tu generador de nombres de productos puede elegir a alguien que no sea Steve Jobs para obtener los tipos de nombres que le gustan, puede cambiar el formato de la respuesta si es necesario, y la salida de este indicador puede convertirse en la entrada de otro. Por último, podrías actualizar periódicamente los ejemplos que utilizas en la consulta basándote en los comentarios de los usuarios, haciendo que tu sistema sea más inteligente con el tiempo.

Visión general de los cinco principios de la provocación

El proceso de optimización de este aviso sigue los Cinco Principios del Aviso, que analizaremos utilizando este ejemplo en lo que queda de capítulo y recordaremos a lo largo del libro. Coinciden exactamente con las cinco cuestiones que planteamos al hablar del aviso de texto ingenuo. Encontrarás referencias a estos principios a lo largo del resto del libro para ayudarte a conectar los puntos con la forma en que se utilizan en la práctica. Los Cinco Principios de la Estimulación son los siguientes:

Dar dirección

Describe detalladamente el estilo deseado, o haz referencia a un personaje relevante

Especifica el formato

Define las normas a seguir, y la estructura requerida de la respuesta

Proporciona ejemplos

Inserta un conjunto diverso de casos de prueba en los que la tarea se haya realizado correctamente

Evaluar la calidad

Identifica los errores y valora las respuestas, comprobando qué impulsa el rendimiento.

Divide el trabajo

Divide las tareas en pasos múltiples, encadenados para objetivos complejos

Estos principios no son consejos o trucos efímeros, sino convenciones generalmente aceptadas que son útiles para trabajar con cualquier nivel de inteligencia, biológica o artificial. Estos principios son independientes del modelo y deberían servir para mejorar tus avisos independientemente del modelo generativo de texto o imagen que utilices. Publicamos estos principios por primera vez en julio de 2022 en el blog "Ingeniería de prompts: De las palabras al arte y la copia", y han resistido el paso del tiempo, incluso se asemejan bastante a la propia Guía de ingeniería de prompts de OpenAI, que apareció un año después. Cualquiera que trabaje estrechamente con modelos de IA generativa probablemente convergerá en un conjunto similar de estrategias para resolver problemas comunes, y a lo largo de este libro verás cientos de ejemplos demostrativos de cómo pueden ser útiles para mejorar tus prompts.

Hemos proporcionado páginas descargables para la generación de texto e imágenes en que puedes utilizar como lista de comprobación cuando apliques estos principios. Se crearon para nuestro popular curso Udemy The Complete Prompt Engineering for AI Bootcamp (más de 70.000 estudiantes), que se basaba en los mismos principios, pero con material diferente al de este libro .

Para demostrar que estos principios se aplican igualmente bien a los modelos de imágenes de avisos, utilicemos el siguiente ejemplo y expliquemos cómo aplicar cada uno de los Cinco Principios de los Avisos a este escenario concreto. Copia y pega todo el mensaje de entrada en Midjourney Bot en Discord, incluido el enlace a la imagen al principio, después de escribir /imagine para que aparezca el cuadro de aviso (requiere una cuenta gratuita de Discord y una cuenta de pago de Midjourney ).

Entrada:

https://s.mj.run/TKAsyhNiKmc stock photo of business meeting
of 4 people watching on white MacBook on top of glass-top
table, Panasonic, DC-GH5

La Figura 1-2 muestra el resultado.

pega 0102
Figura 1-2. Foto de archivo de una reunión de trabajo

Este aviso aprovecha la capacidad de Midjourney de tomar una imagen base como ejemplo subiendo la imagen a Discord y luego copiando y pegando la URL en el aviso(https://s.mj.run/TKAsyhNiKmc), para lo que se utiliza la imagen libre de derechos de Unsplash(Figura 1-3). Si te encuentras con un error en el mensaje, intenta subir la imagen tú mismo y revisar la documentación de Midjourney para ver si hay algún cambio de formato.

pega 0103
Figura 1-3. Foto de Mimi Thian en Unsplash

Comparemos este prompt bien diseñado con lo que obtienes de Midjourney si pides ingenuamente una foto de archivo de la forma más sencilla posible. La Figura 1-4 muestra un ejemplo de lo que obtienes sin ingeniería de prompts, una imagen con un estilo más oscuro y estilizado de lo que cabría esperar de una foto de archivo.

Entrada:

people in a business meeting

La Figura 1-4 muestra el resultado.

Aunque se trata de un problema menos importante a partir de la v5 de Midjourney, los mecanismos de retroalimentación de la comunidad (cuando los usuarios seleccionan una imagen para redimensionarla a una resolución mayor, esa elección puede utilizarse para entrenar el modelo) han sesgado supuestamente el modelo hacia una estética de fantasía, que es menos adecuada para el caso de uso de las fotos de archivo. Los primeros usuarios de Midjourney procedían del mundo del arte digital y gravitaban naturalmente hacia estilos de fantasía y ciencia ficción, lo que puede reflejarse en los resultados del modelo incluso cuando esta estética no es adecuada.

pega 0104
Figura 1-4. Personas en una reunión de trabajo

A lo largo de este libro, los ejemplos utilizados serán compatibles con ChatGPT Plus (GPT-4) como modelo de texto y Midjourney v6 o Stable Diffusion XL como modelo de imagen, aunque especificaremos si es importante. Estos modelos fundacionales son el estado actual de la técnica y son buenos en una amplia gama de tareas. Los principios pretenden estar preparados para el futuro en la medida de lo posible, de modo que si estás leyendo este libro cuando salga GPT-5, Midjourney v7 o Stable Diffusion XXL, o si utilizas otro proveedor como Google, todo lo que aprendas aquí debería seguir resultándote útil.

1. Dar dirección

Uno de los problemas del texto ingenuo del que hablamos antes era que no informaba a la IA sobre qué tipos de nombres de productos querías. Hasta cierto punto, poner nombre a un producto es una tarea subjetiva, y sin dar a la IA una idea de los nombres que te gustan, tiene pocas probabilidades de acertar.

Por cierto, a un ser humano también le costaría realizar esta tarea sin un buen briefing, por eso las agencias creativas y de branding exigen a sus clientes un briefing detallado sobre cualquier tarea.

Consejo

Aunque no es un mapeo perfecto, puede ser útil imaginar qué contexto podría necesitar un humano para esta tarea e intentar incluirlo en la indicación.

En la indicación del ejemplo, dimos la dirección mediante el uso de juegos de rol, en ese caso emulando el estilo de Steve Jobs, que era famoso por poner nombres icónicos a los productos. Si cambias este aspecto de la indicación por el de otra persona famosa en los datos de entrenamiento (además de ajustar los ejemplos al estilo correcto), obtendrás resultados radicalmente distintos.

Entrada:

Brainstorm a list of product names for a shoe that fits any
foot size, in the style of Elon Musk.

Return the results as a comma-separated list, in this format:
Product description: A shoe that fits any foot size
Product names: [list of 3 product names]

## Examples
Product description: A refrigerator that dispenses beer
Product names: Teslacool, FridgeX, Neuradrink

Product description: A watch that can tell accurate time in
space
Product names: WatchX, iSpace, The Watch Company

Product description: A home milkshake maker
Product names: ShakeX, The Milkshake Company, HyperShake

Salida:

ShoeX, MarsFit, The Shoe Company

También hay algunas reglas o buenas prácticas que haría bien en seguir, y que podrían incluirse en la indicación como contexto para guiar a la IA hacia un nombre que funcione. Esta técnica se denomina a veces precalentamiento o recuperación interna, y es sencilla pero eficaz(Liu et al., 2021). Empezar la conversación pidiéndole consejos sobre buenas prácticas, y luego pidiéndole que siga sus propios consejos, puede ayudar mucho. En efecto, le estás utilizando para que genere su propia dirección.

Entrada:

Please give me 5 tips for naming products based on expert
industry advice.

Salida:

Certainly! Naming a product is crucial as it often gives the
first impression to potential customers. Here are five expert
tips to guide you in naming products:

1. **Simplicity & Memorability**: Opt for names that are
short, easy to spell, and memorable. Long, complicated names
can be difficult for customers to recall. Remember, the
easier the name is to remember, the more likely it is that
consumers will think of your product when making a purchase
decision.

...

5. **Positive Connotations**: Names that evoke positive
emotions or imagery can create a favorable perception of
your product. Avoid names that have negative or
controversial associations in any of the primary languages
or cultures where you intend to do business. It's often
worthwhile to conduct linguistic checks and market testing
to ensure there aren't unintended meanings.

Lastly, once you've shortlisted a few names, it's a good
idea to run them by diverse focus groups or conduct surveys
to gauge reactions. Also, ensure that the name you choose is
available for trademarking and doesn't infringe on existing
trademarks.

Luego, dentro de la misma ventana de chat, donde el modelo tiene el contexto de los consejos anteriores que dio, le pides la tarea que querías completar.

Entrada:

Using this advice, can I have a list of product names for a
pair of shoes that can fit any foot size?

Salida:

Certainly! Based on the criteria given:

1. **Simplicity & Memorability**
2. **Relevance & Descriptiveness**
3. **Differentiation & Uniqueness**
4. **Adaptable & Scalable**
5. **Positive Connotations**

Here's a list of potential product names for shoes that can
fit any foot size:

1. **FitAll Walkers**: A simple and memorable name that
instantly suggests a universal fit.

...

10. **TrueFit Universals**: Emphasizing genuine comfort and
fit for all.

Before finalizing any name, remember to check for trademarks
to ensure there's no conflict with existing products or
brands.

Otra estrategia fructífera, según nuestra experiencia, es tomar los mejores consejos existentes para la tarea que quieres realizar e insertar ese contexto en la pregunta. Por ejemplo, puedes tomar las 5 reglas de oro de Brandwatch para nombrar un producto u otro recurso externo de confianza que encuentres, e insertarlo como contexto en la solicitud. Esto aumentará significativamente la longitud de la pregunta, lo que cuesta más dinero (cuando se utiliza la API como desarrollador), pero puede merecer la pena si mejora la calidad de la respuesta.

Entrada:

Can I have a list of product names for a pair of shoes that
can fit any foot size? Please follow the five rules below:

1. It should be readable and writable.
If your product name is hard to pronounce, people won’t talk about it,
and if they can’t write it down (and spell it correctly!)
when they hear it, how do you expect them to Google it?

Keep it simple and don’t go with any wacky spellings just for the sake of it.

...

5. It should evoke an emotion, feeling, or idea.
Your product name should tie back into what your product is, what the
feeling you want people to have when experiencing your product is, and/or
what idea are you trying to get across.

It should be emotive and inspiring.

Salida:

1. FlexFit Footwear
2. OmniSize Sneakers
3. AdaptStride Shoes
...
18. OmniComfort Kicks
19. FlexSize Footwear
20. Boundless Soles

Hay otras innumerables formas de proporcionar una dirección en . En el ejemplo de generación de imágenes, la dirección se dio especificando que la reunión de negocios tiene lugar en torno a una mesa de cristal. Si cambias sólo ese detalle, puedes obtener una imagen completamente distinta, como se detalla en la Figura 1-5.

Entrada:

https://s.mj.run/TKAsyhNiKmc stock photo of business meeting
of four people gathered around a campfire outdoors in the
woods, Panasonic, DC-GH5

La Figura 1-5 muestra el resultado.

pega 0105
Figura 1-5. Foto de archivo de reunión de negocios en el bosque

El juego de roles también es importante para la generación de imágenes de , y una de las formas bastante poderosas de dar dirección a Midjourney es proporcionarle el nombre de un artista o estilo artístico al que emular. Un artista que aparece mucho en el mundo del arte de la IA es Van Gogh, conocido por sus pinceladas atrevidas y dramáticas y por su vívido uso de los colores. Observa lo que ocurre cuando incluyes su nombre en la pregunta, como se muestra en la Figura 1-6.

Entrada:

people in a business meeting, by Van Gogh

La Figura 1-6 muestra el resultado.

pega 0106
Figura 1-6. Gente en una reunión de negocios, de Van Gogh

Para que esa última indicación funcione, tienes que eliminar gran parte de la otra dirección. Por ejemplo, perder la imagen base y las palabras foto de archivo, así como la cámara Panasonic, DC-GH5 ayuda a introducir el estilo de Van Gogh. El problema que puedes encontrarte es que, a menudo, con demasiada dirección, el modelo puede llegar rápidamente a una combinación conflictiva que no pueda resolver. Si tu indicación es demasiado específica, puede que no haya suficientes muestras en los datos de entrenamiento para generar una imagen que sea coherente con todos tus criterios. En casos como éste, debes elegir qué elemento es más importante (en este caso, Van Gogh) y remitirte a él.

La dirección es uno de los principios más utilizados y más amplios. Puede consistir simplemente en utilizar las palabras descriptivas adecuadas para aclarar tu intención, o en canalizar a los personajes de las celebridades empresariales relevantes. Aunque demasiada dirección puede limitar la creatividad del modelo , una dirección demasiado escasa es el problema más común.

2. Especifica el formato

Los modelos de IA son traductores universales. No sólo significa traducir del francés al inglés, o del urdu al klingon, sino también entre estructuras de datos como JSON a YAML, o del lenguaje natural al código Python. Estos modelos son capaces de devolver una respuesta en casi cualquier formato, por lo que una parte importante de la ingeniería de prompts es encontrar formas de especificar en qué formato quieres que esté la respuesta.

De vez en cuando te encontrarás con que la misma consulta devuelve un formato diferente, por ejemplo, una lista numerada en lugar de separada por comas. Esto no es un gran problema la mayoría de las veces, porque la mayoría de las solicitudes son puntuales y se escriben en ChatGPT o Midjourney. Sin embargo, cuando incorporas herramientas de IA al software de producción, los cambios ocasionales de formato pueden provocar todo tipo de errores.

Al igual que cuando trabajas con un humano, puedes evitar un esfuerzo inútil especificando por adelantado el formato en el que esperas que esté la respuesta. Para los modelos de generación de texto, a menudo puede ser útil la salida JSON en lugar de una simple lista ordenada, porque ése es el formato universal de las respuestas de la API, que puede simplificar el análisis y la detección de errores, así como su uso para representar el HTML de la interfaz de una aplicación. YAML también es otra opción popular porque impone una estructura analizable sin dejar de ser simple y legible por humanos.

En el prompt original dabas instrucciones a través de los dos ejemplos proporcionados, y los dos puntos al final del prompt indicaban que debía completar la lista en línea. Para cambiar el formato a JSON, tienes que actualizar ambos y dejar el JSON sin completar, para que GPT-4 sepa que debe completarlo.

Entrada:

Return a comma-separated list of product names in JSON for
"A pair of shoes that can fit any foot size.".
Return only JSON.

Examples:
[{
		"Product description": "A home milkshake maker.",
		"Product names": ["HomeShaker", "Fit Shaker",
		"QuickShake", "Shake Maker"]
	},
	{
		"Product description": "A watch that can tell
		accurate time in space.",
		"Product names": ["AstroTime", "SpaceGuard",
		"Orbit-Accurate", "EliptoTime"]}
]

Salida:

[
	{
		"Product description": "A pair of shoes that can \
		fit any foot size.",
		"Product names": ["FlexFit Footwear", "OneSize Step",
		"Adapt-a-Shoe", "Universal Walker"]
	}
]

El resultado que obtenemos es el JSON completo que contiene los nombres de los productos. Esto se puede analizar y utilizar mediante programación, en una aplicación o en un script local. También es fácil, desde este punto, comprobar si hay un error en el formato utilizando un analizador JSON como la biblioteca json estándar de Python, porque un JSON roto dará lugar a un error de análisis, que puede actuar como desencadenante para reintentar la consulta o investigar antes de continuar. Si sigues sin obtener el formato correcto, puede ayudarte especificar al principio o al final de la consulta, o en el mensaje del sistema si utilizas un modelo de chat: You are a helpful assistant that only responds in JSON, o especificar la salida JSON en los parámetros del modelo cuando esté disponible (esto se llama gramáticas con los modelos Llama.

Consejo

Para ponerte al día sobre JSON si no estás familiarizado, W3Schools tiene una buena introducción.

Para los modelos de generación de imágenes , el formato es muy importante, porque las posibilidades de modificar una imagen son casi infinitas. Van desde formatos obvios como stock photo, illustration, y oil painting, hasta formatos más inusuales como dashcam footage, ice sculpture, o in Minecraft (ver Figura 1-7).

Entrada:

business meeting of four people watching on MacBook on top of
table, in Minecraft

La Figura 1-7 muestra el resultado.

pega 0107
Figura 1-7. Reunión de negocios en Minecraft

Al establecer un formato, a menudo es necesario eliminar otros aspectos de la imagen que podrían chocar con el formato especificado. Por ejemplo, si proporcionas una imagen base de una foto de archivo, el resultado es una combinación de foto de archivo y el formato que querías. Hasta cierto punto, los modelos de generación de imágenes pueden generalizar a nuevos escenarios y combinaciones que no han visto antes en su conjunto de entrenamiento, pero en nuestra experiencia, cuantas más capas de elementos no relacionados haya, más probabilidades tendrás de obtener una imagen inadecuada.

A menudo hay cierto solapamiento entre el primer y el segundo principio de , Dar dirección y Especificar formato. Este último consiste en definir qué tipo de salida quieres, por ejemplo el formato JSON, o el formato de una foto de archivo. El primero trata del estilo de respuesta que quieres, independientemente del formato, por ejemplo nombres de productos al estilo de Steve Jobs, o una imagen de una reunión de negocios al estilo de Van Gogh. Cuando hay choques entre estilo y formato, a menudo es mejor resolverlos dejando de lado el elemento que sea menos importante para tu resultado final.

3. Proporciona ejemplos

La pregunta original no daba a la IA ningún ejemplo de cómo crees que son los buenos nombres. Por tanto, la respuesta es aproximada a una media de Internet, y puedes hacerlo mejor que eso. Los investigadores llamarían a una pregunta sin ejemplos cero, y es siempre una agradable sorpresa cuando la IA puede incluso hacer una tarea cero: es señal de un modelo potente. Si proporcionas cero ejemplos, estás pidiendo mucho sin dar mucho a cambio. Incluso proporcionar un ejemplo(one-shot) ayuda considerablemente, y es norma entre los investigadores probar cómo funcionan los modelos con múltiples ejemplos(few-shot). Una de estas investigaciones es el famoso documento GPT-3 "Language Models are Few-Shot Learners" (Los modelos lingüísticos son aprendices de pocos ejemplos), cuyos resultados se ilustran en la Figura 1-8, que muestra que añadir un ejemplo junto con una indicación puede mejorar la precisión en algunas tareas ¡desde un 10% hasta casi un 50%!

pega 0108
Figura 1-8. Número de ejemplos en contexto

Al informar a un colega o formar a un empleado subalterno en una nueva tarea, es natural que incluyas ejemplos de ocasiones en que esa tarea se haya hecho bien anteriormente. Trabajar con IA es lo mismo, y la fuerza de una indicación a menudo se reduce a los ejemplos utilizados. Proporcionar ejemplos a veces puede ser más fácil que intentar explicar exactamente qué es lo que te gusta de esos ejemplos, por lo que esta técnica es más eficaz cuando no eres un experto en el tema de la tarea que intentas completar. La cantidad de texto que puede caber en un prompt es limitada (en el momento de escribir esto, unos 6.000 caracteres en Midjourney y aproximadamente 32.000 caracteres en la versión gratuita de ChatGPT), por lo que gran parte del trabajo de ingeniería de prompts consiste en seleccionar e insertar ejemplos diversos e instructivos.

Hay un compromiso entre fiabilidad y creatividad: pasa de tres a cinco ejemplos y tus resultados serán más fiables, sacrificando al mismo tiempo la creatividad. Cuantos más ejemplos proporciones, y menor sea la diversidad entre ellos, más limitada estará la respuesta para ajustarse a tus ejemplos. Si cambias todos los ejemplos por nombres de animales en la pregunta anterior, tendrás un fuerte efecto sobre la respuesta, que devolverá de forma fiable sólo nombres que incluyan animales.

Entrada:

Brainstorm a list of product names for a shoe that fits any
foot size.

Return the results as a comma-separated list, in this format:
Product description: A shoe that fits any foot size
Product names: [list of 3 product names]

## Examples:
Product description: A home milkshake maker.
Product names: Fast Panda, Healthy Bear, Compact Koala

Product description: A watch that can tell accurate time in
space.
Product names: AstroLamb, Space Bear, Eagle Orbit

Product description: A refrigerator that dispenses beer
Product names: BearFridge, Cool Cat, PenguinBox

Salida:

Product description: A shoe that fits any foot size
Product names: FlexiFox, ChameleonStep, PandaPaws

Por supuesto, esto conlleva el riesgo de perder la posibilidad de devolver un nombre mucho mejor que no se ajuste al espacio limitado que le queda a la IA para jugar. La falta de diversidad y variación en los ejemplos también es un problema a la hora de tratar casos límite, o escenarios poco comunes. Incluir de uno a tres ejemplos es fácil y casi siempre tiene un efecto positivo, pero por encima de ese número se hace imprescindible experimentar con el número de ejemplos que incluyes, así como con la similitud entre ellos. Hay algunas pruebas(Hsieh et al., 2023) de que la dirección funciona mejor que dar ejemplos, y normalmente no es sencillo reunir buenos ejemplos, por lo que suele ser prudente intentar primero el principio de Dar Dirección.

En el espacio de la generación de imágenes, proporcionar ejemplos suele ser viene en forma de proporcionar una imagen base en el prompt, llamada img2img en la comunidad de código abierto Stable Diffusion. Dependiendo del modelo de generación de imágenes que se utilice, estas imágenes pueden utilizarse como punto de partida para que el modelo genere a partir de ellas, lo que afecta en gran medida a los resultados. Puedes mantener todo lo relacionado con el indicador igual, pero cambiar la imagen base proporcionada para obtener un efecto radicalmente distinto, como en la Figura 1-9.

Entrada:

stock photo of business meeting of 4 people watching on
white MacBook on top of glass-top table, Panasonic, DC-GH5

La Figura 1-9 muestra el resultado.

pega 0109
Figura 1-9. Foto de archivo de una reunión de negocios de cuatro personas

En este caso, sustituyendo la imagen por la que se muestra en la Figura 1-10, también de Unsplash, puedes ver cómo el modelo fue tirado en una dirección diferente e incorpora ahora pizarras y notas adhesivas.

Precaución

Estos ejemplos demuestran las capacidades de los modelos de generación de imágenes, pero deberíamos ser cautos al subir imágenes base para utilizarlas en avisos. Comprueba la licencia de la imagen que piensas subir y utilizar en tu aviso como imagen base, y evita utilizar imágenes claramente protegidas por derechos de autor. Hacerlo puede acarrearte problemas legales y va en contra de las condiciones del servicio de los principales proveedores de modelos de generación de imágenes.

pega 0110
Figura 1-10. Foto de Jason Goodman en Unsplash

4. Evaluar la calidad

Hasta ahora, no ha habido ningún bucle de retroalimentación para juzgar la calidad de tus respuestas, aparte del ensayo y error básico de ejecutar la instrucción y ver los resultados, lo que se conoce como instrucción ciega. Esto está bien cuando tus avisos se utilizan temporalmente para una sola tarea y se revisan raramente. Sin embargo, cuando reutilizas la misma instrucción varias veces o creas una aplicación de producción que depende de una instrucción, tienes que ser más riguroso con la medición de los resultados.

Hay varias formas de evaluar el rendimiento, y depende en gran medida de las tareas que esperes conseguir. Cuando se lanza un nuevo modelo de IA, se tiende a centrar la atención en para saber qué tal lo hizo en las evals (evaluaciones), un conjunto estandarizado de preguntas con respuestas predefinidas o criterios de calificación que se utilizan para comprobar el rendimiento de los distintos modelos. Los distintos modelos rinden de forma diferente en los distintos tipos de tareas, y no hay garantía de que una instrucción que funcionó anteriormente se traduzca bien en un nuevo modelo. OpenAI ha hecho que su marco de evaluaciones para evaluar el rendimiento de los LLM sea de código abierto y anima a otros a contribuir con plantillas de evaluación adicionales.

Además de las evaluaciones académicas estándar, también hay pruebas más merecedoras de titulares, como la GPT-4 para aprobar el examen de abogacía. La evaluación es difícil para las tareas más subjetivas, y puede llevar mucho tiempo o ser prohibitivamente costosa para los equipos más pequeños. En algunos casos, los investigadores han recurrido al uso de modelos más avanzados como el GPT-4 para evaluar las respuestas de modelos menos sofisticados, como se hizo con la publicación de Vicuna-13B, un modelo perfeccionado basado en el modelo de código abierto Llama de Meta (véase la Figura 1-11).

pega 0111
Figura 1-11. Pruebas GPT-4 de Vicuña

Se necesitan técnicas de evaluación más rigurosas cuando se escriben artículos científicos o se califica el lanzamiento de un nuevo modelo de base, pero a menudo sólo necesitarás ir un paso por encima del ensayo y error básico. Puede que descubras que un simple sistema de calificación pulgares arriba/ pulgares abajo implementado en un Cuaderno Jupyter puede ser suficiente para añadir algo de rigor a la optimización rápida, sin añadir demasiada sobrecarga. Una prueba habitual es comprobar si proporcionar ejemplos merece la pena por el coste adicional en términos de longitud de la pregunta, o si puedes salirte con la tuya sin proporcionar ejemplos en la pregunta. El primer paso es obtener las respuestas de varias ejecuciones de cada prompt y almacenarlas en una hoja de cálculo, lo que haremos después de configurar nuestro entorno.

Puedes instalar el paquete OpenAI Python con pip install openai. Si tienes problemas de compatibilidad con este paquete, crea un entorno virtual e instala nuestro requirements.txt (instrucciones en el prefacio).

Para utilizar la API, necesitarás crear una cuenta OpenAI y luego navegar aquí para obtener tu clave API.

Advertencia

No se recomienda codificar las claves API en los scripts por motivos de seguridad. En su lugar, utiliza variables de entorno o archivos de configuración para gestionar tus claves.

Una vez que tengas una clave API, es crucial asignarla como variable de entorno ejecutando el siguiente comando, sustituyendo api_key por el valor real de tu clave API:

export OPENAI_API_KEY="api_key"

O en Windows:

set OPENAI_API_KEY=api_key

Alternativamente, si prefieres no preestablecer una clave API, puedes establecerla manualmente al inicializar el modelo, o cargarla desde un archivo .env utilizando python-dotenv. Primero, instala la biblioteca con pip install python-dotenv, y luego carga las variables de entorno con el siguiente código en la parte superior de tu script o bloc de notas:

from dotenv import load_dotenv

load_dotenv()  # take environment variables from .env.

El primer paso es obtener las respuestas de varias ejecuciones de cada prompt y almacenarlas en una hoja de cálculo.

Entrada:

# Define two variants of the prompt to test zero-shot
# vs few-shot
prompt_A = """Product description: A pair of shoes that can
fit any foot size.
Seed words: adaptable, fit, omni-fit.
Product names:"""

prompt_B = """Product description: A home milkshake maker.
Seed words: fast, healthy, compact.
Product names: HomeShaker, Fit Shaker, QuickShake, Shake
Maker

Product description: A watch that can tell accurate time in
space.
Seed words: astronaut, space-hardened, eliptical orbit
Product names: AstroTime, SpaceGuard, Orbit-Accurate,
EliptoTime.

Product description: A pair of shoes that can fit any foot
size.
Seed words: adaptable, fit, omni-fit.
Product names:"""

test_prompts = [prompt_A, prompt_B]

import pandas as pd
from openai import OpenAI
import os

# Set your OpenAI key as an environment variable
# https://platform.openai.com/api-keys
client = OpenAI(
  api_key=os.environ['OPENAI_API_KEY'],  # Default
)

def get_response(prompt):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": prompt
            }
        ]
    )
    return response.choices[0].message.content

# Iterate through the prompts and get responses
responses = []
num_tests = 5

for idx, prompt in enumerate(test_prompts):
    # prompt number as a letter
    var_name = chr(ord('A') + idx)

    for i in range(num_tests):
        # Get a response from the model
        response = get_response(prompt)

        data = {
            "variant": var_name,
            "prompt": prompt,
            "response": response
            }
        responses.append(data)

# Convert responses into a dataframe
df = pd.DataFrame(responses)

# Save the dataframe as a CSV file
df.to_csv("responses.csv", index=False)

print(df)

Salida:

  variant                                             prompt
  \
0       A  Product description: A pair of shoes that can ...
1       A  Product description: A pair of shoes that can ...
2       A  Product description: A pair of shoes that can ...
3       A  Product description: A pair of shoes that can ...
4       A  Product description: A pair of shoes that can ...
5       B  Product description: A home milkshake maker.\n...
6       B  Product description: A home milkshake maker.\n...
7       B  Product description: A home milkshake maker.\n...
8       B  Product description: A home milkshake maker.\n...
9       B  Product description: A home milkshake maker.\n...

                                            response
0  1. Adapt-a-Fit Shoes \n2. Omni-Fit Footwear \n...
1  1. OmniFit Shoes\n2. Adapt-a-Sneaks \n3. OneFi...
2  1. Adapt-a-fit\n2. Flexi-fit shoes\n3. Omni-fe...
3  1. Adapt-A-Sole\n2. FitFlex\n3. Omni-FitX\n4. ...
4  1. Omni-Fit Shoes\n2. Adapt-a-Fit Shoes\n3. An...
5  Adapt-a-Fit, Perfect Fit Shoes, OmniShoe, OneS...
6       FitAll, OmniFit Shoes, SizeLess, AdaptaShoes
7       AdaptaFit, OmniShoe, PerfectFit, AllSizeFit.
8  FitMaster, AdaptoShoe, OmniFit, AnySize Footwe...
9        Adapt-a-Shoe, PerfectFit, OmniSize, FitForm

Aquí estamos utilizando la API OpenAI para generar respuestas del modelo a una serie de preguntas y almacenar los resultados en un marco de datos, que se guarda en un archivo CSV. Así es como funciona:

  1. Se definen dos variantes de prompt, y cada variante consiste en una descripción del producto, palabras semilla y posibles nombres de producto, pero prompt_B proporciona dos ejemplos.

  2. Se llaman declaraciones de importación para la biblioteca Pandas, la biblioteca OpenAI y la biblioteca os.

  3. La función get_response toma un mensaje como entrada y devuelve una respuesta del modelo gpt-3.5-turbo. El aviso se pasa como un mensaje de usuario al modelo, junto con un mensaje de sistema para establecer el comportamiento del modelo.

  4. Se almacenan dos variantes de aviso en la lista test_prompts.

  5. Se crea una lista vacía responses para almacenar las respuestas generadas por , y la variable num_tests se establece en 5.

  6. Se utiliza un bucle anidado para generar respuestas. El bucle exterior itera sobre cada prompt, y el bucle interior genera num_tests (cinco en este caso) número de respuestas por prompt.

    1. La función enumerate se utiliza para obtener el índice y el valor de cada prompt en test_prompts. A continuación, este índice se convierte en una letra mayúscula correspondiente (por ejemplo, 0 se convierte en A, 1 se convierte en B) para utilizarla como nombre de variante.

    2. En cada iteración, se llama a la función get_response con el prompt actual para generar una respuesta del modelo.

    3. Se crea un diccionario con el nombre de la variante, la consulta y la respuesta del modelo, y este diccionario se añade a la lista responses.

  7. Una vez generadas todas las respuestas, la lista responses (que ahora es una lista de diccionarios) se convierte en un DataFrame de Pandas.

  8. A continuación, este marco de datos se guarda en un archivo CSV con la función incorporada de Pandas to_csv, haciendo el archivo responses.csv con index=False para no escribir índices de fila.

  9. Por último, la trama de datos se imprime en la consola.

Tener estas respuestas en una hoja de cálculo ya es útil, porque puedes ver enseguida, incluso en la respuesta impresa, que prompt_A (cero disparos) en las cinco primeras filas nos está dando una lista numerada, mientras que prompt_B (pocos disparos) en las cinco últimas filas tiende a dar como resultado el formato deseado de una lista en línea separada por comas. El siguiente paso es dar una puntuación a cada una de las respuestas, lo que es mejor hacer a ciegas y de forma aleatoria para evitar favorecer a un prompt sobre otro.

Entrada:

import ipywidgets as widgets
from IPython.display import display
import pandas as pd

# load the responses.csv file
df = pd.read_csv("responses.csv")

# Shuffle the dataframe
df = df.sample(frac=1).reset_index(drop=True)

# df is your dataframe and 'response' is the column with the
# text you want to test
response_index = 0
# add a new column to store feedback
df['feedback'] = pd.Series(dtype='str')

def on_button_clicked(b):
    global response_index
    #  convert thumbs up / down to 1 / 0
    user_feedback = 1 if b.description == "\U0001F44D" else 0

    # update the feedback column
    df.at[response_index, 'feedback'] = user_feedback

    response_index += 1
    if response_index < len(df):
        update_response()
    else:
        # save the feedback to a CSV file
        df.to_csv("results.csv", index=False)

        print("A/B testing completed. Here's the results:")
        # Calculate score and num rows for each variant
        summary_df = df.groupby('variant').agg(
            count=('feedback', 'count'),
            score=('feedback', 'mean')).reset_index()
        print(summary_df)

def update_response():
    new_response = df.iloc[response_index]['response']
    if pd.notna(new_response):
        new_response = "<p>" + new_response + "</p>"
    else:
        new_response = "<p>No response</p>"
    response.value = new_response
    count_label.value = f"Response: {response_index + 1}"
    count_label.value += f"/{len(df)}"

response = widgets.HTML()
count_label = widgets.Label()

update_response()

thumbs_up_button = widgets.Button(description='\U0001F44D')
thumbs_up_button.on_click(on_button_clicked)

thumbs_down_button = widgets.Button(
    description='\U0001F44E')
thumbs_down_button.on_click(on_button_clicked)

button_box = widgets.HBox([thumbs_down_button,
thumbs_up_button])

display(response, button_box, count_label)

La salida se muestra en la Figura 1-12:

pega 0112
Figura 1-12. Sistema de puntuación Pulgar arriba/ Pulgar abajo

Si ejecutas esto en un Cuaderno Jupyter, un widget muestra cada respuesta de la IA, con un botón de pulgar hacia arriba o pulgar hacia abajo (ver Figura 1-12) Esto proporciona una interfaz sencilla para etiquetar rápidamente las respuestas, con una sobrecarga mínima. Si quieres hacer esto fuera de un Cuaderno Jupyter, podrías cambiar los emojis de pulgar hacia arriba y pulgar hacia abajo por Y y N, e implementar un bucle utilizando la función incorporada input(), como sustituto de sólo texto para iPyWidgets.

Cuando hayas terminado de etiquetar las respuestas, obtendrás el resultado, que te mostrará cómo se comporta cada prompt.

Salida:

A/B testing completed. Here's the results:
  variant  count  score
0       A      5    0.2
1       B      5    0.6

El marco de datos se barajó aleatoriamente, y cada respuesta se etiquetó a ciegas (sin ver el prompt), para que tengas una idea exacta de la frecuencia con la que actuó cada prompt. He aquí la explicación paso a paso:

  1. Se importan tres módulos: ipywidgets, IPython.display, y pandas. ipywidgets contiene widgets HTML interactivos para Jupyter Notebooks y el núcleo IPython. IPython.display proporciona clases para mostrar varios tipos de salida como imágenes, sonido, mostrar HTML, etc. Pandas es una potente biblioteca de manipulación de datos.

  2. La biblioteca pandas se utiliza para leer el archivo CSV responses.csv, que contiene las respuestas que quieres probar. Esto crea un Pandas DataFrame llamado df.

  3. df se baraja utilizando la función sample() con frac=1, lo que significa que utiliza todas las filas. El reset_index(drop=True) se utiliza para restablecer los índices al índice estándar 0, 1, 2, ..., n.

  4. El script define response_index como 0. Se utiliza para rastrear qué respuesta del marco de datos está viendo actualmente el usuario.

  5. Se añade una nueva columna feedback al marco de datos df con el tipo de datos str o cadena.

  6. A continuación, el script define una función on_button_clicked(b), que se ejecutará cada vez que se pulse uno de los dos botones de la interfaz.

    1. La función comprueba primero la description del botón pulsado era el botón de pulgar hacia arriba (\U0001F44D; thumbs up 1f44d), y establece user_feedback como 1, o si era el botón de pulgar hacia abajo (\U0001F44E thumbs down 1f44e ), establece user_feedback como 0.

    2. A continuación, actualiza la columna feedback del marco de datos en el response_index actual con user_feedback.

    3. Después, incrementa response_index para pasar a la siguiente respuesta.

    4. Si response_index sigue siendo menor que el número total de respuestas (es decir, la longitud del marco de datos), llama a la función update_response().

    5. Si no hay más respuestas, guarda el marco de datos en un nuevo archivo CSV results.csv, luego imprime un mensaje, y también imprime un resumen de los resultados por variante, mostrando el recuento de respuestas recibidas y la puntuación media (media) de cada variante.

  7. La función update_response() obtiene la siguiente respuesta del marco de datos, la envuelve en etiquetas HTML de párrafo (si no es nula), actualiza el widget response para mostrar la nueva respuesta, y actualiza el widget count_label para reflejar el número de respuesta actual y el número total de respuestas.

  8. Se instancian dos widgets, response (un widget HTML) y count_label (un widget Etiqueta). A continuación, se llama a la función update_response() para inicializar estos widgets con la primera respuesta y la etiqueta adecuada.

  9. Se crean dos widgets más, thumbs_up_button y thumbs_down_button (ambos widgets Botón), con emoji de pulgar hacia arriba y pulgar hacia abajo como descripción, respectivamente. Ambos botones están configurados para llamar a la función on_button_clicked() cuando se hace clic en ellos.

  10. Los dos botones se agrupan en una caja horizontal (button_box) utilizando la función HBox.

  11. Por último, los widgets response, button_box, y count_label se muestran al usuario mediante la función display() del módulo IPython.display.

Un sistema de puntuación sencillo como éste puede ser útil para juzgar la calidad de los avisos y encontrar casos de perímetro. Normalmente, en menos de 10 pruebas de una pregunta descubres una desviación que, de otro modo, no habrías detectado hasta que empezaras a utilizarla en producción. El inconveniente es que puede resultar tedioso puntuar muchas respuestas manualmente, y tus puntuaciones pueden no representar las preferencias de tu público objetivo. Sin embargo, incluso un pequeño número de pruebas puede revelar grandes diferencias entre dos estrategias de incitación y poner de manifiesto problemas no evidentes antes de llegar a producción.

Iterar y probar los avisos puede reducir radicalmente su longitud y, por tanto, el coste y la latencia de tu sistema. Si puedes encontrar otro aviso que funcione igual de bien (o mejor) pero que utilice un aviso más corto, puedes permitirte ampliar considerablemente tu operación. A menudo descubrirás en este proceso que muchos elementos de un prompt complejo son completamente superfluos, o incluso contraproducentes.

El pulgar hacia arriba u otros indicadores de calidad etiquetados manualmente no tienen por qué ser los únicos criterios de valoración. En general, se considera que la evaluación humana es la forma más precisa de retroalimentación. Sin embargo, puede resultar tedioso y costoso valorar muchas muestras manualmente. En muchos casos, como en los casos de uso matemático o de clasificación, puede ser posible establecer la verdad de base (respuestas de referencia a los casos de prueba) para calificar programáticamente los resultados, permitiéndote ampliar considerablemente tus esfuerzos de prueba y monitoreo. Lo que sigue no es una lista exhaustiva, porque hay muchas motivaciones para evaluar programáticamente tu consulta :

Coste

Las peticiones que utilizan muchas fichas, o que sólo funcionan con modelos más caros, pueden resultar poco prácticas para su uso en producción.

Latencia

Igualmente, cuantos más tokens haya, o cuanto mayor sea el modelo requerido, más tiempo se tarda en completar una tarea, lo que puede perjudicar la experiencia del usuario.

Llama a

Muchos sistemas de IA requieren múltiples llamadas en bucle para completar una tarea, lo que puede ralentizar seriamente el proceso.

Rendimiento

Implementa algún tipo de sistema de retroalimentación externo, por ejemplo un motor de física u otro modelo para predecir los resultados del mundo real.

Clasificación

Determina con qué frecuencia un indicador etiqueta correctamente un texto dado, utilizando otro modelo de IA o un etiquetado basado en reglas.

Razonamiento

Averigua en qué casos la IA no aplica el razonamiento lógico o se equivoca en los cálculos frente a los casos de referencia.

Alucinaciones

Comprueba la frecuencia con la que encuentras alucinaciones, medida por la invención de nuevos términos no incluidos en el contexto de la pregunta.

Seguridad

Señala cualquier escenario en el que el sistema pueda devolver resultados inseguros o indeseables mediante un filtro de seguridad o un sistema de detección.

Denegaciones

Averigua con qué frecuencia el sistema se niega incorrectamente a satisfacer una petición razonable del usuario marcando el lenguaje de rechazo conocido.

Adversario

Haz que el aviso sea robusto frente a ataques conocidos de inyección de avisos que pueden hacer que el modelo ejecute avisos no deseados en lugar de lo que tú programaste.

Similitud

Utiliza palabras y frases compartidas(BLEU o ROGUE) o la distancia vectorial (explicada en el Capítulo 5) para medir la similitud entre el texto generado y el de referencia.

Una vez que empieces a valorar qué ejemplos han sido buenos, podrás actualizar más fácilmente los ejemplos utilizados en tu prompt como forma de hacer continuamente más inteligente tu sistema a lo largo del tiempo. Los datos de esta retroalimentación también pueden alimentar los ejemplos para afinarlos, lo que empieza a superar a la ingeniería de prompts una vez que puedes suministrar unos cuantos miles de ejemplos, como se muestra en la Figura 1-13.

pega 0113
Figura 1-13. ¿Cuántos puntos de datos vale una indicación?

A partir de pulgares hacia arriba o pulgares hacia abajo, puedes implementar un sistema de puntuación de 3, 5 ó 10 puntos para obtener comentarios más precisos sobre la calidad de tus indicaciones. También es posible determinar el rendimiento relativo agregado comparando las respuestas una al lado de la otra, en lugar de mirar las respuestas de una en una. A partir de esto, puedes construir una comparación justa entre modelos utilizando una clasificación Elo, como es popular en el ajedrez y se utiliza en el Chatbot Arena de lmsys.org.

Para la generación de imágenes, la evaluación suele ser , en la que introduces varias direcciones o formatos y generas una imagen para cada combinación. A continuación, las imágenes pueden escanearse o disponerse posteriormente en una cuadrícula para mostrar el efecto que los distintos elementos de la instrucción pueden tener en la imagen final.

Entrada:

{stock photo, oil painting, illustration} of business
meeting of {four, eight} people watching on white MacBook on
top of glass-top table

En Midjourney esto se recopilaría en seis indicaciones diferentes, una para cada combinación de los tres formatos (foto de archivo, pintura al óleo, ilustración) y dos números de personas (cuatro, ocho).

Entrada:

1. stock photo of business meeting of four people watching
on white MacBook on top of glass-top table

2. stock photo of business meeting of eight people watching
on white MacBook on top of glass-top table

3. oil painting of business meeting of four people watching
on white MacBook on top of glass-top table

4. oil painting of business meeting of eight people watching
on white MacBook on top of glass-top table

5. illustration of business meeting of four people watching
on white MacBook on top of glass-top table

6. illustration of business meeting of eight people watching
on white MacBook on top of glass-top table

Cada prompt genera sus propias cuatro imágenes, como de costumbre, lo que hace que el resultado sea un poco más difícil de ver. Hemos seleccionado una de cada prompt para escalarla y luego las hemos juntado en una cuadrícula, como se muestra en la Figura 1-14. Observarás que el modelo no siempre acierta con el número de personas (los modelos de IA generativa son sorprendentemente malos en matemáticas), pero ha inferido correctamente la intención general añadiendo más personas a las fotos de la derecha que a las de la izquierda.

La Figura 1-14 muestra la salida.

pega 0114
Figura 1-14. Cuadrícula de permutaciones

Con los modelos que tienen API como la Difusión Estable, tú puedes manipular más fácilmente las fotos y mostrarlas en un formato de cuadrícula para facilitar el escaneado. También puedes manipular la semilla aleatoria de la imagen para fijar un estilo en su lugar y conseguir la máxima reproducibilidad. Con los clasificadores de imágenes también puede ser posible clasificar programáticamente las imágenes en función de su contenido seguro, o de si contienen determinados elementos asociados al éxito o al fracaso.

5. Dividir el trabajo

A medida que construyes tu prompt, empiezas a hasta llegar al punto de pedir mucho en una sola llamada a la IA. Cuando las peticiones se hacen más largas y enrevesadas, puede que las respuestas sean menos deterministas y aumenten las alucinaciones o las anomalías. Incluso si consigues llegar a una petición fiable para tu tarea, es probable que esa tarea sea sólo una de las muchas tareas interrelacionadas que necesitas para hacer tu trabajo. Es natural que empieces a explorar cuántas otras de estas tareas podría realizar la IA y cómo podrías encadenarlas.

Uno de los principios básicos de la ingeniería es utilizar la descomposición de tareas para dividir los problemas en sus partes componentes, de modo que puedas resolver más fácilmente cada problema individual y luego volver a agregar los resultados. Descomponer tu trabajo de IA en varias llamadas encadenadas puede ayudarte a realizar tareas más complejas, además de proporcionarte más visibilidad sobre qué parte de la cadena está fallando.

Hay muchos factores que intervienen en la denominación de un producto, y una tarea importante se subcontrata ingenuamente a la IA sin que se sepa cómo sopesa la importancia de estos factores (si es que lo hace). De la forma en que funciona nuestro sistema actual, obtenemos una lista de nombres, pero todos los nombres se muestran con la misma importancia sin más contexto que nos ayude a decidir. Afortunadamente, las herramientas de IA son capaces de autoevaluarse; si añadimos un segundo paso a nuestra tarea, podemos comprobar automáticamente los resultados no deseados.

Entrada:

Rate this list of product names for a pair of shoes that can
fit any foot size. The rating should be out of 10, inline
next to the product name:

UniFit SoleStrides
FlexiSize All-Fit Shoes
OmniFit FootFlex
...
AnyStep AdaptiWalkers
FlexiRange UniversalSteps
PerfectGlide MultiFit Shoes

Salida:

UniFit SoleStrides: 7/10
FlexiSize All-Fit Shoes: 8/10
OmniFit FootFlex: 7/10
...
AnyStep AdaptiWalkers: 7/10
FlexiRange UniversalSteps: 7.5/10
PerfectGlide MultiFit Shoes: 9/10

This ranking is based on clarity, memorability, and how well
the name communicates the unique selling point of the
product (that they can fit any foot size). Remember, these
ratings are subjective and the ultimate success of a product
name also depends on the target market, branding, and
marketing efforts.

Al ejecutar esto varias veces, califica sistemáticamente el nombre "OneSize Glovewalkers" como el peor, proporcionando el contexto (si preguntas) de que el concepto podría ser confuso en un contexto de calzado. Quizá te preguntes por qué, si el modelo sabe que es un mal nombre, lo sugiere en primer lugar. Los LLM funcionan prediciendo el siguiente token de una secuencia y, por tanto, se esfuerzan por saber cuál será la respuesta global una vez terminada. Sin embargo, cuando dispone de todos los tokens de una respuesta anterior para revisarlos, puede predecir más fácilmente si ésta será etiquetada como una respuesta buena o mala.

Podemos seguir encadenando varias llamadas para mejorar los resultados de nuestra tarea. Por ejemplo, podríamos dividir esto en tres valoraciones separadas: claridad, memorabilidad y lo bien que el nombre comunica el punto de venta único del producto. Estas valoraciones podrían darse a un humano como contexto adicional en la decisión final, o incluso calcularse juntas para seleccionar el nombre final mediante programación.

El verdadero desbloqueo al aprender a trabajar profesionalmente con la IA, frente al mero hecho de jugar con las instrucciones, es darse cuenta de que cada parte del sistema puede dividirse en una serie de pasos iterativos. Estos principios se aplican incluso a una única pregunta, ya que basta con añadir Let's think step by step a la pregunta para obtener mejoras demostrables en el razonamiento y la competencia, además de proporcionar una pista de auditoría para el control de calidad y la depuración. Al tomarse el tiempo y los tokens para razonar, las puntuaciones cambian y son más coherentes con los criterios de puntuación.

Entrada:

Let's think step by step. Rate this list of product names
for a pair of shoes that can fit any foot size. The rating
should be out of 10, inline next to the product name:

UniFit SoleStrides
FlexiSize All-Fit Shoes
OmniFit FootFlex
...
AnyStep AdaptiWalkers
FlexiRange UniversalSteps
PerfectGlide MultiFit Shoes

Salida:

Here's a rating out of 10 for each product name, considering
factors like descriptiveness, catchiness, and overall
appeal:

1. **UniFit SoleStrides**: 7/10 - Sounds unifying but may
not immediately convey the "fit any size" idea.
2. **FlexiSize All-Fit Shoes**: 8.5/10 - Combines
flexibility and the notion that it fits all sizes.
3. **OmniFit FootFlex**: 8/10 - Omnipresence (fitting all)
and flexibility nicely conveyed.
...
18. **AnyStep AdaptiWalkers**: 7.5/10 - "AnyStep" suggests
versatility, but the overall name might be less direct.
19. **FlexiRange UniversalSteps**: 8/10 - Combines
flexibility and universal fit.
20. **PerfectGlide MultiFit Shoes**: 8.5/10 - "MultiFit" is
clear, and "PerfectGlide" suggests a comfortable experience.

Remember, the best name can also be influenced by your
target audience, branding strategy, and the overall message
you want to convey.

OpenAI llama a esto "dar tiempo al modelo para pensar", y es un principio clave de la ingeniería de prompts. En efecto, las técnicas de cadena de pensamiento como this, en las que se anima al modelo a enumerar sus pasos, son como dividir una tarea dentro del mismo prompt. Una vez que hemos automatizado la denominación de un producto dada una idea de producto, podemos llamar de nuevo a ChatGPT para que describa cada producto, lo que a su vez puede introducirse en Midjourney para generar una imagen de cada producto. Utilizar un modelo de IA para generar un prompt para un modelo de IA es meta prompting, y funciona porque los LLM son ingenieros de prompts de nivel humano(Zhou, 2022).

Entrada:

Describe the new product "OneFit UltraStride Shoes," a shoe
that can fit any foot size, in great detail:

Salida:

Introducing the revolutionary "OneFit UltraStride Shoes,"
the footwear innovation designed to fit any foot size with
unparalleled comfort and style. These shoes are a result of
cutting-edge technology and meticulous craftsmanship,
ensuring a truly personalized and enjoyable walking or
running experience for everyone.

Design and Materials:
The OneFit UltraStride Shoes boast an elegant and modern
design that appeals to both fashion-forward individuals and
sports enthusiasts. They feature a sleek and streamlined
silhouette, crafted using premium materials for durability
and aesthetic appeal. The shoe's upper is constructed from a
combination of breathable mesh and flexible synthetic
materials, allowing for excellent airflow and a lightweight
feel.

...

Color and Customization:
OneFit UltraStride Shoes are available in a variety of
vibrant colors and stylish patterns, catering to diverse
personal preferences. You can choose from classic
monochromatic options for a timeless look or opt for bold
and vibrant hues to make a fashion statement. The ability to
customize the shoe's appearance allows individuals to
express their unique style while enjoying the benefits of
the OneFit technology.

Conclusion:
The OneFit UltraStride Shoes represent a breakthrough in
footwear technology, eliminating the hassle of finding the
perfect fit for your feet. With their adaptive design,
superior comfort, and stylish aesthetics, these shoes offer
a truly personalized experience for individuals of all foot
sizes. Stay comfortable, confident, and on-trend with the
OneFit UltraStride Shoes, the ultimate choice for those
seeking unmatched versatility and a perfect fit.

DALL-E es bien conocido por GPT-4, y por tanto puedes invocar su nombre dentro de ChatGPT y hace un trabajo razonable en la elaboración de un prompt para una herramienta de generación de imágenes. Si planeas utilizar este indicador en producción, puedes plantearte aplicar el principio del indicador de proporcionar ejemplos, pero hace un trabajo suficientemente bueno para nuestros propósitos sin ejemplos.

Entrada:

Convert this description into a short prompt for an AI image
generation model such as DALL-E:

Salida:

Create an eye-catching image that visually represents the
"OneFit UltraStride Shoes," a revolutionary footwear product
that adapts to any foot size. Showcase a sleek and modern
shoe design incorporating a stretchable upper, an adjustable
lacing system, and a cushioned insole for optimal comfort.
Emphasize the shoe's versatility by displaying it in action
on various surfaces, highlighting its excellent traction.
Incorporate vibrant colors and patterns to convey the
customizable nature of the product. The image should capture
the essence of innovation, style, and personalized fit that
the OneFit UltraStride Shoes offer.

La salida de este prompt puede introducirse ahora en herramientas de generación de imágenes como DALL-E o Midjourney como prompt, lo que puede darte un buen punto de partida para visualizar el aspecto que podría tener el producto. Aunque puede que no sea el diseño final que elijas, ver una imagen es más evocador y ayuda a que la gente se forme una opinión más rápidamente. Desde el punto de vista cognitivo, es más fácil criticar o elogiar una imagen existente que imaginar una nueva imagen a partir de una página en blanco o una sección de texto.

La Figura 1-15 muestra el resultado.

pega 0115
Figura 1-15. Calzado OneFit UltraStride

Cuando se trabaja profesionalmente con AI, es habitual encadenar varias llamadas a AI, e incluso varios modelos, para lograr objetivos más complejos. Incluso las aplicaciones de una sola petición se construyen a menudo de forma dinámica, basándose en el contexto externo consultado desde varias bases de datos u otras llamadas a un modelo de IA. La biblioteca LangChain ha desarrollado herramientas para encadenar múltiples plantillas de instrucciones y consultas, haciendo este proceso más observable y bien estructurado. Un ejemplo fundacional es el resumen progresivo, en el que un texto demasiado grande para caber en una ventana contextual puede dividirse en varios trozos de texto, resumiéndose cada uno de ellos, antes de resumir finalmente los resúmenes. Si hablas con los creadores de los primeros productos de IA, te darás cuenta de que todos encadenan múltiples indicaciones, lo que se denomina encadenamiento de IA, para obtener mejores resultados en el resultado final.

El marco Reason and Act (ReAct) fue uno de los primeros intentos populares de agentes de IA, incluidos los proyectos de código abierto BabyAGI, AgentGPT y Microsoft AutoGen. En efecto, estos agentes son el resultado de encadenar múltiples llamadas a la IA para planificar, observar, actuar y luego evaluar los resultados de la acción. Los agentes autónomos se tratarán en el Capítulo 6, pero todavía no se utilizan ampliamente en producción en el momento de escribir estas líneas. Esta práctica de los agentes que razonan por sí mismos es aún incipiente y propensa a errores, pero hay indicios prometedores de que este enfoque puede ser útil para realizar tareas complejas, y es probable que forme parte de la próxima etapa de la evolución de los sistemas de IA.

Se está produciendo una batalla por la IA entre grandes empresas tecnológicas como Microsoft y Google, así como una amplia gama de proyectos de código abierto en Hugging Face, y empresas de nueva creación financiadas con capital riesgo como OpenAI y Anthropic. A medida que siguen proliferando nuevos modelos, se están diversificando para competir por distintos segmentos del creciente mercado. Por ejemplo, Claude 2 de Anthropic tenía una ventana de contexto de 100.000 tokens, frente a los 8.192 tokens estándar de GPT-4. OpenAI no tardó en responder con una versión de GPT-4 con una ventana de 128.000 tokens, y Google promociona una longitud de contexto de 1 millón de tokens con Gemini 1.5. A modo de comparación, uno de los libros de Harry Potter tendría unos 185.000 tokens, por lo que puede llegar a ser habitual que un libro entero quepa en un solo prompt, aunque procesar millones de tokens con cada llamada a la API puede resultar prohibitivo para la mayoría de los casos de uso.

Este libro se centra en GPT-4 para las técnicas de generación de texto, así como en Midjourney v6 y Stable Diffusion XL para las técnicas de generación de imágenes, pero dentro de unos meses puede que estos modelos ya no sean lo último en tecnología. Esto significa que cada vez será más importante poder seleccionar el modelo adecuado para el trabajo y encadenar varios sistemas de IA. Las plantillas de avisos rara vez son comparables cuando se transfieren a un nuevo modelo, pero el efecto de los Cinco Principios de los Avisos mejorará sistemáticamente cualquier aviso de que utilices, para cualquier modelo, obteniendo resultados más fiables.

Resumen

En este capítulo has aprendido la importancia de la ingeniería de prompts en el contexto de la IA generativa. Definimos la ingeniería de prompts como el proceso de desarrollar prompts eficaces que produzcan los resultados deseados al interactuar con modelos de IA. Descubriste que los principios clave de la ingeniería de prompts son proporcionar una dirección clara, dar formato a la salida, incorporar ejemplos, establecer un sistema de evaluación y dividir las tareas complejas en prompts más pequeños. Si aplicas estos principios y utilizas técnicas comunes de orientación, podrás mejorar la calidad y fiabilidad de los resultados generados por la IA.

También has explorado el papel de la ingeniería de prompts en la generación de nombres de productos e imágenes. Viste cómo especificar el formato deseado y proporcionar ejemplos instructivos puede influir enormemente en el resultado de la IA. Además, conociste el concepto de juego de roles, en el que puedes pedir a la IA que genere resultados como si fuera una persona famosa, como Steve Jobs. El capítulo hizo hincapié en la necesidad de una dirección y un contexto claros para lograr los resultados deseados al utilizar modelos de IA generativa. Además, descubriste la importancia de evaluar el rendimiento de los modelos de IA y los distintos métodos utilizados para medir los resultados, así como las compensaciones entre la calidad y el uso de tokens, el coste y la latencia.

En el siguiente capítulo, se te presentarán los modelos de generación de texto. Conocerás los distintos tipos de modelos de base y sus capacidades, así como sus limitaciones. El capítulo también revisará las ofertas estándar de OpenAI, así como las alternativas de la competencia y de código abierto. Al final del capítulo, tendrás una sólida comprensión de la historia de los modelos de generación de texto y de sus relativos puntos fuertes y débiles. Este libro volverá a hablar de la generación de imágenes en los Capítulos 7, 8 y 9, así que no dudes en saltarte el capítulo si esa es tu necesidad inmediata. Prepárate para profundizar en la disciplina de la ingeniería de prompts y ampliar tu comodidad trabajando con IA.

Get Ingeniería Prompt para la IA Generativa now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.