20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【事前構築済みツール編】インデータベースのAIエージェントをSelect AI Agentで構築してみる

20
Last updated at Posted at 2026-04-06

はじめに

Autonomous AI Database内でAIエージェントを作成・管理するため機能として、Select AI Agentがリリースされました。

Select AI Agentは、データベース内でエージェントを直接実行するため、データを外部サービスに送信することなく、すべてのデータ処理をデータベース内で完結させることができます。

本記事では、Select AI Agentを用いて以下を実現します。

  • 自然言語からSQLを生成しデータを分析(NL2SQL)
  • PDFなどの非構造データをRAGで検索
  • 複数エージェントを連携(Agent Team)して高度な問い合わせに回答

unnamed.png

データベースの準備

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スキーマにデータをロードします。

ADMINユーザーからサインアウトします。
image.png

AIAGENTとしてサインインします。
ユーザー名:AIAGENT、パスワード:Welcome12345#と入力します。
image.png

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

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の内容の一部です。
image.png

3.ダウンロードしたproduct_specs.pdfをオブジェクト・ストアにアップロードし、オブジェクト・ストアのURIを取得します。このURIは後程使用するので、メモをしておきます。(例:https://objectstorage.ap-tokyo-1.oraclecloud.com/n/xxxxxxxxx/b/xxxxxxxxxx/o/)

OCIのオブジェクトストレージでのURI取得方法
  1. アップロードしたファイルの右側にある3つの点をクリックし、オブジェクト詳細の表示を選択します。
    image.png

  2. 赤線で囲まれているところのURIをコピーし、メモをしておきます。
    image.png

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

こちらを参照し、サブスクライブしているリージョンで提供されているモデルを指定します。大阪リージョン等、xAI Grok Code Fast 1を提供していないリージョンを使用する場合にはCohere Command A等をご使用ください。

リージョン名もこちらを参照し、サブスクライブしているリージョンをご指定下さい。

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にアクセスします。
image.png

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

言語が英語になっている場合は、画面をスクロールし、日本語を選択します。
image.png

3. ワークスペースの作成をクリックします。
image.png

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

5. 以下の通りに選択・入力し、ワークスペースの作成をクリックします。

  • データベース・ユーザー:AIAGENT(アイコンをクリックし、AIAGENTスキーマを選択)
  • ワークスペース名:AIAGENT(データベース・ユーザーを選択すると自動で入力されます)
  • ワークスペース・ユーザー名:AIAGENT
  • ワークスペース・パスワード:Welcome12345#(任意)
    image.png

6. 画面上部にメッセージが表示されます。AIAGENTをクリックし、APEX管理サービスからサインアウトします。
image.png

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

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

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

Oracle APEXアプリのインポート

最後にAPEXのアプリをインポートして、SELECT AIをAPEX上で使用できる様にします。

1. アプリケーション・ビルダーで、インポートをクリックします。
image.png

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

3. ダウンロードしたsqlファイルをドラッグアンドドロップし、次へをクリックします。
image.png

4. アプリケーションのインストールをクリックします。
image.png

5. をクリックします。
image.png

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

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

AIAGENTに権限(DBMS_CLOUD_AIとDBMS_CLOUD_AI_AGENT)が付与されていないと、オブジェクトのインストールでエラーが起きる場合がありますので、ご注意ください。

Select AI Agentを試してみる

1. インポートしたアプリケーションを実行し、AIAGENTユーザーとしてログインします。
image.png

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

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

SQLクエリを内部で生成し、データベース内のデータを回答として返してくれました。

4. 続けて、「このまま売れ続けたら在庫はいつ尽きそうですか?」と聞いてみます。
image.png

前の会話履歴を参照して、この質問にも答えることができます。

5. 最後に「スマホケース(A100)が在庫切れになりそうなので、代わりに別の商品をレコメンドしたい。スマホケース(A100)にスペックが似ていて、在庫数にまだ余裕があり且つ価格帯の近い商品はありますか?」と聞いてみます。
image.png

スペックはオブジェクトストレージ内のPDFにデータが格納されており、在庫や価格帯はデータベース内に格納されています。SQLとベクトル検索を組み合わせて回答生成を行う事ができました。

まとめ

Select AI Agentを使うと、データベース内の構造化データとObject Storage上の非構造データを組み合わせたAIエージェントを、Oracle Databaseの中だけで構築できます。
特に、売上分析、在庫確認、製品仕様検索のように、複数の情報源を横断した問い合わせを扱う場面で有効です。

20
8
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
20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?