Generación de datos sintéticos

Genera datos sintéticos utilizando generadores aleatorios, algoritmos, modelos estadísticos y modelos de lenguaje grande (LLM) para simular datos reales para desarrollar y probar soluciones de manera efectiva.

Note:

El soporte para la generación de datos sintéticos está disponible en Oracle Database 19c a partir de la versión 19.29 y en Oracle AI Database 26ai a partir de la versión 23.26.

Los datos sintéticos pueden ser una herramienta poderosa al desarrollar y probar soluciones, especialmente cuando los datos reales aún no existen o no se permite su uso. Los datos sintéticos o generados artificialmente pueden tener muchas de las características de los datos reales. Los datos sintéticos se crean típicamente usando generadores aleatorios, algoritmos o modelos estadísticos para simular las características y distribuciones de datos reales. Sin embargo, esto puede ser complejo para producir o confiar en herramientas con características de diferente sofisticación. Con la disponibilidad de modelos de lenguaje grande (LLM), se pueden generar datos más relevantes y específicos del esquema que consideren las características expresadas en lenguaje natural.

Temas

Beneficios de la generación de datos sintéticos

La generación de datos sintéticos permite rellenar las clonaciones de metadatos de la base de datos y soportar proyectos de desarrollo, prueba y aprendizaje automático sin utilizar datos confidenciales de las tablas originales.

La generación de datos sintéticos ofrece las siguientes ventajas:
  • Relleno de clones de metadatos con datos sintéticos: un clon de metadatos replica la estructura de una base de datos o esquema sin incluir los datos reales. Select AI permite la generación de datos sintéticos para rellenar estos clones, protegiendo los datos confidenciales al tiempo que permite el desarrollo, las pruebas y la creación de plantillas. Este enfoque admite pruebas de rendimiento y escalabilidad.

  • Iniciar nuevos proyectos: al iniciar un nuevo proyecto, es posible que los datos reales no estén disponibles. Los datos sintéticos proporcionan muestras realistas para ayudar a demostrar conceptos y obtener soporte para las propuestas de proyectos.

  • Validación de la experiencia del usuario: los datos sintéticos ayudan a probar las interfaces de usuario al proporcionar diversos conjuntos de datos para descubrir defectos de diseño, rendimiento y problemas de escalabilidad.

  • Soporte de proyectos de IA y aprendizaje automático: los datos sintéticos son útiles para entrenar modelos de IA y aprendizaje automático cuando los datos reales no están disponibles o están restringidos. Los LLM pueden generar datos con patrones específicos para facilitar el entrenamiento y la puntuación de modelos.

Generar datos sintéticos

Utilice la función DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA para generar datos sintéticos y consultar los datos mediante las acciones Select AI.

Supervisión y resolución de problemas de generación de datos sintéticos

Al generar grandes cantidades de datos en muchas tablas, Select AI divide las tareas de generación de datos sintéticos en fragmentos más pequeños y ejecuta tareas en paralelo. El seguimiento del estado de cada fragmento se realiza en la tabla SYNTHETIC_DATA$<operation_id>_STATUS.

Las operaciones de generación de datos sintéticos se registran en las tablas DBA_LOAD_OPERATIONS y USER_LOAD_OPERATIONS. Utilice estas tablas para supervisar la operación DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA. Consulte Seguimiento de operaciones de carga de DBMS_CLOUD para obtener más información.

Después de ejecutar la generación de datos sintéticos en una sesión determinada, puede obtener el último <operation_id> de USER_LOAD_OPERATION mediante lo siguiente:
SELECT max(id) FROM user_load_operations;

Para ver las operaciones de datos sintéticos que se ejecutan en una sesión diferente, utilice la vista DBA_LOAD_OPERATIONS.

Ver estado de generación de datos sintéticos

La tabla de estado de la operación de generación de datos sintéticos muestra el progreso de cada tabla y su fragmento correspondiente. La columna STATUS_TABLE de USER_LOAD_OPERATIONS o DBA_LOAD_OPERATIONS muestra el nombre de la tabla de estado. El nombre de la tabla es SYNTHETIC_DATA$<operation_id>_STATUS y tiene las siguientes columnas:

Nombre Tipo de dato Descripción

ID

NUMBER

Identificador único del registro.

NAME

VARCHAR2

Nombre cualificado de la tabla, como "ADB_USER"."EMPLOYEES"

BYTES

NUMBER

Número deseado de registros para esta tarea de generación de datos

ROWS_LOADED

NUMBER

Número real de registros generados.

CHECKSUM

VARCHAR2

Valor inicial de la clave primaria durante esta tarea de generación de datos.

LAST_MODIFIED

TIMESTAMP WITH TIME ZONE

Registro de hora que indica cuándo se modificó por última vez el registro.

STATUS

VARCHAR2

Estado de la tarea de generación de datos. Los valores válidos son:
  • COMPLETED
  • FAILED
  • PENDING
  • SKIPPED

ERROR_CODE

NUMBER

Código de error, si falla la tarea de generación de datos.

ERROR_MESSAGE

VARCHAR2

Mensaje de error proporcionado si la tarea falla.

END_TIME

TIMESTAMP WITH TIME ZONE

Registro de hora que marca el final de la tarea de generación de datos.
Ejemplo: comprobación del número de registros generados para cada tabla

Para comprobar el número de registros generados para cada tabla, emita lo siguiente:

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

Consulte ROWS_LOADED para confirmar el número de filas que se cargan para cada fragmento y SUM(ROWS_LOADED) para las filas de cada tabla.

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

Ejemplo: generación de datos sintéticos

En este ejemplo se explora cómo se pueden generar datos sintéticos que imitan las características y la distribución de datos reales.

Note:

El soporte para la generación de datos sintéticos está disponible en Oracle Database 19c a partir de la versión 19.29 y en Oracle Database 26ai a partir de la versión 23.26.

En el siguiente ejemplo se muestra cómo crear algunas tablas en el esquema, utilizar OCI Generative AI como proveedor de IA para crear un perfil de IA, sintetizar datos en esas tablas mediante la función DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA y consultar o generar respuestas a peticiones de datos en lenguaje natural 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
Ejemplo: generación de datos sintéticos para varias tablas

Después de crear y definir el perfil de proveedor de AI, utilice DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA para generar datos para varias tablas. Puede consultar o utilizar Select AI para responder a las peticiones de datos en lenguaje natural.

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
Ejemplo: guía de generación de datos sintéticos con filas de ejemplo

Para guiar al servicio de IA en la generación de datos sintéticos, puede seleccionar aleatoriamente registros existentes de una tabla. Por ejemplo, al agregar {"sample_rows": 5} al argumento params, puede enviar 5 filas de ejemplo de una tabla al proveedor de AI. Este ejemplo genera 10 filas adicionales basadas en las filas de ejemplo de la tabla 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;
/
Ejemplo: Personalización de la generación de datos sintéticos con peticiones de datos de usuario

El argumento user_prompt permite especificar reglas o requisitos adicionales para la generación de datos. Esto se puede aplicar a una sola tabla o como parte del argumento object_list para varias tablas. Por ejemplo, en las siguientes llamadas a DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA, la petición de datos indica a la IA que genere datos sintéticos sobre películas publicadas 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;
/
Ejemplo: Mejora de la Calidad de Datos Sintéticos mediante Estadísticas de Tabla

Si una tabla tiene estadísticas de columna o se clona a partir de una base de datos que incluye metadatos, Select AI puede utilizar estas estadísticas para generar datos que se parezcan mucho a los datos originales o sean coherentes con ellos.

Para las columnas NUMBER, los valores superior e inferior de las estadísticas guían el rango de valores. Por ejemplo, si la columna SALARY de la tabla EMPLOYEES original oscila entre 1000 y 10000, los datos sintéticos de esta columna también estarán dentro de este rango.

Para las columnas con valores distintos, como una columna STATE con los valores CA, WA y TX, los datos sintéticos utilizarán estos valores específicos. Puede gestionar esta función mediante el parámetro {"table_statistics": true/false}. Por defecto, las estadísticas de la tabla están activadas.

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;
/
Ejemplo: uso de comentarios de columna para guiar la generación de datos

Si existen comentarios de columna, Seleccionar IA los incluye automáticamente para proporcionar información adicional para el LLM durante la generación de datos. Por ejemplo, un comentario en la columna Status de una tabla de transacciones puede mostrar valores permitidos como successful, failed, pending, canceled y need manual check. También puede agregar comentarios para explicar más detalladamente la columna, lo que proporciona a los servicios de IA instrucciones o indicaciones más precisas para generar datos precisos. Por defecto, los comentarios están desactivados. Consulte Parámetros opcionales para obtener más información.

-- 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;
/
Ejemplo: definición de valores únicos en la generación de datos sintéticos

Cuando se generan grandes cantidades de datos sintéticos con LLM, es probable que se produzcan valores duplicados. Para evitarlo, configure una restricción única en la columna correspondiente. Esto garantiza que Select AI ignore las filas con valores duplicados en la respuesta del LLM. Además, para restringir valores para determinadas columnas, puede utilizar user_prompt o agregar comentarios para especificar los valores permitidos, como limitar una columna STATE a CA, WA y 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'
/
Ejemplo: Mejora de la Generación de Datos Sintéticos mediante Procesamiento Paralelo

Para reducir el tiempo de ejecución, Select AI divide las tareas de generación de datos sintéticos en fragmentos más pequeños para las tablas sin claves primarias o con claves primarias numéricas. Estas tareas se ejecutan en paralelo, interactuando con el proveedor de IA para generar datos de manera más eficiente. El grado de paralelismo (DOP) en la base de datos, influenciado por el nivel de servicio de la base de datos de IA autónoma en infraestructura de Exadata dedicada y la configuración de ECPU u OCPU, determina el número de registros de cada proceso de fragmento. La ejecución de tareas en paralelo generalmente mejora el rendimiento, especialmente cuando se generan grandes cantidades de datos en muchas tablas. Para gestionar el procesamiento paralelo de la generación de datos sintéticos, defina priority como un parámetro opcional. Consulte Optional Parameters.

Ejemplo: activación o desactivación del acceso a datos

En este ejemplo, se muestra cómo los administradores pueden controlar el acceso a los datos y evitar que Select AI envíe tablas de esquema reales al LLM.

Desactivación del acceso a datos

Para restringir el acceso a las tablas de esquema, conéctese como administrador y ejecute el siguiente procedimiento.

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

Desactivando límites de acceso a datos Seleccione la acción narrate de AI y la generación de datos sintéticos. La acción narrate y la generación de datos sintéticos generan un error.

Conéctese como usuario de base de datos, cree y configure su perfil de AI. Revise Use DBMS_CLOUD_AI para configurar perfiles de AI para configurar su perfil de 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

En el siguiente ejemplo, se muestran los errores que se disparan al intentar generar datos sintéticos.

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
Activación del acceso a datos

En el siguiente ejemplo, se muestra la activación del acceso a datos. Inicie sesión como administrador y ejecute el siguiente procedimiento:

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

Conéctese como usuario de base de datos, cree y configure su perfil de AI. Revise Use DBMS_CLOUD_AI para configurar perfiles de AI para configurar su perfil de 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"

En el siguiente ejemplo, se muestra la generación correcta de datos sintéticos después de activar el acceso a los datos.

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.