Generazione dati sintetici

Genera dati sintetici utilizzando generatori casuali, algoritmi, modelli statistici e LLM (Large Language Models) per simulare dati reali per sviluppare e testare soluzioni in modo efficace.

Nota

Il supporto per Synthetic Data Generation è disponibile in Oracle Database 19c a partire dalla versione 19.29 e in Oracle AI Database 26ai a partire dalla versione 23.26.

I dati sintetici possono essere uno strumento potente quando si sviluppano e si testano soluzioni, soprattutto quando i dati effettivi non esistono ancora o non possono essere utilizzati. I dati sintetici, o generati artificialmente, possono avere molte delle caratteristiche dei dati reali. I dati sintetici vengono in genere creati utilizzando generatori casuali, algoritmi o modelli statistici per simulare le caratteristiche e le distribuzioni di dati reali. Tuttavia, questo può essere complesso per produrre o fare affidamento su strumenti con caratteristiche di varia sofisticazione. Con la disponibilità di modelli linguistici di grandi dimensioni (LLM), possono essere generati dati più pertinenti e specifici dello schema che considerano le caratteristiche espresse in linguaggio naturale.

Argomenti

Vantaggi della generazione di dati sintetici

La generazione di dati sintetici consente di popolare le copie dei metadati del database, supportando progetti di sviluppo, test e machine learning senza utilizzare dati sensibili dalle tabelle originali.

Synthetic Data Generation offre i seguenti vantaggi:
  • Popolamento delle copie dei metadati con dati sintetici: una copia dei metadati replica la struttura di un database o di uno schema senza includere i dati effettivi. Select AI consente alla generazione di dati sintetici di popolare queste copie, proteggendo i dati sensibili abilitando allo stesso tempo lo sviluppo, il test e la creazione di modelli. Questo approccio supporta il test delle prestazioni e della scalabilità.

  • Avvio di nuovi progetti: quando si avvia un nuovo progetto, i dati effettivi potrebbero non essere disponibili. I dati sintetici forniscono campioni realistici per aiutare a dimostrare concetti e ottenere supporto per le proposte di progetto.

  • Convalida dell'esperienza utente: i dati sintetici aiutano a testare le interfacce utente fornendo set di dati diversi per scoprire difetti di progettazione, prestazioni e problemi di scalabilità.

  • Supporto di progetti di intelligenza artificiale e machine learning: i dati sintetici sono utili per addestrare i modelli di intelligenza artificiale e machine learning quando i dati reali non sono disponibili o sono limitati. Gli LLM possono generare dati con pattern specifici per facilitare l'addestramento e il punteggio dei modelli.

Genera dati sintetici

Utilizzare la funzione DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA per generare dati sintetici ed eseguire query sui dati utilizzando le azioni Seleziona AI.

Monitoraggio e risoluzione dei problemi della generazione di dati sintetici

Quando si generano grandi quantità di dati in molte tabelle, Select AI suddivide i task di generazione dei dati sintetici in chunk più piccoli ed esegue i task in parallelo. Lo stato di ogni chunk viene tracciato nella tabella SYNTHETIC_DATA$<operation_id>_STATUS.

Le operazioni di generazione dei dati sintetici vengono registrate nelle tabelle DBA_LOAD_OPERATIONS e USER_LOAD_OPERATIONS. Utilizzare queste tabelle per monitorare l'operazione DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA. Per ulteriori dettagli, vedere Traccia operazioni di caricamento DBMS_CLOUD.

Dopo aver eseguito la generazione di dati sintetici in una determinata sessione, è possibile ottenere la versione più recente di <operation_id> da USER_LOAD_OPERATION utilizzando quanto riportato di seguito.
SELECT max(id) FROM user_load_operations;

Per visualizzare le operazioni dei dati sintetici in esecuzione in una sessione diversa, utilizzare la vista DBA_LOAD_OPERATIONS.

Visualizza stato generazione dati sintetici

