Select AI Agentによる自律型エージェントの構築

Select AI Agent(自律型エージェント・フレームワーク)を使用すると、Autonomous AI Database内にインタラクティブな自律型エージェントを構築し、プランニング、ツールの使用、リフレクション、メモリを組み合わせてマルチターン・ワークフローを実現できます。

ノート:

Select AI AgentおよびDBMS_CLOUD_AI_AGENTパッケージのサポートは、Oracle Database 19c (バージョン19.29以降)およびOracle Database 26ai (バージョン23.26以降)で使用できます。

Select AI Agentについて

Select AI Agent (自律型エージェント・フレームワーク)は、Autonomous AI Database内で対話型および自律型エージェントを作成および管理するためのプログラムです。エージェントは、リクエスト、コール・ツール、結果を反映し、ReAct (理由付けと行動)エージェント・パターンでLLMを指定したAIプロファイルによって強化された短期および長期のメモリーでコンテキストを維持します。

Select AI Agentを使用すると、RAGやNatural Language to SQL (NL2SQL)、カスタムPL/SQLプロシージャ、外部REST APIなどの組込みツールを使用してタスクを完了できます。このフレームワークは、複数のターン・メモリーを保持し、会話間のコンテキストを維持します。これらの機能を組み合わせることで、エンタープライズ・データおよびワークフローと統合されたスケーラブルでコンテキストに対応した生成AIがサポートされます。

DBMS_CLOUD_AI_AGENTパッケージは、管理、オーケストレーションおよびセキュリティ境界をカプセル化します。詳細は、DBMS_CLOUD_AI_AGENT Packageを参照してください。

Select AI Agentの機能

主な機能には、統合インテリジェンス、柔軟なツール、状況に応じた会話、迅速なデプロイメントが含まれます。

  • 統合インテリジェンス:

    プランニング、ツールの使用およびリフレクションを組み合せることで、エージェントはタスクの理由付け、ツールの選択と実行、結果の観察、計画の調整、会話全体の応答の改善を行うことができます。エージェントは、ステップを計画し、ツールを実行し、観察を評価し、結果が期待を満たさない場合にアプローチを更新します。このループは、精度を高め、やり直しを減らし、会話を順調に進めます。

  • 柔軟なツーリング:

    オーケストレーション・コンポーネントや個別のインフラストラクチャを使用せずに、組込みのRAGおよびNL2SQL、カスタムPL/SQLプロシージャおよび外部RESTサービスをサポートおよび使用するため、必要に応じて外部機能を統合しながら、データベースのコア・ロジックを保持できます。

  • コンテキスト対応の会話:

    短期および長期のメモリーを維持して、状況を交互に把握し、レスポンスをパーソナライズし、プリファレンスを保存し、マルチターン・セッション中に修正と確認を行うためのヒューマン・イン・ザ・ループ制御をサポートします。短期記憶は、現在の対話を一貫して保ちます。長期的なメモリは、人間のレビュー担当者によるフォローアップのやり取りと監視をサポートし、好みと以前の結果を記録します。

  • スケーラブルで安全:

    Autonomous AI Database内で実行し、セキュリティ制御、監査、パフォーマンスを継承し、データ移動を削減し、エンタープライズ・デプロイメントおよび規制環境のガバナンスを大規模に標準化します。エージェントには、データベースのセキュリティ、監査およびパフォーマンス特性があります。処理をデータに近い状態に保つことで、移動が減少し、ガバナンス・プラクティスに合せて調整されます。

  • 迅速な開発:

    使い慣れたSQLおよびPL/SQLを使用してエージェント、タスクおよびツールを定義し、既存のプロシージャを再利用して機能をより迅速に出荷すると同時に、個別のインフラストラクチャを構築することなく、ロジックを運用データとチームに近づけることができます。

ReActエージェント・パターン

Select AI Agentでは、ReAct (Reasoning and Acting)エージェント・パターンを使用します。エージェントは、リクエストに関する理由、ツールの選択、アクションの実行、結果の評価を行って目標を達成します。

各反復のパターンを次に示します。
  1. 問合せ: ユーザーは質問をするか、要求を指定します。エージェントはそれを読み取り、重要な詳細を抽出し、次のステップを計画する準備をします。

  2. Thought and Action(思考と行動): オプションに関するエージェントの理由。ツールを選択し、それを実行してデータを収集するか、タスクに必要な状態を変更します。

  3. 監視: 監視には、ツールまたは問合せ結果、確認メッセージおよびエラーが含まれます。これらはエージェントの次の推論への入力になります。エージェントは監視を記録し、結果が次のステップまたは最終応答をサポートしているかどうかをチェックします。

  4. 最終的な対応: 十分な思考と観察が成功した後、エージェントは明確な回答を作成し、重要な決定を説明し、次のステップまたはフォローアップ・アクションを共有します。

Select AI Agentのアーキテクチャ

Select AI Agentは、Planning、Tool Use、Reflection、Memory Managementの4つのレイヤーに作業を整理します。これらのレイヤーは、推論、ツール実行、評価およびコンテキストのマルチターン相互作用を調整します。

Planning: Planningは、ユーザー・リクエストを解釈し、順序付けされたアクションに分割し、候補ツールを選択し、セッション・コンテキスト、前回の結果および関連するナレッジを使用してプランをドラフトします。エージェントは、リクエストを分析し、欠落している詳細を特定し、順序付けされた一連のアクションを提案します。ポリシー、データ・スコープおよび期待される結果に適合するツールを選択します。

ツールの使用: ツールの使用では、各アクションのツールが選択および実行されます。サポートされているタイプには、RAG、NL2SQL、ツールの作成時に追加できるカスタムPL/SQLプロシージャ、およびWeb検索や電子メールなどの外部RESTサービスが含まれます。各ステップは、パラメータを持つツールを呼び出します。組込みツールは、取得とSQL生成を処理します。カスタムPL/SQLは、ドメイン・ロジックをカプセル化します。RESTツールは外部サービスに接続します。

リフレクション: リフレクションは、ツールの結果を期待値に照らして評価し、最終応答に進みます。エージェントは観察と目標を比較します。結果が間違っている場合、またはツール・コール・エラーまたはユーザーが承認しなかった結果がある場合、エージェントは推論を改訂するか、別のツールを選択するか、計画を更新してから再試行します。結果が合わない場合は、計画を調整したり、異なるツールを選択したり、続行する前に明確な質問をすることがあります。Select AI Agentの考えは、USER_CLOUD_AI_CONVERSATION_PROMPTSを使用して問い合せることができます。詳細は、DBMS_CLOUD_AIビューを参照してください。

メモリー管理: メモリー管理には、エージェント・チームごとにセッション・コンテキストおよびナレッジが格納されます。短期メモリは、エージェントチームごとに最近のメッセージと中間結果を保持します。長期記憶記録の好み、歴史、戦略、継続性、パーソナライゼーション、計画性の向上。長期的なメモリは、セッション間で有用な知識を維持し、エージェントチーム全体で時間の経過とともにガイダンスと応答の品質を向上させます。

Select AI Agentの用語

Select AI Agent (自律型エージェント・フレームワーク)に関連する概念と用語を確認します。

Select AI Agentに関連する用語は次のとおりです。

用語 定義
エージェント・アクション

エージェントのコンテキストでは、アクションはパラメータを持つツールをトリガーする命令です。このプラットフォームはツールを実行し、エラーを処理し、次の推論ステップ・ループの観察を返します。

アクションは計画を実行につなぎます。実行するツールと、どの入力を使用するかを定義します。

エージェント

エージェントは、定義された目的のためにタスクを実行します。エージェントは、リクエストに関する理由付け、ツールの選択、ステップの実行、結果の評価、およびデータベース・コンテキストに基づくレスポンスの生成を行う構成済ワーカーです。

エージェントは、特定のジョブの動作、ポリシーおよび使用可能なツール(返品処理やナレッジ取得など)をカプセル化します。

エージェントチーム

