0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle ADB Select AI Agent入門② ~Custom Agent Toolによるメール送信~

0
Last updated at Posted at 2026-05-22

はじめに

 Oracle Autonomous AI Database(ADB) には、データベースの内部でAI Agentを構築・実行できる「Select AI Agent」という機能があります。
この機能の大きな利点は、AI専用の基盤を用意することなくデータもAI Agentも単一の基盤で利用できることです。これにより、データの移動を最小限に抑え、DBのセキュリティやガバナンスを維持したまま企業データを活用でき、生成AIを業務システムへ安全に組み込みやすくなります。

 以前、この機能を使ってDB上のデータを参照した結果をメールで送信するAgentを作成しました。
この時は「組み込みのメール送信ツール」を使ってメール送信を実施しました。しかし、組み込みのツールではツール内に送信先のメールアドレスを埋め込む必要があり、宛先のカスタマイズ性が少し物足りませんでした。

 そこで今回はこのSelect AI Agentのツールを自作し、動的に宛先を変更可能なツールとしてAgentに利用させてみたいと思います。

この記事でやること

  • メール送信Agentの作成と実行
    • 組み込みツールでもメールは送れますが、よりカスタマイズ性の高いAgent Toolにするため、これを置き換えるToolを作成し、このツールを使ってメールを送るAgentを作成しメール送信を実行します。

前提

  • Autonomous AI Databaseのインスタンス構築が完了している
    ADBの構築はこちらの手順を参照し実施してください。

  • Select AIを利用するための準備が完了している。
    こちらの記事のStep2「ADBへのAPIキーの登録」までを実施してください。

  • SMTPの設定
    メールの送信にはSMTPの設定が必要です。こちらの記事の「ADBからのメール送信の設定」の項を参考に構成してください。
    加えてEMAIL送信のためのSMTPのクレデンシャルも必要になるため、あらかじめ作成をしておきましょう。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'EMAIL_CRED',
    username => '<SMTP username>',
    password => '<SMTP password>');
END;
/

メール送信ツールの作成

早速メール送信ツールを作成していきます。作成とはいっても公式に提供されているPL/SQLプロシージャの機能を拡張するだけです。
send_email_notificationというプロシージャを作ります。
このプロシージャの中でOracle提供のこちらのプロシージャがメールの受信者と件名、内容が動的に変更なようにカスタマイズします。

CREATE OR REPLACE PROCEDURE send_email_notification (
    -- 送信先メールアドレス
    p_recipient IN VARCHAR2,
    -- メール件名
    p_subject   IN VARCHAR2,
    -- メール本文
    p_body      IN VARCHAR2
)
AS
BEGIN
   -- DBMS_CLOUD_NOTIFICATION を使ってメールを送信する
   DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE(
        -- 通知プロバイダとして email を指定
        provider        => 'email',
        -- メール送信用のCredential名
        -- 事前に作成したCredential名に置き換える
        credential_name => 'EMAIL_CRED',
        -- メール本文
        -- subjectではなくbodyを渡す
        message         => p_body,
        -- email providerに渡す追加パラメータ
        params          => json_object(
                            -- 宛先メールアドレス
                            'recipient' value p_recipient,
                            -- メール件名
                            'subject'   value p_subject,
                            -- OCI Email DeliveryのSMTPエンドポイント
                            -- 利用リージョンに合わせて変更する
                            'smtp_host' value 'smtp.email.eu-milan-1.oci.oraclecloud.com',
                            -- 送信元メールアドレス
                            -- Approved Senderとして登録済みのアドレスに変更する
                            'sender'    value 'your_sender@gmail.com'
                          )
   );

   -- 正常終了時のログ出力
   DBMS_OUTPUT.PUT_LINE('Email sent to: ' || p_recipient);

EXCEPTION
   -- 何らかのエラーが発生した場合の処理
   WHEN OTHERS THEN
      -- エラーメッセージをログ出力
      DBMS_OUTPUT.PUT_LINE('Error sending email: ' || SQLERRM);
      -- エラーを呼び出し元に再送出する
      -- Agent Tool側にも失敗として伝えるため
      RAISE;

-- プロシージャの終了
END send_email_notification;
/

プロシージャが完成したらテストしてみましょう
作成したsend_email_notificationプロシージャを実行します。

BEGIN
  send_email_notification(
    p_recipient => '送信先のメールアドレス',
    p_subject   => 'Test Mail',
    p_body      => 'This is a test email from DBMS_CLOUD_NOTIFICATION.'
  );
END;
/

image.png
きちんと私のGmail宛にメールが飛んでいました。
プロシージャ自体は作成完了です。

