add selectai

This commit is contained in:
Fernando Melo
2026-05-28 14:38:15 -03:00
parent 440b1cfadb
commit 052eb23d54
10 changed files with 581 additions and 112 deletions

View File

@@ -0,0 +1,43 @@
EXEC DBMS_CLOUD_AI.DROP_PROFILE('PROFILE_LLAMA_4_17B');
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'PROFILE_LLAMA_4_17B',
attributes => JSON_OBJECT(
'provider' VALUE 'oci',
'credential_name' VALUE 'OCI$RESOURCE_PRINCIPAL',
'model' VALUE 'meta.llama-4-maverick-17b-128e-instruct-fp8',
'region' VALUE 'us-chicago-1',
'oci_compartment_id' VALUE 'ocid1.compartment.oc1..aaaaaaaa33ogmhasyvcqzuvkrfzo5mavh3q2le7mgwmy74yzpyqi7byxgrlq',
'temperature' VALUE 0,
'max_tokens' VALUE 4096
));
END;
/
EXEC DBMS_CLOUD_AI.DROP_PROFILE('PROFILE_GPT-5.5');
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'PROFILE_GPT-5.5',
attributes => JSON_OBJECT(
'provider' VALUE 'oci',
'credential_name' VALUE 'OCI$RESOURCE_PRINCIPAL',
'model' VALUE 'openai.gpt-5.5',
'region' VALUE 'us-chicago-1',
'oci_compartment_id' VALUE 'ocid1.compartment.oc1..aaaaaaaa33ogmhasyvcqzuvkrfzo5mavh3q2le7mgwmy74yzpyqi7byxgrlq',
'temperature' VALUE 1,
'max_tokens' VALUE 8192
));
END;
/
set define off
var response CLOB
exec :response := DBMS_CLOUD_AI.GENERATE(prompt => 'Hola', profile_name => 'PROFILE_GPT-5.5', action => 'chat');
print :response

View File

@@ -1,22 +0,0 @@
EXEC DBMS_CLOUD_AI.DROP_PROFILE('PROFILE_GPT-5.5');
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'PROFILE_GPT-5.5',
attributes => JSON_OBJECT(
'provider' VALUE 'oci',
'credential_name' VALUE 'OCI$RESOURCE_PRINCIPAL',
'model' VALUE 'openai.gpt-5.5',
'region' VALUE 'us-chicago-1',
'oci_compartment_id' VALUE 'ocid1.compartment.oc1..aaaaaaaa33ogmhasyvcqzuvkrfzo5mavh3q2le7mgwmy74yzpyqi7byxgrlq',
'temperature' VALUE 1,
'max_tokens' VALUE 8192
));
END;
/
set define off
var response CLOB
exec :response := DBMS_CLOUD_AI.GENERATE(prompt => 'Olá', profile_name => 'PROFILE_GPT-5.5', action => 'chat');
print :response

View File