エージェント・ワークフローを実行する1つ以上のエージェント。チームは、職責を調整し、コンテキストを共有し、エージェントとタスクのペアを実行して、複数ステップの対話を確実に完了します。

チームは、専門的なエージェント間で作業を分割し、その貢献を順序付けします。チームは共有コンテキストを維持し、統一された応答を生成します。

履歴ビュー USER_AI_AGENT_TEAM_HISTORY USER_AI_AGENT_TASK_HISTORYおよび USER_AI_AGENT_TOOL_HISTORYを使用して、エージェントおよびチームの実行の詳細を表示できます。これらのビューは、各エージェント、タスクおよびチームのプロンプト、レスポンスおよびツール実行を記録し、エージェント・ワークフロー全体の透明性とトレーサビリティを提供します。これらの履歴ビューの詳細は、DBMS_CLOUD_AI_AGENT「履歴ビュー」を参照してください。

MCPサーバー

MCPサーバー(Model Context Protocol Server)は、一貫性のあるプロトコルを介してモデル機能、コンテキスト検索および拡張機能を公開することで、アプリケーションが生成AIモデルおよびツールと対話するための標準化された方法を提供します。

Select AI Agentを使用して、Autonomous AI Database MCPサーバーを介して公開できるツールを定義できます。これらのツールには、SQL生成、RAG、通知(電子メールとSlack)、Web検索用の組込みツール、およびカスタム・ツールを含めることができます。カスタム・ツールは、データベースで定義された関数を公開できます。

監視

ツール実行から返されたデータ(行、メッセージまたはエラー)は、エージェントがリフレクション中に記録および評価します。観察は、次の推論ステップを導き、最終的な反応の証拠を提供します。

タスク

タスクは作業単位を表します。ツール選択、パラメータ・マッピングおよび実行ポリシーをガイドし、ダウンストリーム・ステップが読取りおよび要約できる結果を生成します。

タスクでは、目標、入力、ツールの選択、およびガードレールを指定します。これらは、後のステップで消費できる構造化出力を返します。

USER_AI_AGENT_TASK_HISTORYビューを問い合せて、エージェント実行内でタスクがどのように定義、実行および完了されているかを調べることができます。詳細は、DBMS_CLOUD_AI_AGENT「履歴ビュー」を参照してください。

ツール

ツールは、データの更新、ドキュメントの取得、外部サービスの呼出しなどのアクションを実行します。ツールはパラメータを取り、決定的または非決定的に実行でき、推論のために観察を返します。

ツールは繰り返し可能な操作をカプセル化します。副作用の制御と監視を維持し、監査とデバッグをサポートします。

Select AI Agentフレームワークでは、ツールは、エージェントがタスク処理中に使用できる機能的な構成要素を表します。次のようなツールがあります。
  • 同じ入力に対して同じ出力を返すPL/SQLファンクションなどの決定的ツール。
  • Web検索やLLMベースの要約などの非決定的なツール。出力はタイミング、ネットワーク結果、またはランダム性によって異なる場合があります。

エージェントは、タスクのニーズに基づいてツールを選択し、出力(監視と呼ばれる)を使用して、推論、次のステップの決定、またはレスポンスの生成を行います。ツール・メタデータおよび実行履歴は、デバッグ、可観測性およびセキュリティをサポートするために記録されます。

USER_AI_AGENT_TOOL_HISTORYビューを問い合せて、ツールの使用状況を監視し、各エージェント・タスクの実行結果を確認できます。詳細は、DBMS_CLOUD_AI_AGENT「履歴ビュー」を参照してください。

Select AI Agentのユース・ケース

Select AI Agentは、外部サービスの接続、PL/SQLツールによるタスク重視の自動化の構築、自然言語によるインタラクションによるデータへの会話型アクセスの実現など、ロール間の実用的なシナリオをサポートします。

次のユース・ケースがあります。

外部APIを統合して、より充実したレスポンスを実現:

出荷ステータス、ナレッジ記事、メッセージングなどのRESTサービスを接続します。エージェントは、外部の結果をデータベース・ファクトとブレンドし、タイムリーで実用的なガイダンスを返します。

PL/SQLツールを使用して、タスク固有のエージェントを作成します。

更新、検証または変換のためにPL/SQLツールを呼び出す集中型エージェントを作成し、ロジックをデータに近い状態に保ち、パフォーマンスを向上させ、環境間のメンテナンスを一貫して簡素化します。更新およびチェックのために既存のPL/SQLをラップします。エージェントは、トランザクション管理を維持しながら、タスクの調整、パラメータの実施、結果の記録を行います。

エンタープライズ・データへの会話型アクセスを可能にします。

データベース・オブジェクトに基づく自然言語の質問を通じてデータを公開します。セキュリティおよびガバナンス要件を尊重しながら、取得、ポリシーの適用、および結果の明示にNL2SQLを使用します。NL2SQLは、承認済オブジェクトの質問をSQLに変換します。エージェントは、オブジェクト・リストおよびアクセス・ルールに従い、結果と次のステップを要約します。

Select AI Agentを使用するための前提条件

Select AI Agentを使用する前に、DBMS_CLOUD_AI_AGENTパッケージおよびSelect AIに必要な他のすべての権限を使用する権限が必要です。

Select AI Agentを使用するには、次を実行する必要があります。

  • 前提条件を実行し、Select AIの権限を付与します。Configure AI Profiles Using DBMS_CLOUD_AI fr instructionsを参照してください。

  • 少なくとも1つのエージェント・チームが定義されています。CREATE_AGENTプロシージャを参照してください。

  • オプションで、conversation_idが作成され、マルチターン・コンテキストが追跡されます。

Select AI Agentに対する権限の付与

DBMS_CLOUD_AI_AGENTを構成するには:

Select AI Agentを使用するユーザーに、DBMS_CLOUD_AI_AGENTパッケージのEXECUTE権限を付与します。

デフォルトでは、システム管理者のみがEXECUTE権限を持ちます。管理者は、他のユーザーにEXECUTE権限を付与できます。

Select AI Agentを実行する権限の例

次の例では、EXECUTE権限をADB_USERに付与します。

GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;

Select AI Agentを使用する方法

agentアクションまたはDBMS_CLOUD_AI_AGENT.RUN_TEAMファンクションを使用して、Select AI Agentを使用できます。

Select AI Agentは次の方法で使用できます。
  • Select AIアクションとしてagentを使用します: Select AI agent <prompt>

  • DBMS_CLOUD_AI_AGENT.RUN_TEAMをコールし、ファンクション内のプロンプトを他のパラメータとともに指定します。

どちらのオプションも、選択したエージェント・チームにプロンプトをルーティングし、チームの返信を返します。

参照:

にご登録の上、サインインしてアクセスしてください。

Select AI Agentの使用例

動画分析、ログ分析、カスタマーサポートなどの一般的なタスクのために、Select AI Agentを構築、構成、および対話する方法を示す例をご覧ください。

例: エージェントの作成

定義済タスクを実行するエージェントを作成します。

この例では、製品返品関連の会話を処理するCustomer_Return_Agentという名前のエージェントを作成します。

この例では、GOOGLEという名前のAIプロファイルで指定されたAIプロバイダとして Googleを使用しています。AIプロファイルは、エージェントが推論および応答に使用するLLMを識別します。role属性は、エージェントをガイドする手順を示します。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
    agent_name => 'CustomerAgent',
    attributes =>'{
       "profile_name": "GOOGLE",
                       "role": "You are an experienced customer agent who deals with customers return request."
     }'
  );
END;
/  

例: 組込みツールの作成

SQL、RAG、Websearch、Email、Slackなどの組込みツールを作成します。これらのツールを使用すると、エージェントおよびタスクでデータの問合せ、ナレッジの取得、Webの検索および通知の送信を行うことができます。