作成したプロシージャをAgent Tool化する

それではこのPL/SQLプロシージャをAgent Toolにしていきます。
Agent ToolはDBMS_CLOUD_AI_AGENTパッケージのCREATE_TOOLプロシージャで作成できます。(参考)

-- 既存がある場合は削除
BEGIN
  DBMS_CLOUD_AI_AGENT.DROP_TASK(
    task_name => 'DYNAMIC_MAIL_TASK'
  );
END;
/
-- 作成
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    -- tool名は好きにつけてください。
    tool_name  => 'DYNAMIC_MAIL_TOOL',
    -- attributesにツールの情報を入力します。
    -- instructionはLLMに送信するツールの定義情報のためきちんと書きましょう。
    -- function に先ほど作成したプロシージャを指定します。
    -- tool_params にプロシージャの引数を定義しておきます。
    attributes => '{
      "instruction": "指定された宛先にメールを送信するツールです。p_recipientには送信先メールアドレス、p_subjectには短い件名、p_bodyにはメール本文を入力してください。",
      "function" : "send_email_notification",
      "tool_params": {
        "p_recipient": "送信先メールアドレス",
        "p_subject": "メール件名。短く端的に入力すること。",
        "p_body": "メール本文"
      }
    }',
    description => '動的に送信先を変更してメール送信するツール'
  );
END;
/

一応作成できたツールを確認してみましょう。


SQL>SELECT
      tool_id,
      tool_name,
      status,
      description,
      created,
      last_modified
    FROM user_ai_agent_tools
    WHERE tool_name = 'DYNAMIC_MAIL_TOOL';


   TOOL_ID TOOL_NAME          STATUS   DESCRIPTION                              CREATED                                      LAST_MODIFIED
---------- ------------------ -------- ---------------------------------------- -------------------------------------------- --------------------------------------------
         7 DYNAMIC_MAIL_TOOL  ENABLED  動的に送信先を変更してメール送信するツール      22-MAY-26 03.19.02.950815000 PM ASIA/TOKYO   22-MAY-26 03.19.02.950815000 PM ASIA/TOKYO

これにてAgentが使うツールの作成が完了しました。

Agentの作成

ここまでできたら、あとは組み込みツールでAgentを作成する時と同じです。
Agentの作成Stepは以下になります。

Step 内容
1. Agent Toolの作成 Agentに使用させるツールを定義します。組み込み済みのSQLツールを使用します。
2. Taskの作成 Agentが実行するタスクを定義します。何をどのツールで処理するのかを指定するイメージです。
3. Agentの作成 AgentにAIプロファイルと役割を設定します。
4. Agent Teamの作成 どのAgentがどのタスクをどういう順で実施するのかを定義します。
5. 有効化 Agent Teamが動作するできるように有効化します。

Toolは先ほど作ったのでTaskを作成し、このDYNAMIC_MAIL_TOOLを呼び出すAgentを作成します。
まずはメール送信だけを試す最小構成でいきましょう。

Agent Taskの作成

Taskの作成には先ほど同様にDBMS_CLOUD_AI_AGENTパッケージのCREATE_TASKプロシージャを利用します。

-- 既存がある場合は削除
BEGIN
  DBMS_CLOUD_AI_AGENT.DROP_TOOL(
    tool_name => 'DYNAMIC_MAIL_TOOL'
  );
END;
/
-- 作成
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TASK(
    task_name  => 'DYNAMIC_MAIL_TASK',
    attributes => '{
      "instruction": "ユーザーから送信先メールアドレス、件名、本文を受け取り、
      DYNAMIC_MAIL_TOOLを使ってメールを送信してください。
      p_recipientには送信先メールアドレス、p_subjectには短く端的な件名、
      p_bodyにはメール本文を指定してください。
      メール送信後、使用した送信先メールアドレスをユーザーに伝えてください。",
      "tools": ["DYNAMIC_MAIL_TOOL"],
      "enable_human_tool": "true"
    }',
    description => '動的な宛先にメールを送信するTask'
  );
END;
/

作成したら確認します。

SELECT
  task_id,
  task_name,
  status,
  description,
  created,
  last_modified
FROM user_ai_agent_tasks
WHERE task_name = 'DYNAMIC_MAIL_TASK';


   TASK_ID TASK_NAME          STATUS   DESCRIPTION                     CREATED                                      LAST_MODIFIED
---------- ------------------ -------- ------------------------------- -------------------------------------------- --------------------------------------------
        10 DYNAMIC_MAIL_TASK  ENABLED  動的な宛先にメールを送信するTask     22-MAY-26 03.34.11.376540000 PM ASIA/TOKYO   22-MAY-26 03.34.11.376540000 PM ASIA/TOKYO

