¡La IA vino a ayudarnos y hoy en todo el mundo se está hablando del Chat GPT y aquí me sumo también a esta charla!

Quiero mostrarte en este post, cómo he desarrollado una pequeña aplicación en Oracle APEX que utiliza el API del Chat GPT para obtener un plan de alimentación y un plan de ejercicios.

¡Todos en algún momento nos vemos con la necesidad de hacer dieta o mejorar nuestro estilo de vida comiendo más sano y haciendo ejercicios, en mi caso lo necesito urgente! Hoy gracias a la IA quiero mostrarte cómo se puede llamar a la API de OpenAI desde APEX para crear esta demo muy simple.

Ahora sí, veamos qué es el Chat GPT. El ChatGPT es un modelo que está capacitado para seguir una instrucción en un prompt y brindar una respuesta detallada.

Las capacidades que tiene esta herramienta es que:

  • Recuerda lo que el usuario dijo anteriormente en la conversación.
  • Permite al usuario proporcionar correcciones de seguimiento
  • Capacitado para rechazar solicitudes inapropiadas

En cuanto a las limitaciones, la herramienta advierte las siguientes:

  • Ocasionalmente puede generar información incorrecta
  • Ocasionalmente puede producir instrucciones dañinas o contenido sesgado
  • Conocimiento limitado del mundo y los eventos después de 2021

En esta pantalla podemos ver un elemento de tipo select list que nos permite cargar distintos ejemplos:

Al cargar el ejemplo podemos ver cómo se le da la instrucción a la API para que realice la traducción del idioma inglés al francés y japonés.

Al cargar el ejemplo podemos ver cómo se le da la instrucción a la API para que realice la traducción del idioma inglés al francés y japonés.

Otro ejemplo es explicar código:

Al hacer clic en el botón Submit, comienza la explicación del código.

En el artículo de Michelle, ella explica muy bien lo básico a tener en cuenta para generar un mejor prompt para hacer una llamada a OpenAI.

Por otro lado, debemos mencionar que existen distintos modelos a utilizar cuando hacemos una llamada a la API.

Modelos GPT-3

Según la documentación los modelos GPT-3 pueden comprender y generar lenguaje natural. Ofrecen cuatro modelos principales con diferentes niveles de potencia adecuados para diferentes tareas. Davinci es el modelo más capaz y Ada es la más rápida.

ULTIMO MODELO DESCRIPCIÓN SOLICITUD MÁXIMA DATOS DE ENTRENAMIENTO
texto-davinci-003 El modelo GPT-3 más capaz. Puede realizar cualquier tarea que puedan realizar los otros modelos, a menudo con mayor calidad, mayor duración y mejor seguimiento de instrucciones. También admite la inserción de finalizaciones dentro del texto. 4,000 tokens Hasta junio de 2021
texto-curie-001 Muy capaz, pero más rápido y de menor costo que Davinci. 2,048 tokens Hasta octubre de 2019
texto-babbage-001 Capaz de realizar tareas sencillas, muy rápidas y de menor costo. 2,048 tokens Hasta octubre de 2019
texto-ada-001 Capaz de tareas muy simples, generalmente el modelo más rápido de la serie GPT-3 y el costo más bajo. 2,048 tokens Hasta octubre de 2019

Documentación de OpenAI

Versiones anteriores a GPT-3

Davinci

Davinci es la familia de modelos más capaz y puede realizar cualquier tarea que los otros modelos pueden realizar y, a menudo, con menos instrucción. Para aplicaciones que requieren mucha comprensión del contenido, como resúmenes para una audiencia específica y generación de contenido creativo, Davinci producirá los mejores resultados. Estas mayores capacidades requieren más recursos informáticos, por lo que Davinci cuesta más por llamada API y no es tan rápido como los otros modelos.

Otra área en la que brilla Davinci es en la comprensión de la intención del texto. Davinci es bastante bueno resolviendo muchos tipos de problemas lógicos y explicando los motivos de los personajes. Davinci ha podido resolver algunos de los problemas de IA más desafiantes que involucran causa y efecto.

Bueno en: intención compleja, causa y efecto, resumen para la audiencia

Curie

Curie es extremadamente poderoso, y muy rápido. Si bien Davinci es más fuerte cuando se trata de analizar texto complicado, Curie es bastante capaz para muchas tareas matizadas como la clasificación y el resumen de sentimientos. Curie también es bastante bueno respondiendo preguntas y realizando preguntas y respuestas y como un chatbot de servicio general.

Bueno en: traducción de idiomas, clasificación compleja, sentimiento de texto, resumen

