2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

生成AIでテーブル作って、SELECT AIのSynthetic Data Generationでサンプルデータを作成する方法

Last updated at Posted at 2025-11-17

はじめに

この記事では、エンジニアがよく直面するであろう、テスト用のテーブルデータを生成AI機能を使って生成する方法を説明します。
もっと良いやり方はありそうですが、直感的な方法にフォーカスしてまとめました。
サンプルテーブルを簡単に作れれば、お客様向けのデモや、社内プレゼンの準備工数を大幅に削減できます。

サンプルデータの準備は、生成AIに直接生成させたり、Web上のサンプルデータを利用したりも考えられますが、環境へのデータ転送の手間やネットワーク負荷を考えると、Synthetic Data Generationの活用はありだと思います。

今回のサンプルでは、個人的な趣味のランニングのデータを生成しています。

  1. 生成AI(フリーのChatGPT)を利用して、ラフなテーブル設計図からテーブル作成のためのSQL文を生成
  2. Mermaid Live Editorを使って、ER図化したものを確認
  3. Oracle Cloud(OCI)のPaaS DBサービス「Autonomous AI Database(ADB)」上でテーブルを作成
  4. SELECT AIのSynthetic Data Generationでサンプルレコードを生成

生成AI(フリーのChatGPT)を利用して、ラフなテーブル設計図からテーブル作成のためのSQL文を生成

最初に、ChatGPTに読み込ませるためのラフな設計図を作成します。

  • 今回は、PowerPointでテーブル設計図(っぽいもの)を作成しました。
    (手書きでもある程度はいけそうな感じでした。)

image.png

ChatGPTにアクセスします。

image.png

作成したPowerPointのテーブル設計図をChatGPTにコピー&ペーストし、入力欄に以下のようなプロンプトを入力して実行し、ER図とSQL分を生成します。

添付画像をMermaid記法にしてください。
また、添付画像の複数テーブルを参照関係も含めて作成する、SQLを生成してください。

image.png

image.png

