합성 데이터 생성

무작위 생성기, 알고리즘, 통계 모델, 대규모 언어 모델(LLM)을 사용해 합성 데이터를 생성해 솔루션을 효과적으로 개발 및 테스트하기 위한 실제 데이터를 시뮬레이션할 수 있습니다.

주:

합성 데이터 생성 지원은 Oracle Database 19c(버전 19.29부터) 및 Oracle AI Database 26ai(버전 23.26부터)에서 제공됩니다.

합성 데이터는 솔루션을 개발하고 테스트할 때 특히 실제 데이터가 아직 없거나 사용할 수 없는 경우 강력한 도구가 될 수 있습니다. 합성 또는 인위적으로 생성된 데이터는 실제 데이터의 많은 특성을 가질 수 있습니다. 합성 데이터는 일반적으로 무작위 생성기, 알고리즘 또는 통계 모델을 사용하여 생성되어 실제 데이터의 특성 및 분포를 시뮬레이션합니다. 그러나 이는 다양한 정교한 기능을 갖춘 도구를 제작하거나 사용하는 것이 복잡할 수 있습니다. LLM(Large Language Models)의 가용성을 고려하면 자연어로 표현된 특성을 고려하는 보다 관련성 높은 스키마별 데이터가 생성될 수 있습니다.

항목

합성 데이터 생성의 이점

합성 데이터 생성을 통해 데이터베이스 메타데이터 복제본을 채우고, 원본 테이블의 민감한 데이터를 사용하지 않고도 개발, 테스트 및 머신 러닝 프로젝트를 지원할 수 있습니다.

합성 데이터 생성은 다음과 같은 이점을 제공합니다.
  • 메타데이터 복제본을 합성 데이터로 채우기: 메타데이터 복제본은 실제 데이터를 포함하지 않고 데이터베이스 또는 스키마의 구조를 복제합니다. Select AI는 합성 데이터 생성이 이러한 복제본을 채우고, 민감한 데이터를 보호하는 동시에 템플릿을 개발, 테스트, 생성할 수 있게 해 줍니다. 이 접근 방식은 성능 및 확장성 테스트를 지원합니다.

  • 새 프로젝트 시작: 새 프로젝트를 시작할 때 실제 데이터를 사용하지 못할 수 있습니다. 합성 데이터는 개념 시연 및 프로젝트 제안 지원 확보에 도움이 되는 현실적인 샘플을 제공합니다.

  • 사용자 경험 검증: 합성 데이터는 디자인 결함, 성능 및 확장성 문제를 발견하기 위한 다양한 데이터 세트를 제공하여 사용자 인터페이스를 테스트하는 데 도움이 됩니다.

  • AI 및 머신러닝 프로젝트 지원: 합성 데이터는 실제 데이터를 사용할 수 없거나 제한할 때 AI 및 머신러닝 모델을 학습시키는 데 유용합니다. LLM은 특정 패턴의 데이터를 생성하여 모델 학습 및 점수부여를 지원합니다.

합성 데이터 생성

DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 함수를 사용하여 AI 선택 작업을 통해 합성 데이터를 생성하고 데이터를 질의합니다.

자세한 내용은 GENERATE_SYNTHETIC_DATA 함수예제: 합성 데이터 생성을 참조하십시오.

합성 데이터 생성 모니터링 및 문제 해결

Select AI는 여러 테이블에 걸쳐 대량의 데이터를 생성할 때 합성 데이터 생성 작업을 작은 조각으로 분할하고 작업을 병렬로 실행합니다. 각 조각의 상태는 SYNTHETIC_DATA$<operation_id>_STATUS 테이블에서 추적됩니다.

합성 데이터 생성 작업은 DBA_LOAD_OPERATIONSUSER_LOAD_OPERATIONS 테이블에 기록됩니다. 이러한 테이블을 사용하여 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 작업을 모니터합니다. 자세한 내용은 DBMS_CLOUD 로드 작업 추적을 참조하십시오.

지정된 세션에서 합성 데이터 생성을 실행한 후 다음을 사용하여 USER_LOAD_OPERATION에서 최신 <operation_id>를 가져올 수 있습니다.
SELECT max(id) FROM user_load_operations;

다른 세션에서 실행 중인 합성 데이터 작업을 보려면 DBA_LOAD_OPERATIONS 뷰를 사용합니다.

