add selectai
This commit is contained in:
40
lab/init.sql
40
lab/init.sql
@@ -19,23 +19,25 @@ END blob_to_clob;
|
||||
/
|
||||
|
||||
|
||||
set serveroutput on
|
||||
set define off
|
||||
|
||||
CREATE OR REPLACE PROCEDURE CONVERT_MDFILES_TO_JSON AS
|
||||
l_md_content CLOB;
|
||||
l_prompt CLOB;
|
||||
l_final_json CLOB;
|
||||
-- CHR(10) agrega saltos de linea al prompt.
|
||||
l_final_json CLOB;
|
||||
-- CHR(10) agrega saltos de linea al prompt enviado al modelo.
|
||||
BEGIN
|
||||
SELECT md_clob INTO l_md_content
|
||||
FROM markdown_files WHERE STATUS = 'INGESTED'
|
||||
AND ROWNUM = 1
|
||||
FOR UPDATE;
|
||||
|
||||
-- =====================================================================
|
||||
-- Llamada unica: metadatos de la promocion y lista de comercios
|
||||
-- Llamada unica: genera todo el JSON estructurado desde el markdown.
|
||||
-- =====================================================================
|
||||
l_prompt :=
|
||||
'Abaixo está um documento em markdown de uma promoção do ueno bank (Paraguai), em espanhol.' || CHR(10) ||
|
||||
'Extraia os metadados da promoção e TODOS os comércios em formato JSON estruturado.' || CHR(10) || CHR(10) ||
|
||||
'Extraia todos os dados relevantes da promoção em formato JSON estruturado.' || CHR(10) || CHR(10) ||
|
||||
'Retorne APENAS o objeto JSON abaixo (sem markdown fences, sem texto antes ou depois):' || CHR(10) ||
|
||||
'{' || CHR(10) ||
|
||||
' "promocao": {' || CHR(10) ||
|
||||
@@ -51,7 +53,7 @@ BEGIN
|
||||
' "ecommerce_permitido": true' || CHR(10) ||
|
||||
' },' || CHR(10) ||
|
||||
' "beneficios_por_nivel": [' || CHR(10) ||
|
||||
' {"nivel": "nivel 1", "percentual_reintegro": 0, "monto_compra_minimo_gs": 0, "reintegro_maximo_gs": 0}' || CHR(10) ||
|
||||
' {"nivel": "nivel N", "percentual_reintegro": 0, "monto_compra_minimo_gs": 0, "reintegro_maximo_gs": 0}' || CHR(10) ||
|
||||
' ],' || CHR(10) ||
|
||||
' "cuotas": {' || CHR(10) ||
|
||||
' "maximo_sin_intereses": 0,' || CHR(10) ||
|
||||
@@ -69,17 +71,16 @@ BEGIN
|
||||
'}' || CHR(10) || CHR(10) ||
|
||||
'REGRAS:' || CHR(10) ||
|
||||
'- Datas no formato ISO YYYY-MM-DD.' || CHR(10) ||
|
||||
'- Campos booleanos devem usar true ou false.' || CHR(10) ||
|
||||
'- Campos numericos devem usar numbers, sem aspas.' || CHR(10) ||
|
||||
'- Campos booleanos devem usar true ou false sem aspas.' || CHR(10) ||
|
||||
'- Campos numéricos devem usar números, sem aspas.' || CHR(10) ||
|
||||
'- Valores monetários em guaranies como integers (remover "Gs.", pontos e espaços).' || CHR(10) ||
|
||||
'- Se um campo não aparecer no documento, use null.' || CHR(10) ||
|
||||
'- exclusoes: liste apenas os principais pontos de exclusão em frases curtas.' || CHR(10) || CHR(10) ||
|
||||
'REGRAS PARA comercios:' || CHR(10) ||
|
||||
'- Extraia TODOS os comércios que aparecem literalmente no documento.' || CHR(10) ||
|
||||
'- category: seção em negrito mais próxima (**Belleza...**, **Grupo Zavidoro...**, etc).' || CHR(10) ||
|
||||
'- payment_processor: "upay" ou "bancard" conforme aparece ao lado do nome.' || CHR(10) ||
|
||||
'- Preserve os nomes exatamente como aparecem.' || CHR(10) ||
|
||||
'- Não invente comércios, categorias ou processadores de pagamento.' || CHR(10) || CHR(10) ||
|
||||
'- exclusoes: liste apenas os principais pontos de exclusão em frases curtas.' || CHR(10) ||
|
||||
'- comercios: extraia TODOS os comércios que aparecem literalmente no documento.' || CHR(10) ||
|
||||
'- comercios.category: seção em negrito mais próxima (**Belleza...**, **Grupo Zavidoro...**, etc).' || CHR(10) ||
|
||||
'- comercios.payment_processor: "upay" ou "bancard" conforme aparece ao lado do nome.' || CHR(10) ||
|
||||
'- Preserve os nomes dos comércios exatamente como aparecem.' || CHR(10) ||
|
||||
'- Não invente comércios nem complete nomes ausentes.' || CHR(10) || CHR(10) ||
|
||||
'DOCUMENTO:' || CHR(10) || l_md_content;
|
||||
|
||||
l_final_json := DBMS_CLOUD_AI.GENERATE(
|
||||
@@ -87,15 +88,12 @@ BEGIN
|
||||
profile_name => 'PROFILE_GPT-5.5',
|
||||
action => 'chat');
|
||||
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Resposta bruta do LLM: ' || LENGTH(l_final_json) || ' chars');
|
||||
|
||||
IF l_final_json IS NOT JSON THEN
|
||||
RAISE_APPLICATION_ERROR(-20210,
|
||||
'LLM retornou JSON inválido. Últimos 200 chars: ' || SUBSTR(l_final_json, -200));
|
||||
'Modelo retornou JSON inválido. Últimos 200 chars: ' || SUBSTR(l_final_json, -200));
|
||||
END IF;
|
||||
|
||||
-- Guarda el JSON estructurado generado por el modelo.
|
||||
-- Graba el JSON completo generado por el modelo.
|
||||
INSERT INTO parsed_markdown_files (data) VALUES (l_final_json);
|
||||
|
||||
UPDATE markdown_files SET STATUS = 'LOADED';
|
||||
@@ -129,4 +127,4 @@ BEGIN
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Total de tablas eliminadas: ' || l_count);
|
||||
END;
|
||||
/
|
||||
/
|
||||
|
||||
Reference in New Issue
Block a user