Génération de données synthétiques

Générer des données synthétiques à l'aide de générateurs aléatoires, d'algorithmes, de modèles statistiques et de grands modèles de langage (LLM) pour simuler des données réelles pour développer et tester efficacement des solutions.

Note :

La prise en charge de la génération de données synthétiques est disponible dans Oracle Database 19c à partir de la version 19.29 et dans Oracle AI Database 26ai à partir de la version 23.26.

Les données synthétiques peuvent être un outil puissant lors du développement et du test de solutions, en particulier lorsque les données réelles n'existent pas encore ou ne sont pas autorisées à être utilisées. Les données synthétiques, ou artificiellement générées, peuvent avoir de nombreuses caractéristiques des données réelles. Les données synthétiques sont généralement créées à l'aide de générateurs aléatoires, d'algorithmes ou de modèles statistiques pour simuler les caractéristiques et les distributions des données réelles. Cependant, cela peut être complexe à produire ou à s'appuyer sur des outils avec des caractéristiques de sophistication variable. Avec la disponibilité des grands modèles de langage (LLM), des données plus pertinentes et spécifiques au schéma peuvent être générées qui tiennent compte des caractéristiques exprimées en langage naturel.

Rubriques

Avantages de la génération de données synthétiques

La génération de données synthétiques permet d'alimenter les clones des métadonnées de base de données, prenant en charge les projets de développement, de test et d'apprentissage automatique sans utiliser les données sensibles des tables d'origine.

La génération de données synthétiques offre les avantages suivants :
  • Alimentation des clones de métadonnées à l'aide de données synthétiques : Un clone de métadonnées réplique la structure d'une base de données ou d'un schéma sans inclure les données réelles. Select AI permet la génération de données synthétiques pour alimenter ces clones, protégeant les données sensibles tout en permettant le développement, les tests et la création de modèles. Cette approche prend en charge les tests de performance et d'évolutivité.

  • Démarrage de nouveaux projets : Lors du démarrage d'un nouveau projet, il est possible que les données réelles ne soient pas disponibles. Les données synthétiques fournissent des échantillons réalistes pour aider à démontrer les concepts et à obtenir un soutien pour les propositions de projet.

  • Validation de l'expérience utilisateur : Les données synthétiques facilitent le test des interfaces utilisateur en fournissant divers jeux de données pour détecter les défauts de conception, les problèmes de performance et d'évolutivité.

  • Prise en charge des projets d'intelligence artificielle et d'apprentissage automatique : Les données synthétiques sont utiles pour l'entraînement des modèles d'intelligence artificielle et d'apprentissage automatique lorsque les données réelles sont indisponibles ou restreintes. Les LLM peuvent générer des données avec des modèles spécifiques pour faciliter l'entraînement et la notation des modèles.

Générer les données synthétiques

Utilisez la fonction DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA pour générer des données synthétiques et interroger les données à l'aide des actions Sélectionner l'intelligence artificielle.

Surveiller et dépanner la génération de données synthétiques

Lors de la génération de grandes quantités de données dans de nombreuses tables, Select AI fractionne les tâches de génération de données synthétiques en fragments plus petits et exécute les tâches en parallèle. Le statut de chaque fragment fait l'objet d'un suivi dans la table SYNTHETIC_DATA$<operation_id>_STATUS.

Les opérations de génération de données synthétiques sont enregistrées dans les tables DBA_LOAD_OPERATIONS et USER_LOAD_OPERATIONS. Utilisez ces tables pour surveiller l'opération DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA. Pour plus de détails, voir Suivre les opérations de chargement DBMS_CLOUD.

Après avoir exécuté la génération de données synthétiques dans une session donnée, vous pouvez obtenir la dernière version de <operation_id> à partir de USER_LOAD_OPERATION à l'aide des éléments suivants :
SELECT max(id) FROM user_load_operations;

Pour voir les opérations de données synthétiques exécutées dans une autre session, utilisez la vue DBA_LOAD_OPERATIONS.

Voir le statut de la génération de données synthétiques

La table d'état de l'opération de génération de données synthétiques indique la progression de chaque table et de sa tranche correspondante. La colonne STATUS_TABLE dans USER_LOAD_OPERATIONS ou DBA_LOAD_OPERATIONS affiche le nom de la table de statut. Le nom de la table est SYNTHETIC_DATA$<operation_id>_STATUS et comporte les colonnes suivantes :

Nom Type de données Description

ID

