8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Select AI for Synthetic Data Generationを試してみた

Last updated at Posted at 2024-09-11

はじめに

Oracle Autonomous DatabaseにはSelect AIという自然言語でSQLを実行できる機能があります。
詳しくはこちらをご覧ください。

そんなSelect AIにSynthetic Data Generationが実装されました。

Synthetic Data Generationとは

Synthetic Data Generationは、実際のデータの特徴や構造を模倣した人工的なテストデータを生成するプロセスです。日本語では合成データ生成とも言います。主な特徴と利点は以下の通りです。

主な特徴

  • アルゴリズムやモデルを使用して、実データに基づいた人工的なデータセットを作成する
  • 実データの統計的特性や構造を維持しつつ、個人情報などの機密データは含まない
  • 機械学習モデルの訓練やソフトウェアのテストなどに活用できる

主な利点

  • プライバシー保護: 個人情報を含まないデータを生成できる
  • コスト削減: 実データの収集よりも効率的にデータを作成できる
  • データ拡張: 既存のデータセットを補完・拡張できる
  • テストデータ作成: 新システムのテストに必要なデータを生成できる

今回は以下のブログを参考に、ある表に対してテストデータを作成 (生成)してみます。

テストデータの作成

事前準備

まずはOCI (Oracle Cloud Infrastructure)上にAutonomous Databaseを作成し実行ユーザーを作成します。
手順はこちらの「Autonomous Databaseの作成」、「ユーザー作成」を参考にしてください。

今回はSELECTAIというユーザーでSelect AI for Synthetic Data Generationを試します。

はじめに、ADMINユーザでデータベースに接続し必要な権限をSELECTAIユーザに付与します。

sqlplus ADMIN/xxxxxxxxxx@xxxxxxxx

grant execute on DBMS_CLOUD to SELECTAI;
grant execute on DBMS_CLOUD_AI to SELECTAI;

SELECTAIユーザでデータベースに接続します。

sqlplus SELECTAI/xxxxxxxxxx@xxxxxxxx

表の作成

テストデータを作成するにあたって、データを格納するための表を作成します。
今回はDirector表、Movie表、Actor表、Movie_Actor表を作成します。

CREATE TABLE SELECTAI.Director (
    director_id     INT PRIMARY KEY,
    name            VARCHAR(100)
);

CREATE TABLE SELECTAI.Movie (
    movie_id        INT PRIMARY KEY,
    title           VARCHAR(100),
    release_date    DATE,
    genre           VARCHAR(50),
    director_id     INT,
    FOREIGN KEY (director_id) REFERENCES SELECTAI.Director(director_id)
);

CREATE TABLE SELECTAI.Actor (
    actor_id        INT PRIMARY KEY,
    name            VARCHAR(100)
);

CREATE TABLE SELECTAI.Movie_Actor (
    movie_id        INT,
    actor_id        INT,
    PRIMARY KEY (movie_id, actor_id),
    FOREIGN KEY (movie_id) REFERENCES SELECTAI.Movie(movie_id),
    FOREIGN KEY (actor_id) REFERENCES SELECTAI.Actor(actor_id)
);

各種プロシージャを用いた設定

※今回はOCI Generative AI Serviceを使用します。

クレデンシャルを作成します。

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;
/ 

プロファイルを作成します。

BEGIN  
 DBMS_CLOUD_AI.create_profile(  
     profile_name => 'GENAI',  
     attributes   =>'{"provider":        "oci", 
                      "credential_name": "GENAI_CRED", 
                      "object_list":     [{"owner": "SELECTAI"}]}');  
END;  
/

属性を設定します。

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

データの作成

まずはDirector表のデータを作成します。
ここではrecord_countに5を指定することで、5行分のテストデータを作成します。

BEGIN
    DBMS_CLOUD_AI.generate_synthetic_data(
        profile_name => 'GENAI',
        object_name  => 'Director',
        owner_name   => 'SELECTAI',
        record_count => 5 );
END;
/

作成されたデータを確認します。

SQL> SELECT * FROM SELECTAI.Director;

"DIRECTOR_ID","NAME"
1,"John Smith"
2,"Emily Johnson"
3,"Michael Brown"
4,"Sarah Lee"
5,"David Kim"

5行分のデータが作成されたことを確認できました。
Select AIを使ってDirectorの数を聞いてみます。

SQL> SELECT AI how many directors are there;

"NUMBER_OF_DIRECTORS"
5

想定していた通りの回答が返ってきました。

次は複数の表 (Director表、Movie表、Actor表、Movie_Actor表)に対してデータを作成してみます。

Movie表のデータを作成するにあたって、"all movies released in 2009"という指示をしています。

BEGIN
  DBMS_CLOUD_AI.generate_synthetic_data(
    profile_name => 'GENAI',
    object_list => '[{"owner": "SELECTAI", "name": "Director","record_count":5},
                     {"owner": "SELECTAI", "name": "Movie_Actor","record_count":5},
                     {"owner": "SELECTAI", "name": "Actor","record_count":10},
                     {"owner": "SELECTAI", "name": "Movie","record_count":5,"user_prompt":"all movies released in 2009"}]' );
END;
/

作成されたデータを確認するためMovie表を見てみます。

SQL> select * from SELECTAI.Movie;

"MOVIE_ID","TITLE","RELEASE_DATE","GENRE","DIRECTOR_ID"
1,"The Hangover","01-JAN-09","Comedy",5
2,"Inglourious Basterds","20-AUG-09","Action",10
3,"Up in the Air","04-SEP-09","Drama",6
4,"The Blind Side","20-NOV-09","Biography",9
5,"Avatar","18-DEC-09","Science Fiction",1

RELEASE_DATEが2009年になっていることが確認できます。

最後にSelect AIを使ってActorの数を聞いてみます。

SQL> SELECT AI how many actors are there;

"Number of Actors"
10

想定していた通りの回答が返ってきました。

まとめ

Select AI for Synthetic Data Generationを使ってテストデータを作成 (生成)してみました。
社内検索用途でSelect AIを試してみたいけどプライバシーの観点で実際のデータを使って試せないといった際には、実データを模したデータを作成しSelect AIを試してみてはいかがでしょうか。

参考

8
4
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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?