組込みツール(SQLやRAGなど)には、内部命令が含まれています。オプションで、ユーザー指定の指示を追加して、ユース・ケースの動作を調整できます。命令を追加すると、タスク固有のコンテキストを追加できます(たとえば、問合せを特定のスキーマにスコープ指定したり、レスポンス・フォーマットを強制できます)。これにより、特殊なシナリオの関連性が向上します。不適切に記述された命令や過度に規定された命令は、ツールのパフォーマンスを低下させる可能性があります。指示を短く、具体的で、ツールの目的と一致させてください。

例: SQLツール

この例では、自然言語問合せをSQL文に変換するSQLツールを作成します。SQLツールは、プロンプトをSQL問合せにマップすることで、エージェントがデータ関連の質問に回答するのに役立ちます。

この例では、nl2sql_profileというAIプロファイルで指定されたAIプロバイダとしてOCIを使用しています。AIプロファイルは、エージェントが推論および応答に使用するLLMを識別します。この例では、AIプロファイルnl2sql_profileによって、エージェントが問い合せることができる一連のSHスキーマ表が定義され、顧客、製品、プロモーション、国など、一般的に使用される販売履歴データへの自然言語アクセスが可能になります。SQLツールでは、AIプロファイルで指定されたデータベース・オブジェクトが使用され、生成されたSQL文がSHデータ・セットに正確で関連していることが保証されます。

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
      profile_name => 'nl2sql_profile',
      attributes   => '{"provider": "oci",
        "credential_name": "GEN1_CRED",
        "oci_compartment_id": "ocid1.compartment.oc1..aaaa...",
	object_list": [{"owner": "SH", "name": "customers"},                
                      {"owner": "SH", "name": "countries"},                
                      {"owner": "SH", "name": "supplementary_demographics"},
                      {"owner": "SH", "name": "profits"},                  
                      {"owner": "SH", "name": "promotions"},               
                      {"owner": "SH", "name": "products"}]

       }');
end;
/

EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('SQL');
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'SQL',
    attributes => '{"tool_type": "SQL",
                    "tool_params": {"profile_name": "nl2sql_profile"}}'
  );
END;
/
例: RAGツール

この例では、RAG (Retrieval Augmented Generation)ツールを作成します。RAGツールを使用すると、エージェントはエンタープライズ・ドキュメント内のレスポンスを取得してアースできるため、ナレッジベースの回答の精度が向上します。

この例では、資格証明、ベクトル索引を使用してRAG_PROFILEを定義し、プロファイル・パラメータを指定しています。次に、ドキュメント埋込み用のベクトル索引RAG_INDEXをオブジェクト・ストレージに作成し、プロファイルにリンクされたRAG_TOOLを作成します。

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
          profile_name =>'RAG_PROFILE',
          attributes   =>'{"provider": "oci",
            "credential_name": "GENAI_CRED",
            "vector_index_name": "RAG_INDEX",
            "oci_compartment_id": "ocid1.compartment.oc1..aaaa..",   
            "temperature": 0.2,
            "max_tokens": 3000
          }');
END;
/

BEGIN
   DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
           index_name  => 'RAG_INDEX',
           attributes  => '{"vector_db_provider": "oracle",
                            "location": "https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder",
                            "object_storage_credential_name": "OCI_CRED",
                            "profile_name": "RAG_PROFILE",
                            "chunk_overlap":128,
                            "chunk_size":1024
   }');
END;
/

EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('RAG_TOOL');
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'RAG_TOOL',
    attributes => '{"tool_type": "RAG",
                      "tool_params": {"profile_name": "RAG_PROFILE"}}'
  );
END;
/
例: Websearchツール

この例では、インターネットから詳細を取得するためのWebsearchツールを作成します。Websearchツールを使用すると、エージェントは製品価格や説明などの情報をWebから検索できます。

次の例では、OpenAIプロバイダのACLエントリを追加します。APIキーを使用して資格証明OPENAI_CREDを作成し、Websearchツールを作成してその目的を説明し、資格証明にリンクします。

ノート:

OpenAIは、サポートされている唯一のWebsearch AIプロバイダです。
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_USER',
                        principal_type => xs_acl.ptype_db)
   );
END;
/

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OPENAI_CRED',
    username        => 'OPENAI',
    password        => '<OPENAI_API_KEY>'
  );
END;
/

EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('Websearch');
BEGIN
  DBMS_CLOUD_AI_AGENT.create_tool(
    tool_name  => 'Websearch',
    attributes => '{"instruction": "This tool can be used for searching the details about topics mentioned in notes and prepare a summary about prices, details on web",
                      "tool_type": "WEBSEARCH",
                      "tool_params": {"credential_name": "OPENAI_CRED"}}'
  );
END;
/
例: 電子メール・タイプの通知ツール

この例では、電子メール通知ツールを作成します。Eメール・ツールを使用すると、エージェントはワークフローの一部として通知Eメールを送信できます。

この例では、パスワードを使用して資格証明EMAIL_CREDを作成し、データベース・ユーザーのSMTPアクセスを許可し、タイプEMAILの通知ツール(SMTPの詳細、送信者および受信者アドレスを含む)を作成します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'EMAIL_CRED',
    username => '<username>',
    password => '<password>');
END;
/
-- Allow SMTP access for user
BEGIN
   DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
     host => 'smtp.email.us-ashburn-1.oci.oraclecloud.com',
     lower_port => 587,
     upper_port => 587,
     ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                        principal_name => 'ADB_USER',
                        principal_type => xs_acl.ptype_db));
END;
/

EXEC DBMS_CLOUD_AI_AGENT.DROP_TOOL('Email');
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'EMAIL',
    attributes => '{"tool_type": "NOTIFICATION",
                    "tool_params": {"notification_type" : "EMAIL",
                                    "credential_name": "EMAIL_CRED",
                                    "recipient": "example_recipient@oracle.com",
                                    "smtp_host": "smtp.email.us-ashburn-1.oci.oraclecloud.com",
                                    "sender": "example_sender@oracle.com"}}'
  );
END;
/
例: Slackタイプの通知ツール

この例では、Slack通知ツールを作成します。Slackツールを使用すると、エージェントは通知をSlackワークスペース・チャネルに直接配信できます。

この例では、SlackのACLエントリを追加し、SLACK_CREDおよびターゲット・チャネルにリンクするタイプSLACKの通知ツールを作成します。

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
  host         => 'slack.com',
  lower_port   => 443,
  upper_port   => 443,
  ace          => xs$ace_type(
      privilege_list => xs$name_list('http'),
      principal_name => 'ADB_USER',
      principal_type => xs_acl.ptype_db));
END;
/
 
BEGIN
  DBMS_CLOUD_AI_AGENT.create_tool(
    tool_name  => 'slack',
    attributes => '{"tool_type": "SLACK",
                    "tool_params": {"credential_name": "SLACK_CRED",
                                    "channel": "<channel_number>"}}'
  );
END;
/

例: タスクの作成

エージェントが実行できるタスクを作成します。

ノート:

DBAのみがEXECUTE権限およびネットワークACLプロシージャを付与できます。

例: 電子メール・タスクの作成

この例では、構造化データを使用して標準確認Eメールを作成するようLLMに指示するGenerate_Email_Taskを作成します。

次の例では、instruction属性を使用し、電子メールに含める手順を示します。

BEGIN DBMS_CLOUD_AI_AGENT.DROP_TASK('Generate_Email_Task');
EXCEPTION WHEN OTHERS THEN NULL; END;
/
BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
    task_name => 'Generate_Email_Task',
    attributes => '{"instruction": "Use the customer information and product details to generate an email in a professional format. The email should:' || 
                    '1. Include a greeting to the customer by name' || 
                    '2. Specify the item being returned, the order number, and the reason for the return' ||
                    '3. If it is a refund, state the refund will be issued to the credit card on record.' ||
                    '4. If it is a replacement, state that the replacement will be shipped in 3-5 business days."}'
    );
END;
例: フェッチ・ログ・タスクの作成

この例では、リクエストに基づいてログを取得するFETCH_LOGS_TASKを作成します。

