Computación en la Nube, Servicios y Aplicaciones. Francisco García <paco.garcia@ual.es>, Joaquín Cañadas <jjcanada@ual.es>
Version 0.23.0
-
Utilizar servicios de avanzados en la nube para la realización de tareas inteligentes.
-
Introducción al uso de servicios de inteligencia artificial mediante el uso de la API de OpenAI.
Esta es la versión 0.23.0 de este documento.
Primeros pasos con Azure OpenAI
-
Vamos a solicitar creditos para poder usar Azure de forma gratuita.
-
Después, solicitaremos una cuenta de Azure OpenAI y acceso a los modelos de lenguaje de GPT-3 y GPT-4.
Activación de la suscripción de Azure
-
Activación de la suscripción de Azure.
-
Solicitud de créditos para estudiantes.
Introducción a Azure
Azure es una plataforma de cloud computing que ofrece una amplia gama de servicios para la creación de aplicaciones y servicios en la nube.
Entre los servicios que ofrece Azure podemos destacar:
-
Azure DevOps: Herramienta de gestión de proyectos de desarrollo de software.
-
Azure Cognitive Services: Herramienta de inteligencia artificial.
-
Azure OpenAI: Herramienta para el acceso a modelos de inteligencia artificial de OpenAI.
Dar de alta su cuenta Microsoft en la Universidad de Almería
Para ello, seguir los pasos indicados en el siguiente enlace: https://www.ual.es/descargadesoftware/software-microsoft
Solamente en el caso de que no tuvieras activada tu cuenta Microsoft la UAL con anterioridad. |
Solicitar una cuenta Azure for Students
Utilizar el siguiente enlace de Azure for Students: https://azure.microsoft.com/es-es/free/students/
Habrá que iniciar sesión con la cuenta Microsoft de la UAL.
Es posible que soliciten datos adicionales como los siguientes:
|
Azure para estudiantes ofrece $100 en créditos de Azure que puede usar durante los 12 primeros meses junto con algunos servicios gratuitos (sujetos a cambios), sin necesidad de tarjeta de crédito.
El crédito que no se haya utilizado no se puede transferir a los meses siguientes ni a otras suscripciones de Azure.
Si agota el crédito disponible, se deshabilitará su suscripción de Azure. En ese caso, puede cambiar a una suscripción Pago por uso.
Acceso a Azure
Para acceder a Azure, utilizar el siguiente enlace: https://portal.azure.com
Solicitud de acceso a modelos GPT-3 y GPT-4
Introducción a OpenAI
OpenAI es una organización sin ánimo de lucro que busca desarrollar inteligencia artificial segura y beneficios para la humanidad.
Algunas de los modelos de lenguaje que han desarrollado son:
-
GPT-3: Generative Pre-trained Transformer 3
-
GPT-4: Generative Pre-trained Transformer 4
-
DALL-E: Discrete VAE for Conditional Image Generation
Algunos de estos modelos estan disponibles a través de Azure OpenAI y se pueden utilizar con el credito de estudiantes de Azure.
Solicitar acceso a modelos GPT-3
Para empezar a trabajar necesitamos solicitar acceso a los modelos GPT-3 mediante el siguiente formulario: https://aka.ms/oai/access.
Hay que marcar la casilla de Text and code models para poder utilizar GPT-3. También es necesario introducir el id de la suscripción de Azure. Para obtenerlo, hay que ir a la suscripción de Azure y copiar el id que aparece en la URL. Marcar ISV como tipo de organización y 250-499 como número de empleados. |
Pasados unos días, recibiremos un correo con la confirmación de acceso a los modelos.
Solicitar acceso a modelos GPT-4
Para solicitar acceso a los modelos GPT-4, hay que rellenar el siguiente formulario: https://aka.ms/oai/get-gpt4.
Solo se puede solicitar teniendo acceso a los modelos GPT-3. Es necesario introducir el id de solicitud de acceso a los modelos GPT-3. |
Aplicación en NodeJS
Como construir aplicaciones que utilicen la api de OpenAI en NodeJS utilizando el framework ExpressJS
-
Realizar una implementación de un modelo de lenguaje en Azure OpenAI Studio
-
Crear un endpoint en NodeJS que utilice el modelo de lenguaje mediante la api de OpenAI y ExpressJS
Hola mundo en OpenAI
A continuación se muestra un ejemplo de utilización de la API de OpenAI en un proyecto NodeJS utilizando ExpressJS.
Creación del recurso de OpenAI en Azure
Para poder utilizar la API de OpenAI es necesario crear un recurso de OpenAI en Azure. Para ello, debemos seguir los siguientes pasos:
-
Acceder a Azure Portal, seleccionar Azure OpenAI y seleccionar el botón
+ Crear
. -
Seleccionar la suscripción y el grupo de recursos donde se va a crear el recurso de OpenAI. Si no se tiene ninguno, se puede crear uno nuevo.
-
Seleccionar el nombre del recurso, la región y el plan de tarifas. Como nombre del recurso se puede poner
usuario-openai
, la mejor región esSouth Central US
y el plan de tarifas esS0
. -
Seleccionar el botón
Crear
. -
Una vez creado el recurso, se puede acceder a la página de administración del recurso de OpenAI en Azure.
Implementar un modelo de OpenAI en Azure
Para poder utilizar un modelo de OpenAI es necesario implementarlo en Azure. Para ello, debemos seguir los siguientes pasos:
-
Acceder a Azure OpenAI Studio.
-
Seleccionar la opción
Modelos
y el botónImplementar modelo
. -
Seleccionar el modelo que se quiere implementar. En este caso, se va a implementar el modelo
gpt-35-turbo
. -
Establecer un nombre para la implementación. Por ejemplo,
gpt3
. -
Pulsar en el botón
Crear
.
Recopilar datos para utilizar la API de OpenAI
Necesitamos los siguientes datos para poder utilizar la API de OpenAI:
-
API Key: Se puede obtener en la página de administración del recurso de OpenAI en Azure.
-
Endpoint: Se puede obtener en la página de administración del recurso de OpenAI en Azure.
-
Deployment: Nombre de la implementación del modelo de OpenAI en Azure.
Creación de Endpoint en ExpressJS
Podemos partir de un proyecto NodeJS con ExpressJS. En este caso, se ha utilizado el proyecto https://github.com/ualcnsa/nodeapp. Este proyecto implementa un hola mundo en NodeJS con ExpressJS.
El primer paso es instalar las dependencias necesarias para poder utilizar la API de OpenAI. Para ello, se debe ejecutar el siguiente comando:
npm install openai
En segundo lugar, se debe crear un fichero src/config/configuration.js
con el siguiente contenido:
const openai = require('openai');
const configuration = {
openai: new openai.Configuration({
basePath: 'https://ggf906-openai.openai.azure.com/openai/deployments/gpt3', (1)
apiKey: '3f9f9f99f9f9f9f9f9f9f9f9f9f9f9f', (2)
}),
};
module.exports = configuration;
1 | Endpoint de la API de OpenAI. ggf906-openai es el nombre del recurso de OpenAI en Azure y gpt3 es el nombre de la implementación del modelo de OpenAI en Azure. |
2 | API Key de la API de OpenAI. |
En tercer lugar, se debe crear un fichero src/services/movie-recommendations.js
con el siguiente contenido:
const configuration = require('../config/configuration');
class MovieRecommendationsService {
constructor(openAIApi) {
this.openai = openAIApi; (1)
}
async getMovieRecommendations({ movies }) {
const completion = await this.openai.createChatCompletion( (2)
{
model: 'gpt-3.5-turbo', (3)
messages: [ (4)
{
role: 'system', (5)
content:
'Given a list of movies suggest 5 new movies. Reply with only the answer in JSON form and include no other commentary. It is an array of objects called movies with title, director, year and reason.', (6)
},
{
role: 'user', (7)
content: movies.join(','), (8)
},
],
},
{
headers: {
'api-key': configuration.openai.apiKey, (9)
},
params: {
'api-version': '2023-03-15-preview', (10)
},
}
);
return this.extractJSON(completion.data.choices[0].message.content); (11)
}
extractJSON(text) {
const jsonStart = text.indexOf('```json'); (12)
if (jsonStart === -1) { (13)
const movies = JSON.parse(text);
return movies.movies ? movies : { movies }; (14)
}
const jsonEnd = text.indexOf('```', jsonStart + 1);
const json = text.substring(jsonStart + 7, jsonEnd);
return JSON.parse(json);
}
}
module.exports = MovieRecommendationsService;
1 | Se inyecta la API de OpenAI. |
2 | Se llama al método createChatCompletion de la API de OpenAI que se encarga de interactuar con el modelo de OpenAI. |
3 | Se indica el modelo que se va a utilizar. En este caso, se va a utilizar el modelo gpt-3.5-turbo . |
4 | Se indica el listado de mensajes que se van a enviar al modelo de OpenAI. |
5 | Se indica el rol del mensaje. En este caso, el rol es system . |
6 | Se indica el comportamiento del modelo de OpenAI. En este caso, se indica que el modelo debe devolver un listado de películas recomendadas al usuario siguiendo un formato determinado y usando JSON. |
7 | Se indica el rol del mensaje. En este caso, el rol es user . |
8 | Se indica el listado de películas que se van a enviar al modelo de OpenAI. Estas películas se reciben como parámetro del método / endpoint. |
9 | Se indica la API Key de la API de OpenAI. |
10 | Se indica la versión de la API de OpenAI. Requisito de la versión de Azure OpenAI Studio. |
11 | Se extrae el JSON del mensaje devuelto por el modelo de OpenAI. El resultado devuelto puede venir de diferentes maneras y es necesario procesarlo para obtener el JSON. |
12 | Se trata de un mensaje formateado como código. Se busca el inicio del código. |
13 | Si no se encuentra el inicio del código, se asume que el mensaje es un JSON. |
14 | Se devuelve el JSON. Si no existe el campo movies , se devuelve el JSON como un objeto con el campo movies . |
Puesto que el uso de la API de OpenAI es un servicio de pago, se recomienda diseñar los mensajes utilizando OpenAI Chat para comprobar que el modelo devuelve el resultado esperado. |
En cuarto lugar, se ha modificado el fichero src/app.js
para añadir el endpoint /movie-recommendations
:
const express = require('express');
const bodyParser = require('body-parser');
...
const MovieRecommendationsService = require('./services/movie-recommendations'); (1)
const configuration = require('./config/configuration'); (1)
const { OpenAIApi } = require('openai'); (1)
const app = express();
app.use(bodyParser.json()); (2)
...
app.put('/post-test', async (req, res) => { (3)
console.log('Got body:', req.body);
const recommendations = await new MovieRecommendationsService(
new OpenAIApi(configuration.openai)
).getMovieRecommendations(req.body); (4)
res.send(recommendations); (5)
});
module.exports = app;
1 | Se importan las dependencias necesarias. |
2 | Se añade el middleware body-parser para poder parsear el cuerpo de la petición. |
3 | Se añade el endpoint /movie-recommendations . |
4 | Se llama al servicio MovieRecommendationsService para obtener las recomendaciones de películas. |
5 | Se devuelve el resultado de las recomendaciones de películas. |
Prueba del Endpoint
Para probar el endpoint, se puede utilizar Postman. En este caso, se ha utilizado el siguiente JSON:
{
"movies": [
"The Matrix",
"Blade Runner",
"2001: A Space Odyssey"
]
}
y se ha obtenido el siguiente resultado:
{
"movies": [
{
"title": "Inception",
"director": "Christopher Nolan",
"year": "2010",
"reason": "mind-bending sci-fi"
},
{
"title": "Interstellar",
"director": "Christopher Nolan",
"year": "2014",
"reason": "visually stunning sci-fi"
},
{
"title": "Ex Machina",
"director": "Alex Garland",
"year": "2014",
"reason": "thought-provoking sci-fi"
},
{
"title": "Blade Runner 2049",
"director": "Denis Villeneuve",
"year": "2017",
"reason": "sequel to Blade Runner"
},
{
"title": "Her",
"director": "Spike Jonze",
"year": "2013",
"reason": "romantic sci-fi"
}
]
}
La llamada a la API de OpenAI lleva un coste asociado derivado del número de tokens que se envían al modelo. Para este número se tiene en cuenta tanto el número de tokens de los mensajes en el código como el número de tokens de los mensajes en el JSON de respuesta. |