27
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?

ReActを使ったAIエージェントによる自律的ワークフローをOracle DBの機能だけで実装してみた (26ai Select AI Agent)

27
Last updated at Posted at 2025-10-19

先日のOracle AI World開催に合わせて、Autonomous AI Database 26ai (旧Autonomous Database 23ai) に「Select AI Agent」という機能が追加されました。
詳細は下記アナウンスをご参照ください。

またマニュアルは下記になります。

本機能によりAIエージェントをAutonomous AI Database上で実装できます。
つまりReActやMCP等で実装できる自律的なワークフロー処理をAutonomous AI Database上で実現できます。

目次

SELECT AI Agentの概念

SELECT AI Agentは ReAct (Reasoning and Acting) を簡単にOracle DB上で実装するための機能を提供します。
ReActとはユーザからの質問に対して何をすべきか推論 (Reasoning) を行い、その結果として何らかのアクション (Acting) を起こす、というフレームワークです。
最終的な回答に至るまで推論とアクションを繰り返します。
良く知られた実装方法の例としては LangGraph などの利用が挙げられます。
詳しくは下記記事をご参照ください。
ReActエージェントとMCP

SELECT AI Agentでは主に以下4つのオブジェクトを活用し、ReActを実現します。

  • Agent Team: Agentを束ねて一つのワークフローを形成
  • Agent: 特定タスクを実行するためのツールの選択と理由付け、ステップの実行、結果の評価、およびレスポンスの生成を実施
  • Task: 特定タスクを実行するためのツールの選択、ツールへのパラメータ設定、実行ポリシーの定義、結果の精査を実施
  • Tool: データの更新、ドキュメントの取得、外部サービスの呼出しなどのアクションを実行

より詳細は下記マニュアルをご参照ください。

ちなみに上記4つのオブジェクトの関係性は以下イメージとなります。
Agent Team には依存性を持たせつつ複数の Agent を紐づけられるため、前のステップの結果をもとに次のステップを処理する、というワークフローを実装できます。

なおSelect AI Agentでは下記ツールが提供されており、これらを組み合わせてAIエージェントを作成します。

  • SQL (SELECT AIによるNL2SQL)
  • RAG (SELECT AI RAGによるAI Vector Searchを使ったRAG)
  • WEB検索 (記事作成の時点ではOpenAIのWeb検索対応モデルを使った機能)
  • 通知 (メールやSlackへの通知)
  • PL/SQLファンクション (PL/SQLファンクションで実装された任意の処理)

以上からSelect AI Agentにより、恐らくどんなワークフローでもAIエージェントによる自律処理を実現できるのではないかと思われます。
今回は試しに以下ユースケースを想定し、Select AI Agentの動作確認をしてみました。

これから配送予定の商品に関して、配送先ロケーションにおける交通情報等をAIエージェントに確認し、配送ルート計画のインプットとする。

検証環境

OCI Osakaリージョンに構築した 26aiAutonomous AI Database を利用しました。
作業は Database Actions 上で実施しました。

作業手順

DBユーザ作成 (ADMINユーザで実行)

検証に使うDBユーザの作成、および必要な権限の付与を行います。

GRANT DB_DEVELOPER_ROLE TO adb_agent identified by <your password>;
GRANT DWROLE to adb_agent;
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to adb_agent;
GRANT EXECUTE on DBMS_CLOUD_AI to adb_agent;
GRANT EXECUTE on DBMS_CLOUD_PIPELINE to adb_agent;

Autonomous AI Database上のACL設定 (ADMINユーザで実行)

外部APIを利用するためACLを設定します。
以下はOpenAIのAPIを実行するACL許可設定です。

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_agent',
                        principal_type => xs_acl.ptype_db)
   );
END;
/

資格証明の作成

LLMを利用するための資格証明を作成します。
今回はOpenAIのLLMを利用するため、OpenAIのAPI実行に必要な資格証明を作成します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OPENAI_CRED',
    username        => 'OPENAI',
    password        => 'your api key'
  );
END;
/

AIプロファイル作成

以降で準備するAgentやSELECT AI等のツールに必要なAIプロファイルを作成します。
なお今回利用するモデルは gpt-4o になります。

BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        profile_name =>'OPENAI',
        attributes   =>'{
            "provider"        : "openai",
            "model"           : "gpt-4o",
            "credential_name" : "OPENAI_CRED",
            "comments"        : "TRUE",
            "conversation"    : "TRUE",
            "object_list" : [
                {"owner": "adb_agent", "name": "orders"}]
        }'
    );
END;
/

ここからSelect AI Agentのオブジェクトを作っていきますが、今回は以下2つの処理を実行するためのAgentやTask、Toolをそれぞれ作成します。

  • 商品の受発注データにおいて、指定した配送先を対象とする商品のうち、未発送となっているものを検索する処理
  • 指定した配送先ロケーションの交通情報等を検索する処理

ちなみに受発注データですが、本検証では ORDERS テーブルという5,000行ほどのデータが含まれるサンプル表を利用しました。

受発注データを検索するAgentとTask、Toolの作成

ORDERSテーブル検索用のAgentを作成します。
profile_nameは直前に作成したgpt-4oを利用するためのAIプロファイルを指定しています。
これによって推論 (Reasoning) にgpt-4oが利用されます。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
        agent_name => 'ORDERS_ANALYST',
        attributes => '{"profile_name": "OPENAI",
           "role": "あなたは受発注履歴であるORDERS表から指示された情報を抽出する役割を担っています。"
        }'
    );
END;
/

ORDERSテーブル検索用のツールを作成します。
実体はSELECT AI (NL2SQL) です。
こちらもprofile_namegpt-4oを利用するためのAIプロファイルを指定しています。
これによってNL2SQL (自然言語からのSQL生成) にgpt-4oが利用されます。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
        tool_name  => 'ORDERS_QUERY',
        attributes => '{"instruction": "ORDERS表を検索する際にこのツールを使います。",
            "tool_type": "SQL",
            "tool_params": {"profile_name": "OPENAI"}}'
    );
END;
/

ORDERSテーブル検索用のタスクを作成します。
このタスクにはtoolsの設定により、先ほど作成したツールを紐づけています。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name => 'ORDERS_ANALYZE',
      attributes =>'{"instruction": "ORDERS表に対するデータ検索を支援してください。ユーザからの質問: {query}' ||
                       'ORDERS表を参照する際には ORDERS_QUERY ツールを利用してください。",
        "tools": ["ORDERS_QUERY"],
         "enable_human_tool" : "False"
       }'
    );
END;
/

指定したロケーションの交通情報等を検索するAgentとTask、Toolの作成

Web検索用のAgentを作成します。
profile_nameは以前作成したgpt-4oを利用するためのAIプロファイルを指定しています。
これによって推論 (Reasoning) にgpt-4oが利用されます。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
        agent_name => 'WEBSEARCHER',
        attributes => '{"profile_name": "OPENAI",
           "role": "あなたは指示された情報をWeb検索によって取得する役割を担っています。"
        }'
    );
END;
/

Web検索用のツールを作成します。
こちらはcredential_nameにOpenAI APIアクセス用の資格証明OPENAI_CREDを指定しています。
これによって恐らくgpt-4o-search-previewを利用でき、最新情報などのWeb検索が可能になると推測しています。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'WEBSEARCH_TOOL',
    attributes => '{"instruction": "天気や災害情報、交通情報をWeb検索して調べる際にこのツールを使います。",
                      "tool_type": "WEBSEARCH",
                      "tool_params": {"credential_name": "OPENAI_CRED"}}'
  );
END;
/

Web検索用のタスクを作成します。
このタスクにはtoolsの設定により、先ほど作成したツールを紐づけています。
またinputというパラメータにORDERSテーブル検索用タスクORDERS_ANALYZEを指定しています。
これによってORDERSテーブルを検索してからWeb検索する、というタスク間の依存関係を定義できます。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
        task_name => 'WEB_ANALYZE',
        attributes => '{"instruction": "ORDERS表の検索結果をもとに、天気や災害情報、交通情報に関するユーザからの質問に回答します。ユーザからの質問: {query}。' ||
                '回答する際にツールとして WEBSEARCH_TOOL を利用し、Web検索して情報を取得してください。",
            "tools": ["WEBSEARCH_TOOL"],
            "enable_human_tool" : "False",
            "input" : "ORDERS_ANALYZE"
        }'
    );
END;
/

Agent Team作成