次の例では、log_fetcherツールを使用してログを取得するタスクを作成します。このカスタム・ツールは、PL/SQLプロシージャfetch_logsを指定します。タスク手順では、タスクの実行内容を指定します。属性enable_human_toolはtrueに設定されているため、ユーザーは必要に応じてタスク・フローをガイドまたは承認するためにステップインできます。完全な例については、を参照してください。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TASK(
    task_name  =>'FETCH_LOGS_TASK',
    attributes =>'{
       "instruction": "Fetch the log entries from the database based on user request: {query}",
       "tools": ["log_fetcher"],
       "enable_human_tool" : "true"
     }'
  );
END;
/
例: ログ分析タスクの作成

この例では、フェッチされたログを分析するANALYZE_LOG_TASKを作成します。

次の例は、FETCH_LOGS_TASKinput属性として使用する方法を示しています。ANALYZE_LOG_TASKという名前のタスクは、ログが収集されて入力としてFETCH_LOGS_TASK出力が得られた後に開始されます。タスク手順では、タスクの実行内容を指定します。属性enable_human_toolは、ヒューマン・イン・ザ・ループ・レビューがないことを示すfalseに設定されます。

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name  =>'ANALYZE_LOG_TASK',
      attributes =>'{"instruction": "Analyze the fetched log entries retrieved based on user request: {query} ' ||
                      'Generate a detailed report include issue analysis and possible solution.",
         "input" : "FETCH_LOGS_TASK",
         "enable_human_tool" : "false"
       }'
    );
END;
/

例: エージェント・チームの作成

タスクを完了するためにエージェント・チームを作成します。

例: エージェント・チームの作成

この例では、ReturnAgencyチームを作成し、単一のエージェントCustomer_Return_Agentを含めます。タスクReturn_And_Price_Matchがエージェントに割り当てられます。このタスクでは、事由を尋ねてデータベースのオーダー・ステータスを更新することにより、返品要求を管理します。processは、定義された順序でタスクを実行するためにsequentialに設定されます。

BEGIN                                                                
  DBMS_CLOUD_AI_AGENT.CREATE_TEAM( 
    team_name  => 'ReturnAgency',                                                            
    attributes => '{"agents": [{"name":"Customer_Return_Agent","task" : "Return_And_Price_Match"}],
                    "process": "sequential"}');                                                                
END;                                                                      
/

完全な例については、を参照してください。

例: マルチエージェント・チームの作成

この例では、Ops_Issues_Solution_Teamチームを作成し、ログ分析およびトラブルシューティングを処理する2つのエージェント(Data_EngineerおよびOps_Manager)を含めます。Data_Engineerエージェントはタスクfetch_logs_taskを実行し、Ops_Managerエージェントはタスクanalyze_log_taskを実行します。processは、定義された順序でタスクを実行するためにsequentialに設定されます。

BEGIN
      DBMS_CLOUD_AI_AGENT.create_team(
        team_name  => 'Ops_Issues_Solution_Team',
        attributes => '{"agents": [{"name":"Data_Engineer","task" : "fetch_logs_task"},
                                   {"name":"Ops_Manager","task" : "analyze_log_task"}],
                "process": "sequential"
                }');
END;
/

完全な例については、を参照してください。

例: 組込みツールを使用したムービー分析エージェントの作成

この例では、Select AI Agentを使用してムービー分析エージェントを作成する方法を示します。この例では、データを取得し、質問に回答し、Webを検索し、分析をEメールで送信したり、Slack通知を送信するムービー分析エージェントを設定します。

次の例では、データを使用できると想定しています。

この例では、MOVIE_ANALYSTエージェントを作成し、EMAILおよびSLACK型のSQLRAGWEBSEARCHおよびNOTIFICATIONツールなどの複数の組込みツールを使用します。エージェントは、自然言語プロンプトを使用してムービー関連の質問に回答します。

この例では、DBAが DBMS_CLOUD_AI_AGENTDBMS_CLOUD_AIDBMS_CLOUD_PIPELINEパッケージ、AIプロバイダのACLアクセス、SMTPアクセスおよびSlackアクセスに対してEXECUTE権限を付与した後、まずMOVIE_ANALYSTエージェントを作成します。

エージェントの作成

プロファイル(GROK)と、映画、俳優およびジャンルに関する質問に回答する役割を持つMOVIE_ANALYSTというエージェントを作成します。

タスクの作成

ムービー関連の問合せに回答する指示を含むANALYZE_MOVIE_TASKというタスクを作成します。

チームを作成

エージェントとしてMOVIE_ANALYST、タスクをANALYZE_MOVIE_TASKとしてMOVIE_AGENT_TEAMチームを作成し、アクティブ・チームとして設定します。

SQL、RAG、WebsearchまたはNotificationなどのツールを後で添付して、その機能を拡張できます。

Select AI Agentチームの実行

プロンプトの接頭辞としてselect ai agentを使用して、エージェント・チームを実行します。

ツールの作成

次に、様々な組込みエージェント・ツールをアタッチします。
  • SQL: NL2SQLプロファイルを使用して、質問をSQL問合せおよびその他のサポートされているSelect AIアクションに変換します。
  • RAG: 格納されたドキュメントからナレッジベースのコンテキストを取得します。
  • WEBSEARCH: 映画の詳細または価格をオンラインで収集します。
  • NOTIFICATION:
    • EMAIL: ユーザー・プロンプト、ムービー・レポートまたはレビューへのアンサーを受信者に送信します。
    • SLACK: ユーザー・プロンプト、サマリーまたは更新へのアンサーをSlackに直接送信します。

完全な例は次のとおりです。

--Grants EXECUTE privilege to ADB_USER
--
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_PIPELINE to ADB_USER;

-- Websearch tool accesses OPENAI endpoint, allow ACL access
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_USER',
                        principal_type => xs_acl.ptype_db)
   );
END;
/

-- To allow Email tool in Autonomous Database, allow SMTP access

BEGIN
   DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
     host => 'smtp.email.us-ashburn-1.oci.oraclecloud.com',
     lower_port => 587,
     upper_port => 587,
     ace => xs$ace_type(privilege_list => xs$name_list('SMTP'),
                        principal_name => 'ADB_USER,
                        principal_type => xs_acl.ptype_db));
END;
/

-- Allow ACL access to Slack

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
  host         => 'slack.com',
  lower_port   => 443,
  upper_port   => 443,
  ace          => xs$ace_type(
      privilege_list => xs$name_list('http'),
      principal_name => 'ADB_USER',
      principal_type => xs_acl.ptype_db));
END;
/

PL/SQL procedure successfully completed.

--Create an agent
BEGIN
   DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
     agent_name => 'MOVIE_ANALYST',
     attributes => '{"profile_name": "GROK",
                     "role": "You are an AI Movie Analyst. Your can help answer a variety of questions related to movies. "
             }'
   );
END;
/

PL/SQL procedure successfully completed.

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name  => 'ANALYZE_MOVIE_TASK',
      attributes => '{"instruction": "Help the user with their request about movies. User question: {query}",
         "enable_human_tool" : "true"
       }'
    );
END;
/

PL/SQL procedure successfully completed.

BEGIN                                                                 
  DBMS_CLOUD_AI_AGENT.CREATE_TEAM(  
    team_name  => 'MOVIE_AGENT_TEAM',                                                            
    attributes => '{"agents": [{"name":"MOVIE_ANALYST","task" : "ANALYZE_MOVIE_TASK"}],
                    "process": "sequential"
                    }');                                                                 
END;                                                                        
/

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');

PL/SQL procedure successfully completed.

select ai agent who are you?;

RESPONSE
--------------------------------------------------------------------------------
I'm MOVIE_ANALYST, an AI Movie Analyst here to assist with any questions or topi
cs related to movies. Whether you need information on films, actors, directors,
genres, or recommendations, I'm ready to help. What can I assist you with regard
ing movies?