NUMBER

Identificateur unique de l'enregistrement.

NAME

VARCHAR2

Nom qualifié de la table, par exemple "ADB_USER"."EMPLOYEES"

BYTES

NUMBER

Nombre d'enregistrements souhaité pour cette tâche de génération de données.

ROWS_LOADED

NUMBER

Nombre réel d'enregistrements générés.

CHECKSUM

VARCHAR2

Valeur de départ de la clé primaire lors de cette tâche de génération de données.

LAST_MODIFIED

TIMESTAMP WITH TIME ZONE

Horodatage indiquant la date de la dernière modification de l'enregistrement.

STATUS

VARCHAR2

Statut de la tâche de génération de données. Les valeurs possibles sont :
  • COMPLETED
  • FAILED
  • PENDING
  • SKIPPED

ERROR_CODE

NUMBER

Code d'erreur, si la tâche de génération de données échoue.

ERROR_MESSAGE

VARCHAR2

Message d'erreur fourni si la tâche échoue.

END_TIME

TIMESTAMP WITH TIME ZONE

Horodatage marquant la fin de la tâche de génération de données.
Exemple : Vérifiez le nombre d'enregistrements générés pour chaque table

Pour vérifier le nombre d'enregistrements générés pour chaque table, procédez comme suit :

SELECT name, SUM(rows_loaded) FROM synthetic_data$<operation_id>_status group by name;

Interrogez ROWS_LOADED pour confirmer le nombre de rangées chargées pour chaque fragment et SUM(ROWS_LOADED) pour les rangées de chaque table.

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner": "ADB_USER", "name": "DIRECTOR","record_count":150},
                         {"owner": "ADB_USER", "name": "MOVIE_ACTOR","record_count":300},
                         {"owner": "ADB_USER", "name": "CLASSES", "user_prompt":"all in fall semester","record_count":5},
                         {"owner": "ADB_USER", "name": "ACTOR","record_count":220},
                         {"owner": "ADB_USER", "name": "MOVIE","record_count":50}]'
    );
END;
/
 
 
-- Check loaded rows for each chunk
SQL> SELECT name, rows_loaded FROM synthetic_data$141_status order by name;
NAME                           ROWS_LOADED
------------------------------------------
"ADB_USER"."ACTOR"                        188
"ADB_USER"."ACTOR"                         32
"ADB_USER"."CLASSES"                        5
"ADB_USER"."DIRECTOR"                     150
"ADB_USER"."MOVIE"                         50
"ADB_USER"."MOVIE_ACTOR"                   38
"ADB_USER"."MOVIE_ACTOR"                  114
"ADB_USER"."MOVIE_ACTOR"                  148
 
 
 
-- Check loaded rows for each table
SQL> SELECT name, SUM(rows_loaded) FROM synthetic_data$141_status group by name;
 
NAME                      SUM(ROWS_LOADED)
------------------------------------------
"ADB_USER"."DIRECTOR"                     150
"ADB_USER"."MOVIE_ACTOR"                  300
"ADB_USER"."CLASSES"                        5
"ADB_USER"."ACTOR"                        220
"ADB_USER"."MOVIE"                         50

Exemple : Générer des données synthétiques

Cet exemple montre comment générer des données synthétiques imitant les caractéristiques et la distribution des données réelles.

Note :

La prise en charge de la génération de données synthétiques est disponible dans Oracle Database 19c à partir de la version 19.29 et dans Oracle Database 26ai à partir de la version 23.26.

L'exemple suivant montre comment créer quelques tables dans votre schéma, utiliser l'IA générative pour OCI comme fournisseur d'IA pour créer un profil d'IA, synthétiser des données dans ces tables à l'aide de la fonction DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA et interroger ou générer des réponses aux invites de langage naturel avec Select AI.

--Create tables or use cloned tables

CREATE TABLE ADB_USER.Director (
    director_id     INT PRIMARY KEY,
    name            VARCHAR(100)
);
CREATE TABLE ADB_USER.Movie (
    movie_id        INT PRIMARY KEY,
    title           VARCHAR(100),
    release_date    DATE,
    genre           VARCHAR(50),
    director_id     INT,
    FOREIGN KEY (director_id) REFERENCES ADB_USER.Director(director_id)
);
CREATE TABLE ADB_USER.Actor (
    actor_id        INT PRIMARY KEY,
    name            VARCHAR(100)
);
CREATE TABLE ADB_USER.Movie_Actor (
    movie_id        INT,
    actor_id        INT,
    PRIMARY KEY (movie_id, actor_id),
    FOREIGN KEY (movie_id) REFERENCES ADB_USER.Movie(movie_id),
    FOREIGN KEY (actor_id) REFERENCES ADB_USER.Actor(actor_id)
);