Agentの作成

Agentを作成します。
AgentはLLMを使うので、プロファイルが必要です。
まずはプロファイルを作ります。

プロファイルの作成

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'DYNAMIC_MAIL_AGENT_PROFILE',
    attributes   => '{
      "provider": "oci",
      "credential_name": "OCI_CRED",
      "region": "us-ashburn-1",
      "model": "xai.grok-4"
    }',
    description  => 'AI profile for Dynamic Mail Agent'
  );
END;

Agent作成

次にAgentを作成します。LLMが正しく動作するようにroleはしっかりと記載しましょう。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
    agent_name  => 'DYNAMIC_MAIL_AGENT',
    attributes  => '{
      "profile_name": "DYNAMIC_MAIL_AGENT_PROFILE",
      "role": "あなたはメール送信を支援するエージェントです。
               ユーザーから送信先メールアドレス、件名、本文を確認し、
               DYNAMIC_MAIL_TASKを実行してメールを送信してください。
               メール送信後、使用した送信先メールアドレスをユーザーに伝えてください。",
      "enable_human_tool": "true"
    }',
    description => '動的な宛先にメールを送信するAgent'
  );
END;
/

できたら確認します。

SELECT
  agent_id,
  agent_name,
  status,
  description,
  created,
  last_modified
FROM user_ai_agents
WHERE agent_name = 'DYNAMIC_MAIL_AGENT';


  AGENT_ID AGENT_NAME           STATUS   DESCRIPTION                      CREATED                                      LAST_MODIFIED
---------- -------------------- -------- -------------------------------- -------------------------------------------- --------------------------------------------
        10 DYNAMIC_MAIL_AGENT   ENABLED  動的な宛先にメールを送信するAgent     22-MAY-26 03.59.57.285886000 PM ASIA/TOKYO   22-MAY-26 03.59.57.285886000 PM ASIA/TOKYO

Agent Teamの作成

最後にAgent Teamを作成します。
ここまでで作成した、AgentTaskを指定します。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
    team_name => 'DYNAMIC_MAIL_TEAM',
    attributes => '{
      "agents": [
        {
          "name": "DYNAMIC_MAIL_AGENT",
          "task": "DYNAMIC_MAIL_TASK"
        }
      ],
      "process": "sequential"
    }',
    description => '動的な宛先にメールを送信するTeam'
  );
END;
/

できたら確認してみましょう。

SELECT
  team_id,
  status,
  description,
  created,
  last_modified
FROM user_ai_agent_teams
WHERE team_name = 'DYNAMIC_MAIL_TEAM';


   AGENT_TEAM_ID AGENT_TEAM_NAME     STATUS   DESCRIPTION                     CREATED                                      LAST_MODIFIED
---------------- ------------------- -------- ------------------------------- -------------------------------------------- --------------------------------------------
              15 DYNAMIC_MAIL_TEAM   ENABLED  動的な宛先にメールを送信するTeam     22-MAY-26 04.09.57.113645000 PM ASIA/TOKYO   22-MAY-26 04.09.57.113645000 PM ASIA/TOKYO

Agentからメールを送ってみよう

まずは作成したAgent Teamを有効化します。

EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('DYNAMIC_MAIL_TEAM');

それではAgentからメールを送ってみましょう。

SQL> SELECT AI AGENT
     'xxx@gmail.com 宛に、件名「テスト」、本文「お疲れ様でした」でメールを送信してください。';

RESPONSE                                         
________________________________________________ 
The email was sent to xxx@gmail.com.    

image.png
私のメールアドレス宛にメールがきちんと届きました。
お疲れ様でしただけでは少し心に響きません。もう少し労ってもらいたいと思います。

SQL> SELECT AI AGENT
       'xxx@gmail.com 宛に、件名「テスト」、本文は私の環境構築への労いの言葉を考えて
        メールを送信してください。';

RESPONSE                                         
________________________________________________ 
The email was sent to xxx@gmail.com.    

image.png
ありがとうをいただけました。大変満足です。

まとめ

今回はメール送信用のAgent Toolを自作し、それを使ってIn-Database Agentからのメール送信を試してみました。
これなら、宛先を固定することなくプロンプトで指定したり、DBから取得した情報をもとにメールを送ると言ったことが可能です。
次回はDB検索用のAgentと今回のメール送信Agentを組み合わせて、

  1. DBからメールアドレスを取得
  2. DBの情報をもとにメール本文を作成
  3. メールを送信

を実装してみたいと思います。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?