17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

17
Last updated at Posted at 2024-08-22

Oracle、Microsoft、OpenAIの発表では、OpenAIが利用するAIインフラをMicrosoft Azureに加えてOracle Cloud Infrastructure(OCI)へ拡張することが公表されました。

image.png

Oracle Autonomous DatabaseのSelect AIを使用すると、自然言語からOracle SQLを生成し、データベースへ問い合わせることができます。たとえば、「最も売れた商品はどれだけ売れましたかしら?」のような日常的な表現でも問い合わせできます。

生成AIの大規模言語モデル(LLM)とOracle SQLを組み合わせることで、利用者はSQLそのものではなく「何を知りたいか」という意図を記述できます。Select AIは、対象スキーマのメタデータを基にSQLを生成します。

image.png

Select AIの設定には、Autonomous DatabaseのDBMS_CLOUD_AIパッケージを使用します。このパッケージにより、OpenAI、OCI Generative AI、Cohere、Azure OpenAI ServiceなどのAIプロバイダーと連携できます。

image.png

本記事では、OpenAI APIと低コストなgpt-5-nanoを使用してSelect AIを試します。

■ OpenAI APIキーの取得

OpenAI APIを使用するには、OpenAI API PlatformでAPIキーを作成し、API側の課金設定を行います。ChatGPTの有料プランとOpenAI APIの料金は別管理です。

APIキーはパスワードと同様の機密情報です。ブログ、Gitリポジトリ、チャット、スクリーンショットへ実際のキーを掲載しないでください。漏えいした可能性がある場合は、API Platformで直ちにキーを無効化し、新しいキーを作成します。

● OpenAIへログイン

1)OpenAI API Platformへログイン

OpenAI API Platformへアクセスしてログインします。

01_OpenAI-API01.png

2)API Platformを開く

APIの管理画面を開きます。

01_OpenAI-API02.png

3)API Keys画面を開く

画面構成は変更される場合があります。現在のUIでは、プロジェクトのAPI Keys画面からキーを管理できます。

01_OpenAI-API03.png

4)新しいSecret Keyを作成

Create new secret keyをクリックします。

01_OpenAI-API04.png

5)キー名と権限を設定

用途が分かる名前を設定し、必要最小限の権限でSecret Keyを作成します。

01_OpenAI-API05.png

6)Secret Keyを安全に保存

Secret Keyの完全な値を確認できるのは、通常、作成直後だけです。安全なパスワード管理ツールなどへ保存します。

01_OpenAI-API06.png

7)作成結果を確認

API Keys画面に新しいキーが追加されたことを確認します。

01_OpenAI-API07.png

■ Autonomous Databaseの作成

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

● Autonomous Data Warehouseの作成

1)OCIコンソールを開く

Oracle Cloud Infrastructure(OCI)へログインし、ナビゲーション・メニューからOracle Database → Autonomous Databasesを選択します。

2)Autonomous Databaseを作成

Create Autonomous Databaseをクリックします。

11_ADB作成02.png

3)Autonomous Data Warehouseを構成

必要な項目を入力し、Autonomous Data Warehouseを作成します。

11_ADB作成03−1.png
11_ADB作成03−2.png
11_ADB作成03−3.png
11_ADB作成03−4.png

4)作成完了を確認

11_ADB作成04.png

● Database Clientの設定

1)SQLclのインストールとAutonomous Databaseへの接続

接続元のPCまたはComputeインスタンスへDatabase Clientをインストールします。今回はSQLclを使用します。

2)日本語を扱うための文字コード設定

ターミナルをUTF-8で動作させます。Instant Clientなど、NLS_LANGを参照するクライアントも併用する場合は、環境に合わせて設定します。

環境変数の設定例

[opc@tokyo-inst ~]$ export LANG=en_US.UTF-8
[opc@tokyo-inst ~]$ export NLS_LANG=Japanese_Japan.AL32UTF8
[opc@tokyo-inst ~]$ env | grep -E '^(LANG|NLS_LANG)='
LANG=en_US.UTF-8
NLS_LANG=Japanese_Japan.AL32UTF8

ログイン時に自動設定する場合は、.bash_profileなどへ記述します。ORACLE_HOMEは実際のインストール先に合わせて変更してください。

[opc@tokyo-inst ~]$ cat ~/.bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

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 LANG="en_US.UTF-8"
export NLS_LANG="Japanese_Japan.AL32UTF8"

alias cdn='cd "$TNS_ADMIN"'

■ Select AIの設定

● ユーザーの作成とロール/権限の付与

Select AIを使用するデータベース・ユーザーを作成します。

1)ADMINユーザーでSQLcl接続

[opc@tokyo-inst ~]$ sql admin/<ADMIN_PASSWORD>@ADW

SQLcl: Release 24.2 Production

Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - Production

SQL>

2)ADB_USERを作成

CREATE USER adb_user IDENTIFIED BY "Your_Strong_Password";

GRANT DWROLE, UNLIMITED TABLESPACE TO adb_user;