-- Create the GenAI credential
BEGIN                                                                       
  DBMS_CLOUD.create_credential(                                             
    credential_name => 'GENAI_CRED',                                        
    user_ocid       => 'ocid1.user.oc1....',
    tenancy_ocid    => 'ocid1.tenancy.oc1....',
    private_key     => 'vZ6cO...',
    fingerprint     => '86:7d:...'    
  );                                                                        
END;                                                                       
/
 
-- Create a profile
BEGIN                                                                      
  DBMS_CLOUD_AI.CREATE_PROFILE(                                            
      profile_name =>'GENAI',                                                           
      attributes  =>'{"provider": "oci",                                                                 
        "credential_name": "GENAI_CRED",                                   
        "object_list": [{"owner": "ADB_USER", 
		"oci_compartment_id": "ocid1.compartment.oc1...."}]          
       }');                                                                
END;                                                                       
/
 
 
EXEC DBMS_CLOUD_AI.set_profile('GENAI');

-- Run the API for single table
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_name  => 'Director',
        owner_name   => 'ADB_USER',
        record_count => 5
    );
END;
/
PL/SQL procedure successfully completed.
 
 
-- Query the table to see results
SQL> SELECT * FROM ADB_USER.Director;
 
DIRECTOR_ID NAME
----------- ----------------------------------------------------------------------------------------------------
          1 John Smith
          2 Emily Chen
          3 Michael Brown
          4 Sarah Taylor
          5 David Lee
 
 
-- Or ask select ai to show the results
SQL> select ai how many directors are there;
 
NUMBER_OF_DIRECTORS
-------------------
                  5
Exemple : Générer des données synthétiques pour plusieurs tables

Après avoir créé et défini votre profil de fournisseur d'intelligence artificielle, utilisez DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA pour générer des données pour plusieurs tables. Vous pouvez interroger ou utiliser Select AI pour répondre aux invites en langage naturel.

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner": "ADB_USER", "name": "Director","record_count":5},
                         {"owner": "ADB_USER", "name": "Movie_Actor","record_count":5},
                         {"owner": "ADB_USER", "name": "Actor","record_count":10},
                         {"owner": "ADB_USER", "name": "Movie","record_count":5,"user_prompt":"all movies released in 2009"}]'
    );
END;
/
PL/SQL procedure successfully completed.
 
 
-- Query the table to see results
SQL> select * from ADB_USER.Movie;

 MOVIE_ID TITLE                                                     RELEASE_D                            GENRE                                 DIRECTOR_ID	
---------- -------------------------------------------------------- --------- --------------------------------------------------------------- -----------	
         1 The Dark Knight                                           15-JUL-09                              Action                              8	
         2 Inglourious Basterds                                      21-AUG-09                              War                                 3	
         3 Up in the Air                                             04-SEP-09                              Drama                               6	
         4 The Hangover                                              05-JUN-09                              Comedy                              1	
         5 District 9                                                14-AUG-09                              Science Fiction                     10	
	

 
-- Or ask select ai to show the results
SQL> select ai how many actors are there;
 
Number of Actors
----------------
              10
Exemple : Guider la génération de données synthétiques avec des exemples de rangées

Pour guider le service d'intelligence artificielle dans la génération de données synthétiques, vous pouvez sélectionner au hasard des enregistrements existants dans une table. Par exemple, en ajoutant {"sample_rows": 5} à l'argument params, vous pouvez envoyer 5 exemples de rangées d'une table au fournisseur d'intelligence artificielle. Cet exemple génère 10 rangées supplémentaires en fonction des exemples de rangées de la table Transactions.

BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name => 'GENAI',
    object_name  => 'Transactions',
    owner_name   => 'ADB_USER',
    record_count => 10,
    params       => '{"sample_rows":5}'
  );
END;
/
Exemple : Personnaliser la génération de données synthétiques à l'aide d'invites d'utilisateur

L'argument user_prompt vous permet de spécifier des règles ou des exigences supplémentaires pour la génération de données. Cela peut être appliqué à une seule table ou dans le cadre de l'argument object_list pour plusieurs tables. Par exemple, dans les appels suivants à DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA, l'invite indique à l'IA de générer des données synthétiques sur les films sortis en 2009.

