使用 Select AI Agent 构建自治代理

Select AI Agent(自治代理框架)使您能够在自治 AI 数据库内构建交互式和自治代理,结合规划、工具使用、反射和内存来提供多回合工作流。

注:从版本 19.29 开始的 Oracle Database 19c 以及从版本 23.26 开始的 Oracle Database 26ai 中提供了对 Select AI Agent 和 DBMS_CLOUD_AI_AGENT Package 的支持。

关于选择 AI 代理

Select AI Agent(自治代理框架)是一个用于在自治 AI 数据库中创建和管理交互式和自治代理的程序。代理关于请求、呼叫工具、反思结果以及使用 AI 配置文件指定的 LLM 和 ReAct(Reasoning and Acting) 代理模式提供支持的短期和长期内存来维护上下文。

选择 AI Agent 可使用 RAG 和自然语言到 SQL (NL2SQL)、定制 PL/SQL 过程以及外部 REST API 等内置工具来完成任务。该框架保留多回合内存,在对话中维护上下文。这些功能共同支持与企业数据和工作流集成的可扩展、情境感知的生成式 AI。

DBMS_CLOUD_AI_AGENT 软件包封装了管理、编排和安全边界。有关详细信息,请参见 DBMS_CLOUD_AI_AGENT Package 。

选择 AI 代理的功能

其主要功能包括集成智能、灵活的工具、情景感知对话和更快的部署。

重新激活代理模式

选择 AI Agent 会使用 ReAct(Reasoning and Acting) 代理模式,其中代理有关请求的原因、选择工具、执行操作以及评估结果以实现目标。

以下是每个迭代的模式:

  1. 查询:用户询问问题或陈述请求。座席会读取它,提取关键详细信息,并准备计划后续步骤。

  2. 思想和行动:代理关于选项的原因,选择工具,并运行它来收集数据或根据需要更改任务的状态。

  3. 观察:观察包括工具或查询结果、确认消息和错误。这些成为代理人下一轮推理的投入。座席记录观察结果并检查结果是否支持下一步或最终响应。

  4. 最终响应:在足够成功的思考和观察之后,代理会做出明确的回答,解释重要的决策,并分享任何后续步骤或后续操作。

选择 AI 代理体系结构

选择“AI Agent(AI 代理)”可将工作分为四个层:Planning、Tool Use、Reflection 和 Memory Management。这些层协调推理、工具运行、评估和上下文多向交互。

Planning :Planning 将解释用户请求,将其分解为有序操作,选择候选工具,并使用会话上下文、先前结果和相关知识拟定计划。代理分析请求,确定缺少的详细信息,并建议有序的操作序列。它选择适合策略、数据范围和预期结果的工具。

工具使用:工具使用会为每个操作选择并运行工具。支持的类型包括 RAG、NL2SQL、可以在创建工具时添加的定制 PL/SQL 过程,以及 Web 搜索和电子邮件等外部 REST 服务。每个步骤都调用具有参数的工具。内置工具可处理检索和 SQL 生成。定制 PL/SQL 封装域逻辑。REST 工具连接到外部服务。

反思:反思根据预期评估工具结果,并进行最终响应。代理将观察值与目标值进行比较。如果结果看起来错误,或者存在工具调用错误或用户未批准的结果,则代理会修改推理、选择其他工具或更新计划,然后再重试。当结果不合适时,它会调整计划,选择不同的工具,或者在继续之前提出澄清问题。可以使用 USER_CLOUD_AI_CONVERSATION_PROMPTS 查询 AI 代理思想。有关详细信息,请参阅 DBMS_CLOUD_AI 视图。

内存管理:内存管理按代理团队存储会话上下文和知识。短期内存存储每个代理团队最近的消息和中间结果。长期记忆记录偏好、历史和策略,改善连续性、个性化和计划。长期记忆在各个会话中保留有用的知识,并随着时间的推移提高座席团队的指导和响应质量。

选择 AI 代理术语

了解与 Select AI Agent(自治代理框架)相关的概念和术语。

以下是与 Select AI Agent 相关的术语:

术语 定义
代理操作

在代理的上下文中,操作是触发具有参数的工具的指令。该平台运行工具,处理错误,并返回下一个推理步骤循环的观察结果。

操作将计划连接到执行。它们定义要运行的工具和输入。

代理

代理根据定义的目的执行任务。代理是已配置的员工,其原因包括请求、选择工具、运行步骤、评估结果以及生成基于数据库上下文的响应。

代理封装特定作业的行为、策略和可用工具,例如返回处理或知识检索。

座席团队

执行代理工作流的一个或多个代理。团队负责协调责任、共享上下文并运行代理 - 任务对,以可靠地完成多步骤交互。

小组在专门人员之间分配工作,并对其贡献进行排序。团队保持共享上下文并生成统一的响应。

您可以使用以下历史记录视图查看代理和团队运行详细信息: USER_AI_AGENT_TEAM_HISTORY、 USER_AI_AGENT_TASK_HISTORY 和 USER_AI_AGENT_TOOL_HISTORY。这些视图可记录每个座席、任务和团队的提示、响应和工具运行,从而在座席工作流中提供透明度和可跟踪性。有关这些历史记录视图的更多信息,请参见 DBMS_CLOUD_AI_AGENT History Views 。

MCP 服务器

MCP 服务器(Model Context Protocol Server,模型上下文协议服务器)通过一致的协议公开模型功能、上下文检索和扩展,为应用提供了一种标准化的方法来与生成式 AI 模型和工具进行交互。

使用 Select AI Agent,可以定义可通过 Autonomous AI Database MCP Server 公开的工具。这些工具可以包括用于 SQL 生成、RAG、通知(电子邮件和 Slack)和 Web 搜索的内置工具,以及定制工具。定制工具可以公开数据库中定义的函数。

观察 从工具运行返回的数据:代理在反射期间记录和评估的行、消息或错误。观察指导下一个推理步骤,并为最终反应提供证据。
任务

任务表示工作单位。它引导工具选择、参数映射和执行策略,生成下游步骤可以读取和汇总的结果。

任务指定目标、输入、工具选择和护栏。它们返回后面的步骤可以使用的结构化输出。

您可以查询 USER_AI_AGENT_TASK_HISTORY 视图来检查如何在代理运行中定义、运行和完成任务。有关更多信息,请参见 DBMS_CLOUD_AI_AGENT History Views 。

工具

工具执行诸如更新数据、检索文档或调用外部服务之类的操作。工具接受参数,可以运行确定性或非确定性,并返回观测进行推理。

工具封装了可重复的操作。它们可控制和观察副作用,支持审计和调试。

在 Select AI Agent 框架中,工具表示代理在任务处理期间可以使用的功能构建块。工具可以是:

  • 确定性工具,如 PL/SQL 函数,用于为同一输入返回相同的输出。
  • 一种非确定性工具,例如基于 Web 搜索或 LLM 的摘要,其中输出可能因时间、网络结果或随机性而异。

代理根据任务的需求选择工具,并使用输出(称为观察)推理、决定后续步骤或生成响应。将记录工具元数据和运行历史记录,以支持调试、可观察性和安全性。

您可以查询 USER_AI_AGENT_TOOL_HISTORY 视图来监视工具使用情况,并查看每个代理任务的运行结果。有关更多信息,请参见 DBMS_CLOUD_AI_AGENT History Views 。

选择 AI 代理用例

Select AI Agent 支持跨角色的实际场景:连接外部服务,使用 PL/SQL 工具构建以任务为中心的自动化,以及使用自然语言交互实现对数据的对话访问。

使用场景包括:

使用 Select AI Agent 的先决条件

在使用 Select AI Agent 之前,您必须具有使用 DBMS_CLOUD_AI_AGENT 软件包的特权以及 Select AI 所需的所有其他特权。

要使用 Select AI Agent,必须执行以下操作:

为选择 AI 代理授予权限

要配置 DBMS_CLOUD_AI_AGENT,请执行以下操作:

将 DBMS_CLOUD_AI_AGENT 软件包上的 EXECUTE 权限授予要使用 Select AI Agent 的用户。

缺省情况下,只有系统管理员具有 EXECUTE 权限。管理员可以将 EXECUTE 权限授予其他用户。

运行选择 AI 代理的权限示例

以下示例将 EXECUTE 特权授予 ADB_USER:

GRANT EXECUTE on DBMS_CLOUD_AI_AGENT to ADB_USER;

如何使用 Select AI Agent

可以使用 Select AI Agent,方法是使用 agent 操作或 DBMS_CLOUD_AI_AGENT.RUN_TEAM 函数。

可以通过以下方式使用 Select AI Agent:

 Select AI agent `<prompt>`

这两个选项都会将提示传递给所选代理团队并返回团队的回复。

使用 Select AI Agent 的示例

浏览示例,了解如何针对电影分析、日志分析和客户支持等常见任务构建、配置和与 Select AI Agent 交互。

示例:创建代理

创建代理以执行定义的任务。

此示例创建一个名为 Customer_Return_Agent 的代理,负责处理与产品退货相关的对话。

此示例说明如何使用 Google 作为 AI 提供程序(如在名为 GOOGLE 的 AI 配置文件中指定的)。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 查询来帮助代理回答与数据相关的问题。

此示例显示了如何使用 OCI 作为 AI 提供程序(如在名为 nl2sql_profile 的 AI 配置文件中指定)。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(检索增强生成)工具。利用 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 工具,用于从 Internet 检索详细信息。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;
/

示例:具有电子邮件类型的通知工具

此示例创建电子邮件通知工具。通过电子邮件工具,代理可以在其工作流中发送通知电子邮件。

此示例说明如何使用口令创建身份证明 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),将它链接到 SLACK_CRED 和目标通道。

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

示例:描述和运行 Select AI Agent Tool

使用工具 API 描述工具并按名称运行工具。DESCRIBE_TOOL 返回工具说明、属性和参数方案。RUN_TOOL 调用具有 JSON 输入有效负载的工具,并将工具结果返回为 JSON。

此示例创建示例日志数据,将 PL/SQL 函数注册为 Select AI Agent 工具,演示如何在使用工具方案之前对其进行检查,以及使用 JSON 输入直接从 SQL 或 PL/SQL 调用工具。与 MCP 兼容的集成可以使用相同的 API 来公开工具发现和工具调用功能。

如果未创建 Select AI Agent 工具,则工具搜索和工具调用 API 将返回空结果。使用 DBMS_CLOUD_AI_AGENT.CREATE_TOOL 创建一个或多个工具,使工具可用于搜索和调用。

DECLARE
  l_result CLOB;
BEGIN
  l_result := DBMS_CLOUD_AI_AGENT.DESCRIBE_TOOL(
    tool_name => 'FETCH_LOG_TOOL'
  );

  DBMS_OUTPUT.PUT_LINE(l_result);
END;
/

SELECT DBMS_CLOUD_AI_AGENT.RUN_TOOL(
  tool_name => 'FETCH_LOG_TOOL',
  input => '{"P_SINCE":"2026-01-01"}'
) AS tool_result
FROM dual;

以下示例说明如何创建工具以及如何使用 DESCRIBE_TOOL 和 RUN_TOOL。

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE app_log_messages PURGE';
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE != -942 THEN
      RAISE;
    END IF;
END;
/

CREATE TABLE app_log_messages (
  log_timestamp DATE,
  severity VARCHAR2(10),
  message VARCHAR2(4000)
);

INSERT INTO app_log_messages VALUES (DATE '2026-01-01', 'INFO', 'Routine performance check completed.');
INSERT INTO app_log_messages VALUES (DATE '2026-01-03', 'WARN', 'Query response time exceeded the review threshold.');
COMMIT;

CREATE OR REPLACE FUNCTION fetch_logs (
  p_since IN DATE
) RETURN CLOB IS
  l_logs CLOB;
BEGIN
  DBMS_LOB.CREATETEMPORARY(l_logs, TRUE);

  FOR rec IN (
    SELECT TO_CHAR(log_timestamp, 'YYYY-MM-DD') || ' ' ||
           severity || ': ' || message AS line
    FROM app_log_messages
    WHERE log_timestamp >= p_since
    ORDER BY log_timestamp
  ) LOOP
    DBMS_LOB.WRITEAPPEND(l_logs, LENGTH(rec.line) + 1, rec.line || CHR(10));
  END LOOP;

  RETURN l_logs;
END;
/

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name => 'FETCH_LOG_TOOL',
    attributes => '{"instruction":"Returns log messages on or after the requested date.","function":"FETCH_LOGS"}',
    description => 'Fetch application log messages by date.'
  );
END;
/

DECLARE
  l_result CLOB;
BEGIN
  l_result := DBMS_CLOUD_AI_AGENT.DESCRIBE_TOOL(
    tool_name => 'FETCH_LOG_TOOL'
  );

  DBMS_OUTPUT.PUT_LINE(l_result);
END;
/

SELECT DBMS_CLOUD_AI_AGENT.RUN_TOOL(
  tool_name => 'FETCH_LOG_TOOL',
  input => '{"P_SINCE":"2026-01-01"}'
) AS tool_result
FROM dual;

示例:创建任务

创建座席可以执行的任务。

注:只有 DBA 才能授予 EXECUTE 特权和网络 ACL 过程。

示例:创建电子邮件任务

此示例创建 Generate_Email_Task,指示 LLM 使用结构化数据生成标准确认电子邮件。

以下示例说明了如何使用 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,以便人员可以介入以指导或批准任务流(如果需要)。有关完整示例,请参见 Example:Fetch and Analyze Log Reports 。

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

有关完整示例,请参见 Example:Create a Product Return Agent 。

示例:创建多代理团队

此示例创建 Ops_Issues_Solution_Team 团队,并包括两个用于处理日志分析和故障排除的代理: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;
/

有关完整示例,请参见 Example:Fetch and Analyze Log Reports 。

示例:发现代理团队并检查团队状态

使用团队搜索 API 列出可用团队、描述所选团队以及检索团队对话的最新运行状态。团队描述包括团队展示的技能。这些技能代表底层 Select AI Agent 工具,不是单独的数据库对象。

此示例列出可用的座席团队,描述所选团队公开的功能,并检索对话的最新运行状态。这些 API 还可以支持与 Agent2Agent 兼容的集成,以发现已发布的座席团队并检查其公开的技能。

如果未创建 Select AI 代理团队,则代理团队搜索和运行状态 API 将返回空结果。使用 DBMS_CLOUD_AI_AGENT.CREATE_TEAM 启用团队发现和执行,从而创建一个或多个代理团队。

对于 Agent2Agent 委派,使用 LIST_TEAMS 返回调用用户拥有且仅包含一个代理的团队。在选择团队之前,请使用 DESCRIBE_TEAM 查看其功能。

当需要特定对话的运行状态时,请使用传递给 RUN_TEAM 的相同对话 ID。对于 Agent2Agent 集成,为团队运行和后续状态查找使用一个对话标识符。应用程序可以搜索团队、检查其技能、委派工作,然后轮询执行状态。

SELECT DBMS_CLOUD_AI_AGENT.LIST_TEAMS() AS teams
FROM dual;

SELECT DBMS_CLOUD_AI_AGENT.DESCRIBE_TEAM(
  team_name => 'CUSTOMER_AGENT_ONLY_TEAM'
) AS team_description
FROM dual;

SELECT DBMS_CLOUD_AI_AGENT.GET_TEAM_STATE(
  team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
  params => '{"conversation_id":"<CONVERSATION_ID>"}'
) AS team_state
FROM dual;

对于 Agent2Agent 集成,为团队运行和后续状态查找使用一个对话标识符。应用程序可以搜索团队、检查其技能、委派工作,然后轮询执行状态。

DECLARE
  l_conversation_id VARCHAR2(36);
  l_response        CLOB;
  l_state           VARCHAR2(30);
BEGIN
  l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION();

  l_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
    team_name   => 'CUSTOMER_AGENT_ONLY_TEAM',
    user_prompt => 'I need help returning a damaged item.',
    params      => '{"conversation_id":"' || l_conversation_id || '"}'
  );

  l_state := DBMS_CLOUD_AI_AGENT.GET_TEAM_STATE(
    team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
    params    => '{"conversation_id":"' || l_conversation_id || '"}'
  );

  DBMS_OUTPUT.PUT_LINE(l_response);
  DBMS_OUTPUT.PUT_LINE('Current state: ' || l_state);
END;
/

状态结果将报告对话的最新运行状态,例如 RUNNING、WAITING_FOR_HUMAN、SUCCEEDED 或 FAILED。

示例:创建直接调用工具的代理

代理直接工具调用支持开放式交互式会话。在此模式下,团队条目包含代理名称,并且不会将“选择 AI 代理”任务分配给代理。应用程序或用户通过调用 SET_EXECUTION_STATE 来控制会话完成。

此示例创建的代理可直接调用已配置的工具,而无需使用基于任务的执行。它演示了一个代理 - 直接会话,应用程序在其中确定交互何时完成。当工作流应遵循预定义的任务说明和完成标准时,使用基于任务的工作流。当应用程序必须保持对话打开并确定会话何时结束时,使用代理直接运行。

如果未创建具有关联工具的代理,则代理直接工具调用 API 返回空结果。在调用代理 - 直接工具调用之前,创建代理并将一个或多个工具与其关联。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
    agent_name => 'CUSTOMER_AGENT_ONLY',
    attributes => '{
      "profile_name": "<AI_PROFILE_NAME>",
      "role": "You help customers with return requests. Ask for the return reason, collect the order number, confirm the requested action, and call EMAIL_TOOL only after the customer confirms the action.",
      "enable_human_tool": "true",
      "short_term_memory_length": 4,
      "tools": ["EMAIL_TOOL"]
    }'
  );
END;
/

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

DECLARE
  l_response CLOB;
  l_conversation_id VARCHAR2(128);
BEGIN
  l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION();

  l_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM(
    team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
    user_prompt => 'I need help returning order 7820.',
    params => '{"conversation_id":"' || l_conversation_id || '"}'
  );

  DBMS_OUTPUT.PUT_LINE(l_response);
END;
/

BEGIN
  DBMS_CLOUD_AI_AGENT.SET_EXECUTION_STATE(
    team_name => 'CUSTOMER_AGENT_ONLY_TEAM',
    state => 'SUCCEEDED',
    params => '{"conversation_id":"<CONVERSATION_ID>"}'
  );
END;
/

示例:配置短期和长期内存长度

内存长度控制在座席调用 LLM 时以前的上下文可用程度。short_term_memory_length 控制当前运行的每个 LLM 调用中包括的最近对话轮次。long_term_memory_length 控制新运行启动时包括的先前任务级别摘要。

内存类型 属性 范围 默认值
短期记忆 short_term_memory_length 已在代理上配置。 30
长期记忆 long_term_memory_length 在团队中配置。 30

对话内存使用默认内存深度 30 次对话转动。对大多数工作量使用默认值。当座席需要在更长的交互中提供额外的对话情境时,增加内存深度,或者减少情境处理以缩短面向任务的对话。

此示例为代理配置短期内存,为团队配置长期内存,并显示如何控制 LLM 可用于满足不同工作负荷要求的会话上下文量。

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_AGENT(
    agent_name => 'MEMORY_AWARE_RETURN_AGENT',
    attributes => '{
      "profile_name": "<AI_PROFILE_NAME>",
      "short_term_memory_length": 5,
      "role": "You help customers with product return requests and keep the current conversation context concise."
    }'
  );
END;
/

BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
    team_name => 'MEMORY_AWARE_RETURN_TEAM',
    attributes => '{"agents":[{"name":"MEMORY_AWARE_RETURN_AGENT","task":"RETURN_REQUEST_TASK"}],
      "long_term_memory_length": 5,
      "process":"sequential"}'
  );
END;
/

示例:使用内置工具创建电影分析代理

