はじめに
Autonomous AI Database内でAIエージェントを作成・管理するため機能として、Select AI Agentがリリースされました。
Select AI Agentは、データベース内でエージェントを直接実行するため、データを外部サービスに送信することなく、すべてのデータ処理をデータベース内で完結させることができます。
本記事では、Select AI Agentを用いて以下を実現します。
- 自然言語からSQLを生成しデータを分析(NL2SQL)
- PDFなどの非構造データをRAGで検索
- 複数エージェントを連携(Agent Team)して高度な問い合わせに回答
データベースの準備
1. OCIコンソール上から、Autonomous AI Database(BaseDB等でも可能)をプロビジョニングします。
- 表示名:SelectAiAgent(任意)
- データベース名:SelectAiAgent(任意)
- ワークロード・タイプ:レイクハウス(任意)
- データベース・バージョン:26ai(任意)
Select AI Agentは19cでも使用可能ですが、本記事ではベクトルデータも扱うので、ベクトルデータに対応している26aiをご選択ください。
Autonomous AI Database以外のOracle AI Databaseを使用する場合は、23.26.1以降のバージョンをご選択ください。それぞれのバージョンで対応しているSelect AI系の機能の一覧は、こちらをご覧ください。
- ECPU数:2(任意)
- ストレージ:1TB(任意)
- アクセスタイプ:すべての場所からのセキュア・アクセス(任意)
2. スキーマを作成し、必要な権限を付与します。
SQLワークシートから、以下のクエリを実行します。
-- ユーザーを作成
CREATE USER AIAGENT IDENTIFIED BY "Welcome12345#";
-- 基本的なロールの付与
GRANT CONNECT TO AIAGENT;
GRANT DWROLE TO AIAGENT;
GRANT RESOURCE TO AIAGENT;
ALTER USER AIAGENT DEFAULT ROLE CONNECT,DWROLE,RESOURCE;
-- Database Actions接続に必要な権限を付与
BEGIN
ORDS_ADMIN.ENABLE_SCHEMA(
p_enabled => TRUE,
p_schema => 'AIAGENT',
p_url_mapping_type => 'BASE_PATH',
p_url_mapping_pattern => 'aiagent',
p_auto_rest_auth=> TRUE
);
-- ENABLE DATA SHARING
C##ADP$SERVICE.DBMS_SHARE.ENABLE_SCHEMA(
SCHEMA_NAME => 'AIAGENT',
ENABLED => TRUE
);
commit;
END;
/
-- テーブルスペースを付与
ALTER USER AIAGENT QUOTA UNLIMITED ON DATA;
-- Select AI Agentの使用に必要な権限を付与
GRANT EXECUTE on DBMS_CLOUD_AI to AIAGENT;
GRANT EXECUTE on DBMS_CLOUD_PIPELINE to AIAGENT;
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to AIAGENT;
Autonomous AI Database以外のOracle AI Databaseを使用する場合には、DBMS_CLOUDパッケージをダウンロードする必要があります。
ダウンロード方法は以下をご参照ください:
3. ADMINスキーマにデータをロードします。
AIAGENTとしてサインインします。
ユーザー名:AIAGENT、パスワード:Welcome12345#と入力します。

「開発」タブ配下の「SQL」を選択し、SQLワークシートを開きます。

