※ 本記事は、Ravi Guptaによる”How to Use Oracle Select AI: A Step-by-Step Guide (Generative AI)“を翻訳したものです。
2025年2月6日
Oracle Autonomous Database Select AIは、データベース環境内でAI機能を直接活用できる強力なツールです。このガイドでは、Oracle Autonomous Transaction Processing (ATP)データベースでのSelect AIの設定および使用に関するステップを順を追って説明します。チャットボットをデータベースとシームレスに統合および設定するための簡単な手順の概要を示します。
ステップ1: ATPデータベースの作成
開始するには、ATPデータベースをプロビジョニングします。この例では、SELECTAIDEMOという名前のデータベースを作成しました。

このプロセスを初めて使用する場合は、ATPデータベースのプロビジョニングに関する包括的なガイド「ハンズオン・ガイド: Bastionサービスを介したセキュリティ・プロビジョニングおよびアクセス」を参照してください。
ステップ2: データベース・ユーザーの作成
Select AI機能を適用するためのデータベース・ユーザーを作成します。次のSQLコマンドを実行してユーザーを設定します(管理ユーザーの場合):
SET DEFINE OFF; CREATE USER SELECT_AI_USER IDENTIFIED BY "Oracle##2025AI"; GRANT RESOURCE TO SELECT_AI_USER; GRANT CREATE SESSION TO SELECT_AI_USER; GRANT CREATE VIEW TO SELECT_AI_USER; GRANT CREATE TABLE TO SELECT_AI_USER; GRANT CONNECT TO SELECT_AI_USER; GRANT ALTER SYSTEM TO SELECT_AI_USER; GRANT ALTER USER TO SELECT_AI_USER; ALTER USER SELECT_AI_USER QUOTA 10M ON temp; GRANT CONSOLE_DEVELOPER TO SELECT_AI_USER; GRANT DWROLE TO SELECT_AI_USER; GRANT EXECUTE ON DBMS_CLOUD TO SELECT_AI_USER; GRANT EXECUTE ON DBMS_CLOUD_AI TO SELECT_AI_USER;
ステップ3: OCI生成AIを使用したプロファイルの作成
Autonomous Databaseがデプロイされている場所(OCI、Google CloudまたはAzure)や、データにAIを適用する方法など、様々なユースケースで異なるモデルが必要になる場合があります。「Select AI」では、そのユース・ケースに適したモデルを選択できます。Select AIプロファイルは、AIプロバイダー(OCI生成AI、Google Gemini、Azure OpenAI、Anthropicなど)および自然言語クエリに使用されるテーブルに関する詳細を取得します。以下では、ADBをOracle Cloud Infrastructure(OCI)生成AIと統合するためのSelect AIプロファイルを作成します。プロファイルを作成するには:
1. 必要な情報の収集
- User OCID: OCIのユーザーの一意識別子。
- Tenancy OCID: テナンシの一意の識別子。
- Fingerprint: APIキーのフィンガープリント。
- Private Key: APIキーの作成時に生成されます。
OCIユーザーが生成AIにアクセスできることを確認します。OCI生成AIプレイグラウンド・ドキュメントでこれを確認します:
OCI生成AIプレイグラウンド。
2. すべての詳細を収集するAPIキーの生成
- OCIで「My Profile」→「API Key」→「Add API Key」にナビゲートします。
- 秘密キーと公開キーをダウンロードして、後で使用します。

3. 資格証明の作成
次のPL/SQLブロックを実行して、資格証明を作成します(作成ユーザー – SELECT_AI_USER):
BEGIN
DBMS_CLOUD.create_credential(
credential_name => 'OCI_GENERATIVE_AI_CRED’,
user_ocid => '<UserOCID>',
tenancy_ocid => '<TenancyOCID>',
fingerprint => '<Fingerprint>',
private_key => '<Private Key>'
);
END;
/

4. 資格証明の検証
次の問合せを実行します(作成されたユーザー – SELECT_AI_USER):
SELECT * FROM DBA_CREDENTIALS;

