はじめに
Autonomous Databaseに「SELECT AI for Synthetic Data Generation」という、AIを使用してテストデータを自動生成する機能が追加されました。
そこで今回は、「SELECT AI for Synthetic Data Generation」を使用して、日本語のテストデータを生成できるかを検証してみました。
1. 事前準備
テストデータ生成の対象となる表を作成します。
今回は、director、movie、actor、movie_actorの4つの表を作成しました。
SQL> CREATE TABLE director (
2 director_id NUMBER PRIMARY KEY,
3 name VARCHAR2(100)
4 );
表が作成されました。
SQL> CREATE TABLE movie (
2 movie_id NUMBER PRIMARY KEY,
3 title VARCHAR2(100),
4 release_date DATE,
5 genre VARCHAR2(50),
6 director_id NUMBER,
7 FOREIGN KEY (director_id) REFERENCES director(director_id)
8 );
表が作成されました。
SQL> CREATE TABLE actor (
2 actor_id NUMBER PRIMARY KEY,
3 name VARCHAR2(100)
4 );
表が作成されました。
SQL> CREATE TABLE movie_actor (
2 movie_actor_id NUMBER PRIMARY KEY,
3 movie_id NUMBER,
4 actor_id NUMBER,
5 FOREIGN KEY (movie_id) REFERENCES movie(movie_id),
6 FOREIGN KEY (actor_id) REFERENCES actor(actor_id)
7 );
表が作成されました。
SQL>
日本語のデータを生成したい列にコメントを設定します。
SQL> COMMENT ON COLUMN movie.title IS 'Movie title in Japanese';
コメントが作成されました。
SQL> COMMENT ON COLUMN movie.genre IS 'Movie genre in Japanese';
コメントが作成されました。
SQL> COMMENT ON COLUMN actor.name IS 'Actor name in Japanese';
コメントが作成されました。
SQL> COMMENT ON COLUMN director.name IS 'Director name in Japanese';
コメントが作成されました。
SQL>
2. AIプロファイルの作成
AIプロバイダとして「OCI Generative AI Service」(oci)、使用するモデルとして「Cohere Command R+」(cohere.command-r-plus)を指定して、AIプロファイルを作成します。
今回は、Autonomous DatabaseからOCI Generative AI Serviceへのアクセスにリソース・プリンシパルを使用しました。
リソース・プリンシパルを有効化する手順は、こちらのマニュアルに記載があります。
SQL> BEGIN
2 DBMS_CLOUD_AI.CREATE_PROFILE(
3 profile_name =>'OCI_GENAI',
4 attributes =>'{"provider": "oci",
5 "model": "cohere.command-r-plus",
6 "credential_name": "OCI$RESOURCE_PRINCIPAL",
7 "comments": "TRUE"
8 }'
9 );
10 END;
11 /
PL/SQLプロシージャが正常に完了しました。
SQL>
3. テストデータの生成
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATAプロシージャを実行して、テストデータを生成します。
使用するAIプロファイルとして先ほど作成した「OCI_GENAI」、データを生成する対象の表として先ほど作成したmovie、director、actor、movie_actorを指定します。
SQL> BEGIN
2 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
3 profile_name => 'OCI_GENAI',
4 object_list => '[
5 {"owner":"ADMIN", "name":"director","record_count":5},
6 {"owner":"ADMIN", "name":"movie_actor","record_count":20, "user_prompt":"Each movie has several actors"},
7 {"owner":"ADMIN", "name":"actor","record_count":10},
8 {"owner":"ADMIN", "name":"movie","record_count":5, "user_prompt":"all movies released in 2022"}
9 ]'
10 );
11 END;
12 /
PL/SQLプロシージャが正常に完了しました。
SQL>
生成された各表のデータを確認してみます。
SQL> SELECT * FROM movie;
MOVIE_ID TITLE RELEASE_ GENRE DIRECTOR_ID
---------- ------------------------------------------------------------ -------- -------------------- -----------
1 The Matrix Resurrections 22-12-22 Sci-Fi 4
2 Spider-Man: No Way Home 22-12-17 Action 2
3 Top Gun: Maverick 22-05-27 Action 3
4 The Batman 22-03-04 Superhero 5
5 Everything Everywhere All at Once 22-03-14 Sci-Fi 1
5行が選択されました。
SQL> SELECT * FROM director;
DIRECTOR_ID NAME
----------- --------------------
1 John Smith
2 Mary Jones
3 Robert Johnson
4 Sarah Davis
5 David Miller
5行が選択されました。
SQL> SELECT * FROM actor;
ACTOR_ID NAME
---------- --------------------
1 John Smith
2 Emily Brown
3 Michael Jones
4 Sarah Davis
5 David Miller
6 Rachel Wilson
7 Robert Johnson
8 Laura Anderson
9 William Thompson
10 Elizabeth Moore
10行が選択されました。
SQL> SELECT * FROM movie_actor;
MOVIE_ACTOR_ID MOVIE_ID ACTOR_ID
-------------- ---------- ----------
1 2 9
2 2 2
3 2 10
4 1 3
5 1 1
6 1 5
7 1 8
8 5 6
9 5 4
10 5 7
11 3 9
12 3 2
13 3 10
14 4 3
15 4 1
16 4 5
17 2 8
18 2 6
19 3 4
20 3 7
20行が選択されました。
SQL>
映画のタイトルや監督名、俳優名が英語になっていることがわかります。
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATAプロシージャを実行する際のパラメータとして、表や列のコメントを有効化する設定をして再度実行してみます。
まずは、既存の表データを削除します。
SQL> TRUNCATE TABLE movie_actor;
表が切り捨てられました。
SQL> TRUNCATE TABLE actor;
表が切り捨てられました。
SQL> TRUNCATE TABLE movie;
表が切り捨てられました。
SQL> TRUNCATE TABLE director;
表が切り捨てられました。
SQL>
paramsに{"comments":"TRUE"}を指定して、コメントを有効にしてテストデータを生成してみます。
SQL> BEGIN
2 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
3 profile_name => 'OCI_GENAI',
4 object_list => '[
5 {"owner":"ADMIN", "name":"director","record_count":5},
6 {"owner":"ADMIN", "name":"movie_actor","record_count":20, "user_prompt":"Each movie has several actors"},
7 {"owner":"ADMIN", "name":"actor","record_count":10},
8 {"owner":"ADMIN", "name":"movie","record_count":5, "user_prompt":"all movies released in 2022"}
9 ]',
10 params => '{"comments":"TRUE"}'
11 );
12 END;
13 /
PL/SQLプロシージャが正常に完了しました。
SQL>
生成された各表のデータを確認してみます。
SQL> SELECT * FROM movie;
MOVIE_ID TITLE RELEASE_ GENRE DIRECTOR_ID
---------- ------------------------------------------------------------ -------- -------------------- -----------
1 『アバター』続編 22-12-22 SF 1
2 ブローシャー・ドラマ 22-03-19 ドラマ 4
3 ホラー・マスタークラス 22-10-31 ホラー 5
4 アクション・レジェンド 22-07-04 アクション 2
5 ロマンス・イン・パラダイス 22-02-14 ロマンス 3
5行が選択されました。
SQL> SELECT * FROM director;
DIRECTOR_ID NAME
----------- --------------------
1 佐藤 一郎
2 鈴木 花子
3 高橋 太郎
4 山本 伊織
5 渡辺 隼人
5行が選択されました。
SQL> SELECT * FROM actor;
ACTOR_ID NAME
---------- --------------------
1 伊藤 健太郎
2 佐藤 健
3 綾瀬 はるか
4 長澤 まさみ
5 菅田 将暉
6 広瀬 すず
7 木村 拓哉
8 新垣 結衣
9 竹内 涼真
10 有村 架純
10行が選択されました。
SQL> SELECT * FROM movie_actor;
MOVIE_ACTOR_ID MOVIE_ID ACTOR_ID
-------------- ---------- ----------
1 2 10
2 5 8
3 3 7
4 1 5
5 4 6
6 2 3
7 5 9
8 3 4
9 1 1
10 4 2
11 2 10
12 5 8
13 3 7
14 1 5
15 4 6
16 2 3
17 5 9
18 3 4
19 1 10
20 4 8
20行が選択されました。
SQL>
映画のタイトルや監督名、俳優名のデータが日本語で生成されたことが確認できました。