Aumenta il 4D con OpenAI!

Tradotto automaticamente da Deepl

L’intelligenza artificiale sta rapidamente sconvolgendo la nostra vita quotidiana, non solo come sviluppatori. Molti di voi, se non tutti, hanno già sentito parlare di ChatGPT di OpenAI. Questo post riguarda un proof-of-concept realizzato con Qodly Studio, in un caso d’uso pratico: come utilizzare l’intelligenza artificiale per generare insiemi di dati credibili e realistici per le vostre app. In altre parole, come riempire rapidamente la vostra applicazione di dati per testarla o dimostrarla. Preparatevi!

Chi è chi

ChatGPT è una variante del modello GPT (Generative Pre-trained Transformer) che è stata messa a punto per la comprensione e la generazione di linguaggio naturale in un contesto di conversazione. È stato progettato per intraprendere conversazioni basate sul testo con gli utenti, fornendo risposte simili a quelle umane e generando testi coerenti e contestualmente rilevanti. ChatGPT può essere utilizzato per un’ampia gamma di applicazioni, tra cui chatbot, assistenti virtuali, assistenza clienti e altro, in cui è necessario interagire con gli utenti attraverso il linguaggio naturale.

OpenAI API è l’interfaccia di programmazione che consente agli sviluppatori di accedere e utilizzare le funzionalità di ChatGPT e di altri modelli forniti da OpenAI. Funge da ponte tra il modello e le applicazioni degli sviluppatori, consentendo loro di inviare richieste di testo e di ricevere risposte generate dal modello.

Cosa c’è dentro?

Essendo un’API Rest, è abbastanza facile utilizzarla con 4D e lo vedremo attraverso un interessante caso d’uso. Supponiamo di lavorare a una nuova applicazione. Si progetta la struttura: classi di dati, attributi e relazioni. Progettate le schermate e le transazioni, sia attraverso le schermate del desktop sia attraverso i webform di Qodly. Ora cosa manca? I dati, naturalmente!

Non sempre si hanno a disposizione file csv o json pronti da importare, né il tempo per raccogliere e pulire un insieme di dati rilevanti. È qui che l’intelligenza artificiale può essere d’aiuto. In questa prova di concetto, vi mostriamo quello che potrebbe essere un uso semplice ma utile e pratico dell’IA per voi, come sviluppatori.

Immaginate di poter semplicemente dire “dammi i nomi francesi” o “dammi i commenti tipici dei fogli di presenza” e di poter riempire il vostro database di conseguenza. Guardate il video qui sotto per vedere altri esempi su come produrre dati utili con un’applicazione realizzata con Qodly Studio.

Siete curiosi? È possibile ottenere il codice della demo qui (minimo 4D v20 R2):

4D, Qodly e OpenAI

Sentitevi liberi di giocarci, migliorarlo o adattarlo ai vostri casi. E non dimenticate di contribuire!

COME FUNZIONA?

In realtà è abbastanza semplice, niente di speciale.

Oltre a elencare le classi di dati e i loro attributi, cosa abbastanza comune nella programmazione generica 4D, il cuore di questa demo è l’interrogazione delle API di OpenAI.

Ciò avviene in una classe utente dedicata, in una funzione chiamata 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 

Se siete abituati a usare la classe 4D.HTTPRequest, questa funzione non ha segreti per voi (notate che dovete usare la vostra chiave API dopo la registrazione). Nessun segreto? Tranne che per le proprietà This.messages e This.userPrompt, utilizzate per interrogare OpenAI inserendole nel corpo della richiesta.

Entrambe le proprietà sono il punto di partenza della vostra creatività. Si dia un’occhiata al costruttore della classe per avere la risposta:

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

Questo insieme di righe è composto da tre parti:

  1. Richiesta del sistema: qui si imposta il contesto, il quadro generale. Si indica al modello la direzione in cui si vuole che vada. In questo caso, scrivo una sorta di requisiti.
  2. Conversazione preliminare: si può simulare una conversazione tra l’utente (voi) e l’assistente (l’IA). Non dimenticate che OpenAI non è altro che un modello generativo dedicato a fornire risposte coerenti con il contesto. Scrivendo voi stessi l’inizio di una discussione, aumentate le possibilità di ottenere una risposta stabile. Qui simulo 3 domande e risposte, per aumentare le possibilità di ottenere sempre una risposta ben formattata, nella quantità desiderata.
  3. Richiesta dell’utente: questa è la vera domanda. Una replica delle 3 domande simulate in precedenza, ma questa volta il prompt è inizializzato con quanto impostato dall’utente nell’interfaccia utente della demo.

Come descritto in precedenza, il prompt del sistema, la conversazione preliminare e il prompt dell’utente sono tutti inseriti in una raccolta $data e inviati come corpo della richiesta HTTPRequest a OpenAI.

Il resto è la classica suddivisione delle stringhe.

Aspetti positivi

Guardando la demo e giocando con essa, ci si rende conto che interrogare OpenAI può richiedere tempo. È possibile controllare https://status.openai.com/ se si sospetta un downtime. Un aspetto influisce molto sui tempi di risposta: la quantità di token nella risposta dell’API. Più lunga è la risposta, più lenta sarà la risposta. Ma in molti casi, lasciare che la macchina funzioni, anche per un po’, è più veloce che raccogliere, pulire e importare un set di dati rilevante.

C’è spazio per l’ottimizzazione di questa demo, in molti modi. OpenAI API offre una modalità di streaming che potrebbe migliorare l’esperienza, consentendo di avviare la generazione di record nel database molto più velocemente di quanto non avvenga attualmente.

Speriamo che questo esempio possa ispirarvi! Scoprite le API di riferimento di OpenAI: sono piene di funzioni interessanti e di altri casi d’uso. Non esitate a contribuire e a inviarci suggerimenti!

Avatar
• 4D Product Team Leader •Mathieu joined 4D in 2020 as Product Team Leader. His team is composed of Product Owners, the users voice of 4D. Working hand to hand with engineering team, their role involves prioritizing, scoping and verifying that new features will match 4D users expectations.Mathieu previously acted as projects director and team manager in various leading industries IT divisions - automotive, safety, advertising, specialized in international contexts and cloud oriented services.