Babbage

Babbage puede realizar tareas sencillas como una clasificación simple. También es bastante capaz cuando se trata de la búsqueda semántica que clasifica qué tan bien los documentos coinciden con las consultas de búsqueda.

Bueno en: clasificación moderada, clasificación de búsqueda semántica

Ada

Ada suele ser el modelo más rápido y puede realizar tareas como analizar texto, corregir direcciones y ciertos tipos de tareas de clasificación que no requieren demasiados matices. El desempeño de Ada a menudo se puede mejorar al proporcionar más contexto.

Según la herramienta nos indica que usemos el modelo Davinci ya que es una manera excelente de descubrir lo qué es capaz de hacer la API.

Para conocer más sobre la API te dejo aquí el link:

Para poder utilizar la API en nuestra aplicación de Oracle APEX es necesario ante todo generar nuestra API key. Para ello dentro de nuestro perfil accedemos a Ver API keys, y allí podemos crear una nueva API Key.

Ejemplo de promp:

Nota: es mejor tener un prompt mucho más corto, ya que es más fácil que obtengamos lo que realmente queremos obtener y además no tendríamos error en el playground cuando queremos probar nuestro prompt. Para esta demostración lo he hecho muy simple como para tener un primer acercamiento a esta herramienta. Vamos a ver qué nos recomienda la IA según el prompt que ingresamos.

“Actúa como un nutricionista y crea una dieta para mí de 3 días. Elabora una Dieta Detox. La dieta debe tener una porción de proteína y dos porciones de grasa y tres porciones de vegetales y una porción de carbohidratos, para cada comida. Prioriza las comidas que tienen alto valor de los micronutrientes de esta lista: Hierro, Magnesio. Además, soy alérgico o no me gusta: Salmón. Quiero que describas recetas con el paso a paso por cada comida en una nueva línea. Describa qué micronutrientes contiene cada comida.”

Ingreso al chat GPT:

Y vemos que el chat nos responde con la dieta que pedimos.

Oracle APEX con GPTchat

Ahora creamos una página en APEX para poder seleccionar las opciones. Luego al seleccionar las opciones que deseamos, hacemos clic en el botón Obtener Mi Plan para realizar la llamada a la API de OpenAI.

Esta página contiene:

  • 1 elemento de página de tipo Select List (Cantidad de Días).
  • 1 elemento de página de tipo Radio Group  (Tipos de Dietas).
  • 4 elementos de página de tipo Checkbox  (proteínas, Vegetales, Grasa, y Carbohidratos).
  • 3 elementos de página de tipo Textarea (Alergias, Incluir Micronutrientes, Comentarios).
  • 2 elementos de página de tipo Switch (Incluir Información Nutricional, Incluir Receta).
  • 1 elemento de tipo Textarea para mostrar el resultado.

Un botón para llamar a la API de OpenAI y otro botón para limpiar la pantalla que simplemente limpia todos los elementos de la pantalla.

El proceso que utilizamos para darle la indicación a la API de nuestro prompt es el siguiente:

“Actúa como un nutricionista y crea una dieta para mí de 3 días. Elabora una Dieta Detox. La dieta debe tener una porción de proteína y dos porciones de grasa y tres porciones de vegetales y una porción de carbohidratos, para cada comida. Prioriza las comidas que tienen alto valor de los micronutrientes de esta lista: Hierro, Magnesio. Además, soy alérgico o no me gusta: Salmón. Quiero que describas recetas con el paso a paso por cada comida en una nueva línea. Describa qué micronutrientes contiene cada comida.”

Lo resaltado en negrita serían nuestras opciones. Y las demás opciones se activarán en caso que seleccionemos lo elementos para obtener los requerimientos.

El siguiente código PL/SQL lo agregamos como un proceso cuando se hace clic en el botón Obtener Mi Plan.

declare

l_prompt varchar2(4000);

begin

l_prompt:='Actúa como un nutricionista y crea una dieta para mí de ' ||:P4_DIAS_SOLICITADOS||' días.';

if :P4_TIPO is not null then 
l_prompt:=l_prompt||'Elabora una '||:P4_TIPO||'.';
end if;

if :P4_PROTEINAS = 'Y' then
l_prompt:=l_prompt||'La dieta debe tener una porción de proteína y ';
end if;

if :P4_GRASAS = 'Y' then
l_prompt:=l_prompt||'dos porciones de grasas y ';
end if;

if :P4_VEGETALES = 'Y' then
l_prompt:=l_prompt||'tres porciones de vegetales y ';
end if;