합성 데이터 생성 상태 보기

합성 데이터 생성 작업의 상태 테이블에는 각 테이블과 해당 청크의 진행률이 표시됩니다. USER_LOAD_OPERATIONS 또는 DBA_LOAD_OPERATIONSSTATUS_TABLE 열에는 상태 테이블 이름이 표시됩니다. 테이블 이름은 SYNTHETIC_DATA$<operation_id>_STATUS이며 다음 열을 가집니다.

이름 데이터 유형 설명

ID

NUMBER

레코드의 고유 식별자입니다.

NAME

VARCHAR2

전체 테이블 이름(예: "ADB_USER"."EMPLOYEES")

BYTES

NUMBER

이 데이터 생성 태스크에 대해 원하는 레코드 수입니다.

ROWS_LOADED

NUMBER

생성된 실제 레코드 수입니다.

CHECKSUM

VARCHAR2

이 데이터 생성 태스크 중 기본 키에 대한 시작 값입니다.

LAST_MODIFIED

TIMESTAMP WITH TIME ZONE

레코드가 마지막으로 수정된 시기를 나타내는 시간 기록입니다.

STATUS

VARCHAR2

데이터 생성 태스크의 상태입니다. 적합한 값은 다음과 같습니다.
  • COMPLETED
  • FAILED
  • PENDING
  • SKIPPED

ERROR_CODE

NUMBER

데이터 생성 태스크가 실패하는 경우 오류 코드입니다.

ERROR_MESSAGE

VARCHAR2

태스크가 실패할 경우 제공된 오류 메시지입니다.

END_TIME

TIMESTAMP WITH TIME ZONE

데이터 생성 태스크의 끝을 표시하는 시간기록입니다.
예: 각 테이블에 대해 생성된 레코드 수 확인

각 테이블에 대해 생성된 레코드 수를 확인하려면 다음을 실행합니다.

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

ROWS_LOADED을 질의하여 각 조각에 대해 로드된 행 수를 확인하고 각 테이블에 대해 행에 대해 SUM(ROWS_LOADED)를 확인합니다.

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

예: 합성 데이터 생성

이 예에서는 실제 데이터의 특성 및 분포를 모방하는 합성 데이터를 생성하는 방법을 살펴봅니다.

주:

합성 데이터 생성 지원은 Oracle Database 19c(버전 19.29부터) 및 Oracle Database 26ai(버전 23.26부터)에서 제공됩니다.

다음 예에서는 스키마에 몇 개의 테이블을 생성하고, AI 제공자로 OCI Generative AI를 사용하여 AI 프로파일을 생성하고, DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 함수를 사용하여 해당 테이블로 데이터를 합성하고, 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
예: 다중 테이블에 대한 합성 데이터 생성

AI 제공자 프로파일을 생성 및 설정한 후 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA을 사용하여 여러 테이블에 대한 데이터를 생성합니다. Select AI를 쿼리하거나 사용하여 자연어 프롬프트에 응답할 수 있습니다.

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
예: 샘플 행으로 합성 데이터 생성 안내

AI 서비스에서 합성 데이터 생성을 안내하려면 테이블에서 기존 레코드를 임의로 선택할 수 있습니다. 예를 들어, {"sample_rows": 5}params 인수에 추가하면 테이블에서 AI 제공자로 5개의 샘플 행을 전송할 수 있습니다. 이 예에서는 Transactions 테이블의 샘플 행을 기반으로 10개의 추가 행을 생성합니다.

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;
/
예: 사용자 프롬프트로 합성 데이터 생성 사용자정의

user_prompt 인수를 사용하면 데이터 생성을 위한 추가 규칙 또는 요구 사항을 지정할 수 있습니다. 단일 테이블 또는 여러 테이블에 대한 object_list 인수의 일부로 적용할 수 있습니다. 예를 들어, DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA에 대한 다음 호출에서 프롬프트는 AI가 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;
/
예: 테이블 통계를 사용하여 합성 데이터 품질 향상

테이블에 열 통계가 있거나 메타데이터가 포함된 데이터베이스에서 복제된 경우 Select AI는 이러한 통계를 사용하여 원본 데이터와 거의 비슷하거나 일관된 데이터를 생성할 수 있습니다.