erDiagram

    USERTABLE {
        NUMBER USERID PK
        VARCHAR2 USERNAME
        NUMBER AGE
        NUMBER HEIGHT
        NUMBER WEIGHT
        NUMBER VO2MAX
        INTERVAL PB
    }

    ACTIVITYTABLE {
        NUMBER ACTIVITYID PK
        NUMBER USERID FK
        VARCHAR2 RUNDAY
    }

    LAPTABLE {
        NUMBER LAPID PK
        NUMBER ACTIVITYID FK
        NUMBER DISTANCE
        INTERVAL TIME
        NUMBER STEPS
        NUMBER ELEVATION
        NUMBER HEARTRATE
    }

    USERTABLE ||--o{ ACTIVITYTABLE : "USERID"
    ACTIVITYTABLE ||--o{ LAPTABLE : "ACTIVITYID"

image.png

-- ===========================
-- 1. USERTABLE
-- ===========================
CREATE TABLE USERTABLE (
    USERID      NUMBER       PRIMARY KEY,
    USERNAME    VARCHAR2(100),
    AGE         NUMBER,
    HEIGHT      NUMBER,
    WEIGHT      NUMBER,
    VO2MAX      NUMBER,
    PB          INTERVAL DAY TO SECOND
);

-- ===========================
-- 2. ACTIVITYTABLE
-- ===========================
CREATE TABLE ACTIVITYTABLE (
    ACTIVITYID  NUMBER       PRIMARY KEY,
    USERID      NUMBER       NOT NULL,
    RUNDAY      VARCHAR2(100),
    CONSTRAINT FK_ACTIVITY_USER
        FOREIGN KEY (USERID)
        REFERENCES USERTABLE(USERID)
);

-- ===========================
-- 3. LAPTABLE
-- ===========================
CREATE TABLE LAPTABLE (
    LAPID       NUMBER       PRIMARY KEY,
    ACTIVITYID  NUMBER       NOT NULL,
    DISTANCE    NUMBER,
    TIME        INTERVAL DAY TO SECOND,
    STEPS       NUMBER,
    ELEVATION   NUMBER,
    HEARTRATE   NUMBER,
    CONSTRAINT FK_LAP_ACTIVITY
        FOREIGN KEY (ACTIVITYID)
        REFERENCES ACTIVITYTABLE(ACTIVITYID)
);

私の環境では、Mermaid記法は直接可視化できなかったので、次のチャプターでは、Mermaid Live Editorを使ってMermaid記法のER図を可視化します。

Mermaid Live Editorを使って、ER図化したものを確認

Mermaid Live Editorを使ってMermaid記法のER図を可視化します。

Mermaid Live Editorにアクセスします。

image.png

左上のCode欄に先ほどChatGPTで生成した以下のMermaid記法のER図をコピー&ペーストします。

erDiagram

    USERTABLE {
        NUMBER USERID PK
        VARCHAR2 USERNAME
        NUMBER AGE
        NUMBER HEIGHT
        NUMBER WEIGHT
        NUMBER VO2MAX
        INTERVAL PB
    }

    ACTIVITYTABLE {
        NUMBER ACTIVITYID PK
        NUMBER USERID FK
        VARCHAR2 RUNDAY
    }

    LAPTABLE {
        NUMBER LAPID PK
        NUMBER ACTIVITYID FK
        NUMBER DISTANCE
        INTERVAL TIME
        NUMBER STEPS
        NUMBER ELEVATION
        NUMBER HEARTRATE
    }

    USERTABLE ||--o{ ACTIVITYTABLE : "USERID"
    ACTIVITYTABLE ||--o{ LAPTABLE : "ACTIVITYID"

画面にMermaid記法のER図が表示されました。
元のテーブル設計図と比較し、想定通りの内容になっていることが確認できます。

image.png

image.png

Oracle Cloud(OCI)のPaaS DBサービス「Autonomous AI Database(ADB)」上でテーブルを作成

OCIコンソール上で、起動したAutonomous AI Database 26aiを開き、データベース・アクションからSQLを選択します。

image.png

生成AIで作成したSQL分をコピー&ペーストし、3つのテーブルを作成します。

-- ===========================
-- 1. USERTABLE
-- ===========================
CREATE TABLE USERTABLE (
    USERID      NUMBER       PRIMARY KEY,
    USERNAME    VARCHAR2(100),
    AGE         NUMBER,
    HEIGHT      NUMBER,
    WEIGHT      NUMBER,
    VO2MAX      NUMBER,
    PB          INTERVAL DAY TO SECOND
);

-- ===========================
-- 2. ACTIVITYTABLE
-- ===========================
CREATE TABLE ACTIVITYTABLE (
    ACTIVITYID  NUMBER       PRIMARY KEY,
    USERID      NUMBER       NOT NULL,
    RUNDAY      VARCHAR2(100),
    CONSTRAINT FK_ACTIVITY_USER
        FOREIGN KEY (USERID)
        REFERENCES USERTABLE(USERID)
);

-- ===========================
-- 3. LAPTABLE
-- ===========================
CREATE TABLE LAPTABLE (
    LAPID       NUMBER       PRIMARY KEY,
    ACTIVITYID  NUMBER       NOT NULL,
    DISTANCE    NUMBER,
    TIME        INTERVAL DAY TO SECOND,
    STEPS       NUMBER,
    ELEVATION   NUMBER,
    HEARTRATE   NUMBER,
    CONSTRAINT FK_LAP_ACTIVITY
        FOREIGN KEY (ACTIVITYID)
        REFERENCES ACTIVITYTABLE(ACTIVITYID)
);

image.png

各テーブルのカラムにコメントを付与します。

COMMENT ON TABLE USERTABLE                 IS 'ランナーのプロフィール情報を含む';
COMMENT ON TABLE ACTIVITYTABLE             IS ‘ランニングのアクティビティ情報を含む';
COMMENT ON TABLE LAPTABLE                  IS ‘各アクティビティのラップ情報を含む';

COMMENT ON COLUMN USERTABLE.USERID         IS 'ランナーの一意なID';
COMMENT ON COLUMN USERTABLE.USERNAME       IS 'ランナーの氏名(日本語フルネーム)';
COMMENT ON COLUMN USERTABLE.AGE            IS 'ランナーの年齢(整数値、例:35)';
COMMENT ON COLUMN USERTABLE.HEIGHT         IS 'ランナーの身長(小数値、例:168.5)';
COMMENT ON COLUMN USERTABLE.WEIGHT         IS 'ランナーの体重(小数値、例:55.5)';
COMMENT ON COLUMN USERTABLE.VO2MAX         IS 'ランナーの最大酸素摂取量(整数値、例:59)';
COMMENT ON COLUMN USERTABLE.PB             IS 'ランナーのフルマラソンのフルマラソンパーソナルベスト(INTERVAL型、フォーマット:+D HH:MM:SS、例:+1 02:59:59)';
COMMENT ON COLUMN ACTIVITYTABLE.ACTIVITYID IS 'アクティビティの一意なID';
COMMENT ON COLUMN ACTIVITYTABLE.RUNDAY     IS 'アクティビティの日付';
COMMENT ON COLUMN LAPTABLE.LAPID           IS 'ラップの一意なID';
COMMENT ON COLUMN LAPTABLE.DISTANCE        IS 'ラップの移動距離(少数値、例:35)';
COMMENT ON COLUMN LAPTABLE.TIME            IS 'ラップの経過時間(INTERVAL型、フォーマット:+D HH:MM:SS、例:+1 02:59:59)';
COMMENT ON COLUMN LAPTABLE.STEPS           IS 'ラップの歩数(整数値、例:1111)';
COMMENT ON COLUMN LAPTABLE.ELEVATION       IS 'ラップの獲得標高(整数値、例:11)';
COMMENT ON COLUMN LAPTABLE.HEARTRATE       IS 'ラップの心拍数(整数値、例:111)';

以上で、生成AIで生成したSQL分を元に、複数テーブルを作成できました。
作成したテーブルは、データベース・アクションのデータ・モデラーで可視化して確認することもできます。

image.png

image.png

image.png

次のチャプターでは、SELECT AIのSynthetic Data Generationでサンプルレコードを生成します。

SELECT AIのSynthetic Data Generationでサンプルレコードを生成

SELECT AIのSynthetic Data Generationでサンプルレコードを生成します。
Synthetic Data Gerationについては、以下ニュース、ヘルプドキュメント、セミナー資料なども合わせてご参照ください。

初めに、クレデンシャルを作成します。

事前にAPIキーを作成し、必要な情報を取得しておきます。

APIキーの作成は右上のプロファイルからユーザアカウントを選択します。

image.png

左下のAPIキーからAPIキーの追加を選択します。

image.png

秘密キーのダウンロードをクリックし、秘密キーをダウンロードしておきます。
追加をクリックします。

image.png

構成ファイルをコピーして、メモ帳などに残します。
プレビューを閉じます。

image.png

初めに、構成ファイルや秘密キーの情報を以下に記載し、クレデンシャルを作成します。

BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'GENAI_CRED',
        user_ocid       => 'ocid1.user.oc1..XXXXXXXXXXXXXXXXXXXX',
        tenancy_ocid    => 'ocid1.tenancy.oc1..XXXXXXXXXXXXXXXXX',
        private_key     => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
        fingerprint     => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); 
END;
/ 

次に、プロファイルを作成します。
リージョンは、大阪リージョンを指定し、モデルはCohereのCommand Aを指定します。

BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        profile_name => 'GENAI',
        attributes   =>'{"provider":        "oci",
                         "credential_name": "GENAI_CRED",
                         "region":          "ap-osaka-1",
                         "model":           "cohere.command-a-03-2025",
                         "comments":        "TRUE"}');
END;
/

次に、属性を設定します。
コンパートメントOCIDは環境に合った内容に変更します。

BEGIN  
  DBMS_CLOUD_AI.SET_ATTRIBUTE(
        'GENAI', 'oci_compartment_id', 'ocid1.compartment.oc1..XXXXXXXX');
END;
/

最後に、各テーブルのテストデータレコードを作成します。

1テーブルのレコードを作成する場合のサンプルは以下です。
以下の例では、ユーザプロンプトを付与することで、レコード生成時の付帯条件を付与しています。

  • "name":"USERTABLE"
    • "user_prompt":"ランナーのプロフィールデータを日本語で生成してください。年齢は20,35,42のような具体的な整数で、AGE列に記載してください。"
  • "name":"ACTIVITYTABLE"
    • "user_prompt":"ランニングのアクティビティデータを生成してください。すべてのアクティビティは2025年のデータとしてください。"
  • "name":"LAPTABLE"
    • "user_prompt":"ランニングアクティビティの各ラップデータを生成してください。すべてのラップデータは、トップアスリートの記録を基準に生成してください。"
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_name  => 'USERTABLE',
        owner_name   => 'ADMIN',
        record_count => 5,
        user_prompt => 'ランナーのプロフィールデータを日本語で生成してください。年齢は20,35,42のような具体的な整数で、AGE列に記載してください。');
END;
/
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_name  => 'ACTIVITYTABLE',
        owner_name   => 'ADMIN',
        record_count => 5,
        user_prompt => 'ランニングのアクティビティデータを生成してください。すべてのアクティビティは2025年のデータとしてください。');
