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)エージェント・パターンを使用します。エージェントは、リクエストに関する理由、ツールの選択、アクションの実行、結果の評価を行って目標を達成します。
-
問合せ: ユーザーは質問をするか、要求を指定します。エージェントはそれを読み取り、重要な詳細を抽出し、次のステップを計画する準備をします。
-
Thought and Action(思考と行動): オプションに関するエージェントの理由。ツールを選択し、それを実行してデータを収集するか、タスクに必要な状態を変更します。
-
監視: 監視には、ツールまたは問合せ結果、確認メッセージおよびエラーが含まれます。これらはエージェントの次の推論への入力になります。エージェントは監視を記録し、結果が次のステップまたは最終応答をサポートしているかどうかをチェックします。
-
最終的な対応: 十分な思考と観察が成功した後、エージェントは明確な回答を作成し、重要な決定を説明し、次のステップまたはフォローアップ・アクションを共有します。
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つ以上のエージェント。チームは、職責を調整し、コンテキストを共有し、エージェントとタスクのペアを実行して、複数ステップの対話を確実に完了します。 チームは、専門的なエージェント間で作業を分割し、その貢献を順序付けします。チームは共有コンテキストを維持し、統一された応答を生成します。 履歴ビュー |
| MCPサーバー |
MCPサーバー(Model Context Protocol Server)は、一貫性のあるプロトコルを介してモデル機能、コンテキスト検索および拡張機能を公開することで、アプリケーションが生成AIモデルおよびツールと対話するための標準化された方法を提供します。 Select AI Agentを使用して、Autonomous AI Database MCPサーバーを介して公開できるツールを定義できます。これらのツールには、SQL生成、RAG、通知(電子メールとSlack)、Web検索用の組込みツール、およびカスタム・ツールを含めることができます。カスタム・ツールは、データベースで定義された関数を公開できます。 |
| 監視 |
ツール実行から返されたデータ(行、メッセージまたはエラー)は、エージェントがリフレクション中に記録および評価します。観察は、次の推論ステップを導き、最終的な反応の証拠を提供します。 |
| タスク |
タスクは作業単位を表します。ツール選択、パラメータ・マッピングおよび実行ポリシーをガイドし、ダウンストリーム・ステップが読取りおよび要約できる結果を生成します。 タスクでは、目標、入力、ツールの選択、およびガードレールを指定します。これらは、後のステップで消費できる構造化出力を返します。
|
| ツール |
ツールは、データの更新、ドキュメントの取得、外部サービスの呼出しなどのアクションを実行します。ツールはパラメータを取り、決定的または非決定的に実行でき、推論のために観察を返します。 ツールは繰り返し可能な操作をカプセル化します。副作用の制御と監視を維持し、監査とデバッグをサポートします。 Select 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 <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問合せにマップすることで、エージェントがデータ関連の質問に回答するのに役立ちます。
この例では、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 (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ツールを使用すると、エージェントは製品価格や説明などの情報をWebから検索できます。
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の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_TASKをinput属性として使用する方法を示しています。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型のSQL、RAG、WEBSEARCHおよびNOTIFICATIONツールなどの複数の組込みツールを使用します。エージェントは、自然言語プロンプトを使用してムービー関連の質問に回答します。
この例では、DBAが DBMS_CLOUD_AI_AGENT、DBMS_CLOUD_AI、DBMS_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!データベース・アクションなどのWeb SQLクライアントを使用している場合は、DBMS_CLOUD_AI_AGENT.RUN_TEAMファンクションを使用してエージェント・チームを実行し、ファンクション内にプロンプトを指定します。
ノート:
データベース・アクションまたはAPEXサービスでDBMS_CLOUD_AI_AGENT.SET_TEAMを使用しないでください。かわりに、DBMS_CLOUD_AI_AGENT.RUN_TEAMのteam_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コマンドラインでSELECT AI AGENT <prompt>を使用している場合、Select AI Agentは一時停止したチームの実行を自動的に再開します。前のプロンプトや推論を含む会話コンテキストは、追加のパラメータを必要とせずに維持されます。
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;For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
Oracle Supportへのアクセス
お客様のOracleサポート・サービスへのアクセスおよびご利用は、該当するサービスの注文時に指定された利用条件に従うものとします。