SQLワークシートから、以下のクエリを実行します。
サンプル・データ作成クエリ
CREATE TABLE CUSTOMERS (
customer_id NUMBER(10) PRIMARY KEY,
name VARCHAR2(100),
email VARCHAR2(100),
phone VARCHAR2(20),
state VARCHAR2(2),
zip VARCHAR2(10)
);
CREATE TABLE products (
product_id VARCHAR2(10) PRIMARY KEY,
product_name VARCHAR2(100),
category VARCHAR2(50),
price NUMBER(10,0)
);
CREATE TABLE inventory (
product_id VARCHAR2(10) PRIMARY KEY,
stock_qty NUMBER(5,0)
);
CREATE TABLE sales (
sale_id VARCHAR2(10) PRIMARY KEY,
product_id VARCHAR2(10),
customer_id NUMBER(10),
quantity NUMBER(5,0),
sale_date DATE,
FOREIGN KEY (product_id) REFERENCES products(product_id),
FOREIGN KEY (customer_id) REFERENCES CUSTOMERS(customer_id)
);
CREATE TABLE CUSTOMER_ORDER_STATUS (
customer_id NUMBER(10),
order_number VARCHAR2(20),
status VARCHAR2(30),
product_name VARCHAR2(100),
FOREIGN KEY (customer_id) REFERENCES CUSTOMERS(customer_id)
);
INSERT INTO products (product_id, product_name, category, price) VALUES
('A100', '耐衝撃保護ケース', '保護ケース', 1780),
('B200', 'クリア保護ケース', '保護ケース', 1780),
('C001', 'レザー調保護ケース', '保護ケース', 2339),
('C002', 'ソフトシリコン保護ケース', '保護ケース', 1740),
('C003', 'リング付き保護ケース', '保護ケース', 2003),
('C004', '薄型ハード保護ケース', '保護ケース', 2276),
('C005', '手帳型保護ケース', '保護ケース', 2212),
('C006', 'ストラップ付き保護ケース', '保護ケース', 2362),
('C007', '耐水保護ケース', '保護ケース', 2010),
('C008', 'クリアハード保護ケース', '保護ケース', 1924),
('E001', 'USB-C 急速充電器', 'アクセサリ', 1500),
('E002', 'ワイヤレス充電パッド', 'アクセサリ', 1800),
('E003', '金属製スマホスタンド', 'アクセサリ', 1200),
('E004', 'バックアップストレージ (USB)', 'アクセサリ', 2000),
('E005', '保護フィルムセット', 'アクセサリ', 1000);
INSERT INTO inventory (product_id, stock_qty) VALUES
('A100', 80),
('B200', 300),
('C001', 39),
('C002', 14),
('C003', 81),
('C004', 110),
('C005', 52),
('C006', 23),
('C007', 153),
('C008', 187),
('E001', 123),
('E002', 14),
('E003', 44),
('E004', 64),
('E005', 88);
INSERT INTO CUSTOMERS (customer_id, name, email, phone, state, zip) VALUES
(1, '山田 太郎', 'taro.yamada@example.com', '03-1234-5678', 'TK', '100-0001'),
(2, '佐藤 花子', 'hanako.sato@example.com', '06-2345-6789', 'OS', '530-0001'),
(3, '鈴木 一郎', 'ichiro.suzuki@example.com', '052-3456-7890', 'AI', '460-0001'),
(4, '高橋 美咲', 'misaki.takahashi@example.com', '092-4567-8901', 'FK', '810-0001'),
(5, '伊藤 健', 'ken.ito@example.com', '011-5678-9012', 'HK', '060-0001');
INSERT INTO sales (sale_id, product_id, customer_id, quantity, sale_date) VALUES
('S0001', 'A100', 1, 3, SYSDATE),
('S0002', 'A100', 2, 2, SYSDATE),
('S0003', 'A100', 3, 4, SYSDATE - INTERVAL '1' DAY),
('S0004', 'A100', 1, 3, SYSDATE - INTERVAL '1' DAY),
('S0005', 'A100', 2, 1, SYSDATE - INTERVAL '2' DAY),
('S0006', 'A100', 3, 2, SYSDATE - INTERVAL '2' DAY),
('S0007', 'B200', 4, 1, SYSDATE - INTERVAL '4' DAY),
('S0008', 'C002', 5, 2, SYSDATE - INTERVAL '3' DAY),
('S0009', 'A100', 1, 2, SYSDATE - INTERVAL '3' DAY),
('S0010', 'C003', 2, 1, SYSDATE - INTERVAL '5' DAY),
('S0011', 'A100', 3, 1, SYSDATE - INTERVAL '4' DAY),
('S0012', 'C001', 4, 3, SYSDATE - INTERVAL '6' DAY),
('S0013', 'A100', 5, 3, SYSDATE - INTERVAL '5' DAY),
('S0014', 'E001', 1, 1, SYSDATE),
('S0015', 'A100', 2, 2, SYSDATE - INTERVAL '6' DAY),
('S0016', 'C004', 3, 2, SYSDATE - INTERVAL '1' DAY),
('S0017', 'A100', 4, 1, SYSDATE),
('S0018', 'E003', 5, 1, SYSDATE - INTERVAL '2' DAY),
('S0019', 'B200', 1, 2, SYSDATE - INTERVAL '3' DAY),
('S0020', 'A100', 2, 1, SYSDATE - INTERVAL '1' DAY);
INSERT INTO CUSTOMER_ORDER_STATUS (customer_id, order_number, status, product_name) VALUES
(1, 'S0001', '配達完了', '耐衝撃保護ケース'), -- A100
(2, 'S0002', '配送待ち', '耐衝撃保護ケース'), -- A100
(3, 'S0003', '配達完了', '耐衝撃保護ケース'), -- A100
(1, 'S0004', '返品受付中', '耐衝撃保護ケース'), -- A100
(2, 'S0005', '返品済み', 'ソフトシリコン保護ケース'), -- C002
(3, 'S0006', '配達完了', '耐衝撃保護ケース'), -- A100
(4, 'S0007', '配送待ち', 'クリア保護ケース'), -- B200
(5, 'S0008', '配達完了', 'ソフトシリコン保護ケース'), -- C002
(1, 'S0009', '返品受付中', '耐衝撃保護ケース'), -- A100
(2, 'S0010', '返品済み', 'リング付き保護ケース'), -- C003
(3, 'S0011', '配達完了', '耐衝撃保護ケース'), -- A100
(4, 'S0012', '配送待ち', 'レザー調保護ケース'), -- C001
(5, 'S0013', '配達完了', '耐衝撃保護ケース'), -- A100
(1, 'S0014', '返品受付中', 'USB-C 急速充電器'), -- E001
(2, 'S0015', '返品済み', '耐衝撃保護ケース'), -- A100
(3, 'S0016', '配達完了', '薄型ハード保護ケース'), -- C004
(4, 'S0017', '配送待ち', '耐衝撃保護ケース'), -- A100
(5, 'S0018', '配達完了', '金属製スマホスタンド'), -- E003
(1, 'S0019', '返品受付中', 'クリア保護ケース'), -- B200
(2, 'S0020', '配達完了', '耐衝撃保護ケース'); -- A100
オブジェクト・ストレージの準備
1.オブジェクト・ストアを作成します。本記事ではOCIのオブジェクトストレージを使用します。OCIのオブジェクトストレージの作成方法は、こちらをご参照ください。
2.オブジェクト・ストアを作成したら、こちらをクリックしproduct_specs.pdfというテキストファイルをダウンロードします。
product_specs.pdfにはスマホケース毎の製品仕様が記載されています。以下がproduct_specs.pdfの内容の一部です。

