13
10

OpenAI API を使用して自然言語で Select AI してみてみた

Last updated at Posted at 2024-08-22

ORACLE、Microsoft、OpenAIの3社は提携を発表し、OpenAIにさらなる AIインフラのキャパシティを提供するために、OpenAIが利用するプラットフォームを Microsoft Azureに加えて Oracle Cloud Infrastructure (OCI) へ拡大することを発表しました。
image.png
Oracle Autonomous Database Select AIを使用すると、「最も売れた商品はどれだけ売れましたかしら?」のような自然言語を使用してデータを問い合せることができます。
生成 AI 大規模言語モデル (LLM) と Oracle SQL を組み合わせることで、 必要なもの(宣言的意図) を記述し、データベースがスキーマに関連する SQL クエリを生成するようになります。
image.png
LLM は膨大な量のテキスト データでトレーニングされているため、ほとんどの自然言語クエリのニュアンスや意図された意味を理解できます。自然言語を使用して SQL を生成すると、クエリの生成に必要な時間が短縮され、クエリの構築が簡素化され、SQL の専門知識を最小限に抑えたり、排除したりするのに役立ちます。自然言語を使用すると、複数の結合、ネストされたサブクエリ、その他の SQL 構造を含むクエリの作成を伴うデータベースからの情報の取得がはるかに簡単かつ迅速になります。分析ツールを使用すると、データベース データのクエリと理解が容易になりますが、自然言語プロンプトを使用して SQL データベースを操作する機能により、SQL のエキスパートと非エキスパートのユーザーがクエリを作成せずにデータベースをクエリできるため、生産性が向上します。
この機能を有効にするには、Autonomous Database の新しいパッケージ DBMS_CLOUD_AIを使用します。これにより、自然言語プロンプトから SQL を生成するための LLM の使用が可能になります。このパッケージは、ユーザーがアクセス可能なデータベース メタデータの知識とともに、ユーザー指定の LLM へのアクセスを提供します。これにより、そのスキーマに適用で実行可能な SQL クエリを生成できます。
image.png
また、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 へアクセスしてログイン

01_OpenAI-API01.png

2) OpenAI画面
[API]をクリック
01_OpenAI-API02.png

3) Overview画面
右上にあるユーザーアイコンをクリックし、[Your profile]をクリック

01_OpenAI-API03.png

4) Your profile画面
[+ Create new secret key]をクリック
01_OpenAI-API04.png

5) Create new secret key画面
Nameを設定し、[Create secret key]をクリック
01_OpenAI-API05.png

6) Save your key画面
[copy]をクリックして作成された secret keyをコピーしてメモして保存しておきます。
01_OpenAI-API06.png

7) API keys画面
新しくSECRET KEYが作成されたことを確認
01_OpenAI-API07.png

■ Autonomous Database作成

今回、Autonomous Data Warehouseを作成します。

● Autonomous Data Warehouse作成

1) OCI コンソール画面
Oracle Cloud Infrastructure (OCI) へログインし、リストメニューから [Oracle Database] > [Autonomous Databases] を選択

2) Autonomous Databases画面
[Create Autonomous Database]をクリック
11_ADB作成02.png

3) Create Autonomous Database画面
次のように入力し、Autonomous Data Warehouseを作成
11_ADB作成03−1.png
11_ADB作成03−2.png
11_ADB作成03−3.png
11_ADB作成03−4.png

4) Autonomous Data Warehouse作成完了
11_ADB作成04.png

● 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

13
10
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
13
10