if :P4_CARBOHIDRATOS = 'Y' then
l_prompt:=l_prompt||'una porción de carbohidratos para cada comida.';
end if;

if :P4_INCLUIR_MICRONUTRIENTES is not null then 
l_prompt:=l_prompt||' Prioriza las comidas que tienen alto valor de los micronutrientes de esta lista: '||:P4_INCLUIR_MICRONUTRIENTES||'.';
end if;

if :P4_EVITAR_COMIDA is not null then
l_prompt:=l_prompt||'Además, soy alérgico o no me gusta estos alimentos: '||:P4_EVITAR_COMIDA||'.';
end if;

if :P4_INCLUIR_RECETA_DIRECCIONES = 'Y' then
l_prompt:=l_prompt||'Quiero que describas recetas con el paso a paso por cada comida en una nueva línea.'; 
else
l_prompt:=l_prompt||'No incluya receta para cada comida.'; 
end if;

if :P4_INCLUIR_INFO_NUTRICIONAL = 'Y' then
l_prompt:=l_prompt||'Describa qué micronutrientes contiene cada comida.'; 
end if;

if :P4_COMENTARIOS is not null then 
l_prompt:=l_prompt||'. '||:P4_COMENTARIOS||'.';
end if;

chatgpt_pkg.get_completion(
in_parm1 => l_prompt,
out_plan => :P4_RESPUESTA);

end;

El paquete que necesitamos para que se realice la llamada, fue creado por Michelle, gracias Michelle por este gran aporte! Visita su blog aquí.

Qué interesante lo que puede hacer la IA!, replico lo que ella preguntó para poder hacer la llamada con pl/sql, me encantó!

Cuál es el código PL/SQL requerido para usar apex_web_service.make_rest_request para hacer una llamada a GPT3 usando el modelo text-davinci-003.

Aquí está el paquete creado que podemos usar según las especificaciones dadas.

create or replace PACKAGE "CHATGPT_PKG" is 
/* 
Purpose: PL/SQL package for OpenAI API 
Remarks: Allows us to post requests to OpenAI API 
Who Date Description 
—— ———- ————————————- 
MS 14.1.2023 Created package 
*/ 
procedure get_completion ( 
in_parm1 in varchar2, 
out_plan out clob 
); 
end chatgpt_pkg;

==================================

create or replace PACKAGE BODY "CHATGPT_PKG" is 
g_gpt_api_url constant varchar2(255) := 'https://api.openai.com/v1/completions'; 
g_api_secret constant varchar2(255) := 'API Key'; 


procedure get_completion ( 
in_parm1 in varchar2, 
out_plan out clob 
) 
is 
l_result clob; 

/* the parameters in the request could/should be variables for a more flexible call */ 

l_request_text varchar2(4000) := '{"prompt": "'||in_parm1||'", "model": "text-davinci-003","temperature":0.7,"max_tokens":2000}'; 

l_json_table clob; 

l_status_code number; 

begin 
apex_web_service.g_request_headers.delete(); -- clear the header 
apex_web_service.g_request_headers(1).name := 'Content-Type'; 
apex_web_service.g_request_headers(1).value := 'application/json'; 
apex_web_service.g_request_headers(2).name := 'Authorization'; 
apex_web_service.g_request_headers(2).value := 'Bearer '||g_api_secret; 
l_result := apex_web_service.make_rest_request( 
p_url => g_gpt_api_url, 
p_http_method => 'POST', 
p_body=>l_request_text 
); 
--Get the status code from the response 
l_status_code := apex_web_service.g_status_code; 
--Raise an exception if the status code is not 200 
IF l_status_code != 200 THEN 
raise_application_error(-20000, 'La solicitud de API falló con el código de estado: ' || l_status_code); 
END IF; 
for i in (select * from json_table(l_result, '$.choices[*]' 
columns ( 
value varchar2(4000) path '$.text' 
) 
)) 
loop 
out_plan:=out_plan||i.value; 
end loop; 
end get_completion; 

end chatgpt_pkg;

 

En la demo también he creado una página para obtener un plan de ejercicios.

¡Si tienes comentarios o aprendes algo nuevo sobre este nuevo mundo del chatGPT y Oracle APEX por favor escribe en los comentarios!

¡Hay mucho por aprender todavía, pero esto es un gran inicio y agradezco a todas las personas que siempre están ayudando y compartiendo lo que aprenden con la comunidad! ¡En este caso va mi agradecimiento especial a Michelle por este gran aporte!

¡Será hasta la próxima!