From dd6bbdbd9297921304cb895c943b4fa19ea3dd83 Mon Sep 17 00:00:00 2001 From: Fernando Melo Date: Thu, 28 May 2026 19:41:13 -0300 Subject: [PATCH] add ai agents --- lab/agents/01_agents.sql | 146 +++++++++++++++++++++++++++++++++++++ lab/selectai/03_select.sql | 20 +---- 2 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 lab/agents/01_agents.sql diff --git a/lab/agents/01_agents.sql b/lab/agents/01_agents.sql new file mode 100644 index 0000000..2f9d7b9 --- /dev/null +++ b/lab/agents/01_agents.sql @@ -0,0 +1,146 @@ +set serveroutput on +set long 9999999 +set pagesize 1000 +set linesize 200 + +-- ============================================================================ +-- Lab: AI Agents con DBMS_CLOUD_AI_AGENT +-- ============================================================================ +-- Este lab crea un tool SQL, un agente, una tarea y un team. +-- El agente usa el profile PROFILE_GPT_5_5_SELECTAI, que ya fue creado con el +-- scope de tablas del workshop y con annotations habilitadas. +-- +-- Tablas del ejemplo: +-- - T_COMERCIOS: comercios participantes, rubros y procesadora de pago. +-- - T_BENEFICIOS_POR_NIVEL: reglas de reintegro por nivel de cliente. + +-- ============================================================================ +-- Limpieza para poder repetir el lab +-- ============================================================================ +-- El orden evita dependencias: primero team, despues task, agente y tool. + +BEGIN + DBMS_CLOUD_AI_AGENT.DROP_TEAM( + team_name => 'TEAM_PROMO_BENEFICIOS', + force => TRUE + ); +END; +/ + +BEGIN + DBMS_CLOUD_AI_AGENT.DROP_TASK( + task_name => 'TASK_ANALIZAR_PROMO_BENEFICIOS', + force => TRUE + ); +END; +/ + +BEGIN + DBMS_CLOUD_AI_AGENT.DROP_AGENT( + agent_name => 'AGENT_ANALISTA_PROMOCIONES', + force => TRUE + ); +END; +/ + +BEGIN + DBMS_CLOUD_AI_AGENT.DROP_TOOL( + tool_name => 'TOOL_SQL_PROMO_BENEFICIOS', + force => TRUE + ); +END; +/ + +-- ============================================================================ +-- Tool SQL +-- ============================================================================ +-- El tool SQL usa Select AI para traducir preguntas de negocio a SQL. +-- El profile restringe el contexto a las tablas del lab y envia las annotations +-- de tablas, columnas y relaciones al modelo. + +BEGIN + DBMS_CLOUD_AI_AGENT.CREATE_TOOL( + tool_name => 'TOOL_SQL_PROMO_BENEFICIOS', + attributes => '{"tool_type": "SQL", + "tool_params": {"profile_name": "PROFILE_GPT_5_5_SELECTAI"}}', + description => 'Tool SQL para consultar comercios y beneficios por nivel usando Select AI.' + ); +END; +/ + +-- ============================================================================ +-- Agente +-- ============================================================================ +-- El role define la especialidad del agente. El profile_name indica que sus +-- respuestas usan el mismo LLM configurado para el lab de Select AI. + +BEGIN + DBMS_CLOUD_AI_AGENT.CREATE_AGENT( + agent_name => 'AGENT_ANALISTA_PROMOCIONES', + attributes => '{"profile_name": "PROFILE_GPT_5_5_SELECTAI", + "role": "Eres un analista de promociones bancarias. Respondes en espanol claro, usas datos en la base de datos para responder preguntas.", + "enable_human_tool": "false"}', + description => 'Agente analista para comercios participantes y beneficios por nivel.' + ); +END; +/ + +-- ============================================================================ +-- Task +-- ============================================================================ +-- La instruccion usa {query}; RUN_TEAM reemplaza ese marcador con la pregunta +-- enviada por el usuario. El tool SQL queda disponible para consultar la base. + +BEGIN + DBMS_CLOUD_AI_AGENT.CREATE_TASK( + task_name => 'TASK_ANALIZAR_PROMO_BENEFICIOS', + attributes => '{"instruction": "Responde la siguiente pregunta del usuario: {query}. Identifica si requiere datos de comercios, categorias, procesadoras, niveles, porcentajes, compra minima o tope de reintegro. Si requiere datos, usa TOOL_SQL_PROMO_BENEFICIOS para consultar T_COMERCIOS y T_BENEFICIOS_POR_NIVEL. Devuelve una respuesta corta, util para negocio, incluyendo valores relevantes.", + "tools": ["TOOL_SQL_PROMO_BENEFICIOS"], + "enable_human_tool": "false"}', + description => 'Task para responder preguntas de negocio sobre promociones, comercios y beneficios.' + ); +END; +/ + +-- ============================================================================ +-- Team +-- ============================================================================ +-- El team orquesta que agente ejecuta que tarea. En este lab hay un solo agente +-- y una sola tarea, pero el patron permite agregar mas pasos despues. + +BEGIN + DBMS_CLOUD_AI_AGENT.CREATE_TEAM( + team_name => 'TEAM_PROMO_BENEFICIOS', + attributes => '{"agents": [{"name": "AGENT_ANALISTA_PROMOCIONES", "task": "TASK_ANALIZAR_PROMO_BENEFICIOS"}], + "process": "sequential"}', + description => 'Team para consultas agenticas sobre comercios y beneficios por nivel.' + ); +END; +/ + +-- ============================================================================ +-- Chat rapido con RUN_TEAM +-- ============================================================================ +-- RUN_TEAM inicia la conversacion con el team y pasa el texto a {query}. +-- conversation_id permite aislar una conversacion cuando una aplicacion llama +-- el team de forma stateless, por ejemplo desde APEX o una API. + +DECLARE + l_conversation_id VARCHAR2(4000); + l_response CLOB; +BEGIN + l_conversation_id := DBMS_CLOUD_AI.CREATE_CONVERSATION; + DBMS_CLOUD_AI.SET_CONVERSATION_ID(l_conversation_id); + + l_response := DBMS_CLOUD_AI_AGENT.RUN_TEAM( + team_name => 'TEAM_PROMO_BENEFICIOS', + user_prompt => 'Que Zapaterias tienen beneficios y cuales son los topes por nivel', + params => JSON_OBJECT('conversation_id' VALUE l_conversation_id) + ); + + DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(l_response, 4000, 1)); + DBMS_CLOUD_AI_AGENT.CLEAR_TEAM; + DBMS_CLOUD_AI.CLEAR_CONVERSATION_ID; +END; +/ + diff --git a/lab/selectai/03_select.sql b/lab/selectai/03_select.sql index fb52460..dfe5587 100644 --- a/lab/selectai/03_select.sql +++ b/lab/selectai/03_select.sql @@ -1,3 +1,4 @@ + set serveroutput on set long 9999999 set pagesize 1000 @@ -81,22 +82,6 @@ SELECT JSON_SERIALIZE( action => 'runsql' ) returning CLOB pretty); - - --- dbms_cloud_ai -DECLARE - l_response CLOB; - BEGIN - l_response := DBMS_CLOUD_AI.GENERATE( - prompt => 'Muestra los locales participantes por rubro, indicando el comercio, la categoria y la procesadora de pago.', - profile_name => 'PROFILE_GPT_5_5_SELECTAI', - action => 'showsql' - ); - - DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(l_response, 4000, 1)); - END; - / - -- ============================================================================ -- Ejemplo 2: beneficio por segmento, compra minima y tope -- ============================================================================ @@ -121,3 +106,6 @@ SELECT AI runsql Muestra rubro, comercio, procesadora, nivel del cliente, porcentaje de reintegro, compra minima y limite maximo de devolucion. ; + + +