Database Support Blog

  • Oracle Database
  • Oracle Cloud
2024.12.23

Autonomous Database 23ai 新機能!Select AIでSQLやデータを自動生成!

Oracle Database 23aiでは、生成AIに関連する新機能が多く追加されました。
その中でもAutonomous Database 23ai の「Select AI」では、生成AIの一種である大規模言語モデル(LLM)を使用して、自然言語による問い合わせや、テストデータの自動生成が可能となりました。

画像1:Select AIイメージ


本記事ではSelect AIの機能について、検証結果を交えてご紹介します!

Select AIを使うための事前準備

Select AIはAutonomous Databaseのみで提供されている機能です。
今回は検証のために、Always Free(Autonomous Databaseを無償で利用できるサービス)で環境を準備しました。以下はAutonomous Database作成後の実施内容です。

1.権限付与

今回はTESTユーザーでSelect AIを使用します。TESTユーザーにSelect AIの実行に必要な権限を付与します。

SQL> GRANT EXECUTE ON DBMS_CLOUD to test;
SQL> GRANT EXECUTE ON DBMS_CLOUD_AI to test;

2.資格証明登録

Select AIで使用するAIプロバイダにアクセスするための資格証明を登録します。資格証明の作成に必要な、ユーザーOCIDなどの情報はOracle Cloudのコンソールから確認します。

SQL> BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'GENAI_CRED', --任意の資格証明の名前
user_ocid => '<ユーザーOCID>',
tenancy_ocid => '<テナンシOCID>',
private_key => '<プライベートキー>',
fingerprint => '<フィンガープリント>'
);
END;
/
PL/SQL プロシージャが正常に完了しました。

3.AIプロファイルの作成

AIプロファイルを作成し、Select AIで使用するAIプロバイダ(今回はOCI生成AIサービスを使用)やLLMモデルを設定します。
※AIプロバイダには、OCI生成AIやOpenAI、Cohereなどを指定できます。

SQL> BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
'GENAI_PROFILE',
'{"provider": "oci", --使用するAIプロバイダ
"model": "cohere.command-r-plus",  --使用するLLMモデル
"credential_name": "GENAI_CRED",
"object_list":
[{"owner": "TEST"}],
"comments": "true"
}'
);
END;
/
PL/SQL プロシージャが正常に完了しました。
/* 作成したAIプロファイルをセッションで有効化 */ SQL> EXECUTE DBMS_CLOUD_AI.SET_PROFILE('GENAI_PROFILE');
PL/SQL プロシージャが正常に完了しました。

以上でSelect AIを利用するための事前準備は完了です。

自然言語によるSQLの生成

事前に商品マスタ表や販売実績表など計10個の表を準備しました。
売上データ分析のためのデータ取得を想定して、これらの表に対して自然言語で問い合わせを実行してみます。

画像2:問い合わせイメージ


以下は、「売上額が最も高い商品は?」と自然言語で問い合わせた結果です。10個の表から適切な表や列を選択し、結合やGROUP BY句を使用して正しい結果が出力されました。

/* 自然言語からSQLを生成・実行 */
SQL> SELECT AI 売上額が最も高い商品は?;

PRODUCT_NAME TOTAL_SALES
------------------------------ -----------
ソファベッド 5440000
/* 自然言語で生成されたSQL文を確認 */ SQL> SELECT AI SHOWSQL 売上額が最も高い商品は?;
RESPONSE
--------------------------------------------------------------------------------
SELECT p."PRODUCT_NAME", SUM(s."AMOUNT_SOLD") AS "TOTAL_SALES"
FROM "TEST"."SALES" s
JOIN "TEST"."PRODUCT" p ON s."PRODUCT_ID" = p."PRODUCT_ID"
GROUP BY p."PRODUCT_NAME"
ORDER BY "TOTAL_SALES" DESC
FETCH FIRST 1 ROW ONLY

次にもう少し複雑な例として、「2022年と2023年を比較して、女性の売上増加率が高い商品トップ10は?」と問い合わせてみます。

SQL> SELECT AI 2022年と2023年を比較して、女性の売上増加率が高い商品トップ5は?;
PRODUCT_NAME INCREASE_RATE
-------------------- -------------
壁掛け時計 220
背もたれクッション 175
ボイルカーテン 166.666667
サイドボード 157.142857
ビーズクッション 140
SQL> SELECT AI SHOWSQL 2022年と2023年を比較して、女性の売上増加率が高い商品トップ5は?;
RESPONSE
---------------------------------------------------------------------------------------------------------------------------
WITH sales_2022 AS (
SELECT p."PRODUCT_NAME", SUM(s."AMOUNT_SOLD") AS sales_2022
FROM "TEST"."SALES" s
JOIN "TEST"."CUSTOMER" c ON s."CUSTOMER_ID" = c."CUSTOMER_ID"
JOIN "TEST"."PRODUCT" p ON s."PRODUCT_ID" = p."PRODUCT_ID"
WHERE c."GENDER" = '女' AND EXTRACT(YEAR FROM s."ORDER_DATE") = 2022
GROUP BY p."PRODUCT_NAME"
),
sales_2023 AS (
SELECT p."PRODUCT_NAME", SUM(s."AMOUNT_SOLD") AS sales_2023
FROM "TEST"."SALES" s
JOIN "TEST"."CUSTOMER" c ON s."CUSTOMER_ID" = c."CUSTOMER_ID"
JOIN "TEST"."PRODUCT" p ON s."PRODUCT_ID" = p."PRODUCT_ID"
WHERE c."GENDER" = '女' AND EXTRACT(YEAR FROM s."ORDER_DATE") = 2023
GROUP BY p."PRODUCT_NAME"
)
SELECT s2."PRODUCT_NAME", (s2.sales_2023 - s1.sales_2022) / s1.sales_2022 * 100 AS increase_rate
FROM sales_2022 s1
JOIN sales_2023 s2 ON s1."PRODUCT_NAME" = s2."PRODUCT_NAME"
ORDER BY increase_rate DESC
FETCH FIRST 5 ROWS ONLY

こちらも正しい結果が返ってきました。WITH句内の副問い合わせで各年の売上額を出し、
「(s2.sales_2023 - s1.sales_2022) / s1.sales_2022 * 100 AS increase_rate」の計算式で売上増加率まで求めています。

生成されるSQLの精度を上げるには

ここまでで、Select AIによって自然言語で簡単にデータの問い合わせができることを確認できました。

しかし、実は上記の問い合わせは、初回実行時には正しいSQLが生成されずエラーとなりました。初回で生成されたSQLでは「WHERE c."GENDER" = '女性'」と指定されていたのですが、GENDER列の実際のデータは”女性”ではなく”女”と登録されていたためです。
SQLの精度を上げるためには、以下のように表や列にコメントを追加すれば、コメントの内容を考慮したSQLが生成されます。

SQL> COMMENT ON COLUMN customer.gender IS '性別の列で、値は「男」もしくは「女」';
コメントが作成されました。

このように、Select AIが生成するSQLが必ずしも正しいとは限らない、という点は注意が必要です。生成されたSQLや結果が正しいかは、ユーザー側で判断する必要があります。

テストデータの生成

続いて、Select AIによるテストデータの生成を試してみます。
テストデータの生成はSelect AIの機能の1つ(Select AI for Synthetic Data Generation)で、スキーマの情報や自然言語の指示などをもとに、実データに近いテストデータを生成してくれます。

今回はテストデータを作成する表として、NAME列とEMAIL列で構成されたEMPLOYEE表を作成しました。

SQL> DESCRIBE employee 

Name Null? Type
-------------------------- -------- ----------------------------
NAME VARCHAR2(100)
EMAIL VARCHAR2(100)

テストデータの生成には、DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATAプロシージャを使用します。以下では、EMPLOYEE表に5行分のデータを生成するよう指定したところ、名前やメールアドレスのデータが自動で生成されました。

SQL> BEGIN
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
profile_name => 'GENAI_PROFILE', --使用するAIプロファイル
object_name => 'EMPLOYEE', --オブジェクト名
owner_name => 'TEST', --ユーザー名
record_count => 5);  --生成するテストデータの件数
END;
/
PL/SQL プロシージャが正常に完了しました。
SQL> SELECT * FROM employee; NAME EMAIL
---------- -------------------------
Alice alice@example.com
Bob bob@example.com
Charlie charlie@example.com
David david@example.com
Eve eve@example.com

GENERATE_SYNTHETIC_DATAプロシージャ実行時に自然言語で追加情報を記述して、生成したいデータの細かい指示を出すこともできます。
次の例は、以下の追加情報を指定した結果です。
 ・従業員名は日本語でフルネーム
 ・メールアドレスの形式は<名前の頭文字1字>.<苗字>@example.com
※表や列のコメントでも追加情報を付与できます。

SQL> BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI_PROFILE',
object_name => 'EMPLOYEE',
owner_name => 'TEST',
record_count => 5,
user_prompt => '従業員名は日本語でフルネーム。メールアドレスの形式は<名前の頭文字1字>.<苗字>@example.com。' ,
END;
/
PL/SQL プロシージャが正常に完了しました。
SQL> select * from employee; NAME EMAIL
---------- ------------------------------
中村 花子 n.nakamura@example.com
鈴木 一郎 i.suzuki@example.com
佐藤 次郎 j.satou@example.com
田中 三郎 s.tanaka@example.com
山本 四郎 s.yamamoto@example.com

1回目に生成されたテストデータと比較すると、追加情報を考慮したテストデータが作成されたことが分かります。
また、より実データに近づけるために「メールアドレスのドメインは実在するもの」と情報を追加して実行もしてみましたが、意図したテストデータを生成することができました。

このようにSelect AIでは実データを模したテストデータを簡単に生成することができます。


まとめ

Autonomous Database 23aiのSelect AIによる、SQLとテストデータの自動生成についてご紹介しました。

SQLに生成AIが取り入れられたことで、開発者はSQLコーディングのヒントを得たり、テスト時のデータ準備にかかる工数を削減することができます。
また、SQLに詳しくないユーザー部門の方も、データベースから自然言語で最新データを取り出せるようになれば、データ活用の可能性が一層拡がりそうですね。

一方で、Select AIは生成AIを使用しているため、必ずしも正しい結果を返すわけではありません。自然言語での聞き方を工夫したり、基本的なSQLやテーブル構成を理解してSelect AIを上手に活用していきましょう。

アシストではSQL習得をはじめとした、Oracle Databaseの様々な研修を用意しています。他にもOracle Databaseの最新情報やリプレースのご相談など、お気軽にアシストまでお問い合わせください。


執筆者情報

かじやま あさこ プロフィール画像

2015年入社後、Oracle Databaseのフィールドエンジニアとして構築支援などに従事。
現在はデータベース研修の講師/運営/企画を担当。趣味は最近始めたヨガ。...show more


■本記事の内容について
 本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。

■商標に関して
 ・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
 ・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
  文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • Oracle Database
2024.12.20

RMANで表単位リカバリをする際の注意点(RMAN-06024)

RMANを使って表単位リカバリをする際には制御ファイルのバックアップにも注意する必要があります。世代管理の設定次第では意図せずリカバリができないことがあるため、注意点をお伝えします。

  • Oracle Cloud
  • Oracle Database
2024.12.17

Oracle Cloud VMware SolutionでVMware HCXを利用するための準備

前回の記事では、HCXの概要をお伝えしました。今回はOCVSでHCXを利用するための検討ポイントや前提事項を説明します!

  • AWS
  • Oracle Cloud
  • Oracle Database
  • Exadata
2024.12.13

全オラクルユーザー待望のあのサービス!Oracle Database@AWS解析白書①

今年9月にラスベガスで開催された「Oracle CloudWorld 2024」。その中で発表されたニュースの中でも一番の注目を集めたのが「Oracle Database@AWS」。今後大注目の『Oracle Database@AWS』に関して、これまでのオラクル社のマルチクラウド対応の歴史なども踏まえてご紹介します。

ページの先頭へ戻る