開発およびテストのための合成データの生成

ランダム・ジェネレータ、アルゴリズム、統計モデルおよび大規模言語モデル(LLM)を使用して合成データを生成し、ソリューションを効果的に開発およびテストするための実際のデータをシミュレートします。

ノート:合成データ生成のサポートは、Oracle Database 19c (バージョン19.29以降)およびOracle AI Database 26ai (バージョン23.26以降)で使用できます。

合成データは、特に実際のデータがまだ存在しないか、使用が許可されていない場合に、ソリューションを開発およびテストする際に強力なツールとなります。データは、合成または人工的に生成され、実際のデータの多くの特性を持つことができます。合成データは通常、ランダム・ジェネレータ、アルゴリズムまたは統計モデルを使用して作成され、実際のデータの特性および分布をシミュレートします。ただし、これは複雑で、さまざまな高度な機能を持つツールを作成したり、ツールに依存したりすることがあります。大規模言語モデル(LLM)の可用性により、自然言語で表現された特性を考慮した、より関連性の高いスキーマ固有のデータが生成される場合があります。

合成データ生成の利点

合成データ生成では、元の表の機密データを使用せずに、データベース・メタデータ・クローンを移入し、開発、テストおよび機械学習プロジェクトをサポートできます。

合成データ生成には、次の利点があります。

合成データの生成

DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATAファンクションでは、Select AIアクションを使用して合成データを生成し、データを問い合せます。

さらに学習するには、GENERATE_DATAETIC_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_OPERATIONSSTATUS_TABLE列には、ステータス表名が表示されます。表名はSYNTHETIC_DATA$<operation_id>_STATUSで、次の列があります。

名前 データ型 説明
ID NUMBER レコードの一意のID。
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への次のコールでは、2009年にリリースされたムービーで合成データを生成するようにプロンプトがAIに指示されます。

-- 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の場合、この列の合成データもこの範囲内に収まります。

CAWAおよび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列に対するコメントには、successfulfailedpendingcanceledneed 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で大量の合成データを生成する場合、重複値が発生する可能性が高くなります。これを回避するには、関連する列に一意制約を設定します。これにより、LLMレスポンスの値が重複する行はSelect AIで無視されます。また、特定の列の値を制限するには、user_promptを使用するか、コメントを追加して、STATE列をCAWAおよび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プロバイダーと対話してデータをより効率的に生成します。Autonomous AI Database on Dedicated Exadata Infrastructureサービス・レベルおよびECPUまたはOCPU設定の影響を受けるデータベース内の並列度(DOP)によって、各チャンク・プロセスのレコード数が決まります。通常、タスクをパラレルで実行すると、パフォーマンスが向上します(特に、多数の表にまたがって大量のデータを生成する場合)。合成データ生成のパラレル処理を管理するには、priorityをオプションのパラメータとして設定します。オプション・パラメータを参照してください。

例: データ・アクセスの有効化または無効化

次の例では、管理者がデータ アクセスを制御し、Select AIが実際のスキーマ テーブルをLLMに送信しないようにする方法を示します。

データ・アクセスの無効化

スキーマ表へのアクセスを制限するには、管理者としてログインし、次の手順を実行します。

EXEC DBMS_CLOUD_AI.DISABLE_DATA_ACCESS;

PL/SQL procedure successfully completed.

データ・アクセスを無効にすると、Select AIのnarrateアクションおよび合成データ生成が制限されます。narrateアクションおよび合成データの生成でエラーが発生します。

データベース・ユーザーとしてログインし、AIプロファイルを作成および構成します。AIプロファイルを構成するには、DBMS_CLOUD_AIを使用した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プロファイルを作成および構成します。AIプロファイルを構成するには、DBMS_CLOUD_AIを使用した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.

関連コンテンツ