-- Definition for the Movie table CREATE TABLE Movie 

CREATE TABLE Movie (
    movie_id        INT PRIMARY KEY,
    title           VARCHAR(100),
    release_date    DATE,
    genre           VARCHAR(50),
    director_id     INT,
    FOREIGN KEY (director_id) REFERENCES Director(director_id)
);
 
 
 
BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name      => 'GENAI',
    object_name       => 'Movie',
    owner_name        => 'ADB_USER',
    record_count      => 10,
    user_prompt       => 'all movies are released in 2009',
    params            => '{"sample_rows":5}'
  );
END;
/
 
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner": "ADB_USER", "name": "Director","record_count":5},
                         {"owner": "ADB_USER", "name": "Movie_Actor","record_count":5},
                         {"owner": "ADB_USER", "name": "Actor","record_count":10},
                         {"owner": "ADB_USER", "name": "Movie","record_count":5,"user_prompt":"all movies are released in 2009"}]'
    );
END;
/
Exemple : Améliorer la qualité des données synthétiques à l'aide de statistiques sur les tables

Si une table contient des statistiques sur les colonnes ou est clonée à partir d'une base de données qui inclut des métadonnées, Select AI peut utiliser ces statistiques pour générer des données qui ressemblent ou qui sont cohérentes avec les données d'origine.

Pour les colonnes NUMBER, les valeurs supérieure et inférieure des statistiques guident l'intervalle de valeurs. Par exemple, si la colonne SALARY de la table EMPLOYEES initiale est comprise entre 1000 et 10000, les données synthétiques de cette colonne seront également comprises dans cet intervalle.

Pour les colonnes avec des valeurs distinctes, telles qu'une colonne STATE avec les valeurs CA, WA et TX, les données synthétiques utiliseront ces valeurs spécifiques. Vous pouvez gérer cette fonction à l'aide du paramètre {"table_statistics": true/false}. Par défaut, les statistiques de table sont activées.

BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name      => 'GENAI',
    object_name       => 'Movie',
    owner_name        => 'ADB_USER',
    record_count      => 10,
    user_prompt => 'all movies released in 2009',
    params            => '{"sample_rows":5,"table_statistics":true}'
  );
END;
/
Exemple : Utiliser des commentaires de colonne pour guider la génération de données

Si des commentaires de colonne existent, Select AI les inclut automatiquement pour fournir des informations supplémentaires pour le LLM lors de la génération des données. Par exemple, un commentaire sur la colonne Status dans une table de transactions peut répertorier les valeurs autorisées telles que successful, failed, pending, canceled et need manual check. Vous pouvez également ajouter des commentaires pour expliquer davantage la colonne, en donnant aux services d'IA des instructions ou des conseils plus précis pour générer des données précises. Par défaut, les commentaires sont désactivés. Pour plus de détails, voir Paramètres facultatifs.

-- Use comment on column
COMMENT ON COLUMN Transaction.status IS 'the value for state should either be ''successful'', ''failed'', ''pending'' or ''canceled''';
/
 
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name  => 'GENAI',
        object_name   => 'employees',
        owner_name    => 'ADB_USER',
        record_count  => 10
        params        => '{"comments":true}'
 
    );
END;
/
Exemple : Définir des valeurs uniques dans la génération de données synthétiques

Lors de la génération de grandes quantités de données synthétiques avec des LLM, des valeurs en double sont susceptibles de se produire. Pour éviter cela, configurez une contrainte unique sur la colonne concernée. Cela garantit que Select AI ignore les rangées contenant des valeurs en double dans la réponse LLM. En outre, pour restreindre les valeurs de certaines colonnes, vous pouvez utiliser user_prompt ou ajouter des commentaires pour spécifier les valeurs autorisées, par exemple en limitant une colonne STATE à CA, WA et TX.

-- Use 'user_prompt'
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name  => 'GENAI',
        object_name   => 'employees',
        owner_name    => 'ADB_USER',
        user_prompt   => 'the value for state should either be CA, WA, or TX',
        record_count  => 10
    );
END;
/
 
 
-- Use comment on column
COMMENT ON COLUMN EMPLOYEES.state IS 'the value for state should either be CA, WA, or TX'
/
Exemple : Améliorer la génération de données synthétiques par traitement parallèle