@@ -0,0 +1,297 @@
set define off
-- ============================================================================
-- Lab: Annotations para SELECT AI
-- ============================================================================
-- Este script documenta tablas relacionales generadas desde una JSON COLLECTION
-- TABLE y la JSON Relational Duality View que recompone el documento.
--
-- SELECT AI usa nombres, relaciones y metadatos para generar SQL. Las
-- annotations ayudan a explicar el significado de tablas y columnas con
-- lenguaje de negocio, sinonimos y pistas de uso.
--
-- Nota: para ejecutar el lab mas de una vez, cambie ADD por REPLACE en las
-- annotations que ya existan.
-- ============================================================================
-- ============================================================================
-- T_ROOT: tabla raiz del documento JSON
-- ============================================================================
ALTER TABLE t_root ANNOTATIONS (
ADD display_name 'Documento de promocion',
ADD business_description 'Tabla raiz de cada promocion extraida desde markdown. Une promocion, medios de pago, cuotas, reintegro, exclusiones y listas hijas.',
ADD select_ai_hint 'Use esta tabla como punto de partida cuando la pregunta sea sobre una promocion completa o sobre condiciones generales.',
ADD example_questions 'Que promociones existen? Cuales son las exclusiones? Que banco emite la promocion?'
);
ALTER TABLE t_root MODIFY "_id" ANNOTATIONS (
ADD display_name 'Identificador del documento',
ADD business_description 'Clave tecnica RAW que identifica un documento JSON de promocion.',
ADD select_ai_hint 'No mostrar al usuario final salvo que pida identificadores tecnicos.'
);
ALTER TABLE t_root MODIFY exclusoes ANNOTATIONS (
ADD display_name 'Exclusiones de la promocion',
ADD business_description 'Lista JSON con reglas, restricciones y condiciones que excluyen compras o situaciones del beneficio.',
ADD synonyms 'restricciones, condiciones, limitaciones, no aplica, fuera de promocion',
ADD select_ai_hint 'Cuando el usuario pregunte que no aplica o que esta excluido, consulte este campo JSON.'
);
ALTER TABLE t_root MODIFY titulo_t_promocao ANNOTATIONS (
ADD display_name 'Titulo de la promocion',
ADD business_description 'Referencia al titulo principal de la promocion.',
ADD relationship_hint 'Clave foranea hacia T_PROMOCAO.TITULO.'
);
ALTER TABLE t_root MODIFY emissor_t_medios_pago ANNOTATIONS (
ADD display_name 'Emisor del medio de pago',
ADD business_description 'Banco o entidad emisora usada para enlazar los medios de pago aceptados.',
ADD relationship_hint 'Clave foranea hacia T_MEDIOS_PAGO.EMISSOR.'
);
ALTER TABLE t_root MODIFY maximo_sin_intereses_t_cuotas ANNOTATIONS (
ADD display_name 'Maximo de cuotas sin intereses',
ADD business_description 'Valor usado para enlazar las condiciones de cuotas sin intereses.',
ADD unit 'cuotas',
ADD relationship_hint 'Clave foranea hacia T_CUOTAS.MAXIMO_SIN_INTERESES.'
);
ALTER TABLE t_root MODIFY prazo_dias_habiles_t_acreditacao_reintegro ANNOTATIONS (
ADD display_name 'Plazo de acreditacion del reintegro',
ADD business_description 'Cantidad de dias habiles usada para enlazar la regla de acreditacion del reintegro.',
ADD unit 'dias habiles',
ADD relationship_hint 'Clave foranea hacia T_ACREDITACAO_REINTEGRO.PRAZO_DIAS_HABILES.'
);
-- ============================================================================
-- T_PROMOCAO y T_VIGENCIA: datos principales de la promocion
-- ============================================================================
ALTER TABLE t_promocao ANNOTATIONS (
ADD display_name 'Promocion',
ADD business_description 'Datos principales de la oferta bancaria, incluyendo titulo y vigencia.',
ADD select_ai_hint 'Use esta tabla para responder preguntas sobre el nombre de la promocion y sus fechas.'
);
ALTER TABLE t_promocao MODIFY titulo ANNOTATIONS (
ADD display_name 'Titulo',
ADD business_description 'Nombre oficial de la promocion segun el documento markdown.',
ADD synonyms 'nombre de promocion, campana, oferta'
);
ALTER TABLE t_promocao MODIFY data_inicio_t_vigencia ANNOTATIONS (
ADD display_name 'Fecha de inicio',
ADD business_description 'Fecha inicial de vigencia enlazada con T_VIGENCIA.',
ADD relationship_hint 'Parte de la clave compuesta hacia T_VIGENCIA.'
);
ALTER TABLE t_promocao MODIFY data_fim_t_vigencia ANNOTATIONS (
ADD display_name 'Fecha de fin',
ADD business_description 'Fecha final de vigencia enlazada con T_VIGENCIA.',
ADD relationship_hint 'Parte de la clave compuesta hacia T_VIGENCIA.'
);
ALTER TABLE t_vigencia ANNOTATIONS (
ADD display_name 'Vigencia',
ADD business_description 'Rango de fechas en que la promocion esta activa.',
ADD example_questions 'La promocion sigue vigente? Cuando termina la promocion?'
);
ALTER TABLE t_vigencia MODIFY data_inicio ANNOTATIONS (
ADD display_name 'Inicio de vigencia',
ADD business_description 'Primer dia en que la promocion puede ser aplicada.',
ADD unit 'fecha'
);
ALTER TABLE t_vigencia MODIFY data_fim ANNOTATIONS (
ADD display_name 'Fin de vigencia',
ADD business_description 'Ultimo dia en que la promocion puede ser aplicada.',
ADD unit 'fecha'
);
-- ============================================================================
-- T_MEDIOS_PAGO: tarjetas, QR, ecommerce y billeteras
-- ============================================================================
ALTER TABLE t_medios_pago ANNOTATIONS (
ADD display_name 'Medios de pago',
ADD business_description 'Condiciones de pago aceptadas por la promocion, como tarjetas, red, QR, ecommerce y billeteras electronicas.',
ADD select_ai_hint 'Use esta tabla para preguntas sobre como pagar para recibir el beneficio.'
);
ALTER TABLE t_medios_pago MODIFY emissor ANNOTATIONS (
ADD display_name 'Emisor',
ADD business_description 'Entidad emisora aceptada para participar de la promocion.',
ADD synonyms 'banco, entidad, issuer'
);
ALTER TABLE t_medios_pago MODIFY rede ANNOTATIONS (
ADD display_name 'Red de tarjeta',
ADD business_description 'Red o marca de tarjeta aceptada por la promocion.',
ADD synonyms 'marca, red, network'
);
ALTER TABLE t_medios_pago MODIFY qr_permitido ANNOTATIONS (
ADD display_name 'QR permitido',
ADD business_description 'Indica si el pago por QR participa de la promocion.',
ADD select_ai_hint 'Campo booleano: true significa que QR esta permitido.'
);
ALTER TABLE t_medios_pago MODIFY ecommerce_permitido ANNOTATIONS (
ADD display_name 'Ecommerce permitido',
ADD business_description 'Indica si compras online o ecommerce participan de la promocion.',
ADD select_ai_hint 'Campo booleano: true significa que ecommerce esta permitido.'
);
ALTER TABLE t_medios_pago MODIFY tarjetas_aceitas ANNOTATIONS (
ADD display_name 'Tarjetas aceptadas',
ADD business_description 'Array JSON con las tarjetas o productos de tarjeta que califican.',
ADD synonyms 'tarjetas validas, tarjetas admitidas, tarjetas participantes',
ADD select_ai_hint 'Use funciones JSON cuando necesite filtrar por una tarjeta especifica.'
);
ALTER TABLE t_medios_pago MODIFY billeteras_electronicas ANNOTATIONS (
ADD display_name 'Billeteras electronicas',
ADD business_description 'Array JSON con billeteras digitales aceptadas por la promocion.',
ADD synonyms 'wallets, billeteras, monederos digitales',
ADD select_ai_hint 'Use funciones JSON cuando el usuario pregunte por una billetera especifica.'
);
-- ============================================================================
-- T_CUOTAS: informacion de financiamiento
-- ============================================================================
ALTER TABLE t_cuotas ANNOTATIONS (
ADD display_name 'Cuotas',
ADD business_description 'Reglas de financiamiento sin intereses para la promocion.',
ADD example_questions 'Cuantas cuotas sin intereses permite la promocion? El cliente debe pedir las cuotas?'
);
ALTER TABLE t_cuotas MODIFY maximo_sin_intereses ANNOTATIONS (
ADD display_name 'Maximo sin intereses',
ADD business_description 'Cantidad maxima de cuotas sin intereses permitidas.',
ADD unit 'cuotas'
);
ALTER TABLE t_cuotas MODIFY requer_solicitacao_cliente ANNOTATIONS (
ADD display_name 'Requiere solicitud del cliente',
ADD business_description 'Indica si el cliente debe solicitar expresamente el pago en cuotas.',
ADD select_ai_hint 'Campo booleano: true significa que el cliente debe solicitarlo.'
);
-- ============================================================================
-- T_ACREDITACAO_REINTEGRO: como se acredita el beneficio
-- ============================================================================
ALTER TABLE t_acreditacao_reintegro ANNOTATIONS (
ADD display_name 'Acreditacion del reintegro',
ADD business_description 'Reglas de acreditacion del reintegro: plazo, porcentaje acreditado y tipo de cuenta.',
ADD select_ai_hint 'Use esta tabla para preguntas sobre cuando y donde se acredita el reintegro.'
);
ALTER TABLE t_acreditacao_reintegro MODIFY prazo_dias_habiles ANNOTATIONS (
ADD display_name 'Plazo en dias habiles',
ADD business_description 'Cantidad de dias habiles hasta acreditar el reintegro.',
ADD unit 'dias habiles',
ADD synonyms 'plazo, demora, tiempo de acreditacion'
);
ALTER TABLE t_acreditacao_reintegro MODIFY percentual_creditado ANNOTATIONS (
ADD display_name 'Porcentaje acreditado',
ADD business_description 'Porcentaje del reintegro que sera acreditado al cliente.',
ADD unit 'porcentaje'
);
ALTER TABLE t_acreditacao_reintegro MODIFY tipo_conta ANNOTATIONS (
ADD display_name 'Tipo de cuenta',
ADD business_description 'Cuenta o producto donde se acredita el reintegro.',
ADD synonyms 'cuenta destino, producto, cuenta de acreditacion'
);
-- ============================================================================
-- T_COMERCIOS: comercios participantes
-- ============================================================================
ALTER TABLE t_comercios ANNOTATIONS (
ADD display_name 'Comercios participantes',
ADD business_description 'Lista de comercios que participan de la promocion, con categoria y procesador de pago.',
ADD select_ai_hint 'Use esta tabla para preguntas sobre donde comprar, rubros participantes o procesadores de pago.'
);
ALTER TABLE t_comercios MODIFY name ANNOTATIONS (
ADD display_name 'Nombre del comercio',
ADD business_description 'Nombre del comercio tal como aparece en el documento original.',
ADD synonyms 'tienda, local, merchant, comercio'
);
ALTER TABLE t_comercios MODIFY category ANNOTATIONS (
ADD display_name 'Categoria del comercio',
ADD business_description 'Rubro o seccion del markdown donde aparece el comercio.',
ADD synonyms 'rubro, segmento, categoria, grupo'
);
ALTER TABLE t_comercios MODIFY payment_processor ANNOTATIONS (
ADD display_name 'Procesador de pago',
ADD business_description 'Procesador asociado al comercio, por ejemplo upay o bancard.',
ADD synonyms 'procesadora, adquirente, payment processor'
);
ALTER TABLE t_comercios MODIFY "_id_t_root" ANNOTATIONS (
ADD display_name 'Documento de origen',
ADD business_description 'Clave tecnica que enlaza el comercio con el documento raiz de la promocion.',
ADD relationship_hint 'Clave foranea hacia T_ROOT."_id".'
);
-- ============================================================================
-- T_BENEFICIOS_POR_NIVEL: reglas de reintegro por nivel
-- ============================================================================
ALTER TABLE t_beneficios_por_nivel ANNOTATIONS (
ADD display_name 'Beneficios por nivel',
ADD business_description 'Lista de niveles de cliente y sus reglas de reintegro, compra minima y tope maximo.',
ADD select_ai_hint 'Use esta tabla para comparar beneficios entre niveles.'
);
ALTER TABLE t_beneficios_por_nivel MODIFY nivel ANNOTATIONS (
ADD display_name 'Nivel del cliente',
ADD business_description 'Nivel o segmento del cliente dentro de la promocion.',
ADD synonyms 'segmento, nivel, categoria de cliente'
);
ALTER TABLE t_beneficios_por_nivel MODIFY percentual_reintegro ANNOTATIONS (
ADD display_name 'Porcentaje de reintegro',
ADD business_description 'Porcentaje de reintegro ofrecido para el nivel.',
ADD unit 'porcentaje'
);
ALTER TABLE t_beneficios_por_nivel MODIFY monto_compra_minimo_gs ANNOTATIONS (
ADD display_name 'Compra minima',
ADD business_description 'Monto minimo de compra requerido para aplicar el beneficio.',
ADD unit 'guaranies'
);
ALTER TABLE t_beneficios_por_nivel MODIFY reintegro_maximo_gs ANNOTATIONS (
ADD display_name 'Tope maximo de reintegro',
ADD business_description 'Monto maximo de reintegro que puede recibir el cliente en guaranies.',
ADD unit 'guaranies',
ADD synonyms 'tope, limite, maximo de devolucion'
);
ALTER TABLE t_beneficios_por_nivel MODIFY "_id_t_root" ANNOTATIONS (
ADD display_name 'Documento de origen',
ADD business_description 'Clave tecnica que enlaza el beneficio por nivel con el documento raiz de la promocion.',
ADD relationship_hint 'Clave foranea hacia T_ROOT."_id".'
);
-- ============================================================================
-- V_PARSED_MARKDOWN_FILES: vista JSON Relational Duality
-- ============================================================================
ALTER VIEW v_parsed_markdown_files ANNOTATIONS (
ADD display_name 'Documento JSON de promocion',
ADD business_description 'JSON Relational Duality View que presenta las tablas normalizadas como un unico documento JSON consultable y actualizable.',
ADD select_ai_hint 'Use esta vista cuando el usuario pregunte por el documento completo o quiera ver la estructura JSON de la promocion.',
ADD example_questions 'Muestre el JSON completo de la promocion. Que comercios aparecen dentro del documento? Que condiciones tiene la promocion?'
);

