はじめに

みなさん、こんにちは。
AI検証チームの宮井です。

今回は、OCI (Oracle Cloud)の Autonomous Database に搭載されている「SELECT AI」の機能を試してみました。
SELECT AIはLLMを使用して、自然言語でSQLクエリが実行できるようになります。
SQLに知見がない方でも直感的にデータベースを操作できるようになるのは便利ですね。

検証の流れは、SELECT AIの合成データを作成する機能を用いて、サンプルデータを作成し、作成したデータへのSELECT AIを試す形になっています。

記事作成に当たって、マニュアルおよび以下の記事を参考にさせていただきました。
Select AIの使用例
111: SELECT AIを試してみよう | Oracle Cloud Infrastructure チュートリアル

ユーザ作成と権限付与

まずは、事前準備です。
AI機能を使うための専用ユーザ(select_ai_test)を作成し、必要な権限を付与します。adminユーザで実行します。

SQL> GRANT DWROLE, UNLIMITED TABLESPACE TO select_ai_test IDENTIFIED BY "*****";

権限付与が成功しました。

SQL> GRANT EXECUTE ON DBMS_CLOUD_AI TO select_ai_test;

権限付与が成功しました。

ネットワークアクセス制御リスト(ACL)を作成したユーザに対し、設定します。
今回、Open AIのAPIを使用しました。

SQL> BEGIN
  2      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  3           host => 'api.openai.com',
  4           ace => xs$ace_type(privilege_list => xs$name_list('http'),
  5                               principal_name => 'select_ai_test',
  6                               principal_type => xs_acl.ptype_db)
  7     );
  8  END;
  9  /

PL/SQLプロシージャが正常に完了しました。

AIプロファイル作成

次に作成したユーザに接続し、商品情報を管理するproducts_newテーブルを用意しておきます。

SQL> CREATE TABLE products_new (
  2      product_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
  3      product_name VARCHAR2(100),
  4      category VARCHAR2(50),
  5      price NUMBER(10, 2),
  6      stock_quantity NUMBER,
  7      created_at DATE DEFAULT SYSDATE
  8  );

表が作成されました。

OpenAIのAPIを利用するための認証情報(クレデンシャル)を作成します。
ここで設定したアクセストークンは、OpenAIのAPI利用に必要な認証情報です。実際の環境では適切なトークンを設定してください。

SQL> declare
  2    jo json_object_t;
  3  begin
  4    jo := json_object_t();
  5    jo.put('access_token', '*****');
  6    dbms_vector_chain.create_credential(
  7      credential_name => 'OPENAI_CRED',
  8      params => json(jo.to_string));
  9  end;
 10  /

PL/SQLプロシージャが正常に完了しました。

AI機能を利用するためのAIプロファイルを作成します。
こちらに先ほど作成したクレデンシャルや、使用するLLMのモデル、対象とするテーブル名などを指定します。

SQL> BEGIN
  2      DBMS_CLOUD_AI.CREATE_PROFILE(
  3          'OPENAI',
  4          '{
  5              "provider": "openai",
  6              "credential_name": "OPENAI_CRED",
  7              "model":"gpt-4.1-nano",
  8              "comments":"true",
  9              "object_list": [
 10                      {"owner": "select_ai_test", "name": "products_new"}
 11              ]
 12          }'
 13      );
 14  END;
 15  /

PL/SQLプロシージャが正常に完了しました。

作成したプロファイルを有効にするため、以下のコマンドを実行します。

EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI');

AIを使った合成データの生成

商品テーブルに合成データを30件生成してみます。
この機能を利用すれば、実際のデータがなくてもテストや検証が可能ですね。

SQL> BEGIN
  2      DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
  3          profile_name => 'OPENAI',
  4          object_name => 'products_new',
  5          owner_name => 'select_ai_test',
  6          record_count => 30
  7      );
  8  END;
  9  /

PL/SQLプロシージャが正常に完了しました。

生成されたデータを確認すると、英語の商品名やカテゴリが自動で作成されていました。

SQL> SELECT * FROM products_new;
PRODUCT_ID PRODUCT_NAME              CATEGORY                    PRICE STOCK_QUANTITY CREATED_
---------- ------------------------- ------------------ ---------- -------------- --------
         1 UltraSoft Pillow          Home & Living      29.99            150 24-01-15
         2 EcoFriendly Water Bottle  Sports & Outdoors  15.49            300 23-12-05
         3 Smart LED Desk Lamp       Electronics        45                75 24-02-20
         4 Organic Green Tea         Grocery            12.75            200 23-11-30