-- SQL TOOL
BEGIN   
  DBMS_CLOUD_AI.CREATE_PROFILE(  
    profile_name =>'nl2sql_profile',                                                            
    attributes => '{"provider": "oci",                                                                  
      "credential_name": "GENAI_CRED",
      "oci_compartment_id" : "ocid1.compartment.oc1..aaaaa...",                               
      "object_list": [{"owner": "ADB_USER", "name": "GENRE"},
                      {"owner": "ADB_USER", "name": "CUSTOMER"},
                      {"owner": "ADB_USER", "name": "WATCH_HISTORY"},
                      {"owner": "ADB_USER", "name": "STREAMS"},
                      {"owner": "ADB_USER", "name": "MOVIES"},
                      {"owner": "ADB_USER", "name": "ACTORS"}]
      }');                                                                 
END;                                                                        
/

PL/SQL procedure successfully completed.

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'SQL',
    attributes => '{"tool_type": "SQL",
                    "tool_params": {"profile_name": "nl2sql_profile"}}'
  );
END;
/

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.drop_task('ANALYZE_MOVIE_TASK');

PL/SQL procedure successfully completed.

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name => 'ANALYZE_MOVIE_TASK',
      attributes =>'{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
                       'You can use SQL tool to search the data from database",
        "tools": ["SQL"],
         "enable_human_tool" : "true"
       }'
    );
END;
/

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');

PL/SQL procedure successfully completed.

-- SQL tool retrieves the movie with the highest popularity view count from the watch_history table
select ai agent what is the most popular movie?;

RESPONSE
----------------------------------------------------------------
The most popular movie is "Laugh Out Loud" released in 2008.

-- RAG TOOL
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
         profile_name => 'RAG_PROFILE',
         attributes =>'{"provider": "oci",
            "credential_name": "GENAI_CRED",
            "vector_index_name": "RAG_INDEX",
            "oci_compartment_id": "ocid1.compartment.oc1..aaaaa...",   
            "temperature": 0.2,
            "max_tokens": 3000
          }');
END;
/

PL/SQL procedure successfully completed.

BEGIN
   DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
           index_name  => 'RAG_INDEX',
           attributes  => '{"vector_db_provider": "oracle",
                            "location": "https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/v1/my_namespace/my_bucket/my_data_folder",
                            "object_storage_credential_name": "MY_OCI_CRED",
                            "profile_name": "RAG_PROFILE",
                            "vector_dimension": 1024,
                            "vector_distance_metric": "cosine",
                            "chunk_overlap":128,
                            "chunk_size":1024
   }');
END;
/
PL/SQL procedure successfully completed.

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'RAG_TOOL',
    attributes => '{"tool_type": "RAG",
                      "tool_params": {"profile_name": "RAG_PROFILE"}}'
  );
END;
/

PL/SQL procedure successfully completed.

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name =>'ANALYZE_MOVIE_TASK',
      attributes => '{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
                       'You can use RAG tool to search the information from the knowledge base user give.",
        "tools": ["RAG_TOOL"],
         "enable_human_tool" : "true"
       }'
    );
END;
/

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');

PL/SQL procedure successfully completed.

-- Rag seach the object store to find review or comments of Movie Laugh out Loud 
select ai agent Please find the comments of Movie Laugh out Loud;

RESPONSE
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The comments for the movie "Laugh Out Loud" (2008) are as follows:
1. A lighthearted comedy that delivers plenty of laughs, though the plot is fairly predictable.
2. The performances are fun, especially from the lead actor who keeps the energy high.
3. Some jokes feel a bit outdated, but overall it is an enjoyable watch for a casual movie night.
4. Good chemistry between the cast members, which makes the humor more natural.
5. Not a groundbreaking comedy, but it does what it promises makes you laugh out loud.

-- WEBSEARCH TOOL
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OPENAI_CRED',
    username        => 'OPENAI',
    password        => '<API_KEY>'
  );
END;
/

PL/SQL procedure successfully completed.

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'WEBSEARCH_TOOL',
    attributes => '{"instruction": "This tool can be used for searching the details about topics mentioned in notes and prepare a summary about prices, details on web",
                      "tool_type": "WEBSEARCH",
                      "tool_params": {"credential_name": "OPENAI_CRED"}}'
  );
END;
/

PL/SQL procedure successfully completed.

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name => 'ANALYZE_MOVIE_TASK',
      attributes => '{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
                       'You can use WEBSEARCH_TOOL tool to search the information from internet.",
        "tools": ["WEBSEARCH_TOOL"],
         "enable_human_tool" : "true"
       }'
    );
END;
/

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');

PL/SQL procedure successfully completed.

select ai agent What is the most popular movie of 2023?;

RESPONSE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Determining the most popular movie of 2023 can depend on various metrics such as box office earnings, streaming viewership, critical acclaim, or audience reception. Based on global box office data, which is often a strong indicator of popularity, the most successful movie of 2023 is "Barbie," directed by Greta Gerwig. Released in July 2023, it grossed over $1.4 billion worldwide, making it the highest-grossing film of the year and one of the biggest cultural phenomena, often discussed alongside "Oppenheimer" due to the "Barbenheimer" trend. Its widespread appeal, marketing, and social media buzz further solidify its status as the most popular movie of 2023. However, if you are looking for popularity based on a different metric (like streaming numbers or awards), please let me know, and I can adjust the analysis accordingly.

-- NOTIFICATION TOOL WITH EMAIL TYPE

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'EMAIL',
    attributes => q'[{"tool_type": "Notification",
                      "tool_params": {"notification_type" : "EMAIL",
                                      "credential_name": "EMAIL_CRED",
                                      "recipient": "example@oracle.com",
                                      "smtp_host": "smtp.email.us-ashburn-1.oci.oraclecloud.com",
                                      "sender": "example@oracle.com"}}]'
  );
END;
/

PL/SQL procedure successfully completed.

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name => 'ANALYZE_MOVIE_TASK',
      attributes =>'{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
                       'You can use EMAIL TOOL tool to send email to the user.",
        "tools": ["EMAIL"],
         "enable_human_tool" : "true"
       }'
    );
END;
/

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');

PL/SQL procedure successfully completed.

select ai agent Please help me write a review of Movie "Barbie" and send the review to my email;

RESPONSE
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I have written a review for the movie "Barbie" (2023) and sent it to your email. Please check your inbox for the detailed review. If you have any additional feedback or would like me to revise the review, let me know!

-- NOTIFICATION TOOL WITH SLACK TYPE

DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'SLACK_TOOL',
    attributes => '{"tool_type": "SLACK",
                    "tool_params": {"credential_name": "SLACK_CRED",
                                    "channel": "<channel_number>"}}'
  );
END;
/

PL/SQL procedure successfully completed.

BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TASK(
      task_name  => 'ANALYZE_MOVIE_TASK',
      attributes => '{"instruction": "Help the user with their request about movies. User question: {query}. ' ||
                       'You can use SLACK TOOL to send the notification to the user.",
        "tools": ["SLACK_TOOL"],
         "enable_human_tool" : "true"
       }'
    );
END;
/

PL/SQL procedure successfully completed.

select ai agent Please help me find the top 3 most-watched movies of 2023 and send them to me on slack;

RESPONSE
------------------------------------------------------------------------------------------------------------------------------------
I have sent the list of the top 3 most-watched movies of 2023 to you via Slack. Please check your Slack notifications for the details.

例: Product Return Agentの作成

この例では、Select AI Agentを使用してマルチターンの会話エージェントを作成する方法を示します。この例では、製品返品を処理し、データベースの返品ステータスを更新する顧客サービス・エージェントを設定します。

この例では、Customer_Return_Agentという名前のエージェントとUpdate_Order_Status_Toolという名前のツールを作成し、製品返品を処理するタスクとチームを定義します。

この例では、DBAが DBMS_CLOUD_AI_AGENTおよびDBMS_CLOUD_AIに対するEXECUTE権限を付与した後、まず顧客のサンプル・データ、顧客のオーダー・ステータスおよび顧客のオーダー・ステータスを更新するファンクションを作成します。次に、Customer_Return_Agentという名前のエージェントを作成します。

