합성 데이터 생성
무작위 생성기, 알고리즘, 통계 모델, 대규모 언어 모델(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_OPERATIONS 및 USER_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_OPERATIONS의 STATUS_TABLE 열에는 상태 테이블 이름이 표시됩니다. 테이블 이름은 SYNTHETIC_DATA$<operation_id>_STATUS이며 다음 열을 가집니다.
| 이름 | 데이터 유형 | 설명 |
|---|---|---|
|
|
|
레코드의 고유 식별자입니다. |
|
|
|
전체 테이블 이름(예: "ADB_USER"."EMPLOYEES") |
|
|
|
이 데이터 생성 태스크에 대해 원하는 레코드 수입니다. |
|
|
|
생성된 실제 레코드 수입니다. |
|
|
|
이 데이터 생성 태스크 중 기본 키에 대한 시작 값입니다. |
|
|
|
레코드가 마지막으로 수정된 시기를 나타내는 시간 기록입니다. |
|
|
|
데이터 생성 태스크의 상태입니다. 적합한 값은 다음과 같습니다.
|
|
|
|
데이터 생성 태스크가 실패하는 경우 오류 코드입니다. |
|
|
|
태스크가 실패할 경우 제공된 오류 메시지입니다. |
|
|
|
데이터 생성 태스크의 끝을 표시하는 시간기록입니다. |
각 테이블에 대해 생성된 레코드 수를 확인하려면 다음을 실행합니다.
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
----------------
10AI 서비스에서 합성 데이터 생성을 안내하려면 테이블에서 기존 레코드를 임의로 선택할 수 있습니다. 예를 들어, {"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, WA 및 TX인 STATE 열)의 경우 합성 데이터가 해당 특정 값을 사용합니다. {"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, canceled 및 need 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, WA 및 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'
/런타임을 줄이기 위해 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.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.
오라클 고객지원센터 액세스
오라클 고객의 오라클 지원 서비스 접근 및 이용은 해당 서비스의 오라클 주문서에 명시된 조항들에 따릅니다.