Autonomous Database：SELECT AI for Synthetic Data Generationで日本語のテストデータを自動生成を試してみた

# はじめに
Autonomous Databaseに「SELECT AI for Synthetic Data Generation」という、AIを使用してテストデータを自動生成する機能が追加されました。
そこで今回は、「SELECT AI for Synthetic Data Generation」を使用して、日本語のテストデータを生成できるかを検証してみました。

# 1. 事前準備

テストデータ生成の対象となる表を作成します。
今回は、director、movie、actor、movie_actorの４つの表を作成しました。
```
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へのアクセスにリソース・プリンシパルを使用しました。
リソース・プリンシパルを有効化する手順は、こちらのマニュアルに記載があります。

https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/serverless/adbsb/resource-principal.html

```
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> 
```

映画のタイトルや監督名、俳優名のデータが日本語で生成されたことが確認できました。

# 参考情報
・[Synthetic Data Generation](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/synthetic-data-generation.html#GUID-ED698264-97CD-44B4-A640-CFB4FBF892BE)