此示例说明如何使用 Select AI Agent 创建电影分析代理。在此示例中,设置了一个电影分析代理,用于检索数据、回答问题、搜索 Web 以及通过电子邮件发送分析或发送 Slack 通知。

以下示例假定数据可供您使用。

此示例创建 MOVIE_ANALYST 代理并使用多个内置工具,例如 SQL、RAG、WEBSEARCH 和 NOTIFICATION 类型的工具:EMAIL 和 SLACK。代理使用自然语言提示回答与电影相关的问题。

在本示例中,DBA 为 `DBMS_CLOUD_AI_AGENT, DBMS_CLOUD_AI, DBMS_CLOUD_PIPELINE packages, ACL access for your AI provider, SMTP access, and Slack access, you begin by creating the MOVIE_ANALYST` 代理授予 EXECUTE 权限后。

创建代理

您创建了一个名为 MOVIE_ANALYST 的座席,其中包含个人资料 (GROK) 以及回答有关电影、演员和流派的问题的作用。

创建任务

您可以创建一个名为 ANALYZE_MOVIE_TASK 的任务,其中包含用于回答与电影相关的查询的说明。

创建团队

您可以创建一个 MOVIE_AGENT_TEAM 团队,将 MOVIE_ANALYST 作为代理,将任务设置为 ANALYZE_MOVIE_TASK,并将其设置为活动团队。

您以后可以附加 SQL、RAG、Websearch 或 Notification 等工具来扩展其功能。

运行 Select AI Agent Team

现在,您可以使用 select ai agent 作为提示的前缀来运行代理团队。

创建 Tools

然后附加不同的内置代理工具:

完整的示例如下所示:

--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;
/
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;
/
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TEAM(
    team_name  => 'MOVIE_AGENT_TEAM',
    attributes => '{"agents": [{"name":"MOVIE_ANALYST","task" : "ANALYZE_MOVIE_TASK"}],
                    "process": "sequential"
                    }');
END;
/
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
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 regarding 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;
/
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'SQL',
    attributes => '{"tool_type": "SQL",
                    "tool_params": {"profile_name": "nl2sql_profile"}}'
  );
END;
/
EXEC DBMS_CLOUD_AI_AGENT.drop_task('ANALYZE_MOVIE_TASK');
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;
/
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
-- 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;
/
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;
/
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name  => 'RAG_TOOL',
    attributes => '{"tool_type": "RAG",
                      "tool_params": {"profile_name": "RAG_PROFILE"}}'
  );
END;
/
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;
/
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
-- Rag search 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;
/
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;
/
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;
/
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
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;
/
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;
/
EXEC DBMS_CLOUD_AI_AGENT.CLEAR_TEAM;
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('MOVIE_AGENT_TEAM');
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;
/
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;
/
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.

示例:创建产品退货代理

此示例说明如何使用 Select AI Agent 创建多回合会话代理。在此示例中,设置一个客户服务代理来处理产品退货并更新数据库中的退货状态。

此示例创建名为 Customer_Return_Agent 的代理和名为 Update_Order_Status_Tool 的工具,然后定义用于处理产品退货的任务和团队。

在本示例中,DBA 为 `DBMS_CLOUD_AI_AGENT and DBMS_CLOUD_AI, you begin by creating a sample data of customers, customer order status, and a function to update the customer order status. Then, create an agent named Customer_Return_Agent` 授予 EXECUTE 权限后。

创建代理

创建一个名为 Customer_Return_Agent 的代理,该代理具有配置文件 (OCI_GENAI_GROK) 和角色以管理返回请求。

创建 Tools

然后,创建名为 Update_Order_Status_Tool 的代理工具来更新数据库中订单的状态。

创建任务

您创建了一个名为 Handle_Product_Return_Task 的任务来指导流:询问原因(不再需要,到达太晚,盒子断开或有缺陷)。继续执行有缺陷的返回流。

创建团队

您创建了一个名为 Return_Agency_Team、以 Customer_Return_Agent 作为代理的代理团队,并将其设置为活动团队。

运行 Select AI Agent Team

