¡Impulse 4D con OpenAI!

La Inteligencia Artificial altera rápidamente nuestra vida cotidiana, no sólo como desarrolladores. La mayoría de ustedes, si no todos, ya han oído hablar de ChatGPT de OpenAI. Este post trata de una prueba de concepto realizada con Qodly Studio, en un caso de uso práctico: cómo utilizar la IA para generar conjuntos de datos creíbles y realistas para sus aplicaciones. En otras palabras: cómo llenar rápidamente su app de datos para que la pruebe o para hacer una demostración. ¡Prepárese!

Quién es quién

ChatGPT es una variante del modelo GPT (Generative Pre-trained Transformer) que ha sido afinado para la comprensión y la generación de lenguaje natural en un contexto conversacional. Está diseñado para entablar conversaciones textuales con los usuarios, ofreciendo respuestas de tipo humano y generando textos coherentes y contextualmente relevantes. ChatGPT puede utilizarse en una amplia gama de aplicaciones, como chatbots, asistentes virtuales, atención al cliente, etc., en las que es necesario interactuar con los usuarios a través del lenguaje natural.

La API OpenAI es la interfaz de programación que permite a los desarrolladores acceder y utilizar las capacidades de ChatGPT y otros modelos ofrecidos por OpenAI. Actúa como puente entre el modelo y las aplicaciones de los desarrolladores, permitiéndoles enviar mensajes de texto y recibir respuestas generadas por el modelo.

¿Qué me ofrece?

Al ser una API Rest, es bastante fácil utilizarla con 4D, y lo veremos a través de un interesante caso de uso. En efecto, supongamos que usted trabaja en una nueva aplicación. Usted diseña su estructura: clases de datos, atributos y relaciones. Usted diseña sus pantallas y transacciones, ya sea a través de pantallas de escritorio o de formularios web Qodly. ¿Qué falta ahora? Los datos, por supuesto.

No siempre tiene archivos csv o json listos para importar, ni tiempo para recopilar y limpiar un conjunto de datos relevante. Ahí es donde la IA puede ayudar. En esta prueba de concepto, le mostramos lo que podría ser un uso sencillo pero útil y práctico de la IA para usted, como desarrollador.

Imagínese que pudiera decir simplemente «deme nombres franceses» o «deme los comentarios típicos de hojas de tiempo» y que su base de datos se llenara en consecuencia. Vea el vídeo a continuación para ver más ejemplos sobre cómo producir datos útiles con una aplicación hecha con Qodly Studio.

¿Le pica la curiosidad? Puede obtener el código de la demo aquí (4D v20 R2 mínimo):

4D, Qodly y OpenAI

Siéntase libre de jugar con él, mejorarlo o adaptarlo a sus casos. ¡Y no olvide contribuir!

¿CÓMO FUNCIONA?

En realidad es bastante simple, nada del otro mundo.

Aparte de listar las clases de datos y sus atributos – lo cual es bastante común en la programación genérica 4D, el corazón de esta demo gira en torno a la consulta de la API de OpenAI.

Esto se hace en una clase de usuario dedicada, en una función llamada queryOpenAI().

Function queryOpenAI() : Text
  var $url : Text
  var $headers; $data; $opts : Object
  var $request : 4D.HTTPRequest
	
  $url:="https://api.openai.com/v1/chat/completions"
  $headers:=New object("Authorization"; "Bearer "+This.apiKey; "Content-Type"; "application/json")
	
  $data:={}
  $data.model:="gpt-3.5-turbo"
  $data.messages:=This.messages.copy()
  $data.messages.push({role: "user"; content: This.userPrompt})
	
  $opts:={method: "POST"; headers: $headers; body: $data}
	
  $request:=4D.HTTPRequest.new($url; $opts)
  $request.wait()
	
  This.fetchStatusCode:=$request.response.status
	
  If (This.fetchStatusCode=200)
    return $request.response.body.choices[0].message.content
  Else 
    return ""
  End if 

Si está acostumbrado a utilizar la clase 4D.HTTPRequest, esta función no tiene ningún secreto para usted (tenga en cuenta que tiene que utilizar su propia llave API después de registrarse). ¿Ningún secreto? Excepto por las propiedades This.messages y This.userPrompt, utilizadas para consultar OpenAI colocándolas en el cuerpo de la petición.

Pues bien, en estas dos propiedades es donde empieza a jugar su creatividad. De un vistazo al constructor de la clase para obtener la respuesta:

This.systemPrompt:="You are data generator. "
This.systemPrompt+="You will be provided with a description values to generate; and your task is to generate as many values as requested. "
This.systemPrompt+="Generated values must be separated by the character separator ¶. "
This.systemPrompt+="The list must start with 2 characters: ¶¶. "
This.systemPrompt+="The list must end with 2 characters: ¶¶. "
	
This.messages:=[]
This.messages.push({role: "system"; content: This.systemPrompt})
This.messages.push({role: "user"; content: "Generate a list of exactly 10 values for \"firstname\" of type Text."})
This.messages.push({role: "assistant"; content: "¶¶Alice¶Oliver¶Elsa¶Liam¶Maja¶Noah¶Ella¶Lucas¶Wilma¶Hugo¶¶"})
This.messages.push({role: "user"; content: "Generate a list of exactly 10 values for \"amount\" of type number."})
This.messages.push({role: "assistant"; content: "¶¶35¶64797¶101246¶3¶119¶4477¶647779¶357769¶94¶77¶¶"})
This.messages.push({role: "user"; content: "Generate a list of exactly 5 values for \"birthdate\" of type date."})
This.messages.push({role: "assistant"; content: "¶¶1980-10-05¶2035-05-02¶1995-12-15¶2022-10-14¶2011-05-23¶¶"})
	
This.userPrompt:="Generate a list of exactly "+String($quantity)+" values for \""+String($attributeName)+"\" of type "+This.attributeType+"."
This.userPrompt+=($remark#"") ? (" Remark: "+$remark) : ""
If ($attributeType="date")
  This.userPrompt+=". Date format: YYYY-MM-DD"
End if

Puede ver este conjunto de líneas como 3 partes:

  1. System prompt: aquí define el contexto, el panorama general. Señala al modelo la dirección en la que quiere que vaya. En este caso, escribo una especie de requisitos.
  2. Conversación preliminar: a continuación puede imitar una conversación entre el usuario (usted) y el asistente (la IA). No olvide que OpenAI no es «nada más» que un modelo generativo dedicado a proporcionar respuestas coherentes con su contexto. Escribiendo usted mismo el inicio de una conversación, aumenta sus posibilidades de obtener una respuesta estable. Aquí simulo 3 preguntas y respuestas, para aumentar mis posibilidades de obtener siempre una respuesta bien formateada, en la cantidad deseada.
  3. User prompt: esta es la pregunta real. Una réplica de las 3 preguntas simuladas anteriormente, pero esta vez el prompt se inicializa con lo que el usuario establece en la demo UI.

Como se ha descrito anteriormente, System prompt, conversación preliminar y User prompt se introducen en una colección $data y se envían como cuerpo de la HTTPRequest a OpenAI.

El resto es la clásica división de cadenas de caracteres.

Conclusiones

Viendo la demo y jugando con ella, se dará cuenta de que consultar a OpenAI puede tomar su tiempo. Puede consultar https://status.openai.com/ si sospecha que hay un tiempo de inactividad. Hay un aspecto que influye mucho en los tiempos de respuesta: la cantidad de tokens en la respuesta de la API. Cuanto más larga sea la respuesta, más lenta la recibirá. Pero en muchos casos, dejar que la máquina funcione, aunque sea un rato, es más rápido que recopilar, limpiar e importar un conjunto de datos relevante.

Hay margen de optimización para esta demostración, en muchos sentidos. La API de OpenAI ofrece un modo de streaming que podría mejorar su experiencia al permitir que la generación de registros en la base de datos comience mucho más rápido de lo que lo hace actualmente.

Esperamos que este ejemplo le sirva de inspiración. De un vistazo a la documentación de la API Open AI, está llena de funcionalidades interesantes y de otros casos de uso. ¡No dude en contribuir y enviarnos sugerencias!

Avatar
• Líder del equipo Producto 4D -Mathieu ingresó a 4D en 2020 como líder del equipo de productos. Su equipo está compuesto por Propietarios de producto, la voz de los usuarios de 4D. Trabajando mano a mano con el equipo de ingeniería, su papel implica la priorización, el alcance y la verificación de que las nuevas funcionalidades coincidan con las expectativas de los usuarios de 4D. Mathieu se desempeñó anteriormente como director de proyectos y gerente de equipo en varias divisiones de TI de industrias líderes - automotriz, seguridad, publicidad, especializado en contextos internacionales y servicios orientados a la nube.