はじめに
この記事では、エンジニアがよく直面するであろう、テスト用のテーブルデータを生成AI機能を使って生成する方法を説明します。
もっと良いやり方はありそうですが、直感的な方法にフォーカスしてまとめました。
サンプルテーブルを簡単に作れれば、お客様向けのデモや、社内プレゼンの準備工数を大幅に削減できます。
サンプルデータの準備は、生成AIに直接生成させたり、Web上のサンプルデータを利用したりも考えられますが、環境へのデータ転送の手間やネットワーク負荷を考えると、Synthetic Data Generationの活用はありだと思います。
今回のサンプルでは、個人的な趣味のランニングのデータを生成しています。
- 生成AI(フリーのChatGPT)を利用して、ラフなテーブル設計図からテーブル作成のためのSQL文を生成
- Mermaid Live Editorを使って、ER図化したものを確認
- Oracle Cloud(OCI)のPaaS DBサービス「Autonomous AI Database(ADB)」上でテーブルを作成
- SELECT AIのSynthetic Data Generationでサンプルレコードを生成
生成AI(フリーのChatGPT)を利用して、ラフなテーブル設計図からテーブル作成のためのSQL文を生成
最初に、ChatGPTに読み込ませるためのラフな設計図を作成します。
- 今回は、PowerPointでテーブル設計図(っぽいもの)を作成しました。
(手書きでもある程度はいけそうな感じでした。)
ChatGPTにアクセスします。
作成したPowerPointのテーブル設計図をChatGPTにコピー&ペーストし、入力欄に以下のようなプロンプトを入力して実行し、ER図とSQL分を生成します。
添付画像をMermaid記法にしてください。
また、添付画像の複数テーブルを参照関係も含めて作成する、SQLを生成してください。
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"
-- ===========================
-- 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にアクセスします。
左上の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図が表示されました。
元のテーブル設計図と比較し、想定通りの内容になっていることが確認できます。
Oracle Cloud(OCI)のPaaS DBサービス「Autonomous AI Database(ADB)」上でテーブルを作成
OCIコンソール上で、起動したAutonomous AI Database 26aiを開き、データベース・アクションからSQLを選択します。
生成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)
);
各テーブルのカラムにコメントを付与します。
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分を元に、複数テーブルを作成できました。
作成したテーブルは、データベース・アクションのデータ・モデラーで可視化して確認することもできます。
次のチャプターでは、SELECT AIのSynthetic Data Generationでサンプルレコードを生成します。
SELECT AIのSynthetic Data Generationでサンプルレコードを生成
SELECT AIのSynthetic Data Generationでサンプルレコードを生成します。
Synthetic Data Gerationについては、以下ニュース、ヘルプドキュメント、セミナー資料なども合わせてご参照ください。
初めに、クレデンシャルを作成します。
事前にAPIキーを作成し、必要な情報を取得しておきます。
APIキーの作成は右上のプロファイルからユーザアカウントを選択します。
左下のAPIキーからAPIキーの追加を選択します。
秘密キーのダウンロードをクリックし、秘密キーをダウンロードしておきます。
追加をクリックします。
構成ファイルをコピーして、メモ帳などに残します。
プレビューを閉じます。
初めに、構成ファイルや秘密キーの情報を以下に記載し、クレデンシャルを作成します。
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;
SELECT * FROM ACTIVITYTABLE;
SELECT * FROM LAPTABLE;
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記事などを参考にさせていただきました。
この場を借りて御礼申し上げます。ありがとうございました。



