END;
/
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_name  => 'LAPTABLE',
        owner_name   => 'ADMIN',
        record_count => 5,
        user_prompt => 'ランニングアクティビティの各ラップデータを生成してください。すべてのラップデータは、トップアスリートの記録を基準に生成してください。');
END;
/

複数テーブルのレコードを一括で作成する場合のサンプルは以下です。

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner":"ADMIN","name":"USERTABLE","record_count":5,"user_prompt":"ランナーのプロフィールデータを日本語で生成してください。年齢は20,35,42のような具体的な整数で、AGE列に記載してください。"},
                         {"owner":"ADMIN","name":"ACTIVITYTABLE","record_count":20,"user_prompt":"ランニングのアクティビティデータを生成してください。すべてのアクティビティは2025年のデータとしてください。"},
                         {"owner":"ADMIN","name":"LAPTABLE","record_count":100,"user_prompt":"ランニングアクティビティの各ラップデータを生成してください。すべてのラップデータは、トップアスリートの記録を基準に生成してください。"}]',
        params => '{"comments":"TRUE"}');
END;
/

各テーブルの生成した結果を、以下で確認します。

SELECT * FROM USERTABLE;

USERTABLE
image.png

SELECT * FROM ACTIVITYTABLE;

ACTIVITYTABLE
image.png