***省略***

ただ、日本語データが欲しかったため、一旦データは削除し、今度は「商品名とカテゴリを日本語にしてください」というプロンプトを指定して、合成データを生成します。

SQL> truncate table products_new;

表が切り捨てられました。

SQL> select * from products_new;

レコードが選択されませんでした。

SQL> BEGIN
  2      DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
  3          profile_name => 'OPENAI',
  4          object_name => 'products_new',
  5          owner_name => 'select_ai_test',
  6          user_prompt => 'product_nameおよびはcategoryは日本語にしてください',
  7          record_count => 30
  8      );
  9  END;
 10  /

PL/SQLプロシージャが正常に完了しました。

今度は、以下のように日本語の商品名やカテゴリで出力されました!
このようにプロンプトで指示を与えることで期待するデータに近づけることができます。

サンプルデータの作成は以上です。

SQL> select * from products_new;

PRODUCT_ID PRODUCT_NAME              CATEGORY                  PRICE STOCK_QUANTITY CREATED_
---------- ------------------------- -------------------- ---------- -------------- --------
         1 ノートパソコン            電子機器                  85000             15 24-01-15
         2 スマートフォン            電子機器                  60000             30 24-02-10
         3 デジタルカメラ            電子機器                  45000             20 24-01-20
         4 有機野菜セット            食品                       3500             50 24-03-05
         5 緑茶ティーバッグ          食品                       1200            100 24-02-25
         6 和風照明ランプ            家具                       7800             10 24-01-30
         7 木製ダイニングテーブル    家具                      45000              5 24-02-15
         8 革製財布                  ファッション              12000             25 24-03-01
         9 シルクスカーフ            ファッション               8000             40 24-01-18
        10 ランニングシューズ        スポーツ用品              15000             35 24-02-20
        11 ヨガマット                スポーツ用品               3000             60 24-03-10
        12 子供用絵本セット          書籍                       2500             80 24-01-22
        13 ビジネス書籍              書籍                       1800             70 24-02-05
        14 高級万年筆                文房具                     9000             12 24-01-28
        15 カラーペンセット          文房具                     1500            100 24-03-12
        16 電動歯ブラシ              健康用品                   7000             30 24-02-18
        17 マッサージクッション      健康用品                  12000             20 24-01-25
        18 防水スマートウォッチ      電子機器                  22000             18 24-03-08
        19 折りたたみ傘              日用品                     2500             45 24-02-12
        20 加湿器                    日用品                     8000             22 24-01-19
        21 和風掛け軸                インテリア                15000              8 24-03-03
        22 陶器の花瓶                インテリア                12000             10 24-02-22
        23 子供用自転車              スポーツ用品              18000             15 24-01-27
        24 キャンプ用テント          アウトドア                25000              7 24-03-07
        25 登山用リュック            アウトドア                14000             20 24-02-28
        26 手作り和菓子セット        食品                       3200             40 24-01-23
        27 日本酒セット              食品                       5500             25 24-03-11
        28 革製ビジネスバッグ        ファッション              22000             18 24-02-14
        29 ウールセーター            ファッション              13000             30 24-01-21
        30 電子辞書                  電子機器                  15000             28 24-03-06

30行が選択されました。

SELECT AIの確認

サンプルデータが作成できましたので、いよいよ自然言語でSQLを実行してみます。
実行はSELECT AIに自然言語を記載するのみで非常に簡単です。

SQL> select ai 1万円以下の商品を教えて;

 ProductID ProductName                                                                                                      Price
---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------
         4 有機野菜セット                                                                                                    3500
         5 緑茶ティーバッグ                                                                                                  1200
         6 和風照明ランプ                                                                                                    7800
         9 シルクスカーフ                                                                                                    8000
        11 ヨガマット                                                                                                        3000
        12 子供用絵本セット                                                                                                  2500
        13 ビジネス書籍                                                                                                      1800
        14 高級万年筆                                                                                                        9000
        15 カラーペンセット                                                                                                  1500
        16 電動歯ブラシ                                                                                                      7000
        19 折りたたみ傘                                                                                                      2500
        20 加湿器                                                                                                            8000
        26 手作り和菓子セット                                                                                                3200
        27 日本酒セット                                                                                                      5500

14行が選択されました。

このように価格が1万円以下の商品が一覧で表示されました!

また、別の問い合わせを実施してみます。

SQL>  select ai 2024年1月に発売された商品はありますか?;

 ProductID ProductName                                                                                                         CreatedA