3.ダウンロードしたproduct_specs.pdfをオブジェクト・ストアにアップロードし、オブジェクト・ストアのURIを取得します。このURIは後程使用するので、メモをしておきます。(例:https://objectstorage.ap-tokyo-1.oraclecloud.com/n/xxxxxxxxx/b/xxxxxxxxxx/o/)
OCIのオブジェクトストレージでのURI取得方法
APIキーの取得
こちらの手順に沿ってOCIのリソースにアクセスするためのAPIキーを取得します。
Select AI Agentの設定
Select AI Agent では、以下の4つの要素を組み合わせてエージェントを構築します。
- ツール(Tool):データにアクセスする手段(SQL / RAG など)
- タスク(Task):ツールを使って何をするかを定義
- エージェント(Agent):タスクを実行する主体
- エージェントチーム(Team):複数のエージェントを連携して実行
早速Select AI Agentの設定を行います。
クレデンシャルの作成
先ず、OCI生成AIサービスに接続するためのクレデンシャルを作成します。credential_name、user_ocid、tenancy_ocid、private_key、fingerprintは先ほど取得したAPIキーの情報で置き換えます。
以下のPL/SQLをSQLワークシート上で実行します(AIAGENTスキーマでログインをしていることを確認してください):
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OCI_CRED',
user_ocid => 'ocid1.user.oc1..axxxxxxxxxxxxxxxxq',
tenancy_ocid => 'ocid1.tenancy.oc1..aaxxxxxxxxxxxxa',
private_key => '-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiGQEFA<中略>1D3iheu1ct50SB0aIQz9Ow==
-----END PRIVATE KEY-----',
fingerprint => 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx'
);
END;
/
ツールの作成
ツールの作成にはDBMS_CLOUD_AI_AGENT.CREATE_TOOLプロシージャを使用します。
作成可能なツールタイプとして、カスタム・ツールと事前構築済みツールがあります。カスタム・ツールは、PL/SQL等でファンクションを作成します。事前構築済みツールは、SQL(Select AI)、RAG(Select AI with RAG)、Web検索、通知のツールがあります。
今回は、2つの事前構築済みツールを作成します。
| ツール名 | 内容 |
|---|---|
| NL2SQL_TOOL | データベース内の構造化データを問い合わせ |
| RAG_TOOL | オブジェクトストレージ等にある非構造データを問い合わせ |
NL2SQL_TOOLの作成
データベース内の構造化データを検索するためのNL2SQLツールを設定します。
1. 先ずSelect AIのAIプロファイルを作成します。
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'NL2SQL_PROFILE',
attributes =>'{"provider": "oci",
"credential_name": "OCI_CRED",
"model": "xai.grok-code-fast-1",
"region":"us-chicago-1",
"object_list": [{"owner": "AIAGENT"}]}'
);
END;
/
2. 作成したSelect AIのAIプロファイルをNL2SQL_TOOLとして登録します。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'NL2SQL_TOOL',
attributes => '{
"instruction": "スマホケースやスマホ関連製品の販売データや在庫データ、価格について調べる時に使用します。",
"tool_type": "SQL",
"tool_params": {"profile_name": "NL2SQL_PROFILE"}}'
);
END;
/
RAG_TOOLの作成
Object Storage上のPDFを検索するためのRAGツールを設定します。
1. Select AI with RAGのAIプロファイルを作成します。
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'RAG_PROFILE',
attributes =>'{"provider": "oci",
"credential_name": "OCI_CRED",
"vector_index_name": "VECT_INDEX",
"embedding_model": "cohere.embed-v4.0",
"region":"us-chicago-1",
"model": "xai.grok-code-fast-1"
}');
END;
/
こちらもmodelとregionは、利用中のリージョンに合わせて変更してください。RAGでは埋め込みモデルも使うため、embedding_modelについても提供状況を確認してください。
2. Select AI with RAGのベクトル索引を作成します。
BEGIN
DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
index_name => 'VECT_INDEX',
attributes => '{"vector_db_provider": "oracle",
"location": "https://objectstorage.xxx.oraclecloud.com/n/xxx/b/xxx/o",
"object_storage_credential_name": "OCI_CRED",
"profile_name": "RAG_PROFILE",
"vector_dimension": 1536,
"vector_distance_metric": "cosine",
"chunk_overlap":128,
"chunk_size":400,
"refresh_rate":1}'
);
END;
/
locationは先程作成したオブジェクト・ストレージのURIで置き換えます。
3. 作成したSelect AI with RAGをRAG_TOOLとして登録します。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
tool_name => 'RAG_TOOL',
attributes => '{"instruction": "スマホケースやスマホ関連製品のスペックについて検索する際に使用します。",
"tool_type": "RAG",
"tool_params": {"profile_name": "RAG_PROFILE"}}'
);
END;
/
タスクの作成
1. データベース内のデータを検索するためのタスクを作成します。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'SQL_TASK',
attributes =>
'{
"instruction": "ユーザからの質問: {query}。",
"tools": ["NL2SQL_TOOL"],
"enable_human_tool": "False"
}'
);
END;
2. オブジェクトストレージ内のPDFをベクトル検索するためのタスクを作成します。inputにSQL_TASKを指定することで、SQL_TASKで取得した情報を踏まえてRAGに処理を引き継げます。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TASK(
task_name => 'RAG_TASK',
attributes =>
'{
"instruction": "ユーザからの質問: {query}。",
"tools": ["RAG_TOOL"],
"enable_human_tool": "False",
"input": "SQL_TASK"
}'
);
END;
エージェントの作成
1. データベース内のデータを検索するエージェントを作成します。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'SQL_AGENT',
attributes => '{"profile_name": "NL2SQL_PROFILE",
"role": "データベースを検索し、ユーザーからの質問へ回答します。"
}'
);
END;
2. オブジェクトストレージ内のPDFをベクトル検索するためエージェントを作成します。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
agent_name => 'RAG_AGENT',
attributes => '{"profile_name": "RAG_PROFILE",
"role": "データベースを検索し、ユーザーからの質問へ回答します。"
}'
);
END;
エージェントチームの作成
エージェントチームを作成します。どのエージェントにどのタスクをどの順番で実行させるか定義します。
SQL_AGENTは構造化データ、RAG_AGENTは非構造データを担当します。この2つを順番に実行することで、売上分析と製品仕様検索を横断した回答ができます。
BEGIN
DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
team_name => 'SEARCH_AGENT_TEAMS',
attributes => '{"agents": [
{"name":"SQL_AGENT","task":"SQL_TASK"},
{"name":"RAG_AGENT","task":"RAG_TASK"}],
"process": "sequential"
}');
END;
Oracle APEXのワークスペースの作成
1. ツール構成タブ配下のAPEXのURLをコピーし、APEXにアクセスします。

