Por cierto, el nombre DALL-E, elegido por OpenAI para esta app GPT, está basado en el nombre Dalí, precisamente (Pues así es como se pronuncia en inglés). Veamos ahora algunos detalles técnicos de cómo hacer una ‘request’ por el método GET desde la página cliente al servidor. La app Dall-E está implementada en el módulo OpenAI para Node.js mediante una función asincrónica. Supongamos que mi servidor web lo pongo a la escucha en la URL https://localhost:8000, y la página cliente desde la que se hacen requests a DALL-E es la ‘openai/gen-img.jhs´. Necesitaremos una ‘query string’ con dos variables: una será la variable ‘prompt’, donde enviamos nuestro texto, y la otra la variable ‘size’, donde le diremos de qué tamaño queremos la imagen. Así, nuestra ‘request’ completa del ejemplo, suponiendo que queremos un tamaño mediano de imagen, será está:
'https://localhost:8000/openai/gen-img.jhs?prompt=portrait of Dali like a van Gogh& size=medium'
O si codificamos convemientemente la URl, lo cual sería bastante correcto:
https://localhost:8000/openai/gen-img.jhs?prompt=portrait%20of%20Dali%20like%20a%20van%20Gogh&%20size=medium
Cuando la request sea procesada por nuestro servidor con el método GET, generará el objeto queryobject = {prompt:’portrait of Dali like a van Gogh’, size:’medium’}, el cual es enviado como argumento a la función asincrónica
const response = await openai.createImage({prompt:queryobject.prompt, n: 1, size: queryobject.size});
donde el parámetro adicional n:1, lo dejamos constante, porque sólo queremos una copia de la imagen. Cuando DALL-E termina la tarea que le hemos pedido, nos devuelve el resultado de esta forma:
const result = response.data.data[0].url
es decir, nos envía una url de la imagen generada que tiene almacenada en la nube OpenAI (no nos envía todos los bytes en crudo de la imagen).
Si le volviéramos a enviar la misma request (mismo texto) el resultado sería distinto, pero siempre en contexto.
Otra de las aplicaciones de OpenAI que estuve viendo es la de chat. Más exactamente el modelo para chat ‘gpt-3.5-turbo’. En este caso la función asincrónica es
const response = await openai.createChatCompletion({model, messages});
. Es decir, que en la request de la pagina cliente enviamos dos variables, una será ‘messages’, para los mensajes de texto y nombre de usuario, y otra será ‘model’ para el modelo de GPT que estemos solicitando. El objeto ‘messages’ es un array de objetos compuesto cada uno por dos variables de cadena. Es decir,
messages =[ {role:'albert' , content:'hi assistant, how big is our universe?'}, {role:'albert' , content:'are black holes real?'}, {role:'albert' , content:'Does dark matter exist?'}, {role:'albert' , content:'is our universe a simulation?'}, ... ]
. Esto lo hacen asi, para poder chatear con el usuario, poder mantener una conversación con él. La respuesta a cada mensaje que enviemos se extrae así:
const result = response.data.choices[0].message.content;
Y para finalizar esta breve incursión en la AGI (Inteligencia Artificial Generativa) de OpenAI, combinemos ambas aplicaciones, que sucintamente he presentado, la DALL-E y el modelo GPT 3.5-turbo. A GPT 3.5-turbo le solicito lo siguiente:
messages =[ {role:'albert' , content:'hi assistant, can you write a short tale of a rabbit?'}, ]
Una vez que leo ese breve cuento, sé que al propagonista le llama Benny, por lo tanto, propongo a DALL-E lo siguiente:
prompt:'draw a colorful young and curious rabbit eating a carrot style alice in wonderland'
Y El resultado combinado de ambas consultas es este:
Once upon a time, there was a young and curious rabbit named Benny. He had soft and white fur and big floppy ears that would bounce as he hopped around the meadow. Benny loved exploring and discovering new things.
One day, while venturing far away from his burrow, Benny found a patch of the sweetest and juiciest carrots he had ever seen. Excitedly, he began to munch on them, savoring their delicious taste.
However, Benny soon realized that he had wandered quite far from home and was now lost in a vast and unfamiliar landscape. The sun began to set, and Benny’s fear grew as the darkness enveloped him.
Just when Benny was about to give up hope, he heard a familiar voice calling his name – it was his mother! She had been searching for him and finally found him just in time.
Benny felt comforted and relieved, knowing that his mother cared for him and would always be there to guide him back home. From then on, Benny always remembered to stay close to his burrow and never venture too far away.
script: ‘GPT-3.5-turbo’
illustrations: ‘DALL-E’