123
lab/selectai/03_select.sql Normal file
View File

@@ -0,0 +1,123 @@
set serveroutput on
set long 9999999
set pagesize 1000
set linesize 200
-- ============================================================================
-- Profile especializado para el lab de SELECT AI con annotations
-- ============================================================================
-- Este profile limita el contexto de SELECT AI a las tres tablas del ejercicio.
-- La opcion annotations=true envia las annotations de tablas y columnas al modelo.
-- enforce_object_list=true evita que el modelo use otras tablas accesibles.
BEGIN
DBMS_CLOUD_AI.DROP_PROFILE(
profile_name => 'PROFILE_GPT_5_5_SELECTAI',
force => TRUE
);
END;
/
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name => 'PROFILE_GPT_5_5_SELECTAI',
attributes => JSON_OBJECT(
'provider' VALUE 'oci',
'credential_name' VALUE 'OCI$RESOURCE_PRINCIPAL',
'model' VALUE 'openai.gpt-5.5',
'region' VALUE 'us-chicago-1',
'oci_compartment_id' VALUE 'ocid1.compartment.oc1..aaaaaaaa33ogmhasyvcqzuvkrfzo5mavh3q2le7mgwmy74yzpyqi7byxgrlq',
'temperature' VALUE 1,
'max_tokens' VALUE 8192,
'annotations' VALUE 'true',
'object_list_mode' VALUE 'all',
'enforce_object_list' VALUE 'true',
'object_list' VALUE JSON_ARRAY(
JSON_OBJECT('owner' VALUE USER, 'name' VALUE 'T_ROOT'),
JSON_OBJECT('owner' VALUE USER, 'name' VALUE 'T_COMERCIOS'),
JSON_OBJECT('owner' VALUE USER, 'name' VALUE 'T_BENEFICIOS_POR_NIVEL')
)
),
description => 'Profile para SELECT AI usando annotations y solamente T_ROOT, T_COMERCIOS y T_BENEFICIOS_POR_NIVEL.'
);
END;
/
-- ============================================================================
-- Lab: Consultas SELECT AI usando annotations
-- ============================================================================
-- Este script contiene ejemplos didacticos de SELECT AI.
--
-- La accion SHOWSQL muestra el SQL que el modelo genera. Esto ayuda a ver como
-- las annotations de display_name, business_description, synonyms y
-- relationship_hint guian la seleccion de tablas, columnas y joins.
-- SELECT AI modes:
-- showsql: cuando quieres obtener el SQL generado, revisarlo, auditarlo, registrarlo en logs o ejecutarlo después con control propio.
-- runsql: cuando aceptas que la base de datos genere y ejecute la consulta directamente.
-- narrate: cuando quieres una respuesta en lenguaje natural basada en el resultado.
-- explainsql: cuando quieres explicar el SQL generado.
-- chat: conversación general con el modelo, no necesariamente sobre SQL.
-- ============================================================================
EXEC DBMS_CLOUD_AI.SET_PROFILE('PROFILE_GPT_5_5_SELECTAI');
-- ============================================================================
-- Ejemplo 1: sinonimos de comercios y categorias
-- ============================================================================
-- Las annotations indican que T_COMERCIOS representa "Comercios participantes"
-- y que NAME tambien puede ser entendido como tienda, local, merchant o comercio.
-- El prompt usa lenguaje de negocio, no nombres tecnicos de columnas.
-- select ai
SELECT AI runsql Muestra los locales participantes por rubro, indicando el comercio, la categoria y la procesadora de pago.;
SELECT JSON_SERIALIZE(
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 => '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
-- ============================================================================
-- Las annotations explican que "nivel" tambien puede significar segmento o
-- categoria de cliente, y que "tope" es el reintegro maximo en guaranies.
-- El prompt usa esos sinonimos para mostrar como SELECT AI entiende el negocio.
SELECT AI runsql
Para cada segmento de cliente, lista el porcentaje de reintegro,
la compra minima requerida y el tope maximo de devolucion en guaranies.
;
-- ============================================================================
-- Ejemplo 3: pregunta de negocio cruzando comercios y niveles
-- ============================================================================
-- Este ejemplo combina tres tablas. Las relationship_hint de T_ROOT, T_COMERCIOS
-- y T_BENEFICIOS_POR_NIVEL ayudan al modelo a entender que ambas listas hijas
-- pertenecen al mismo documento de promocion.
SELECT AI runsql
Combine los comercios participantes con los beneficios por nivel de cliente del mismo documento.
Muestra rubro, comercio, procesadora, nivel del cliente, porcentaje de reintegro, compra minima
y limite maximo de devolucion.
;