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.
-
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.
Per ulteriori informazioni, vedere GENERATE_SYNTHETIC_DATA Funzione ed Esempio: generazione di dati sintetici.
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.
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 |
|---|---|---|
|
|
|
Identificativo univoco del record. |
|
|
|
Nome qualificato della tabella, ad esempio "ADB_USER"."EMPLOYEES" |
|
|
|
Numero di record desiderato per questo task di generazione dati |
|
|
|
Numero effettivo di record generati. |
|
|
|
Valore iniziale per la chiave primaria durante questo task di generazione dati. |
|
|
|
Indicatore orario che indica l'ultima modifica del record. |
|
|
|
Stato del task di generazione dati. I valori validi sono:
|
|
|
|
Codice di errore, se il task di generazione dati non riesce. |
|
|
|
Messaggio di errore fornito se il task non riesce. |
|
|
|
Indicatore orario che contrassegna la fine del task di generazione dati. |
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
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
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
----------------
10Per 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;
/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;
/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;
/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;
/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'
/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.
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: 6L'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 2L'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.For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
Accesso al supporto Oracle
L'accesso e l'uso dei servizi di Supporto Oracle da parte dei clienti Oracle è soggetto ai termini e alle condizioni specificati nell'ordine Oracle per i servizi applicabili.