La tabella di stato dell'operazione di generazione dei dati sintetici mostra l'avanzamento di ogni tabella e il relativo chunk corrispondente. La colonna STATUS_TABLE in USER_LOAD_OPERATIONS o DBA_LOAD_OPERATIONS mostra il nome della tabella di stato. Il nome della tabella è SYNTHETIC_DATA$<operation_id>_STATUS e contiene le colonne seguenti:

Nome Tipo di dati Descrizione

ID

NUMBER

Identificativo univoco del record.

NAME

VARCHAR2

Nome qualificato della tabella, ad esempio "ADB_USER"."EMPLOYEES"

BYTES

NUMBER

Numero di record desiderato per questo task di generazione dati

ROWS_LOADED

NUMBER

Numero effettivo di record generati.

CHECKSUM

VARCHAR2

Valore iniziale per la chiave primaria durante questo task di generazione dati.

LAST_MODIFIED

TIMESTAMP WITH TIME ZONE

Indicatore orario che indica l'ultima modifica del record.

STATUS

VARCHAR2

Stato del task di generazione dati. I valori validi sono:
  • COMPLETED
  • FAILED
  • PENDING
  • SKIPPED

ERROR_CODE

NUMBER

Codice di errore, se il task di generazione dati non riesce.

ERROR_MESSAGE

VARCHAR2

Messaggio di errore fornito se il task non riesce.

END_TIME

TIMESTAMP WITH TIME ZONE

Indicatore orario che contrassegna la fine del task di generazione dati.
Esempio: controllo del numero di record generati per ogni tabella

Per controllare il numero di record generati per ogni tabella, effettuare le operazioni riportate di seguito.

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

Eseguire una query ROWS_LOADED per confermare il numero di righe caricate per ogni chunk e SUM(ROWS_LOADED) per le righe per ogni tabella.

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

Esempio: Genera dati sintetici

In questo esempio viene illustrato come generare dati sintetici che imitano le caratteristiche e la distribuzione dei dati reali.

Nota

Il supporto per Synthetic Data Generation è disponibile in Oracle Database 19c a partire dalla versione 19.29 e in Oracle Database 26ai a partire dalla versione 23.26.

L'esempio riportato di seguito mostra come creare alcune tabelle nello schema, utilizzare OCI Generative AI come provider AI per creare un profilo AI, sintetizzare i dati in tali tabelle utilizzando la funzione DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA ed eseguire query o generare risposte AI prompt in linguaggio naturale con 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
Esempio: generazione di dati sintetici per più tabelle

Dopo aver creato e impostato il profilo del provider AI, utilizzare DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA per generare dati per più tabelle. È possibile eseguire una query o utilizzare Seleziona intelligenza artificiale per rispondere AI prompt in linguaggio naturale.

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
Esempio: generazione di dati sintetici guida con righe campione

Per guidare il servizio AI nella generazione di dati sintetici, è possibile selezionare casualmente i record esistenti da una tabella. Ad esempio, aggiungendo {"sample_rows": 5} all'argomento params, è possibile inviare 5 righe di esempio da una tabella al provider AI. In questo esempio vengono generate 10 righe aggiuntive in base alle righe di esempio della tabella 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;
/
Esempio: personalizzazione della generazione di dati sintetici con i prompt utente

L'argomento user_prompt consente di specificare regole o requisiti aggiuntivi per la generazione dei dati. Questo può essere applicato a una singola tabella o come parte dell'argomento object_list per più tabelle. Ad esempio, nelle chiamate seguenti a DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA, il prompt indica all'intelligenza artificiale di generare dati sintetici sui filmati rilasciati nel 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;
/
Esempio: miglioramento della qualità dei dati sintetici mediante le statistiche delle tabelle

Se una tabella contiene statistiche di colonna o è duplicata da un database che include metadati, Select AI può utilizzare queste statistiche per generare dati che assomigliano o sono coerenti con i dati originali.