エージェントの作成

リターン・リクエストを管理するプロファイル(OCI_GENAI_GROK)およびロールを持つCustomer_Return_Agentというエージェントを作成します。

ツールの作成

次に、Update_Order_Status_Toolという名前のエージェント・ツールを作成して、データベース内の順序のステータスを更新します。

タスクの作成

フローをガイドするHandle_Product_Return_Taskというタスクを作成します。理由(不要になった、到着が遅すぎた、ボックスが壊れた、または欠陥がある)を尋ねます。欠陥のある返品フローに進みます。

チームを作成

Customer_Return_AgentをエージェントとしてReturn_Agency_Teamというエージェント・チームを作成し、それをアクティブなチームとして設定します。

Select AI Agentチームの実行

プロンプトの接頭辞としてselect ai agentを使用して、エージェント・チームを実行します。

完全な例は次のとおりです。

--Grants EXECUTE privilege to ADB_USER
--
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
    agent_name => 'Customer_Return_Agent',
    attributes => '{"profile_name": "OCI_GENAI_GROK",
                    "role": "You are an experienced customer return agent who deals with customers return requests."}');
END;
/
 
PL/SQL procedure successfully completed.
 
  

--Sample customer data
CREATE TABLE CUSTOMERS (
    customer_id  NUMBER(10) PRIMARY KEY,
    name         VARCHAR2(100),
    email        VARCHAR2(100),
    phone        VARCHAR2(20),
    state        VARCHAR2(2),
    zip          VARCHAR2(10)
);

INSERT INTO CUSTOMERS (customer_id, name, email, phone, state, zip) VALUES
(1, 'Alice Thompson', 'alice.thompson@example.com', '555-1234', 'NY', '10001'),
(2, 'Bob Martinez', 'bob.martinez@example.com', '555-2345', 'CA', '94105'),
(3, 'Carol Chen', 'carol.chen@example.com', '555-3456', 'TX', '73301'),
(4, 'David Johnson', 'david.johnson@example.com', '555-4567', 'IL', '60601'),
(5, 'Eva Green', 'eva.green@example.com', '555-5678', 'FL', '33101');

--create customer order status
CREATE TABLE CUSTOMER_ORDER_STATUS (
    customer_id     NUMBER(10),
    order_number    VARCHAR2(20),
    status          VARCHAR2(30),
    product_name    VARCHAR2(100)

);

INSERT INTO CUSTOMER_ORDER_STATUS (customer_id, order_number, status, product_name) VALUES
(2, '7734', 'delivered', 'smartphone charging cord'),
(1, '4381', 'pending_delivery', 'smartphone protective case'),
(2, '7820', 'delivered', 'smartphone charging cord'),
(3, '1293', 'pending_return', 'smartphone stand (metal)'),
(4, '9842', 'returned', 'smartphone backup storage'),
(5, '5019', 'delivered', 'smartphone protective case'),
(2, '6674', 'pending_delivery', 'smartphone charging cord'),
(1, '3087', 'returned', 'smartphone stand (metal)'),
(3, '7635', 'pending_return', 'smartphone backup storage'),
(4, '3928', 'delivered', 'smartphone protective case'),
(5, '8421', 'pending_delivery', 'smartphone charging cord'),
(1, '2204', 'returned', 'smartphone stand (metal)'),
(2, '7031', 'pending_delivery', 'smartphone backup storage'),
(3, '1649', 'delivered', 'smartphone protective case'),
(4, '9732', 'pending_return', 'smartphone charging cord'),
(5, '4550', 'delivered', 'smartphone stand (metal)'),
(1, '6468', 'pending_delivery', 'smartphone backup storage'),
(2, '3910', 'returned', 'smartphone protective case'),
(3, '2187', 'delivered', 'smartphone charging cord'),
(4, '8023', 'pending_return', 'smartphone stand (metal)'),
(5, '5176', 'delivered', 'smartphone backup storage');

--Create a update customer order status function
CREATE OR REPLACE FUNCTION UPDATE_CUSTOMER_ORDER_STATUS (
    p_customer_name IN VARCHAR2,
    p_order_number  IN VARCHAR2,
    p_status        IN VARCHAR2
) RETURN CLOB IS
    v_customer_id  customers.customer_id%TYPE;
    v_row_count    NUMBER;
BEGIN
    -- Find customer_id from customer_name
    SELECT customer_id
    INTO v_customer_id
    FROM customers
    WHERE name = p_customer_name;
    
    UPDATE customer_order_status
    SET status = p_status
    WHERE customer_id = v_customer_id
      AND order_number = p_order_number;

    v_row_count := SQL%ROWCOUNT;

    IF v_row_count = 0 THEN
        RETURN 'No matching record found to update.';
    ELSE
        RETURN 'Update successful.';
    END IF;
EXCEPTION
    WHEN OTHERS THEN
        RETURN 'Error: ' || SQLERRM;
END;

--Create Tool
BEGIN
    DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
        tool_name => 'Update_Order_Status_Tool',
        attributes => '{"instruction": "This tool updates the database to reflect return status change. Always confirm user name and order number with user before update status",
                        "function" : "update_customer_order_status"}',
        description => 'Tool for updating customer order status in database table.'
    );
END;
/
--Create Task
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TASK(
    task_name => 'Handle_Product_Return_Task',
    attributes => '{"instruction": "Process a product return request from a customer:{query}' || 
                    '1. Ask customer the order reason for return (no longer needed, arrived too late, box broken, or defective)' || 
                    '2. If no longer needed:' ||
                    '   a. Inform customer to ship the product at their expense back to us.' ||
                    '   b. Update the order status to return_shipment_pending using Update_Order_Status_Tool.' ||
                     '3. If it arrived too late:' ||
                    '   a. Ask customer if they want a refund.' ||
                    '   b. If the customer wants a refund, then confirm refund processed and update the order status to refund_completed' || 
                    '4. If the product was defective or the box broken:' ||
                    '   a. Ask customer if they want a replacement or a refund' ||
                    '   b. If a replacement, inform customer replacement is on its way and they will receive a return shipping label for the defective product, then update the order status to replaced' ||
                    '   c. If a refund, inform customer to print out the return shipping label for the defective product, return the product, and update the order status to refund' ||
                    '5. After the completion of a return or refund, ask if you can help with anything else.' ||
                    '   End the task if user does not need help on anything else",
                    "tools": ["Update_Order_Status_Tool"]}'
  );
END;
/
SQL> BEGIN                                                                
  DBMS_CLOUD_AI_AGENT.CREATE_TEAM( 
    team_name  => 'Return_Agency_Team',                                                            
    attributes => '{"agents": [{"name":"Customer_Return_Agent","task" : "Handle_Product_Return_Task"}],
                    "process": "sequential"}');                                                                
END;                                                                      
/
 
PL/SQL procedure successfully completed.
 
SQL> EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('Return_Agency_Team');
 
PL/SQL procedure successfully completed.

--Validate that the agent team is set in the current session with get_team
SQL> SELECT DBMS_CLOUD_AI_AGENT.GET_TEAM from DUAL;
 
--Interact with the agent
SQL> select ai agent I want to return a smartphone case;

RESPONSE
Could you please tell me the reason for returning the smartphone case? Is it no longer needed, arrived too late, box broken, or defective?

SQL> select ai agent the item is defective

RESPONSE
I'm sorry to hear that the smartphone case is defective. Would you like a replacement or a refund?

SQL> select ai agent I will need a replacement

RESPONSE
Can you please confirm your name and order number so I can update the status and process the replacement?

SQL> select ai agent I''m Bob Martinez and my order number is 7820

RESPONSE
Is there anything else I can help you with?

SQL> select ai agent No, I''m all set. Thanks

RESPONSE
Thank you for reaching out, Bob. I'm glad I could assist with the return of your smartphone case and stand. If you have any further questions or need assistance in the future, feel free to contact us. Have a great day!
例: データベース・アクションおよびAPEXでのSelect AIエージェントの使用

