合成データ生成

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

ノート:

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

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

トピック

合成データ生成の利点

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

合成データ生成には、次の利点があります。
  • 合成データへのメタデータ・クローンの移入: メタデータ・クローンは、実際のデータを含めずに、データベースまたはスキーマの構造をレプリケートします。Select AIにより、合成データ生成でこれらのクローンを移入し、機密データを保護しながら、開発、テストおよびテンプレートの作成が可能になります。このアプローチは、パフォーマンスとスケーラビリティのテストをサポートします。

  • 新規プロジェクトの開始: 新規プロジェクトを開始するときに、実績データを使用できない場合があります。合成データは、概念を実証し、プロジェクトの提案をサポートするのに役立つ現実的なサンプルを提供します。

  • ユーザー・エクスペリエンスの検証: 合成データは、設計上の欠陥、パフォーマンスおよびスケーラビリティの問題を発見するための多様なデータ・セットを提供することで、ユーザー・インタフェースのテストに役立ちます。

  • AIおよび機械学習プロジェクトのサポート: 合成データは、実際のデータが使用できない、または制限されている場合にAIおよび機械学習モデルのトレーニングに役立ちます。LLMは、モデルのトレーニングとスコアリングを容易にするために、特定のパターンでデータを生成できます。

合成データの生成

DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATAファンクションでは、Select 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_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

例: 合成データの生成

この例では、実際のデータの特性と分布を模倣した合成データを生成する方法について説明します。

ノート:

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

次の例は、スキーマにいくつかの表を作成し、AIプロバイダとしてOCI生成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およびTXSTATE列など、個別値を持つ列の場合、合成データではこれらの固有の値が使用されます。この機能は、{"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を使用して合成データを生成すると、重複値が発生する可能性があります。これを回避するには、関連する列に一意制約を設定します。これにより、Select AIはLLM応答で値が重複する行を無視します。また、特定の列の値を制限するには、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プロバイダーとやり取りしてデータをより効率的に生成します。データベース内の並列度(DOP)は、専用Exadataインフラストラクチャ上のAutonomous AI Databaseのサービス・レベルおよびECPUまたはOCPUの設定の影響を受け、各チャンク・プロセスのレコード数を決定します。タスクをパラレルに実行すると、特に多数の表にわたって大量のデータを生成する場合に、パフォーマンスが一般的に向上します。合成データ生成のパラレル処理を管理するには、オプション・パラメータとして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.