Per le colonne NUMBER, i valori massimo e minimo delle statistiche determinano l'intervallo di valori. Ad esempio, se la colonna SALARY nella tabella EMPLOYEES originale è compresa tra 1000 e 10000, anche i dati sintetici per questa colonna rientrano in questo intervallo.

Per le colonne con valori distinti, ad esempio una colonna STATE con valori CA, WA e TX, i dati sintetici utilizzeranno questi valori specifici. È possibile gestire questa funzione utilizzando il parametro {"table_statistics": true/false}. Per impostazione predefinita, le statistiche della tabella sono abilitate.

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;
/
Esempio: usa commenti colonna per generazione dati guida

Se esistono commenti di colonna, la funzione Seleziona AI li include automaticamente per fornire informazioni aggiuntive per l'LLM durante la generazione dei dati. Ad esempio, un commento sulla colonna Status in una tabella Transazione potrebbe elencare valori consentiti quali successful, failed, pending, canceled e need manual check. È inoltre possibile aggiungere commenti per spiegare ulteriormente la colonna, fornendo AI servizi AI istruzioni o suggerimenti più precisi per la generazione di dati accurati. Per impostazione predefinita, i commenti sono disabilitati. Per ulteriori informazioni, vedere Parametri facoltativi.

-- 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;
/
Esempio: impostazione di valori univoci nella generazione di dati sintetici

Quando si generano grandi quantità di dati sintetici con LLM, è probabile che si verifichino valori duplicati. Per evitare questo problema, impostare un vincolo univoco sulla colonna pertinente. Ciò garantisce che Select AI ignori le righe con valori duplicati nella risposta LLM. Inoltre, per limitare i valori per determinate colonne, è possibile utilizzare user_prompt o aggiungere commenti per specificare i valori consentiti, ad esempio la limitazione di una colonna STATE a CA, WA e 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'
/
Esempio: miglioramento della generazione di dati sintetici mediante elaborazione parallela

Per ridurre il runtime, Select AI suddivide i task di generazione dei dati sintetici in chunk più piccoli per le tabelle senza chiavi primarie o con chiavi primarie numeriche. Queste attività vengono eseguite in parallelo, interagendo con il provider AI per generare dati in modo più efficiente. Il livello di parallelismo (DOP) nel database, influenzato dal livello di servizio Autonomous AI Database on Dedicated Exadata Infrastructure e dalle impostazioni ECPU o OCPU, determina il numero di record di ogni processo chunk. L'esecuzione di attività in parallelo in genere migliora le prestazioni, soprattutto quando si generano grandi quantità di dati in molte tabelle. Per gestire l'elaborazione parallela della generazione di dati sintetici, impostare priority come parametro facoltativo. Vedere Parametri facoltativi.

Esempio: abilitare o disabilitare l'accesso ai dati

In questo esempio viene illustrato come gli amministratori possono controllare l'accesso AI dati e impedire a Select AI di inviare tabelle di schema effettive all'LLM.

Disabilitazione dell'accesso ai dati

Per limitare l'accesso alle tabelle dello schema, eseguire il login come amministratore ed eseguire la procedura riportata di seguito.

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

Disabilitazione dei limiti di accesso ai dati Selezionare l'azione narrate di AI e la generazione di dati sintetici. L'azione narrate e la generazione di dati sintetici generano un errore.

Eseguire il login come utente del database, creare e configurare il profilo AI. Per configurare il profilo AI, vedere Utilizzare DBMS_CLOUD_AI per configurare i profili AI.

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'esempio seguente mostra gli errori che vengono attivati quando si tenta di generare dati sintetici.

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
Abilitazione dell'accesso ai dati

L'esempio seguente mostra l'abilitazione dell'accesso ai dati. Eseguire il login come amministratore ed eseguire la procedura riportata di seguito.

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

Eseguire il login come utente del database, creare e configurare il profilo AI. Per configurare il profilo AI, vedere Utilizzare DBMS_CLOUD_AI per configurare i profili AI.

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'esempio seguente mostra la generazione di dati sintetici riuscita dopo aver abilitato l'accesso ai dati.

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.