ORACLE、Microsoft、OpenAIの3社は提携を発表し、OpenAIにさらなる AIインフラのキャパシティを提供するために、OpenAIが利用するプラットフォームを Microsoft Azureに加えて Oracle Cloud Infrastructure (OCI) へ拡大することを発表しました。
OpenAI が提供する人工知能の API(Application Programming Interface)を使用して Oracle の Select AI を実行することができます。
Oracle Autonomous Database Select AIを使用すると、「最も売れた商品はどれだけ売れましたかしら?」のような自然言語を使用してデータを問い合せることができます。
生成 AI 大規模言語モデル (LLM) と Oracle SQL を組み合わせることで、 必要なもの(宣言的意図) を記述し、データベースがスキーマに関連する SQL クエリを生成するようになります。
LLM は膨大な量のテキスト データでトレーニングされているため、ほとんどの自然言語クエリのニュアンスや意図された意味を理解できます。自然言語を使用して SQL を生成すると、クエリの生成に必要な時間が短縮され、クエリの構築が簡素化され、SQL の専門知識を最小限に抑えたり、排除したりするのに役立ちます。自然言語を使用すると、複数の結合、ネストされたサブクエリ、その他の SQL 構造を含むクエリの作成を伴うデータベースからの情報の取得がはるかに簡単かつ迅速になります。分析ツールを使用すると、データベース データのクエリと理解が容易になりますが、自然言語プロンプトを使用して SQL データベースを操作する機能により、SQL のエキスパートと非エキスパートのユーザーがクエリを作成せずにデータベースをクエリできるため、生産性が向上します。
この機能を有効にするには、Autonomous Database の新しいパッケージ DBMS_CLOUD_AIを使用します。これにより、自然言語プロンプトから SQL を生成するための LLM の使用が可能になります。このパッケージは、ユーザーがアクセス可能なデータベース メタデータの知識とともに、ユーザー指定の LLM へのアクセスを提供します。これにより、そのスキーマに適用で実行可能な SQL クエリを生成できます。
また、Oracle の Select AIを、OpenAI、Cohere、Azure Open AI、OCI Generative AIなどのさまざまな AIプロバイダと統合して、自然言語から直接SQL問合せを生成することができます。
ということで、OpenAI が提供する人工知能の API(Application Programming Interface)を使用して Select AI してみてみます。
■ OpenAI API Key取得
OpenAIが自然言語プロンプトからSQLを生成できるようにするには、OpenAI有料アカウントからAPIキーを取得します。
秘密APIキーは、「ユーザー設定」にあります。
● OpenAI Login
1) OPEN AI Login
https://platform.openai.com/login へアクセスしてログイン
3) Overview画面
右上にあるユーザーアイコンをクリックし、[Your profile]をクリック
4) Your profile画面
[+ Create new secret key]をクリック
5) Create new secret key画面
Nameを設定し、[Create secret key]をクリック
6) Save your key画面
[copy]をクリックして作成された secret keyをコピーしてメモして保存しておきます。
7) API keys画面
新しくSECRET KEYが作成されたことを確認
■ Autonomous Database作成
今回、Autonomous Data Warehouseを作成します。
● Autonomous Data Warehouse作成
1) OCI コンソール画面
Oracle Cloud Infrastructure (OCI) へログインし、リストメニューから [Oracle Database] > [Autonomous Databases] を選択
2) Autonomous Databases画面
[Create Autonomous Database]をクリック
3) Create Autonomous Database画面
次のように入力し、Autonomous Data Warehouseを作成
4) Autonomous Data Warehouse作成完了
● Database Client設定
1) SQLclインストールと Autonomous Database接続
Autnomous Databaseへ接続するため 接続PCへ Database Clientをインストールして接続します。
今回は、SQLclを使用して接続してみてみます。
SQLcl を使用して Walletなしの TLS認証で Oracle Autonomous Databaseに接続
2) Database Clientの日本語表示設定
Select AIで日本語入力できるように NLS_LANGを日本語対応にします。
OSの文字コードに合わせて設定します。
・ 環境変数設定例
[opc@tokyo-inst ~]$ export NLS_LANG=Japanese_Japan.AL32UTF8
[opc@tokyo-inst ~]$ env | grep LAN
LANG=en_US.UTF-8
NLS_LANG=Japanese_Japan.AL32UTF8
ORACLE関連の環境変数を .bash_profile等へ設定しておくとログイン時に自動設定されます。
・ bash_profile設定例
[opc@tokyo-inst ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export ORACLE_BASE=$HOME/oracle
export ORACLE_HOME=$HOME/oracle/instantclient_21_11
export PATH=$PATH:$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=Japanese_Japan.AL32UTF8
#export NLS_LANG=AMERICAN_AMERICA.UTF8
alias cdn='cd $TNS_ADMIN'
■ Select AI設定
● ユーザの作成とロール/権限の付与
Select AIするユーザーを作成して、Select AIできるように設定します。
1) sqlcl接続
[opc@tokyo-inst ~]$ sql admin/Password@ADW
SQLcl: Release 24.2 Production on Wed Aug 21 01:45:05 2024
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Last Successful login time: Wed Aug 21 2024 01:45:06 +00:00
Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - Production
Version 23.6.0.24.07
SQL>
2) adb_user作成
SQL> CREATE USER adb_user IDENTIFIED BY Password;
User ADB_USER created.
SQL> GRANT DWROLE, UNLIMITED TABLESPACE TO adb_user;
Grant succeeded.
SQL> SELECT * FROM dba_sys_privs where GRANTEE='ADB_USER';
GRANTEE PRIVILEGE ADMIN_OPTION COMMON INHERITED
___________ _______________________ _______________ _________ ____________
ADB_USER UNLIMITED TABLESPACE NO NO NO
● DBMS_CLOUD_AI パッケージへのアクセス権を付与
Select AI の使用を開始するには、管理者権限で Autonomous Database インスタンスにサインインし、ユーザー (ここでは ADB_USER) を ACL リストに追加して、DBMS_CLOUD_AI パッケージへのアクセス権を付与します。
1) adb_userに対して、OpenAIのAPIのホストapi.openai.comに対するHTTPアクセスを許可
SQL> BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'ADB_USER',
principal_type => xs_acl.ptype_db)
);
END;
/
PL/SQL procedure successfully completed.
2) SELECT AI機能の利用に必要なDBMS_CLOUD_AIパッケージの実行権限を付与
SQL> GRANT EXECUTE ON DBMS_CLOUD_AI TO adb_user;
Grant succeeded.
SQL> SELECT * FROM USER_TAB_PRIVS where GRANTEE='ADB_USER';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY COMMON TYPE INHERITED
___________ ___________________ ________________ __________ ____________ ____________ ____________ _________ __________ ____________
ADB_USER C##CLOUD$SERVICE DBMS_CLOUD_AI ADMIN EXECUTE NO NO NO PACKAGE NO
● SELECT AIで OpenAIを利用するための準備
AI プロバイダー アカウントへのデータベース資格情報を作成します。OpenAI の場合、パスワードは API 使用のために一意に生成されたトークンです。
1) adb_userとして Autonomous Databaseに接続
SQL> conn adb_user/Password@ADW
Connected.
SQL> show user
USER is "ADB_USER"
2) AI プロバイダー アカウントへのデータベース資格情報作成
AI プロバイダー アカウントへのデータベース資格情報を作成します。OpenAI の場合、パスワードは API 使用のために一意に生成されたトークンです。
BMS_CLOUD.CREATE_CREDENTIALプロシージャで、OpenAIのAPIに接続するためのクレデンシャルopenai_credを作成します。
パスワードには、OpenAIのサイドで取得したAPIキーの値を設定します。
SQL>
BEGIN
DBMS_CLOUD.DROP_CREDENTIAL (
credential_name => 'OPENAI_CRED');
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => 'sk-p2uycd5lYVQBtLPRpTf3zZ8XCksyPLqK3|udqWxsRwT7ltOBDPMQpsA'
);
END;
/
PL/SQL procedure successfully completed.
3) DBMS_CLOUD_AI プロファイル作成
DBMS_CLOUD_AI プロファイルを作成します。ここでは、考慮するスキーマ (SH など) と、オプションでテーブル (顧客、売上など) をリストします。
DBMS_CLOUD_AI.CREATE_PROFILEプロシージャで、SELECT AIで使用するAIプロファイルopenaiを作成します。
・ profile_name: AIプロファイルの名前
・ credential_name: AIプロバイダAPIにアクセスするための資格証明の名前、先ほど作成したOpenAIのAPIに接続するためのクレデンシャルを指定
・ object_list: SQLへの自然言語変換に適格な所有者名およびオブジェクト名を指定するJSONオブジェクトの配列、このプロファイルで使用するスキーマ・オブジェクトの所有者とオブジェクト名を指定します。
この例では、Autonomous Databaseにデフォルトで用意されているサンプルスキーマSH内にあるcustomers、sales、produces、countriesの4つの表をこのプロファイルで使用するオブジェクトとして登録しています。
SQL>
BEGIN
DBMS_CLOUD_AI.drop_profile(profile_name => 'OPENAI');
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OPENAI',
attributes => '{"provider": "openai",
"credential_name": "OPENAI_CRED",
"object_list": [{"owner": "SH", "name": "customers"},
{"owner": "SH", "name": "sales"},
{"owner": "SH", "name": "products"},
{"owner": "SH", "name": "countries"}]
}'
);
END;
/
PL/SQL procedure successfully completed.
Sales History (SH)サンプル・スキーマは、サンプルの会社での販売(Sales)部門でビジネス上の判断に役立つ事業統計を管理しており、年、四半期、月、週ごとの売上げが製品別に蓄積されたデータを意思決定支援のために事業統計レポートを作成できるように過去のデータ傾向を分析できる大量のデータを使用するデモ向けに設計されています。
SHサンプル・スキーマのオブジェクトや表は次から確認できます。
・ SHサンプル・スキーマのスクリプトおよびオブジェクト
・ SHサンプル・スキーマの表の説明
これで、最初の Select AI プロンプトを呼び出す準備が整いました。
■ SELECT AI機能を使用した自然言語によるクエリ実行
DBMS_CLOUD_AIへ登録した SHスキーマにあるテーブルから自然言語で問い合わせてみてみます。
● 英語で実行
1) DBMS_CLOUD_AI.SET_PROFILEプロシージャ
DBMS_CLOUD_AI プロファイルを設定します。これは、各データベース セッションで実行する必要があります。
DBMS_CLOUD_AI.SET_PROFILEプロシージャで、現在のセッションで使用するAIプロファイルに先ほど作成したopenaiを設定します。
BEGIN
DBMS_CLOUD_AI.SET_PROFILE(
profile_name => 'OPENAI'
);
END;
/
もしくは
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI');
PL/SQL procedure successfully completed.
2) SELECT AI SQLクエリ実行
SQL> SELECT AI how many customers exist;
CUSTOMER_COUNT
--------------
55500
⭐️次のようなエラー出たら上から手順を見直します。
SQL> SELECT AI how many customers exist;
Error starting at line : 1 in command -
SELECT AI how many customers exist
Error at Command Line : 1 Column : 15
Error report -
SQL Error: ORA-20000: ORA-24247: Network access denied by access control list (ACL)
ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD", 行2064
ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD", 行13639
ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_AI", 行4857
ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_AI", 行5401
ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_AI", 行8221
ORA-06512: 行1
20000. 00000 - "%s"
*Cause: The stored procedure 'raise_application_error'
was called which causes this error to be generated.
*Action: Correct the problem as described in the error message or contact
the application administrator or DBA for more information.
More Details :
https://docs.oracle.com/error-help/db/ora-20000/
https://docs.oracle.com/error-help/db/ora-06512/
3) SELECT AI で生成されたSQLを確認
SQL> SELECT AI SHOWSQL how many customers exist;
RESPONSE
-------------------------------------------------------
SELECT COUNT(*) AS customer_count
FROM "SH"."CUSTOMERS"
● 日本語で実行
1) SELECT AI SQLクエリ実行
SQL> SELECT AI 顧客は全部で何人ですか?;
TOTAL_CUSTOMERS
---------------
55500
2) SELECT AI で生成されたSQLを確認
SQL> SELECT AI SHOWSQL 顧客は全部で何人ですか?;
RESPONSE
----------------------------------------------------------
SELECT COUNT(*) AS "TOTAL_CUSTOMERS"
FROM "SH"."CUSTOMERS"
3) 複雑な問い合わせをしてみてみる
日常会話の話し言葉で複数テーブル使用するもう少し複雑な集計問い合わせをしてみてみます。
SQL> SELECT AI 各商品はどれだけ売れましたかしら?昇順で表示してちょ;
64MB Memory Card 710
Envoy External Keyboard 3441
Fly Fishing 4091
Comic Book Heroes 4572
18" Flat Panel Graphics Monitor 5205
256MB Memory Card 5541
Envoy 256MB - 40GB 5766
5MP Telephoto Digital Camera 6002
17" LCD w/built-in HDTV Tuner 6010
O/S Documentation Set - Italian 6113
Mini DV Camcorder with 3.5" Swivel LCD 6160
Finding Fido 6168
Martial Arts Champions 6711
Y Box 6929
8.3 Minitower Speaker 7197
Model NM500X High Yield Toner Cartridge 7557
Extension Cable 7576
Smash up Boxing 7844
O/S Documentation Set - Spanish 8340
Model C93822D Wireless Phone Battery 8990
Internal 6X CD-ROM 9523
Envoy Ambassador 9591
DVD-RAM Jewel Case, Double-Sided, 9.4G 9885
Standard Mouse 10156
128MB Memory Card 10225
Laptop carrying case 10430
O/S Documentation Set - Kanji 10742
CD-RW, High Speed, Pack of 10 10823
Home Theatre Package with DVD-Audio/Video Play 10903
S27273M Extended Use w/l Phone Batt. 11056
Multimedia speakers- 5" cones 11253
Bounce 11574
O/S Documentation Set - French 12116
Multimedia speakers- 3" cones 12163
3 1/2" Bulk diskettes, Box of 100 12292
O/S Documentation Set - German 12429
Adventures with Numbers 12742
Deluxe Mouse 12837
Envoy External 6X CD-ROM 13008
External 6X CD-ROM 13043
Internal 8X CD-ROM 13319
Model C9827B Cordless Phone Battery 14183
Music CD-R 14315
OraMusic CD-R, Pack of 10 14381
Endurance Racing 14769
CD-R Mini Discs 15084
Xtend Memory 15191
DVD-RW Discs, 4.7GB, Pack of 3 15305
3 1/2" Bulk diskettes, Box of 50 15318
Model K3822L Cordless Phone Battery 15910
SIMM- 16MB PCMCIAII card 15950
Model CD13272 Tricolor Ink Cartridge 15984
External 8X CD-ROM 16494
Model K8822S Cordless Phone Battery 16732
Unix/Windows 1-user pack 16796
CD-R, Professional Grade, Pack of 10 17152
CD-RW, High Speed Pack of 5 17389
Envoy External 8X CD-ROM 17430
DVD-R Discs, 4.7GB, Pack of 5 17938
Model SM26273 Black Ink Cartridge 19233
DVD-R Disc with Jewel Case, 4.7 GB 19403
SIMM- 8MB PCMCIAII card 19557
External 101-key keyboard 19642
Model A3827H Black Image Cartridge 20490
PCMCIA modem/fax 28800 baud 20948
CD-R with Jewel Cases, pACK OF 12 22189
PCMCIA modem/fax 19200 baud 22768
1.44MB External 3.5" Diskette 23108
O/S Documentation Set - English 27114
Keyboard Wrist Rest 27755
Mouse Pad 29282
71行が選択されました。
SQL> SELECT AI SHOWSQL 各商品はどれだけ売れましたかしら?昇順で表示してちょ;
SELECT P."PROD_NAME" AS "Product Name",
SUM(S."QUANTITY_SOLD") AS "Total Quantity Sold"
FROM "SH"."SALES" S
JOIN "SH"."PRODUCTS" P ON S."PROD_ID" = P."PROD_ID"
GROUP BY P."PROD_NAME"
ORDER BY "Total Quantity Sold" ASC
SQL> SELECT AI 最も売れた商品はどれだけ売れましたかしら?;
Product Name Total Quantity Sold
-------------------------------------------------- -------------------
Mouse Pad 29282
SQL> SELECT AI SHOWSQL 最も売れた商品はどれだけ売れましたかしら?;
RESPONSE
--------------------------------------------------------------------------------
SELECT P."PROD_NAME" AS "Product Name",
SUM(S."QUANTITY_SOLD") AS "Total Quantity Sold"
FROM "SH"."SALES" S
JOIN "SH"."PRODUCTS" P ON S."PROD_ID" = P."PROD_ID"
GROUP BY P."PROD_NAME"
ORDER BY SUM(S."QUANTITY_SOLD") DESC
FETCH FIRST ROW ONLY
● タイ語で実行
「最も売れた商品はどれだけ売れましたかしら?」= 'What was the best selling item and how many did that sell?' をタイ語でSELECT AIしてみます。
SQL> SELECT AI สินค้าอะไรขายดีที่สุด และขายได้กี่ชิ้น?;
Product Name Total Quantity Sold
-------------------------------------------------- -------------------
Mouse Pad 29282
● アラビア語で実行
「最も売れた商品はどれだけ売れましたかしら?」= 'What was the best selling item and how many did that sell?' をアラビックでSELECT AIしてみます。
SQL> SELECT AI ما هو المنتج الأكثر مبيعاً وكم عدد المنتجات التي تم بيعها؟;
Product Name Total Quantity Sold
-------------------------------------------------- -------------------
Mouse Pad 29282
いいじゃない Select AI!
■ 参考
・ News
- OpenAI、Microsoft Azure AIプラットフォームの拡張にOracle Cloud Infrastructureを選定
・ 製品概要
- Autonomous Database Select AI
- Oracle Autonomous Database Select AIを使用した自然言語からのSQL問合せの生成
・ Oracle Cloud Infrastructure Documentation
- Select AIを使用した自然言語プロンプトからのSQLの生成
- Select AIの使用例
- DBMS_CLOUD_AI Package
- SHサンプル・スキーマ
・ Oracle Blog
- Introducing Select AI - Natural Language to SQL Generation on Autonomous Database
- Configuring Generative AI in Oracle APEX using Select AI
・ OpenAI
- OpenAI API
- OpenAI API: Overview
- API Reference