SELECT * FROM LAPTABLE;

LAPTABLE
image.png

SELECT AI機能で自然言語からSQLを生成して問い合わせることも可能です。

BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        'GENAI_R',
        '{
            "provider": "oci",
            "credential_name": "GENAI_CRED",
            "model":"cohere.command-r-08-2024",
            "oci_apiformat":"COHERE",
            "region": "ap-osaka-1",
            "object_list": [
                    {"owner": "ADMIN", "name": "USERTABLE"},
                    {"owner": "ADMIN", "name": "ACTIVITYTABLE"},
                    {"owner": "ADMIN", "name": "LAPTABLE"}]
        }'
    );
END;
/
EXEC DBMS_CLOUD_AI.SET_PROFILE('GENAI_R');
SELECT AI PBが最も速いユーザの全てのアクティビティをすべて教えてください。;
RUN_DAY    USER_NAME 
---------- --------- 
2025-01-04 高橋次郎      
2025-01-24 高橋次郎      
2025-02-13 高橋次郎      
2025-01-04 高橋次郎      
2025-01-24 高橋次郎      
2025-02-13 高橋次郎      
EXEC DBMS_CLOUD_AI.SET_PROFILE('GENAI_S');
SELECT AI SHOWSQL PBが最も速いユーザの全てのアクティビティをすべて教えてください。;
RESPONSE                                                                                                                                                                                                        
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
SELECT a."RUNDAY" AS "RUN_DAY", u."USERNAME" AS "USER_NAME"
FROM "ADMIN"."ACTIVITYTABLE" a
JOIN "ADMIN"."USERTABLE" u ON a."USERID" = u."USERID"
WHERE u."PB" = (SELECT MIN(u."PB") FROM "ADMIN"."USERTABLE" u)     

想定通りのテーブルレコードが生成されいることを確認できました。

今回の記事作成に当たっては、以下のQiita記事などを参考にさせていただきました。
この場を借りて御礼申し上げます。ありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?