---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
         1 ノートパソコン                                                                                                      24-01-15
         3 デジタルカメラ                                                                                                      24-01-20
         6 和風照明ランプ                                                                                                      24-01-30
         9 シルクスカーフ                                                                                                      24-01-18
        12 子供用絵本セット                                                                                                    24-01-22
        14 高級万年筆                                                                                                          24-01-28
        17 マッサージクッション                                                                                                24-01-25
        20 加湿器                                                                                                              24-01-19
        23 子供用自転車                                                                                                        24-01-27
        26 手作り和菓子セット                                                                                                  24-01-23
        29 ウールセーター                                                                                                      24-01-21

11行が選択されました。

SELECT AIにはアクションというものを設定することが可能になってます。

runsql(デフォルト) LLMによって生成されたSQLを実行し、結果を返します。
showsql LLMによって生成されたSQL文を表示します。実行はされません。
narrate LLMによって生成されたSQLを実行し、結果を自然言語で返します。
chat SQLは実行せず、LLMへの問い合わせのみを行います。
explainsql SQL文の解説を行います。試してみたら結果は英語表示でした。

では、先ほどのSQLに対し、「SHOWSQL」オプションを試してみます。
このオプションは実際にAIが生成したデータが正しいか確認したいときや、実行したSQLを再度実行したい場合などに利用できそうですね。

SQL>  select ai showsql 2024年1月に発売された商品はありますか?;

RESPONSE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT "p"."PRODUCT_ID" AS "ProductID", "p"."PRODUCT_NAME" AS "ProductName", "p"."CREATED_AT" AS "CreatedAt" FROM "SELECT_AI_TEST"."PRODUCTS_NEW" "p" WHERE "p"."CREATED_AT" >= TO_DATE('2024-01-01', 'YYYY-MM-DD') AND "p"."CREATED_AT" < TO_DATE('2024-02-01', 'YYYY-MM-DD')

また、会話を対話形式で行うことも可能になっています。
まずは、AIプロファイルを一度削除し、会話履歴を保持するために、conversation : trueという設定を追加します。
これにより、複数の質問を連続して行い、文脈を踏まえた回答が得られます。

SQL> BEGIN
  2    DBMS_CLOUD_AI.DROP_PROFILE(profile_name=> 'OPENAI');
  3  END;
  4  /

PL/SQLプロシージャが正常に完了しました。

SQL>
SQL> BEGIN
  2      DBMS_CLOUD_AI.CREATE_PROFILE(
  3          'OPENAI',
  4          '{
  5              "provider": "openai",
  6              "credential_name": "OPENAI_CRED",
  7              "model":"gpt-4.1-nano",
  8              "comments":"true",
  9              "conversation":"true",
 10              "object_list": [
 11                      {"owner": "select_ai_test", "name": "products_new"}
 12              ]
 13          }'
 14      );
 15  END;
 16  /

PL/SQLプロシージャが正常に完了しました。

SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI');

PL/SQLプロシージャが正常に完了しました。

では試してみます。
2024年1月1日から1月20日までに発売された商品を聞き、その商品の中で日用品のカテゴリを聞いてみます。

SQL> set long 2000
SQL> select ai narrate 2024年1月1日から1月20日までに発売された商品はありますか?;

RESPONSE
--------------------------------------------------------------------------------
はい、以下の商品が2024年1月1日から1月20日までに発売されました。
1. ノートパソコン(発売日:2024年1月15日)
2. デジタルカメラ(発売日:2024年1月20日)
3. シルクスカーフ(発売日:2024年1月18日)
4. 加湿器(発売日:2024年1月19日)

SQL> select ai naratte その中で日用品はありますか?;

 ProductID ProductName                                                                                                         Category
---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
        19 折りたたみ傘                                                                                                        日用品
        20 加湿器                                                                                                              日用品

しっかり意図通りの回答が得られました!
最初にした質問を反映した回答になってますね。

まとめ

いかがでしたでしょうか?
今回はSELECT AI機能を検証してみました。
次回のOracle×AI Trialsもお楽しみに!

生成AIに関する記事は随時更新予定です。是非次回もご覧ください。

投稿者プロフィール

宮井 聡
宮井 聡
Oracle Database、Oracle Cloud、生成AIに関するエンジニア兼プリセールスなどを担当しています。
社内のOCI検証チームのとりまとめやAI検証チームの技術リーダーをしています。
資格はOracle Cloud Infrastructure Architect Professional 2023等を取得しています。