现在,您可以使用 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;
/
--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;
/

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;
/
SQL> EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('Return_Agency_Team');
--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!

示例:将 Select AI Agent 与 Database Actions 和 Oracle APEX AI Application Generator 结合使用

如果使用 Web SQL 客户机(例如 Database Actions ),请使用 DBMS_CLOUD_AI_AGENT.RUN_TEAM 函数运行代理团队,并在函数中提供提示。

注:请勿在 Database Actions 或 APEX Service 中使用 DBMS_CLOUD_AI_AGENT.SET_TEAM。而是使用 DBMS_CLOUD_AI_AGENT.RUN_TEAM 的 team_name 参数指定代理团队。

以下示例创建一个对话 ID 以跟踪客户对话历史记录,然后使用 DBMS_CLOUD_AI_AGENT.RUN_TEAM 函数与产品退货代理进行交互。

有关更多信息,请参见 RUN_TEAM Function 。

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;

示例:提取和分析日志报告

此示例说明如何使用两个代理 - 任务对创建代理团队来检索日志和分析日志。

此示例将创建:

注:只有 DBA 才能运行 EXECUTE 特权和网络 ACL 过程。

在本示例中,DBA 为 `DBMS_CLOUD_AI_AGENT package, DBMS_CLOUD_AI package, and ACL access for your AI providers, you begin by creating the Data_Engineer and Ops_Manager` 代理授予 EXECUTE 权限之后。

创建代理

创建名为 Data_Engineer 的代理,其配置文件 (GOOGLE) 使用 Google 作为 AI 提供者和角色来检索和处理复杂数据。

使用配置文件 (OPENAI) 创建名为 Ops_Manager 的代理,该配置文件使用 OpenAI 作为 AI 提供者和角色来分析数据。

创建工具栏

然后,创建代理工具:log_fetcher:返回给定日期之后的日志条目。这使用定制过程 fetch_logs。

创建的任务

您可以定义两个任务 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;
/
--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)
);
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.'
);
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.'
);
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.'
);
COMMIT;
-- create data engineer agent
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;
    /
-- 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;
    /
-- 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;
/
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;
/
-- create task with log fetcher tool

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;
/
-- create task with predefined rag and slack tool

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;
/
-- create team and set agent team
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;
/
EXEC DBMS_CLOUD_AI_AGENT.SET_TEAM('Ops_Issues_Solution_Team');
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 工具

此示例定义一个 PL/SQL 函数,该函数发送 HTTP GET 请求并返回响应文本。然后,该函数将添加到“Select AI Agent(选择 AI 代理)”工具中。

您可以创建一个定制工具,该工具使用 DBMS_CLOUD.SEND_REQUEST 过程发送 REST 请求并返回作为文本的响应。此示例说明如何编写 PL/SQL 函数并将其添加为用于代理任务的工具。

函数 get_url_content 将 GET 请求发送到目标 URL 并以 CLOB 形式返回响应。DBMS_CLOUD_AI_AGENT.CREATE_TOOL 使用 get_url_content 函数并创建名为 HTTP_TOOL 的工具,当任务需要从 URL 提取内容时,Select AI 代理可以调用该工具。

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

示例:查看最近团队运行的代理提示和响应

此示例通过显示使用历史视图和对话数据运行的最近座席团队的提示、响应和座席想法,帮助调试最近的“选择 AI 代理”活动。

此示例从最近的 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>,则选择 AI 代理将自动恢复暂停的团队运行。将维护对话上下文(包括以前的提示和推理),而无需其他参数。

示例:使用 DBMS_CLOUD_AI_AGENT.RUN_TEAM 恢复代理团队运行

如果使用的是 DBMS_CLOUD_AI_AGENT.RUN_TEAM 过程,则可以通过传递初始运行中使用的同一 conversation_id 来恢复暂停的代理团队。座席团队运行状态(包括待定操作和上下文)将得到保留,座席团队将完全从停止的位置继续。

有关使用 DBMS_CLOUD_AI_AGENT.RUN_TEAM 函数的示例,请参见 Example:Create a Product Return Agent 。

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