Pour réduire le temps d'exécution, Select AI fractionne les tâches de génération de données synthétiques en fragments plus petits pour les tables sans clés primaires ou avec des clés primaires numériques. Ces tâches s'exécutent en parallèle, interagissant avec le fournisseur d'IA pour générer des données plus efficacement. Le degré de parallélisme (DOP) dans votre base de données, influencé par votre niveau de service Autonomous AI Database on Dedicated Exadata et les paramètres d'ECPU ou d'OCPU, détermine le nombre d'enregistrements que chaque processus de fragmentation traite. L'exécution de tâches en parallèle améliore généralement les performances, en particulier lors de la génération de grandes quantités de données dans de nombreuses tables. Pour gérer le traitement parallèle de la génération de données synthétiques, définissez priority comme paramètre facultatif. Voir Paramètres facultatifs.

Exemple : Activer ou désactiver l'accès aux données

Cet exemple montre comment les administrateurs peuvent contrôler l'accès aux données et empêcher Select AI d'envoyer des tables de schéma réelles au LLM.

Désactivation de l'accès aux données

Pour restreindre l'accès aux tables de schéma, connectez-vous en tant qu'administrateur et exécutez la procédure suivante.

EXEC DBMS_CLOUD_AI.DISABLE_DATA_ACCESS;
 
PL/SQL procedure successfully completed.

Désactivation des limites d'accès aux données Sélectionnez l'action narrate de l'intelligence artificielle et la génération de données synthétiques. L'action narrate et la génération de données synthétiques génèrent une erreur.

Connectez-vous en tant qu'utilisateur de base de données, créez et configurez votre profil d'intelligence artificielle. Consultez Utilisez DBMS_CLOUD_AI pour configurer les profils d'intelligence artificielle pour configurer votre profil d'intelligence artificielle.

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
          profile_name =>'DATA_ACCESS',
          attributes   =>'{"provider": "openai",
            "credential_name": "OPENAI_CRED",
            "object_list": [{"owner":"SH"}]
          }');
END;
/

EXEC DBMS_CLOUD_AI.SET_PROFILE('DATA_ACCESS');
 

select ai how many customers;

NUM_CUSTOMERS
55500

select ai narrate what are the top 3 customers in San Francisco;

ORA-20000: Data access is disabled for SELECT AI.
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 2228
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 13157
ORA-06512: at line 1 https://docs.oracle.com/error-help/db/ora-20000/
The stored procedure 'raise_application_error' was called which causes this error to be generated
Error at Line: 1 Column: 6

L'exemple suivant montre les erreurs qui sont déclenchées lorsque vous tentez de générer des données synthétiques.

BEGIN
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
profile_name => 'DATA_ACCESS_SDG',
object_name => 'CUSTOMERS_NEW',
owner_name => 'ADB_USER,
record_count => 5
);
END;
/ 

ERROR at line 1:

ORA-20000: Data access is disabled for SELECT AI.
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 2228
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 13401

ORA-06512: at line 2
Activation de l'accès aux données

L'exemple suivant illustre l'activation de l'accès aux données. Connectez-vous en tant qu'administrateur et exécutez la procédure suivante :

EXEC DBMS_CLOUD_AI.ENABLE_DATA_ACCESS;
 
PL/SQL procedure successfully completed.

Connectez-vous en tant qu'utilisateur de base de données, créez et configurez votre profil d'intelligence artificielle. Consultez Utilisez DBMS_CLOUD_AI pour configurer les profils d'intelligence artificielle pour configurer votre profil d'intelligence artificielle.

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
          profile_name =>'DATA_ACCESS_NEW',
          attributes   =>'{"provider": "openai",
            "credential_name": "OPENAI_CRED",
            "object_list": [{"owner":"SH"}]
          }');
   END;
   /

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI.SET_PROFILE('DATA_ACCESS_NEW');

PL/SQL procedure successfully completed.


select ai how many customers;

NUM_CUSTOMERS
55500

select ai narrate what are the top 3 customers in San Francisco;

"RESPONSE"
"The top 3 customers in San Francisco are Cody Seto, Lauren Yaskovich, and Ian Mc"

L'exemple suivant montre une génération de données synthétiques réussie après l'activation de l'accès aux données.

BEGIN
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
profile_name => 'DATA_ACCESS_SDG',
object_name => 'CUSTOMERS_NEW',
owner_name => 'ADB_USER',
record_count => 5
);
END;
/ 

PL/SQL procedure successfully completed.