データベース・アクションなどのWeb SQLクライアントを使用している場合は、DBMS_CLOUD_AI_AGENT.RUN_TEAMファンクションを使用してエージェント・チームを実行し、ファンクション内にプロンプトを指定します。

ノート:

データベース・アクションまたはAPEXサービスでDBMS_CLOUD_AI_AGENT.SET_TEAMを使用しないでください。かわりに、DBMS_CLOUD_AI_AGENT.RUN_TEAMteam_name引数を使用してエージェント・チームを指定します。

次の例では、会話IDを作成して顧客の会話履歴を追跡し、DBMS_CLOUD_AI_AGENT.RUN_TEAM関数を使用して製品リターン・エージェントと対話します。

詳細は、を参照してください。

CREATE OR REPLACE PACKAGE my_globals IS
  l_team_cov_id varchar2(4000);
END my_globals;
/
-- Create conversation
DECLARE
  l_team_cov_id varchar2(4000);
BEGIN
  l_team_cov_id := DBMS_CLOUD_AI.create_conversation();
  my_globals.l_team_cov_id := l_team_cov_id;
  DBMS_OUTPUT.PUT_LINE('Created conversation with ID: ' || my_globals.l_team_cov_id);
END;

--Interact with the agent
DECLARE
  v_response VARCHAR2(4000);
BEGIN
  v_response :=  DBMS_CLOUD_AI_AGENT.RUN_TEAM(
    team_name   => 'Return_Agency_Team',
    user_prompt => 'I want to return a smartphone case',
    params      => '{"conversation_id": "' || my_globals.l_team_cov_id || '"}'
  );
  DBMS_OUTPUT.PUT_LINE(v_response);
END;

例: ログ・レポートのフェッチおよび分析

この例では、2つのエージェントとタスクのペアを使用してエージェント・チームを作成し、ログを取得して分析する方法を示します。

この例では、次を作成します。
  • トラブルシューティングのための2つのエージェント・ワークフロー: Data_EngineerおよびOps_Manager
  • 1つのツール: log-fetcher
次に、タスクとチームを定義して、ログをフェッチして分析します。

ノート:

DBAのみがEXECUTE権限およびネットワークACLプロシージャを実行できます。

この例では、DBAがAIプロバイダの DBMS_CLOUD_AI_AGENTパッケージ、DBMS_CLOUD_AIパッケージおよびACLアクセスに対するEXECUTE権限を付与した後、まずData_EngineerおよびOps_Managerエージェントを作成します。

エージェントの作成

AIプロバイダとしてGoogleを使用し、複雑なデータを取得および処理するロールを使用するプロファイル(GOOGLE)を使用して、Data_Engineerというエージェントを作成します。

AIプロバイダとしてOpenAIを使用し、データを分析するロールを使用するプロファイル(OPENAI)を使用して、Ops_Managerというエージェントを作成します。

ツールの作成

次に、エージェント・ツールlog_fetcherを作成します。指定した日付より後のログ・エントリを返します。これは、カスタム・プロシージャfetch_logsを使用します。

タスクを作成

フローをガイドするために、2つのタスクfetch_logs_taskおよびanalyze_log_taskを定義します。fetch_logs_taskは、log_fetcherをコールして、リクエストに基づいてログを取得します。analyze_log_taskは、フェッチされたログを分析します。

チームを作成

Data_EngineerおよびOps_Managerを使用してOps_Issues_Solution_Teamチームを作成し、順次実行します。

Select AI Agentの実行

これで、アクティブ・チームを設定し、プロンプトの接頭辞としてselect ai agentを使用してエージェント・チームを実行します。

完全な例は次のとおりです。

--Grants EXECUTE privilege to ADB_USER
--
GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;
GRANT EXECUTE on DBMS_CLOUD_AI to ADB_USER;

-- Grant Network ACL for OpenAI endpoint
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_USER',
                             principal_type => xs_acl.ptype_db)
     );
END;
/
--Grant Network ACL for Google endpoint
BEGIN
      DBMS_NETWORK_ACL_ADB_USER.APPEND_HOST_ACE(
        host => 'generativelanguage.googleapis.com',
        ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                    principal_name => 'ADB_USER',
                    principal_type => xs_acl.ptype_db)
       );
END;
/
PL/SQL procedure successfully completed.

--Create a table with Database logs and insert sample data

SQL> CREATE TABLE app_logs (
  log_id         NUMBER GENERATED BY DEFAULT AS IDENTITY,
  log_timestamp  DATE,
  log_message    VARCHAR2(4000)
);

Table created.

SQL> INSERT INTO app_logs (log_timestamp, log_message) VALUES (
  TO_DATE('2025-03-22 03:15:45', 'YYYY-MM-DD HH24:MI:SS'),
  'INFO: Database Cluster: Failover completed successfully. Standby promoted to primary. Downtime duration: 33 seconds. Correlation ID: dbfailover102.'
);

1 row created.

SQL> INSERT INTO app_logs (log_timestamp, log_message) VALUES (
  TO_DATE('2025-03-23 08:44:10', 'YYYY-MM-DD HH24:MI:SS'),
  'INFO: Switchover Process: Synchronization restored. Performing scheduled switchover. Correlation ID: dbswitchover215.'
);

1 row created.

SQL> INSERT INTO app_logs (log_timestamp, log_message) VALUES (
  TO_DATE('2025-03-24 03:15:12', 'YYYY-MM-DD HH24:MI:SS'),
  'ERROR: Database Cluster: Primary database unreachable, initiating failover to standby. Correlation ID: dbfailover102.'
);

1 row created.

SQL> COMMIT;

Commit complete.

-- create data engineer agent
SQL> BEGIN
      DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
        agent_name => 'Data_Engineer',
        attributes => '{"profile_name": "GOOGLE",
                        "role": "You are a specialized data ingestion engineer with expertise in   ' ||
                         'retrieving and processing data from complex database systems."
               }'
      );
    END;
    /
PL/SQL procedure successfully completed.

-- create ops manager agent
SQL> BEGIN
      DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
        agent_name => 'Ops_Manager',
        attributes => '{"profile_name": "OPENAI",
                        "role": "You are an experienced Ops manager who excels at analyzing ' ||
                'complex log data, diagnosing the issues."
         }'
      );
    END;
    /
 
 
PL/SQL procedure successfully completed.
 
-- create log_fetcher tool
-- fetch_logs is a customized procedure.
-- Please make sure you have created your own procedure before use it in the tool

--Create a customized fetch_logs procedure
SQL> CREATE OR REPLACE FUNCTION fetch_logs(since_date IN DATE) RETURN CLOB IS
  l_logs CLOB;
BEGIN
  SELECT JSON_ARRAYAGG(log_message RETURNING CLOB)
    INTO l_logs
    FROM app_logs
   WHERE log_timestamp >= since_date
   ORDER BY log_timestamp;

  RETURN l_logs;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 'Error fetching logs: ' || SQLERRM;
END fetch_logs;
/

Function created.

SQL> BEGIN
      DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
        tool_name => 'log_fetcher',
        attributes => '{"instruction": "retrieves and returns all log messages with a LOG_TIMESTAMP greater than or equal to the input date.",
                        "function": "fetch_logs"}'
      );
    END;
    /
 
PL/SQL procedure successfully completed.
 
-- create task with log fetcher tool

SQL> BEGIN
      DBMS_CLOUD_AI_AGENT.CREATE_TASK(
        task_name  => 'fetch_logs_task',
        attributes => '{"instruction": "Fetch the log entries from the database based on user request: {query}}.",
                        "tools": ["log_fetcher"]}'
      );
    END;
    /
 
PL/SQL procedure successfully completed.
 
-- create task with predefined rag and slack tool

SQL> BEGIN
      DBMS_CLOUD_AI_AGENT.create_task(
        task_name => 'analyze_log_task',
        attributes => '{"instruction": "Analyze the fetched log entries retrieved based on user request: {query} ' ||
                      'Generate a detailed report include issue analysis and possible solution.",
           "input" : "fetch_logs_task"
        }'
     );
    END;
    /
 