5. 表の作成
作成済ユーザー(SELECT_AI_USER)にSelect AI (この投稿の末尾のコードを参照)を適用する表を設定します。
表に次の構造がある場合は、参照してください:
- T1: 表名
- C1: 顧客名
- C2: 顧客住所
- C3: 金額
これを管理するには、表および列に適切なコマンドを適用します。詳細は、このブログ「Autonomous Databasesでの自然言語問合せの改善」を参照してください。
6. 資格証明表および参照表に基づくプロファイルの作成
続行するには、OCI (Oracle Cloud Infrastructure)ユーザーが生成AIリソースにアクセスできるcompartment IDが必要です。次のPL/SQLブロックを使用して、プロファイルを作成します(作成されたユーザー – SELECT_AI_USER):
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OCI_GENERATIVE_AI_PROFILE' ,
attributes =>
'{
"provider": "oci",
"region": "us-chicago-1",
"oci_compartment_id": "<CompartmentID>",
"credential_name": "OCI_GENERATIVE_AI_CRED",
"object_list": [
{"owner": "SELECT_AI_USER", "name": "Customers"},
{"owner": "SELECT_AI_USER", "name": "Branches"},
{"owner": "SELECT_AI_USER", "name": "Accounts"},
{"owner": "SELECT_AI_USER", "name": "Transactions"},
{"owner": "SELECT_AI_USER", "name": "Loans"},
{"owner": "SELECT_AI_USER", "name": "LoanPayments"},
{"owner": "SELECT_AI_USER", "name": "Employees"},
{"owner": "SELECT_AI_USER", "name": "Cards"},
{"owner": "SELECT_AI_USER", "name": "Services"},
{"owner": "SELECT_AI_USER", "name": "CustomerServices"}
],
"model": "meta.llama-3.1-70b-instruct"
}');
END;

このスクリプトは、CREATE_PROFILEプロシージャを使用してDBMS_CLOUD_AI.CREATE_PROFILEという名前のプロファイルを定義します。コンパートメントID、リージョン、資格証明名およびオブジェクト・リストがOCI設定と一致していることを確認してください。プロファイルには、AI操作に必要な特定のデータベース表への参照が含まれています。
7. プロファイルの検証
次の問合せを実行します:
SELECT * FROM USER_CLOUD_AI_PROFILES;

ステップ4: Oracle APEXへのChatDB.sqlのインポート
Oracle APEXには、ATPデータベースが事前にインストールされています。Select AIを統合するには:
1. APEXの起動

- ATPデータベースのホーム・ページからAPEXインスタンス・リンクを開きます。
- 管理データベースのパスワードを使用してログインします。

2. ワークスペースの作成
- 前に作成したスキーマ(SELECT_AI_USER)に割り当てます。

3. ChatDBのインポートおよびインストール
- ChatDBアプリケーションのダウンロード
- 「App Builder」→「Import」にナビゲートします。
- f101.sqlファイルをドラッグ・アンド・ドロップし、「Next」をクリックします。

[リンク]
- 「Install Application」をクリックしてから、「Install Supporting Objects」をクリックします。

4. アプリケーションの実行
- インストール後、プロファイルを選択して質問を始めましょう。

質問するには、マイク入力するか、マイク・ボタンをクリックした後にマイクに話します。

