Booster 4D avec OpenAI !

L’intelligence artificielle bouleverse rapidement notre vie quotidienne, et pas seulement en tant que développeurs. La plupart d’entre vous a déjà entendu parler de ChatGPT d’OpenAI. Ce post traite d’un proof of concept réalisé avec Qodly Studio, pour un cas d’utilisation pratique : comment utiliser l’IA pour générer des ensembles de données crédibles et réalistes pour vos applications. En d’autres termes : comment remplir rapidement votre application de données pour la tester ou en faire la démonstration. Préparez-vous !

Qui est qui

ChatGPT est une variante du modèle GPT (Generative Pre-trained Transformer) qui a été affiné pour la compréhension et la génération de langage naturel dans un contexte conversationnel. Il est conçu pour engager des conversations textuelles avec les utilisateurs, en fournissant des réponses de type humain et en générant des textes cohérents et pertinents sur le plan contextuel. ChatGPT peut être utilisé pour une large gamme d’applications, y compris les chatbots, les assistants virtuels, le support client, et plus encore, où l’interaction avec les utilisateurs par le biais du langage naturel est nécessaire.

L’API OpenAI est l’interface de programmation qui permet aux développeurs l’accès et l’utilisation des capacités de ChatGPT et d’autres modèles fournis par OpenAI. Elle sert de pont entre le modèle et les applications des développeurs, leur permettant d’envoyer des messages textes et de recevoir des réponses générées par le modèle.

Qu’est-ce que j’y gagne ?

S’agissant d’une API Rest, il est assez facile de l’utiliser avec 4D, et nous allons le voir à travers un cas d’utilisation intéressant. En effet, supposons que vous travailliez sur une toute nouvelle application. Vous concevez votre structure : classes de données, attributs et relations. Vous concevez vos écrans et vos transactions, soit par le biais d’écrans Desktop, soit par le biais de formulaires web Qodly. Que manque-t-il maintenant ? Les données, bien sûr !

Vous n’avez pas toujours de fichier csv ou json prêt à être importé, ni le temps de collecter et de nettoyer un ensemble de données pertinent. C’est là que l’IA peut vous aider. Dans ce proof of concept, nous vous montrons ce qui pourrait être une utilisation simple mais utile et pratique de l’IA pour vous, en tant que développeur.

Imaginez que vous puissiez simplement dire « donnez-moi les prénoms français » ou « donnez-moi les commentaires typiques des feuilles de temps » et que votre base de données soit remplie en conséquence. Regardez la vidéo ci-dessous pour voir d’autres exemples sur la façon de produire des données utiles avec une application réalisée avec Qodly Studio.

Curieux ? Vous pouvez obtenir le code de la démo ici (4D v20 R2 minimum) :

4D, Qodly et OpenAI

N’hésitez pas à jouer avec, à l’améliorer ou à l’adapter à vos cas. Et n’oubliez pas de contribuer !

COMMENT ÇA MARCHE ?

En fait, c’est très simple, rien d’extraordinaire.

En dehors de l’énumération des classes de données et de leurs attributs – ce qui est assez courant en programmation générique 4D, le cœur de cette démo bat autour de l’interrogation de l’API OpenAI.

Cela se fait dans une classe utilisateur dédiée, dans une fonction appelée 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 vous avez l’habitude d’utiliser la classe 4D.HTTPRequest, cette fonction n’a pas de secret pour vous (notez que vous devez utiliser votre propre clé API après vous être enregistré sur OpenAI). Pas de secret ? Sauf pour les propriétés This.messages et This.userPrompt, utilisées pour interroger OpenAI en les plaçant dans le corps de la requête.

C’est dans ces deux propriétés que votre créativité commence à jouer. Jetez un coup d’œil au constructeur de la classe pour obtenir la réponse :

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

Vous pouvez voir cet ensemble de lignes en 3 parties :

  1. System prompt: ici, vous définissez le contexte, la vue d’ensemble. Vous orientez le modèle dans la direction où vous voulez qu’il aille. Dans ce cas, je rédige une sorte de cahier des charges.
  2. Conversation préliminaire: vous pouvez alors imiter une conversation entre l’utilisateur (vous) et l’assistant (l’IA). N’oubliez pas qu’OpenAI n’est « rien de plus » qu’un modèle génératif destiné à fournir des réponses cohérentes avec leur contexte. En écrivant vous-même le début d’une discussion, vous augmentez vos chances d’obtenir une réponse stable. Je simule ici 3 questions et réponses, pour augmenter mes chances d’obtenir toujours une réponse bien formatée, dans la quantité souhaitée.
  3. User prompt: c’est la vraie question. Une réplique des 3 questions simulées précédemment, mais cette fois l’invite est initialisée avec ce que l’utilisateur a défini dans l’interface utilisateur de l’application de démonstration.

Comme décrit ci-dessus, System prompt, conversation préliminaire et User prompt sont toutes poussées dans une collection $data, et soumises en tant que corps du HTTPRequest à OpenAI.

La suite n’est que découpage classique de chaînes de caractères.

A retenir

En regardant la démo et en jouant avec elle, vous vous rendrez compte que l’interrogation d’OpenAI peut prendre du temps. Vous pouvez vérifier https://status.openai.com/ si vous suspectez un problème de disponibilité. Un aspect influe beaucoup sur les temps de réponse : la quantité de tokens dans la réponse de l’API. Plus les réponses sont longues, plus vous les obtiendrez lentement. Mais dans de nombreux cas, il est plus rapide de laisser tourner la machine, même pendant un certain temps, que de rassembler, de nettoyer et d’importer un ensemble de données pertinent.

Il est possible d’optimiser cette démo, à bien des égards. L’API OpenAI propose un mode de streaming qui pourrait améliorer votre expérience en permettant à la génération d’enregistrements dans la base de données de démarrer beaucoup plus rapidement qu’elle ne le fait actuellement.

Nous espérons que cet exemple vous inspirera ! Jetez un coup d’œil à la documentation de l’API OpenAI, elle est pleine de fonctionnalités intéressantes et d’autres cas d’utilisation. N’hésitez pas à contribuer et à nous envoyer vos suggestions !

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.