Article
· Mars 12 6m de lecture

Générer des données de test à l'aide de Gemini

Nous savons tous qu'il est crucial de disposer d'un ensemble de données de test appropriées avant de déployer une application en production pour garantir sa fiabilité et ses performances. Il permet de simuler des scénarios du monde réel et d'identifier les problèmes ou bugs potentiels avant qu'ils n'impactent les utilisateurs finaux. De plus, les tests avec des ensembles de données représentatifs permettent d’optimiser les performances, d’identifier les goulots d’étranglement et d’affiner les algorithmes ou les processus selon les besoins. En fin de compte, disposer d’un ensemble complet de données de test permet de fournir un produit de meilleure qualité, réduisant ainsi le risque de problèmes de post-production et améliorant l’expérience utilisateur globale.

Dans cet article, voyons comment utiliser l'IA générative, par example Gemini de Google, pour générer des données significatives sur les propriétés de plusieurs objets. Pour ce faire, j'utiliserai le service RESTful pour générer des données au format JSON puis j'utiliserai les données reçues pour créer des objets.

Cela conduit à une question évidente : pourquoi ne pas utiliser les méthodes de %Library.PopulateUtils pour générer toutes les données ? Eh bien, la réponse est également assez évidente si vous avez vu la liste des méthodes de la classe : il n'y a pas beaucoup de méthodes qui génèrent des données significatives.

Alors, allons-y.

Étant donné que j'utiliserai l'API Gemini, je devrai d'abord générer la clé API, car je ne l'ai pas au préalable. Pour ce faire, ouvrez simplement aistudio.google.com/app/apikey et cliquez sur Create API key

et créez une clé API

Une fois cela fait, il vous suffit d'écrire un client REST pour obtenir et transformer les données et de proposer une chaîne de requête à une IA Gemini. Facile 😁

Pour faciliter cet exemple, travaillons avec la classe simple

Class Restaurant.Dish Extends (%Persistent, %JSON.Adaptor)
{
Property Name As %String;
Property Description As %String(MAXLEN = 1000);
Property Category As %String;
Property Price As %Float;
Property Currency As %String;
Property Calories As %Integer;
}

En général, il serait très simple d'utiliser le mécanisme %Library.Populate intégré et d'en finir avec lui. Mais dans les projets plus importants, vous obtiendrez de nombreuses propriétés qui ne seront pas automatiquement renseignées automatiquement avec des données significatives.

Quoi qu'il en soit, maintenant que nous avons le cours, réfléchissons à la formulation d'une requête adressée aux Gémeaux. Disons que nous écrivons la requête suivante :

{"contents": [{
    "parts":[{
      "text": "Write a json object that contains a field Dish which is an array of 10 elements. Each element contains Name, Description, Category, Price, Currency, Calories of the Restaurant Dish."}]}]}

Si nous envoyons cette requête à https://generativelingual.googleapis.com/v1beta/models/gemini-pro:generateContent?key=APIKEY, nous obtiendrons quelque chose comme :

 
Spoiler

Déjà pas mal. Pas mal du tout! Maintenant que j'ai le libellé de ma requête, je dois la générer le plus automatiquement possible, l'envyer et traiter le résultat.

Étape suivante : générer la requête. En utilisant l'article très utile sur la façon d'obtenir la liste des propriétés d'une classe, nous pouvons générer automatiquement la plupart de la requête.

ClassMethod GenerateClassDesc(classname As %String) As %String
{
    set cls=##class(%Dictionary.CompiledClass).%OpenId(classname,,.status)
    set x=cls.Properties
    set profprop = $lb()
    for i=3:1:x.Count() {
        set prop=x.GetAt(i)
        set $list(profprop, i-2) = prop.Name        
    }
    quit $listtostring(profprop, ", ")
}

ClassMethod GenerateQuery(qty As %Numeric) As %String [ Language = objectscript ]
{
    set classname = ..%ClassName(1)
    set str = "Write a json object that contains a field "_$piece(classname, ".", 2)_
        " which is an array of "_qty_" elements. Each element contains "_
        ..GenerateClassDesc(classname)_" of a "_$translate(classname, ".", " ")_". "
    quit str
}

Lorsqu'il s'agit de relations complexes entre classes, il peut être plus facile d'utiliser le constructeur d'objet pour relier différents objets entre eux ou d'utiliser un mécanisme intégré de %Library.Ppulate.

L'étape suivante consiste à appeler le service Gemini RESTful et à traiter le JSON résultant.

ClassMethod CallService() As %String
{
 Set request = ..GetLink()
 set query = "{""contents"": [{""parts"":[{""text"": """_..GenerateQuery(20)_"""}]}]}"
 do request.EntityBody.Write(query)
 set request.ContentType = "application/json"
 set sc = request.Post("v1beta/models/gemini-pro:generateContent?key=<YOUR KEY HERE>")
 if $$$ISOK(sc) {
 	Set response = request.HttpResponse.Data.Read()	 
 	set p = ##class(%DynamicObject).%FromJSON(response)
 	set iter = p.candidates.%GetIterator()
 	do iter.%GetNext(.key, .value, .type ) 
 	set iter = value.content.parts.%GetIterator()
 	do iter.%GetNext(.key, .value, .type )
 	write $Extract(value.text,8,*-3), !
 	set obj = ##class(%DynamicObject).%FromJSON($Extract(value.text,8,*-3))
    
    set dishes = obj.Dish
    set iter = dishes.%GetIterator()
    while iter.%GetNext(.key, .value, .type ) {
        set dish = ##class(Restaurant.Dish).%New()
        set sc = dish.%JSONImport(value.%ToJSON())
        set sc = dish.%Save()
    }    
 }
}

Bien sûr, puisqu'il ne s'agit que d'un exemple, n'oubliez pas d'ajouter des vérifications de status ou nécessaire.

Maintenant, lorsque je l'exécute, j'obtiens un résultat assez impressionnant dans ma base de données. Exécutons une requête SQL pour afficher les données.

La description et la catégorie correspondent au nom du plat. De plus, les prix et les calories semblent également corrects. Ce qui signifie que j’obtiens en fait une base de données remplie de données raisonnablement réelles. Et les résultats des requêtes que je vais exécuter vont ressembler aux résultats réels aussi.

Bien entendu, un énorme inconvénient de cette approche est la nécessité d’écrire une requête dans une IA générative et le fait que la génération du résultat prend du temps. Mais les données réelles en valent peut-être la peine. Quoi qu'il en soit, c'est à vous de décider 😉

P.S. La première image montre comment Gemini imagine "l'IA qui écrit un programme pour créer des données de test" 😆

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer