147 lines
5.5 KiB
SQL
147 lines
5.5 KiB
SQL
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;
|
|
/
|
|
|