2. コピーしたURLにアクセスし、APEXの管理サービスにログインします。ADBのADMINユーザーとしてログインします。

4. 先程AIAGENTというスキーマを作成したので、既存のスキーマを選択します。

5. 以下の通りに選択・入力し、ワークスペースの作成をクリックします。
- データベース・ユーザー:AIAGENT(アイコンをクリックし、AIAGENTスキーマを選択)
- ワークスペース名:AIAGENT(データベース・ユーザーを選択すると自動で入力されます)
- ワークスペース・ユーザー名:AIAGENT
- ワークスペース・パスワード:Welcome12345#(任意)
6. 画面上部にメッセージが表示されます。AIAGENTをクリックし、APEX管理サービスからサインアウトします。

7. 先ほど設定したワークスペースのパスワードを入力します(本記事の場合はWelcome12345#)。

8. 先ほど作成したAIAGENTというワークスペースを選択します。

9. APEXのワークスペースを作成し、ログインする事が出来ました。

Oracle APEXアプリのインポート
最後にAPEXのアプリをインポートして、SELECT AIをAPEX上で使用できる様にします。
1. アプリケーション・ビルダーで、インポートをクリックします。

2. インポートするアプリケーションをダウンロードします。こちらをクリックし、f101.sqlというSQLファイルをダウンロードします。
3. ダウンロードしたsqlファイルをドラッグアンドドロップし、次へをクリックします。

6. サポートするオブジェクトのインストールもクリックし、表をインポートします。

7. アプリケーションの実行をクリックし、SELECT AIをAPEXのアプリケーション上で使用してみます。

AIAGENTに権限(DBMS_CLOUD_AIとDBMS_CLOUD_AI_AGENT)が付与されていないと、オブジェクトのインストールでエラーが起きる場合がありますので、ご注意ください。
Select AI Agentを試してみる
1. インポートしたアプリケーションを実行し、AIAGENTユーザーとしてログインします。

2. 入力フィールドの左にある+アイコンをクリックして、Agent Teamを選択します。画面右下から、エージェントチームとして、作成したエージェントチームを選択します。

3. 「スマホケース(A100)、この3日で結構売れているけど、過去3日間の売上金額と売上数量を教えて。」と質問してみます。

SQLクエリを内部で生成し、データベース内のデータを回答として返してくれました。
4. 続けて、「このまま売れ続けたら在庫はいつ尽きそうですか?」と聞いてみます。

前の会話履歴を参照して、この質問にも答えることができます。
5. 最後に「スマホケース(A100)が在庫切れになりそうなので、代わりに別の商品をレコメンドしたい。スマホケース(A100)にスペックが似ていて、在庫数にまだ余裕があり且つ価格帯の近い商品はありますか?」と聞いてみます。

スペックはオブジェクトストレージ内のPDFにデータが格納されており、在庫や価格帯はデータベース内に格納されています。SQLとベクトル検索を組み合わせて回答生成を行う事ができました。
まとめ
Select AI Agentを使うと、データベース内の構造化データとObject Storage上の非構造データを組み合わせたAIエージェントを、Oracle Databaseの中だけで構築できます。
特に、売上分析、在庫確認、製品仕様検索のように、複数の情報源を横断した問い合わせを扱う場面で有効です。