付与したロールとシステム権限を確認します。

SELECT grantee, granted_role
FROM dba_role_privs
WHERE grantee = 'ADB_USER';

SELECT grantee, privilege
FROM dba_sys_privs
WHERE grantee = 'ADB_USER';

● DBMS_CLOUD_AIパッケージへのアクセス権を付与

管理者権限で、ADB_USERからOpenAI APIへHTTPS接続できるようにACLを設定し、DBMS_CLOUD_AIの実行権限を付与します。

1)api.openai.comへのHTTPアクセスを許可

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

2)DBMS_CLOUD_AIの実行権限を付与

GRANT EXECUTE ON DBMS_CLOUD_AI TO adb_user;

権限を確認します。

SQL
SELECT grantee, owner, table_name, privilege
FROM dba_tab_privs
WHERE grantee = 'ADB_USER'
  AND table_name = 'DBMS_CLOUD_AI';
SQL実行結果
GRANTEE     OWNER               TABLE_NAME       PRIVILEGE
___________ ___________________ ________________ ____________
ADB_USER    C##CLOUD$SERVICE    DBMS_CLOUD_AI    EXECUTE

● OpenAIを利用するための準備

1)ADB_USERとして接続

CONN adb_user/Your_Strong_Password@ADW

SHOW USER
SQL実行結果
USER is "ADB_USER"

2)OpenAI APIのクレデンシャルを作成

DBMS_CLOUD.CREATE_CREDENTIALで、OpenAI APIへ接続するためのクレデンシャルOPENAI_CREDを作成します。passwordには、OpenAI API Platformで作成したSecret Keyを指定します。

BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OPENAI_CRED',
        username        => 'OPENAI',
        password        => 'sk-p2uycd5lYVQBtLLqK3|udqWxsRwT7ltOBDPMQpsA-OPENAI_API_KEY'
    );
END;
/

同名のクレデンシャルがすでに存在し、作り直す場合のみ、事前に次を実行します。

BEGIN
    DBMS_CLOUD.DROP_CREDENTIAL(
        credential_name => 'OPENAI_CRED'
    );
END;
/

3)DBMS_CLOUD_AIプロファイルを作成

DBMS_CLOUD_AI.CREATE_PROFILEで、Select AIが使用するAIプロファイルOPENAIを作成します。

主な属性は次のとおりです。

  • provider: AIプロバイダー。ここではopenai
  • credential_name: OpenAI APIへ接続するクレデンシャル名
  • model: 使用するOpenAIモデル。ここではgpt-4o-mini
  • object_list: 自然言語からSQLを生成する対象オブジェクト

この例では、SHサンプル・スキーマのCUSTOMERSSALESPRODUCTSCOUNTRIESを対象にします。

BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        profile_name => 'OPENAI',
        attributes   => '{
            "provider": "openai",
            "credential_name": "OPENAI_CRED",
            "model": "gpt-4o-mini",
            "object_list": [
                {"owner": "SH", "name": "CUSTOMERS"},
                {"owner": "SH", "name": "SALES"},
                {"owner": "SH", "name": "PRODUCTS"},
                {"owner": "SH", "name": "COUNTRIES"}
            ]
        }'
    );
END;
/

同名のプロファイルを作り直す場合のみ、事前に次を実行します。

BEGIN
    DBMS_CLOUD_AI.DROP_PROFILE(
        profile_name => 'OPENAI'
    );
END;
/

Select AIは、対象オブジェクトの所有者名、オブジェクト名、列名、コメントなどのメタデータをAIプロバイダーへ送信します。機密性の高い名称やコメントを含むオブジェクトをobject_listへ登録する場合は、組織のセキュリティ・ポリシーを確認してください。

● モデル変更

gpt-5-nanoを選択する理由

2026年7月21日時点で、Autonomous AI DatabaseのSelect AIドキュメントには、OpenAIプロバイダーの対応モデルとしてgpt-5-nanoが掲載されています。OpenAIのモデル案内は新しい世代へ更新されていますが、現行のSelect AI対応モデル一覧と直接APIの低コスト性を重視し、本記事ではgpt-5-nanoを選択します。

OpenAI APIの標準料金は、100万トークン当たり次のとおりです。

モデル 入力 出力 用途の考え方
gpt-5.4-nano $0.2 $1.25 複雑なJOINや集計でnanoの精度が不足した場合の候補
gpt-5-nano $0.05 $0.40 通常のSelect AIで最初に試す低コスト候補
gpt-4o-mini $0.15 $0.60 旧構成との比較用。現行のAutonomous Select AIモデル一覧では未掲載
gpt-3.5-turbo (default) $0.50 $1.50 Model指定しなかった場合のデフォルト

gpt-5-nanogpt-4o-miniと比べて、入力単価が約67%、出力単価が約33%安価です。Select AIではスキーマ・メタデータを含む入力が多く、生成するSQLは比較的短いため、入力単価の低さが効きやすいと考えられます。

たとえば、1回の問い合わせで入力5,000トークン、出力300トークンを使用した場合の概算は次のとおりです。