ノート: 「Ask Database」を選択します。
他のAIモデルのヒント
OpenAIなどのAIモデルと統合する場合は、ネットワーク・アクセスを構成する必要があります。
1. 管理ユーザーにネットワークACLアクセス権を付与します。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
HOST => api.openai.com',
LOWER_PORT => 443,
UPPER_PORT => 443,
ACE => xs$ace_type(
PRIVILEGE_LIST => xs$name_list('http'),
PRINCIPAL_NAME => 'SELECT_AI_USER',
PRINCIPAL_TYPE => xs_acl.ptype_db
)
);
END;
/
2. アクセスの検証
SELECT * FROM DBA_NETWORK_ACLS; SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES;
3. OpenAIを使用したプロファイルの作成
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL (
credential_name => 'OPENAI_CRED', -- The name of the credential
username => 'OPENAI', -- The username for the credential
password => '...' -- The password (should be securely stored)
);
END;
/
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'OPENAI_PROFILE',
attributes =>
'{"provider": "openai",
"credential_name": "'OPENAI_CRED",
"model":"command",
"object_list": [
{"owner": "SELECT_AI_USER", "name": "Customers"},
{"owner": "SELECT_AI_USER", "name": "Branches"},
{"owner": "SELECT_AI_USER", "name": "Accounts"},
{"owner": "SELECT_AI_USER", "name": "Transactions"},
{"owner": "SELECT_AI_USER", "name": "Loans"},
{"owner": "SELECT_AI_USER", "name": "LoanPayments"},
{"owner": "SELECT_AI_USER", "name": "Employees"},
{"owner": "SELECT_AI_USER", "name": "Cards"},
{"owner": "SELECT_AI_USER", "name": "Services"},
{"owner": "SELECT_AI_USER", "name": "CustomerServices"}
],
}'
);
END;
/
これらのステップに従うことで、Oracle Select AIのパワーを効果的に活用できます。OCI生成AIまたはサードパーティのAIモデルと統合する場合でも、このガイドはシームレスなセットアップと運用を実現します。
Marty GubarとSanket Jainのおかげで、このAIブログの実装と執筆における貴重なインプットとガイダンスが得られました。
例で使用する表を作成するためのSQLコード
-- 1. Customers Table CREATE TABLE Customers ( CustomerID NUMBER PRIMARY KEY, FirstName VARCHAR2(50), LastName VARCHAR2(50), Email VARCHAR2(100), Phone VARCHAR2(15), Address VARCHAR2(255), City VARCHAR2(50), State VARCHAR2(50), ZipCode VARCHAR2(10), CreatedDate DATE DEFAULT SYSDATE ); -- 2. Branches Table CREATE TABLE Branches ( BranchID NUMBER PRIMARY KEY, BranchName VARCHAR2(100), Address VARCHAR2(255), City VARCHAR2(50), State VARCHAR2(50), ZipCode VARCHAR2(10), Phone VARCHAR2(15) ); -- 3. Accounts Table CREATE TABLE Accounts ( AccountID NUMBER PRIMARY KEY, CustomerID NUMBER REFERENCES Customers(CustomerID),\ BranchID NUMBER REFERENCES Branches(BranchID), AccountType VARCHAR2(20), Balance NUMBER(15, 2), CreatedDate DATE DEFAULT SYSDATE ); -- 4. Transactions Table CREATE TABLE Transactions ( TransactionID NUMBER PRIMARY KEY, AccountID NUMBER REFERENCES Accounts(AccountID), TransactionType VARCHAR2(20), Amount NUMBER(15, 2), TransactionDate DATE DEFAULT SYSDATE, Description VARCHAR2(255) ); -- 5. Loans Table CREATE TABLE Loans ( LoanID NUMBER PRIMARY KEY, CustomerID NUMBER REFERENCES Customers(CustomerID), BranchID NUMBER REFERENCES Branches(BranchID), LoanType VARCHAR2(20), Amount NUMBER(15, 2), InterestRate NUMBER(5, 2), StartDate DATE, EndDate DATE ); -- 6. LoanPayments Table CREATE TABLE LoanPayments ( PaymentID NUMBER PRIMARY KEY,\ LoanID NUMBER REFERENCES Loans(LoanID), Amount NUMBER(15, 2),\ PaymentDate DATE DEFAULT SYSDATE ); -- 7. Employees Table CREATE TABLE Employees ( EmployeeID NUMBER PRIMARY KEY, BranchID NUMBER REFERENCES Branches(BranchID), FirstName VARCHAR2(50), LastName VARCHAR2(50), Position VARCHAR2(50), Salary NUMBER(10, 2), HireDate DATE DEFAULT SYSDATE ); -- 8. Cards Table CREATE TABLE Cards ( CardID NUMBER PRIMARY KEY, AccountID NUMBER REFERENCES Accounts(AccountID), CardType VARCHAR2(20), CardNumber VARCHAR2(16), ExpiryDate DATE ); -- 9. Services Table CREATE TABLE Services ( ServiceID NUMBER PRIMARY KEY, ServiceName VARCHAR2(100), Description VARCHAR2(255) ); -- 10. CustomerServices Table CREATE TABLE CustomerServices ( CustomerServiceID NUMBER PRIMARY KEY, CustomerID NUMBER REFERENCES Customers(CustomerID), ServiceID NUMBER REFERENCES Services(ServiceID), StartDate DATE DEFAULT SYSDATE ); -- Sample Data Inserts for Customers (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO Customers (CustomerID, FirstName, LastName, Email, Phone, Address, City, State, ZipCode) VALUES (i, 'First' || i, 'Last' || i, 'customer' || i || '@bank.com', '1234567890', 'Address ' || i, 'City' || MOD(i, 10), 'State' || MOD(i, 5), 'ZIP' || MOD(i, 100)); END LOOP; COMMIT; END; / -- Sample Data Inserts for Branches BEGIN FOR i IN 1..10 LOOP INSERT INTO Branches (BranchID, BranchName, Address, City, State, ZipCode, Phone) VALUES (i, 'Branch ' || i, 'Branch Address ' || i, 'City' || i, 'State' || MOD(i, 5), 'ZIP' || i, '123456789' || i); END LOOP; COMMIT; END; / -- Sample Data Inserts for Accounts (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO Accounts (AccountID, CustomerID, BranchID, AccountType, Balance) VALUES (i, i, MOD(i, 10) + 1, CASE MOD(i, 2) WHEN 0 THEN 'Savings' ELSE 'Checking' END, DBMS_RANDOM.VALUE(1000, 10000)); END LOOP; COMMIT; END; / -- Sample Data Inserts for Transactions (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO Transactions (TransactionID, AccountID, TransactionType, Amount, Description) VALUES (i, MOD(i, 100) + 1, CASE MOD(i, 2) WHEN 0 THEN 'Credit' ELSE 'Debit' END, DBMS_RANDOM.VALUE(50, 500), 'Transaction ' || i); END LOOP; COMMIT; END; / -- Sample Data Inserts for Loans (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO Loans (LoanID, CustomerID, BranchID, LoanType, Amount, InterestRate, StartDate, EndDate) VALUES (i, i, MOD(i, 10) + 1, CASE MOD(i, 2) WHEN 0 THEN 'Home' ELSE 'Car' END, DBMS_RANDOM.VALUE(5000, 50000), DBMS_RANDOM.VALUE(3, 15), SYSDATE - DBMS_RANDOM.VALUE(1, 365), SYSDATE + DBMS_RANDOM.VALUE(365, 3650)); END LOOP; COMMIT; END; / -- Sample Data Inserts for LoanPayments (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO LoanPayments (PaymentID, LoanID, Amount) VALUES (i, MOD(i, 100) + 1, DBMS_RANDOM.VALUE(100, 1000)); END LOOP; COMMIT; END; / -- Sample Data Inserts for Employees (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO Employees (EmployeeID, BranchID, FirstName, LastName, Position, Salary) VALUES (i, MOD(i, 10) + 1, 'EmpFirst' || i, 'EmpLast' || i, CASE MOD(i, 3) WHEN 0 THEN 'Manager' WHEN 1 THEN 'Clerk' ELSE 'Teller' END, DBMS_RANDOM.VALUE(30000, 80000)); END LOOP; COMMIT; END; / -- Sample Data Inserts for Cards (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO Cards (CardID, AccountID, CardType, CardNumber, ExpiryDate) VALUES (i, i, CASE MOD(i, 2) WHEN 0 THEN 'Credit' ELSE 'Debit' END, LPAD(i, 16, '0'), SYSDATE + DBMS_RANDOM.VALUE(365, 1825)); END LOOP; COMMIT; END; / -- Sample Data Inserts for Services (10 records) BEGIN FOR i IN 1..10 LOOP INSERT INTO Services (ServiceID, ServiceName, Description) VALUES (i, 'Service ' || i, 'Description of Service ' || i); END LOOP; COMMIT; END; / -- Sample Data Inserts for CustomerServices (100 records) BEGIN FOR i IN 1..100 LOOP INSERT INTO CustomerServices (CustomerServiceID, CustomerID, ServiceID) VALUES (i, i, MOD(i, 10) + 1); END LOOP; COMMIT; END; /