PL/SQL procedure successfully completed.

-- create team and set agent team
SQL> BEGIN
      DBMS_CLOUD_AI_AGENT.create_team(
        team_name  => 'Ops_Issues_Solution_Team',
        attributes => '{"agents": [{"name":"Data_Engineer","task" : "fetch_logs_task"},
                                    {"name":"Ops_Manager","task" : "analyze_log_task"}],
                "process": "sequential"
                }');
    END;
    /
 
PL/SQL procedure successfully completed.
 
SQL> EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('Ops_Issues_Solution_Team');
 
 
PL/SQL procedure successfully completed.
 

SQL> select ai agent fetch and analyze the logs after 03/15 2025;
 
RESPONSE
-----------------------------------------------------------------------------------------------------------------------------------------------
1. Issue: High volume of 500 Internal Server Errors between 03/22 and 03/24.
   Solution: Review server application logs to identify failing components; add better exception handling and fallback mechanisms to prevent service crashes.
 
2. Issue: Increased response time on /api/v1/user and /checkout, peaking on 03/25.
   Solution: Profile backend queries and services, apply caching where applicable, and offload static content to a CDN.
 
3. Issue: Detected brute-force login attack with over 500 failed POST attempts from a single IP.
   Solution: Add rate-limiting, temporary IP bans, and CAPTCHA on the /login endpoint to prevent credential stuffing.
 
4. Issue: Suspicious User-Agent headers such as curl/7.58.0 or empty headers mimicking mobile devices.
   Solution: Block malformed or uncommon User-Agent strings and log them for threat intelligence analysis.
 
5. Issue: DDoS-like traffic spike from distributed IPs observed on 03/20.
   Solution: Enable DDoS protection at the CDN or cloud provider level, and configure autoscaling to absorb burst traffic.

例: カスタマイズされたHTTPツールの作成

この例では、HTTP GETリクエストを送信し、レスポンス・テキストを返すPL/SQLファンクションを定義します。その後、Select AI Agentツールにファンクションが追加されます。

DBMS_CLOUD.SEND_REQUESTプロシージャを使用してRESTリクエストを送信し、レスポンスをテキストとして返すカスタム・ツールを作成できます。この例では、PL/SQLファンクションを記述し、エージェント・タスクで使用するツールとして追加する方法を示します。

ファンクションget_url_contentは、GETリクエストをターゲットURLに送信し、レスポンスをCLOBとして返します。DBMS_CLOUD_AI_AGENT.CREATE_TOOLは、get_url_content関数を使用し、タスクでURLからコンテンツをフェッチする必要がある場合にSelect AIエージェントがコールできるHTTP_TOOLという名前のツールを作成します。

CREATE OR REPLACE FUNCTION get_url_content (
    url IN CLOB
) RETURN CLOB
AS
    l_resp   DBMS_CLOUD_TYPES.RESP;
    l_result CLOB;
BEGIN
    l_resp := DBMS_CLOUD.SEND_REQUEST(
                credential_name => NULL,
                method          => 'GET',
                uri             => url
             );
    l_result := DBMS_VECTOR_CHAIN.UTL_TO_TEXT(DBMS_CLOUD.GET_RESPONSE_RAW(l_resp);
    RETURN l_result;
END get_url_content;
/

BEGIN
  DBMS_CLOUD_AI_AGENT.create_tool(
    tool_name  => 'HTTP_TOOL',
    attributes => '{
      "instruction": "This tool fetches and returns the plain text content from the specified URL. ",
      "function": "get_url_content"
    }'
  );
END;
/

例: 最新チーム実行からのエージェント・プロンプトおよび応答の表示

この例では、履歴ビューおよび会話データを使用して、最新のエージェント・チーム実行からのプロンプト、レスポンスおよびエージェント思考を表示することで、最近のSelect AI Agentアクティビティのデバッグを支援します。

この例では、最新の Select AI Agentチーム実行から詳細なログを取得して表示します。この例では、USER_AI_AGENT_TEAM_HISTORYビュー、USER_AI_AGENT_TASK_HISTORYビューおよびUSER_CLOUD_AI_CONVERSATION_PROMPTSビューを使用して、各エージェントのチーム名、タスク、関連付けられたプロンプトおよびレスポンスを表示します。この問合せを使用して、入力プロンプトと最新のチーム実行から生成された応答の両方をレビューして、問題をトラブルシューティングします。

WITH latest_team AS (
  SELECT team_exec_id, team_name, start_date
  FROM user_ai_agent_team_history
  ORDER BY start_date DESC
  FETCH FIRST 1 ROW ONLY
),
latest_task AS (
    SELECT team_exec_id, task_name, agent_name, conversation_params, start_date,
           ROW_NUMBER() OVER (PARTITION BY team_exec_id, task_name, agent_name 
                             ORDER BY start_date DESC) as rn
  FROM user_ai_agent_task_history
)
SELECT
  team.team_name,
  task.task_name,
  task.agent_name,
  p.prompt,
  p.prompt_response
FROM latest_team team
JOIN latest_task task
  ON team.team_exec_id = task.team_exec_id
 AND task.rn = 1
LEFT JOIN user_cloud_ai_conversation_prompts p
  ON p.conversation_id = JSON_VALUE(task.conversation_params, '$.conversation_id')
ORDER BY task.start_date DESC NULLS LAST,
         p.created     DESC NULLS LAST;
この例では、ツール、タスクおよびチームの履歴ビューから詳細なログを取得します。次の問合せを使用して、ツール、タスクおよびチームの使用状況を監査し、問題のトラブルシューティングおよびログ分析を行います。問合せでは、USER_AI_AGENT_TOOL_HISTORYビュー、USER_AI_AGENT_TASK_HISTORYビューおよびUSER_AI_AGENT_TASK_HISTORYビューが使用されます。
--View the tool history

select * from USER_AI_AGENT_TOOL_HISTORY
order by START_DATE desc

--View the task history

select * from USER_AI_AGENT_TASK_HISTORY
order by START_DATE desc

--View the team history
select * from USER_AI_AGENT_TEAM_HISTORY
order by START_DATE desc

例: WAITING_FOR_HUMAN状態からのエージェント・チーム実行の再開

この例では、タスク履歴ステータスがWAITING_FOR_HUMANの場合にエージェント・チームの実行を再開する方法を示します。エージェント・チームは、WAITING_FOR_HUMAN状態になると、ユーザーが次の入力または確認を行うまで一時停止します。エージェント・チームの使用方法に応じて、SQLコマンドラインまたはDBMS_CLOUD_AI_AGENT.RUN_TEAMを使用して実行を再開できます。

例: SQLコマンドラインを使用したエージェント・チーム実行の再開

SQLコマンドラインでSELECT AI AGENT <prompt>を使用している場合、Select AI Agentは一時停止したチームの実行を自動的に再開します。前のプロンプトや推論を含む会話コンテキストは、追加のパラメータを必要とせずに維持されます。

例: DBMS_CLOUD_AI_AGENT.RUN_TEAMを使用したエージェント・チームの実行の再開

DBMS_CLOUD_AI_AGENT.RUN_TEAMプロシージャを使用している場合は、最初の実行で使用したものと同じconversation_idを渡して、一時停止したエージェント・チームを再開できます。エージェント・チームの実行状態(保留中のアクションやコンテキストなど)は保持され、エージェント・チームは停止した場所から正確に続行されます。

DBMS_CLOUD_AI_AGENT.RUN_TEAM関数の使用例については、を参照してください。

--Interact with the agent
DECLARE
  v_response VARCHAR2(4000);
BEGIN
  v_response :=  DBMS_CLOUD_AI_AGENT.RUN_TEAM(
    team_name   => '<same initial team name>',
    user_prompt => 'response to request',
    params      => '{"conversation_id": "<same initial conversation_id>"}'
  );
  DBMS_OUTPUT.PUT_LINE(v_response);
END;