モデル 1回当たりの概算
gpt-5-nano $0.00037
gpt-4o-mini $0.00093

ただし、価格が安いことと、すべての自然言語からSQLへの変換で最も正確であることは同義ではありません。実際の採用判断では、代表的な質問を使って次を確認します。

  • SQLの実行成功率
  • JOIN条件と集計粒度の正しさ
  • 日付条件、NULL処理、上位N件などの解釈
  • 同じ質問を繰り返した場合の安定性
  • 1件の正しい回答を得るまでの再試行を含む総コスト

通常の問い合わせはgpt-5-nanoで処理し、複雑な問い合わせだけgpt-5.4-nanoへ切り替える運用も有効です。

● 既存プロファイルのモデルを変更

すでにOPENAIプロファイルを作成済みの場合は、DBMS_CLOUD_AI.SET_ATTRIBUTEでモデルだけをgpt-5-nanoへ変更できます。

BEGIN
    DBMS_CLOUD_AI.SET_ATTRIBUTE(
        profile_name    => 'OPENAI',
        attribute_name  => 'model',
        attribute_value => 'gpt-5-nano'
    );
END;
/
PL/SQL procedure successfully completed.

● モデル設定を確認

SELECT attribute_value AS model
FROM user_cloud_ai_profile_attributes
WHERE profile_name = 'OPENAI'
  AND attribute_name = 'model';
MODEL
----------------
gpt-5-nano

これでSelect AIを実行する準備が整いました。

■ SELECT AIを使用した自然言語による問い合わせ

DBMS_CLOUD_AIへ登録したSHスキーマの表を、自然言語で問い合わせます。

LLMが生成するSQLは、モデル、モデルの更新、データベースのメタデータによって変わる場合があります。本番環境では、最初にSHOWSQLでSQLを確認し、権限を必要最小限にした上で実行してください。以下はSHサンプル・スキーマを使用した実行例です。モデル変更後に公開する場合は、ご自身の環境で再実行し、結果と生成SQLを確認してください。

● AIプロファイルを現在のセッションへ設定

DBMS_CLOUD_AI.SET_PROFILEは、使用するデータベース・セッションごとに実行します。

BEGIN
    DBMS_CLOUD_AI.SET_PROFILE(
        profile_name => 'OPENAI'
    );
END;
/

SQLclでは、次のようにも実行できます。

EXEC DBMS_CLOUD_AI.SET_PROFILE('OPENAI');
PL/SQL procedure successfully completed.

● 英語で実行

1)自然言語で問い合わせ

SELECT AI how many customers exist;
CUSTOMER_COUNT
--------------
         55500

ORA-24247: Network access denied by access control list (ACL)が発生した場合は、api.openai.comへのACL設定と、実行ユーザー名を確認します。

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/

2)生成されたSQLを確認

SELECT AI SHOWSQL how many customers exist;
SELECT COUNT(*) AS customer_count
FROM "SH"."CUSTOMERS"

● 日本語で実行

1)自然言語で問い合わせ

SELECT AI 顧客は全部で何人ですか?;
TOTAL_CUSTOMERS
---------------
          55500

2)生成されたSQLを確認

SELECT AI SHOWSQL 顧客は全部で何人ですか?;
SELECT COUNT(*) AS "TOTAL_CUSTOMERS"
FROM "SH"."CUSTOMERS"

3)複数表を使用する問い合わせ

日常会話に近い表現で、SALES表とPRODUCTS表を使用する集計を実行します。

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

● タイ語で実行

「最も売れた商品はどれだけ売れましたかしら?」に相当する内容をタイ語で問い合わせます。

SELECT AI สินค้าอะไรขายดีที่สุด และขายได้กี่ชิ้น?;
Product Name                                      Total Quantity Sold
------------------------------------------------  -------------------
Mouse Pad                                                       29282

● アラビア語で実行

同じ内容をアラビア語で問い合わせます。

SELECT AI ما هو المنتج الأكثر مبيعاً وكم عدد المنتجات التي تم بيعها؟;
Product Name                                      Total Quantity Sold
------------------------------------------------  -------------------
Mouse Pad                                                       29282

■ まとめ

OpenAI APIのgpt-5-nanoをSelect AIのモデルとして明示指定する手順と、日本語、英語、タイ語、アラビア語による問い合わせ例をまとめました。

gpt-5-nanoは入力・出力ともに低価格で、通常のSelect AIを試す最初の候補に向いています。一方、複雑なJOINや業務上重要な集計では、実際のスキーマを使った評価を行い、必要に応じてgpt-5-miniなどへ切り替えるのが安全です。

また、生成SQLは必ずSHOWSQLで確認し、APIキーとデータベース・メタデータを適切に管理することが重要です。

いいじゃない、Select AI!

■ 参考

News

製品概要

Oracleドキュメント

Oracle Blog

OpenAI

■ おまけ

ChatGPT Image Jul 21, 2026, 08_46_22 PM.png

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?