最後にAgent Teamを作成し、これまでに作成したAgentやタスク、ツールを実行可能な状態にします。
attributesパラメータでは、これまでに作成したAgentORDERS_ANALYSTWEBSEARCHERを連携させる設定、および各Agentに対応するタスクの紐づけを行っています。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TEAM(  
        team_name  => 'SC_AGENT_TEAM',
        attributes => '{"agents": [{"name":"ORDERS_ANALYST","task":"ORDERS_ANALYZE"},
            {"name":"WEBSEARCHER","task":"WEB_ANALYZE"}],
        "process": "sequential"
    }');
END;
/

Agent Team実行

設定が完了しましたのでAgent Teamを実行し、想定したReActの動作を実現できているか確認します。
入力するプロンプトですが、以下シチュエーションを想定した内容となっています。

  • 配送先が名古屋の商品について、未発送の商品があるか確認
  • ある場合、配送ルートを決める際の参考とするため、名古屋市内の交通情報等を確認

上記を考慮したプロンプトが以下になります。

ORDERS表のORDER_STATUS列が3-Shipped以外の商品のうち、City列がNagoyaのものはいくつありますか?
もし1件以上ある場合、該当するデータ件数と名古屋の2025/10/18の天気、交通情報をWeb検索し、日付とともに日本語で教えてください。

なお実行方法は2通りあります。
sqlplusやSQLclといったクライアントツールであればselect ai agentというコマンドの直後に質問となるプロンプトを入力します。
その他のAPEXやDatabase Actions、アプリケーションから実行する場合はDBMS_CLOUD_AI_AGENT.RUN_TEAMファンクションを使います。
今回はDatabase Actionsから実行したためファンクションを使っています。

以下が実際のコードです。
ちなみに実行する際にconversation_idなるものが必要となるため、以下コードでは事前にDBMS_CLOUD_AI.CREATE_CONVERSATIONファンクションからconversation_idを新規取得しています。

DECLARE
    l_conversation_id VARCHAR2(50);
    l_final_answer VARCHAR2(4000);
BEGIN
    SELECT DBMS_CLOUD_AI.CREATE_CONVERSATION INTO l_conversation_id;
    
    l_final_answer := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
        team_name => 'SC_AGENT_TEAM',
        user_prompt => 'ORDERS表のORDER_STATUS列が3-Shipped以外の商品のうち、City列がNagoyaのものはいくつありますか?もし1件以上ある場合、該当するデータ件数と名古屋の2025/10/18の天気、交通情報をWeb検索し、日付とともに日本語で教えてください。',
        params => '{"conversation_id": "' || l_conversation_id || '"}'
    );
    
    DBMS_OUTPUT.PUT_LINE(l_final_answer);
END;
/

実行結果は以下のようになりました。

db_actioons

名古屋で3-Shipped以外の注文は9件あります。2025年10月18日の名古屋の天気は曇り時々雨で、降水確率は50%、最高気温は25℃、最低気温は19℃です。また、同日は「第71回 名古屋まつり」が開催されるため、市内中心部で交通規制が実施されます。特に、名古屋駅前と空港を結ぶバス路線の一部が運休や終点変更となる予定です。お出かけの際は、最新の天気予報と交通情報をご確認ください。

未発送の商品数が合致している点、およびWeb検索結果に「第71回 名古屋まつり」という単語が含まれる点より、想定した結果になっているようです。

またプロンプトを以下のように修正し、未発送の商品が 0件 となるパターンも動作確認してみます。

ORDERS表のORDER_STATUS列が3-Shipped以外の商品のうち、City列がHiroshimaのものはいくつありますか?もし1件以上ある場合、該当するデータ件数と広島の2025/10/20の天気、交通情報をWeb検索し、日付とともに日本語で教えてください。

結果は以下のようになりました。

image.png

ORDERS表のORDER_STATUS列が3-Shipped以外で、City列がHiroshimaのものは0件です。したがって、2025/10/20の広島の天気や交通情報を検索する必要はありません。

以降では念のため内部動作をみていきたいと思います。

実行履歴 (ReActに関する履歴) の確認

内部動作はSelect AI Agent用に新規で用意されたディクショナリ・ビューから確認できます。