NUMBER 열의 경우 통계의 상한 및 하한 값이 값 범위를 안내합니다. 예를 들어, 원래 EMPLOYEES 테이블의 SALARY 열의 범위가 1000에서 10000 사이인 경우 이 열의 합성 데이터도 이 범위 내에 속합니다.

고유 값이 있는 열(예: 값이 CA, WATXSTATE 열)의 경우 합성 데이터가 해당 특정 값을 사용합니다. {"table_statistics": true/false} 매개변수를 사용하여 이 기능을 관리할 수 있습니다. 기본적으로 테이블 통계는 활성화되어 있습니다.

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;
/
예제: 열 주석을 사용하여 데이터 생성 안내

열 설명이 있는 경우 Select AI는 데이터 생성 중 LLM에 대한 추가 정보를 제공하기 위해 해당 설명을 자동으로 포함합니다. 예를 들어, [트랜잭션] 테이블의 Status 열에 대한 설명에는 허용되는 값(예: successful, failed, pending, canceledneed manual check)이 나열될 수 있습니다. 또한 주석을 추가하여 열을 자세히 설명함으로써 AI 서비스에 정확한 데이터 생성을 위한 보다 정확한 지침 또는 힌트를 제공할 수 있습니다. 기본적으로 주석은 사용 안함으로 설정됩니다. 자세한 내용은 선택적 매개변수를 참조하십시오.

-- 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;
/
예: 합성 데이터 생성에서 고유 값 설정

LLM을 사용하여 대량의 합성 데이터를 생성할 때 중복 값이 발생할 수 있습니다. 이를 방지하려면 관련 열에 고유 제약 조건을 설정합니다. 이렇게 하면 Select AI가 LLM 응답에서 중복 값이 있는 행을 무시합니다. 또한 특정 열에 대한 값을 제한하려면 user_prompt를 사용하거나 설명을 추가하여 허용되는 값(예: STATE 열을 CA, WATX로 제한)을 지정할 수 있습니다.

-- 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'
/
예: 병렬 처리로 합성 데이터 생성 향상

런타임을 줄이기 위해 Select AI는 기본 키가 없거나 숫자 기본 키가 있는 테이블에 대해 합성 데이터 생성 작업을 더 작은 조각으로 분할합니다. 이러한 작업은 병렬로 실행되며 AI 제공자와 상호 작용하여 데이터를 보다 효율적으로 생성합니다. 데이터베이스의 DOP(병렬도)는 Autonomous AI Database on Dedicated Exadata Infrastructure 서비스 레벨 및 ECPU 또는 OCPU 설정의 영향을 받으며 각 청크 프로세스의 레코드 수를 결정합니다. 작업을 병렬로 실행하면 일반적으로 많은 테이블에서 대량의 데이터를 생성할 때 성능이 향상됩니다. 합성 데이터 생성의 병렬 처리를 관리하려면 priority를 선택적 매개변수로 설정합니다. 선택적 매개변수를 참조하십시오.

예: 데이터 액세스 사용 또는 사용 안함

이 예에서는 관리자가 데이터 액세스를 제어하고 Select AI가 실제 스키마 테이블을 LLM으로 전송하지 못하도록 하는 방법을 보여줍니다.

데이터 액세스 사용 안함

스키마 테이블에 대한 액세스를 제한하려면 관리자로 로그인하고 다음 절차를 실행합니다.

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

데이터 액세스 제한 비활성화 AI의 narrate 작업 및 합성 데이터 생성을 선택합니다. narrate 작업 및 합성 데이터 생성 시 오류가 발생합니다.

데이터베이스 사용자로 로그인하고 AI 프로파일을 만들고 구성합니다. Use DBMS_CLOUD_AI to Configure AI Profiles을 검토하여 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

다음 예에서는 합성 데이터를 생성하려고 할 때 트리거되는 오류를 보여 줍니다.

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
데이터 액세스 활성화

다음 예에서는 데이터 액세스를 사용으로 설정하는 방법을 보여줍니다. 관리자로 로그인하고 다음 절차를 실행합니다.

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

데이터베이스 사용자로 로그인하고 AI 프로파일을 만들고 구성합니다. Use DBMS_CLOUD_AI to Configure AI Profiles을 검토하여 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"

다음 예에서는 데이터 액세스를 사용으로 설정한 후 성공적인 합성 데이터 생성을 보여줍니다.

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.