Agent Teamとしての履歴 (DBA_AI_AGENT_TEAM_HISTORY / USER_AI_AGENT_TEAM_HISTORY)

Agent Teamの履歴はどのAgent Teamがいつ実行されたかは分かりますが、ReActの内部動作までは確認できません。

SQL> set tab off
SQL> SELECT * FROM USER_AI_AGENT_TEAM_HISTORY WHERE TRUNC(START_DATE) = TRUNC(SYSDATE);

TEAM_EXEC_ID                            TEAM_NAME         STATE        START_DATE                             END_DATE                               CONVERSATION_ID                         
_______________________________________ _________________ ____________ ______________________________________ ______________________________________ _______________________________________ 
4181621B-01C2-3D2E-E063-EE17000A80DE    SC_AGENT_TEAM2    SUCCEEDED    19-OCT-25 10.25.17.851059000 AM UTC    19-OCT-25 10.25.47.648971000 AM GMT    4181621B-01C1-3D2E-E063-EE17000A80DE    

タスクとしての履歴 (DBA_AI_AGENT_TASK_HISTORY / USER_AI_AGENT_TASK_HISTORY)

タスクの履歴であればAgent Team内のどのAgentおよびタスクがどういった順番で実行されたか、各タスクの結果はどうだったか、まで確認できます。
以下より、ORDERSテーブルを検索し、その結果をもとにWeb検索が実行されている点が分かります。

SQL> SET linesize      1024
SQL> SET long          5000
SQL> SET longchunksize 5000
SQL> SELECT * FROM USER_AI_AGENT_TASK_HISTORY WHERE TRUNC(START_DATE) = TRUNC(SYSDATE);

TEAM_EXEC_ID                            TEAM_NAME            TASK_ORDER AGENT_NAME        TASK_NAME         CONVERSATION_PARAMS                                           INPUT                                                                                                                                     RESULT                                                                                                                                                        STATE        START_DATE                             END_DATE                               
_______________________________________ _________________ _____________ _________________ _________________ _____________________________________________________________ _________________________________________________________________________________________________________________________________________ _____________________________________________________________________________________________________________________________________________________________ ____________ ______________________________________ ______________________________________ 
4181621B-01C2-3D2E-E063-EE17000A80DE    SC_AGENT_TEAM2                0 ORDERS_ANALYST    ORDERS_ANALYZE    {"conversation_id":"4181621B-01C3-3D2E-E063-EE17000A80DE"}    ORDERS表のORDER_STATUS列が3-Shipped以外の商品のうち、City列がNagoyaのものはいくつありますか?もし1件以上ある場合、該当するデータ件数と名古屋の2025/10/18の天気、交通情報をWeb検索し、日付とともに日本語で教えてください。    名古屋の該当するデータ件数は9件です。20251018日の天気と交通情報については、現在の能力ではWeb検索ができないため、最新の情報を確認するにはインターネットでの検索をお勧めします。                                                               SUCCEEDED    19-OCT-25 10.25.20.198957000 AM GMT    19-OCT-25 10.25.35.898627000 AM GMT    
4181621B-01C2-3D2E-E063-EE17000A80DE    SC_AGENT_TEAM2                1 WEBSEARCHER       WEB_ANALYZE2      {"conversation_id":"4181621B-01C4-3D2E-E063-EE17000A80DE"}    ORDERS表のORDER_STATUS列が3-Shipped以外の商品のうち、City列がNagoyaのものはいくつありますか?もし1件以上ある場合、該当するデータ件数と名古屋の2025/10/18の天気、交通情報をWeb検索し、日付とともに日本語で教えてください。    名古屋の該当するデータ件数は9件です。20251018日の名古屋の天気は曇り一時雨で、最高気温は25℃、最低気温は19℃でした。また、「名古屋まつり」が開催され、市内中心部で交通規制が実施されました。名古屋駅前と空港を結ぶバス路線の一部が運休や終点変更となり、詳細は名古屋空港の公式サイトで確認できます。    SUCCEEDED    19-OCT-25 10.25.36.194885000 AM GMT    19-OCT-25 10.25.47.627717000 AM GMT 

ツールとしての履歴 (DBA_AI_AGENT_TOOL_HISTORY / USER_AI_AGENT_TOOL_HISTORY)

ツールの履歴では、タスクの履歴から確認できる情報に加え、各ツールに対する実際の入力と加工前の出力まで確認できます。
今回においては以下情報が出力されています。

  • ORDERS_QUERYツールによって自然言語からどんなSQLが生成されたのか
  • WEBSEARCH_TOOLツールによってどんな検索ワードで、どんな検索結果を得られていたのか
SQL> SELECT * FROM USER_AI_AGENT_TOOL_HISTORY WHERE TRUNC(START_DATE) = TRUNC(SYSDATE);

   INVOCATION_ID TEAM_EXEC_ID                               TASK_ORDER TOOL_NAME         AGENT_NAME        TASK_NAME         START_DATE                             END_DATE                               INPUT                                                                                                                                         OUTPUT                                                                                                                                                                                                                                                    TOOL_OUTPUT    
________________ _______________________________________ _____________ _________________ _________________ _________________ ______________________________________ ______________________________________ _____________________________________________________________________________________________________________________________________________ _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ______________ 
             160 4181621B-01C2-3D2E-E063-EE17000A80DE                0 ORDERS_QUERY      ORDERS_ANALYST    ORDERS_ANALYZE    19-OCT-25 10.25.28.249248000 AM GMT    19-OCT-25 10.25.28.469995000 AM GMT    {"TOOL_NAME":"ORDERS_QUERY","QUERY":"SELECT COUNT(*) FROM ORDERS WHERE ORDER_STATUS != '3-Shipped' AND City = 'Nagoya'","ACTION":"SELECT"}    {"status": "success", "result": '{"status": "error", "message": "Invalid action: select. Must be runsql, showsql, or explainsql"}'}                                                                                                                                                                                                                                                                                                                                                                                                                                                
             161 4181621B-01C2-3D2E-E063-EE17000A80DE                0 ORDERS_QUERY      ORDERS_ANALYST    ORDERS_ANALYZE    19-OCT-25 10.25.30.535790000 AM GMT    19-OCT-25 10.25.33.662160000 AM GMT    {"TOOL_NAME":"ORDERS_QUERY","QUERY":"SELECT COUNT(*) FROM ORDERS WHERE ORDER_STATUS != '3-Shipped' AND City = 'Nagoya'","ACTION":"RUNSQL"}    {"status": "success", "result": '[
  {
    "Order_Count" : 9
  }
]'}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
             162 4181621B-01C2-3D2E-E063-EE17000A80DE                1 WEBSEARCH_TOOL    WEBSEARCHER       WEB_ANALYZE2      19-OCT-25 10.25.38.328632000 AM GMT    19-OCT-25 10.25.45.624041000 AM GMT    {"TOOL_NAME": "WEBSEARCH_TOOL", "QUERY": "名古屋 2025年10月18日 天気 交通情報"}                                                                           {"status": "success", "result": '2025年10月18日(土)、名古屋市では「名古屋まつり」が開催されました。このイベントに伴い、市内中心部で交通規制が実施され、名古屋駅前と空港を結ぶバス路線の一部が運休や終点変更となりました。詳細は名古屋空港の公式サイトで案内されています。 ([nagoya-airport.jp](https://nagoya-airport.jp/news/2025/10/000818.html?utm_source=openai))

また、名古屋市内の一部道路でも交通規制が行われました。具体的な規制情報は、名古屋まつりの公���ホームページや関連施設の案内をご参照ください。 ([nagoya.nikkostyle.jp](https://nagoya.nikkostyle.jp/nagoya-matsuri2025/?utm_source=openai))

当日の天気は、曇り一時雨で、最高気温は25℃、最低気温は19℃でした。 ([digi-hotel.com](https://www.digi-hotel.com/domestic/nagoya/weather.html?utm_source=openai)) '} 

まとめ

以上がSelect AI AgentによるReAct実装でした。
ReAct実装においてはPythonを使ってLangGraphやMCP Server、MCP Clientを構成するケースが多いと思います。
Select AI Agentを使えば、Oracle DB上で同じものを実現できることが分かりました。
本機能ならではのお作法は若干ありますが、慣れれば割と簡単にAIエージェントによる自律的なワークフローを実装できるはずです。

参考資料

DBMS_CLOUD_AI_AGENT パッケージのリファレンス

Select AI Agentの様々な使用例

27
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
27
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?