From ae793071ec3802d12d5514f20366b173332ca582 Mon Sep 17 00:00:00 2001 From: flealdba Date: Fri, 8 May 2026 13:14:09 +0000 Subject: [PATCH] Upload files to "/" --- fnc_26ai_rag_manufatura.sql | 96 +++++++++++++++++++++ fnc_26ai_rag_telecom.sql | 168 ++++++++++++++++++++++++++++++++++++ fnc_26ai_rag_utilities.sql | 97 +++++++++++++++++++++ fnc_26ai_rag_varejo.sql | 117 +++++++++++++++++++++++++ 4 files changed, 478 insertions(+) create mode 100644 fnc_26ai_rag_manufatura.sql create mode 100644 fnc_26ai_rag_telecom.sql create mode 100644 fnc_26ai_rag_utilities.sql create mode 100644 fnc_26ai_rag_varejo.sql diff --git a/fnc_26ai_rag_manufatura.sql b/fnc_26ai_rag_manufatura.sql new file mode 100644 index 0000000..438faa7 --- /dev/null +++ b/fnc_26ai_rag_manufatura.sql @@ -0,0 +1,96 @@ +create or replace function fnc_26ai_rag_manufatura (p_ai_prompt IN clob, + p_oci_cred IN VARCHAR2, + p_id in number, + p_comp_id in varchar2 ) +return clob +as +/* + + Criado por: fernando.leal@oracle.com + Data: Nov/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao de RAG para Manufatura - leal + +*/ + + -- modelos: https://docs.oracle.com/en-us/iaas/Content/generative-ai/pretrained-models.htm + -- cuidado com pre requisito (1) + gen_ai_endpoint varchar2(500) := 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com'; + gen_ai_model varchar2(500) := 'meta.llama-4-maverick-17b-128e-instruct-fp8'; + + chat_resp dbms_cloud_types.RESP; + image_resp dbms_cloud_types.RESP; + + base64_image CLOB := NULL; + request_json_part1 CLOB; + request_json_part2 CLOB; + request_body BLOB; + v_ext varchar2(20); +BEGIN + -- create temp blobs + dbms_lob.createtemporary(request_body, FALSE); + + select APEX_WEB_SERVICE.BLOB2CLOBBASE64( FILE_BLOB ,'N','N' ) , + lower(regexp_replace(file_name, '.*\.([a-zA-Z0-9]+)$', '\1')) + into base64_image, v_ext + from TB_26AI_MANUFATURA + where id = p_id; + + request_json_part1 := to_clob( + '{ + "compartmentId": "' || p_comp_id || '", + "servingMode": + { + "modelId": "' || gen_ai_model || '", + "servingType": "ON_DEMAND" + } + , + "chatRequest": { + "apiFormat": "GENERIC", + "messages": [ + { + "role": "USER", + "content": [ + { + "type": "TEXT", + "text": "' || replace(replace(replace(replace( p_ai_prompt ,chr(10),null),chr(13),null),'"',''),'''','') || '" + }, + { + "type": "IMAGE", + "imageUrl": { + "url": "data:image/' || v_ext || ';base64,'); + + request_json_part2 := to_clob('" + } + } + ] + } + ], + "temperature": 0.2 + } + }'); + + -- append part1 json to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part1,p_charset => 'AL32UTF8')); + + -- append base64 image to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => base64_image,p_charset => 'AL32UTF8')); + + -- append part2 json to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part2,p_charset => 'AL32UTF8')); + + -- call Gen AI Chat + chat_resp := dbms_cloud.send_request( + credential_name => p_oci_cred, + uri => gen_ai_endpoint || '/20231130/actions/chat', + method => dbms_cloud.METHOD_POST, + body => request_body + ); + + -- clear temp blobs + dbms_lob.freetemporary(request_body); + + RETURN json_value( dbms_cloud.get_response_text(chat_resp),'$.chatResponse.choices[0].message.content[0].text') ; +END; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_telecom.sql b/fnc_26ai_rag_telecom.sql new file mode 100644 index 0000000..2cf676a --- /dev/null +++ b/fnc_26ai_rag_telecom.sql @@ -0,0 +1,168 @@ +create or replace FUNCTION fnc_26ai_rag_telecom(p_query VARCHAR2, + p_top_k IN NUMBER, + p_new_session in number, + p_credential in varchar2 default 'OCI_CRED' + ) +RETURN CLOB IS +/* + + Criado por: fernando.leal@oracle.com + Data: Oct/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao de RAG para TELECOM - leal + + +begin + dbms_cloud_ai.create_profile( + profile_name => 'PROF_TELECOM_V1', + attributes => + '{"provider": "oci", + "credential_name": "OCI_CRED", + "oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaakvd4bq4b3n7yn3gjjqzfhsl62dec44tjvi2iwa3sugw5frgfpzea", + "region": "us-chicago-1", + "model": "meta.llama-4-maverick-17b-128e-instruct-fp8", + "oci_apiformat": "GENERIC", + "object_list": [ + {"owner": "AICHAT1", "name": "V_26AI_REMARK"}, + {"owner": "AICHAT1", "name": "V_26AI_MASTER"}, + {"owner": "AICHAT1", "name": "V_26AI_CLIENTE_FIXA_MOVEL_CONSOLIDADO"} + ], + "comments": true, + "temperature": 0.1 + }' + ); +end; +/ + + +*/ + v_response_vector CLOB; + v_pre_prompt clob; + v_prompt clob; + params_genai CLOB; + output CLOB; + query_vec VECTOR; + + v_has number; + v_assistant clob; + + v_i number :=0 ; + + v_response_selectai clob; + + v_pre_prompt2 clob; + + v_select_ai_preprompt varchar2(4000) := ' . Não adicione nenhum filtro de data a menos que seja solicitado.'; + v_select_ai_profile varchar2(20) := 'PROF_TELECOM_V1'; + +BEGIN + + -- embedding do prompt para dedicated + query_vec := to_vector( fnc_26ai_embed ( p_string => p_query ,p_emb_type=>'COHERE') ); -- neste tenancy nao temos o DEDICATED - leal 17-10-25 + + for message_cursor in ( + select lv.id as DOCID, + lv.EMBED_DATA as BODY, + vector_distance(lv.embed_vector, query_vec, cosine ) AS SCORE, + null txt_aug + from TB_26AI_TELECOM_VECTOR_DATA lv + order by SCORE + FETCH EXACT FIRST p_top_k ROWS ONLY + ) loop + + v_i := message_cursor.SCORE; + v_response_vector := v_response_vector || '"' || replace(replace(replace(replace(message_cursor.BODY || ': ' || message_cursor.txt_aug,chr(10),null),chr(13),null),'"',''),'''','') || '",' ; + + END LOOP; + + + begin + SELECT DBMS_CLOUD_AI.GENERATE(prompt => p_query || v_select_ai_preprompt , + profile_name => v_select_ai_profile, + action => 'runsql') response + into v_response_selectai; + + if v_response_selectai like 'Sorry%' or v_response_selectai like 'No data found%' then + v_response_selectai := '--' ; + end if; + exception + when others then + v_response_selectai := '-' ; + end; + + + -- + -- pre requisito sao as credenciais definidas com nome OCI_CRED criadas a partir de dbms_vector.create_credential + -- + -- para montar request body abaixo: https://docs.oracle.com/en-us/iaas/api/#/en/generative-ai-inference/20231130/datatypes/GenerateTextDetails + -- + params_genai := '{ + "provider" : "ocigenai", + "credential_name" : "' || p_credential || '", + "url" : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat", + "model": "meta.llama-4-maverick-17b-128e-instruct-fp8"}'; + + + -- augmented prompt atraves do vetor criado no banco + v_pre_prompt := '"messages": [ + { + "role": "system", + "content": "Objetivo +Transformar perguntas em análises qualitativas ou quantitativas e acionáveis para os executivos, cobrindo todos os motivos de contato. +Instruções +Escopo + • Responda apenas sobre chamadas e motivos de contato no call center. + • Se a pergunta não estiver nesse escopo, retorne com recusa educada. +Processo + • Classifique os resultados em temas: Técnico; Contas; Retenção; Vendas; Comercial/Atendimento. + • Extraia sinais relevantes: qualidade de serviço, motivos dominantes de contato, intenções de cancelamento, menções a concorrentes, objeções de preço, falhas de processo, elogios, risco qualitativo de churn. + • Analise sentimento (positivo, negativo, neutro) e emoções (raiva, frustração, ansiedade, alívio). + • Avalie pitch de vendas quando aplicável. + • Sintetize sempre em linguagem executiva. + • Nunca invente números; se usar contagens, declare a amostra. + • Nunca traga informações como "Não há dados suficientes para montar um gráfico" +Formato da resposta (não use Markdown) + • A saída deve ser obrigatoriamente em listas e tópicos, nunca em parágrafos corridos. + • Estrutura fixa da resposta: + • Título curto com o insight principal. + • Resumo executivo: exatamente 3 bullets (curtos, diretos). + • Principais insights: lista não ordenada (•) para destaques gerais. + • Rankings ou comparações: lista ordenada (1, 2, 3). + • É proibido escrever respostas fora desse formato. + • Use negrito para informações críticas e itálico para sinais preliminares ou hipóteses. +Guardrails + • Nunca exponha PII. + • Não reporte métricas individuais de agentes. + • Se não houver evidências suficientes, declare claramente essa limitação no mesmo formato de lista. + • Nunca cite "Não há necessidade de gráfico, pois os dados podem ser facilmente compreendidos na lista ordenada acima." +Linguagem + • Sempre em português claro, executivo e direto. + • Evite jargões técnicos. + • Estruture como briefing para diretoria. + • Valores monetários em BRL.",'; + + + v_pre_prompt2 := '{ "role": "user","content": "Contexto Chamadas:"' || v_response_vector || ' "Contexto BI": ' || v_response_selectai || ' "Pergunta": ' || p_query || '"}' ; -- sem ]' + + v_prompt := v_pre_prompt || v_pre_prompt2 || ']'; + + begin + output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_prompt,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai)); + exception + when others then + begin + v_prompt := v_pre_prompt || v_pre_prompt2 ; + output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_prompt,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai)); + exception + when others then + v_prompt := v_pre_prompt; + output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_prompt,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai)); + end ; + end; + + --output := FNC_AI_LLAMA( replace(replace(replace(replace(messages,chr(10),null),chr(13),null),'"',''),'''','') ,'OCI_CRED'); + RETURN output; + +END; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_utilities.sql b/fnc_26ai_rag_utilities.sql new file mode 100644 index 0000000..fb354af --- /dev/null +++ b/fnc_26ai_rag_utilities.sql @@ -0,0 +1,97 @@ +create or replace function fnc_26ai_rag_utilities (p_ai_prompt IN clob, + p_oci_cred IN VARCHAR2, + p_id in number, + p_comp_id in varchar2) +return clob +as +/* + + Criado por: fernando.leal@oracle.com + Data: Dez/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao de RAG para Utilities - leal + +*/ + + -- modelos: https://docs.oracle.com/en-us/iaas/Content/generative-ai/pretrained-models.htm + -- cuidado com pre requisito (1) + gen_ai_endpoint varchar2(500) := 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com'; + gen_ai_model varchar2(500) := 'meta.llama-4-maverick-17b-128e-instruct-fp8'; + + chat_resp dbms_cloud_types.RESP; + image_resp dbms_cloud_types.RESP; + + base64_image CLOB := NULL; + request_json_part1 CLOB; + request_json_part2 CLOB; + request_body BLOB; + v_ext varchar2(20); +BEGIN + -- create temp blobs + dbms_lob.createtemporary(request_body, FALSE); + + select APEX_WEB_SERVICE.BLOB2CLOBBASE64( FILE_BLOB ,'N','N' ) , + lower(regexp_replace(file_name, '.*\.([a-zA-Z0-9]+)$', '\1')) + into base64_image, v_ext + from TB_26AI_UTILITIES + where id = p_id; + + request_json_part1 := to_clob( + '{ + "compartmentId": "' || p_comp_id || '", + "servingMode": + { + "modelId": "' || gen_ai_model || '", + "servingType": "ON_DEMAND" + } + , + "chatRequest": { + "apiFormat": "GENERIC", + "messages": [ + { + "role": "USER", + "content": [ + { + "type": "TEXT", + "text": "' || replace(replace(replace(replace( p_ai_prompt ,chr(10),null),chr(13),null),'"',''),'''','') || '" + }, + { + "type": "IMAGE", + "imageUrl": { + "url": "data:image/' || v_ext || ';base64,'); + + request_json_part2 := to_clob('" + } + } + ] + } + ], + "maxTokens": 4000, + "temperature": 0 + } + }'); + + -- append part1 json to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part1,p_charset => 'AL32UTF8')); + + -- append base64 image to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => base64_image,p_charset => 'AL32UTF8')); + + -- append part2 json to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part2,p_charset => 'AL32UTF8')); + + -- call Gen AI Chat + chat_resp := dbms_cloud.send_request( + credential_name => p_oci_cred, + uri => gen_ai_endpoint || '/20231130/actions/chat', + method => dbms_cloud.METHOD_POST, + body => request_body + ); + + -- clear temp blobs + dbms_lob.freetemporary(request_body); + + RETURN json_value( dbms_cloud.get_response_text(chat_resp),'$.chatResponse.choices[0].message.content[0].text') ; +END; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_varejo.sql b/fnc_26ai_rag_varejo.sql new file mode 100644 index 0000000..5a39dd6 --- /dev/null +++ b/fnc_26ai_rag_varejo.sql @@ -0,0 +1,117 @@ +create or replace FUNCTION fnc_26ai_rag_varejo (p_ai_prompt IN clob, + p_oci_cred IN VARCHAR2, + p_id in number, + p_comp_id in varchar2 ) + RETURN CLOB AS +/* + + Criado por: fernando.leal@oracle.com + Data: Nov/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao de RAG interpretar imagens do VAREJO - leal + +begin + dbms_cloud_ai.create_profile( + profile_name => 'PROF_RETAIL_V1', + attributes => + '{"provider": "oci", + "credential_name": "OCI_CRED", + "oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaakvd4bq4b3n7yn3gjjqzfhsl62dec44tjvi2iwa3sugw5frgfpzea", + "region": "us-chicago-1", + "model": "meta.llama-4-maverick-17b-128e-instruct-fp8", + "oci_apiformat": "GENERIC", + "object_list": [ + {"owner": "AICHAT1", "name": "V_26AI_VAREJO"} + ], + "comments": true, + "temperature": 0.1 + }' + ); +end; +/ + + + +*/ + -- modelos: https://docs.oracle.com/en-us/iaas/Content/generative-ai/pretrained-models.htm + -- cuidado com pre requisito (1) + gen_ai_endpoint varchar2(500) := 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com'; + gen_ai_model varchar2(500) := 'meta.llama-4-maverick-17b-128e-instruct-fp8'; + + chat_resp dbms_cloud_types.RESP; + image_resp dbms_cloud_types.RESP; + + base64_image CLOB := NULL; + request_json_part1 CLOB; + request_json_part2 CLOB; + request_body BLOB; + v_ext varchar2(20); +BEGIN + -- create temp blobs + dbms_lob.createtemporary(request_body, FALSE); + + select APEX_WEB_SERVICE.BLOB2CLOBBASE64( FILE_BLOB ,'N','N' ) , + lower(regexp_replace(file_name, '.*\.([a-zA-Z0-9]+)$', '\1')) + into base64_image, v_ext + from TB_26AI_VAREJO + where id = p_id; + + request_json_part1 := to_clob( + '{ + "compartmentId": "' || p_comp_id || '", + "servingMode": + { + "modelId": "' || gen_ai_model || '", + "servingType": "ON_DEMAND" + } + , + "chatRequest": { + "apiFormat": "GENERIC", + "messages": [ + { + "role": "USER", + "content": [ + { + "type": "TEXT", + "text": "' || replace(replace(replace(replace( p_ai_prompt ,chr(10),null),chr(13),null),'"',''),'''','') || '" + }, + { + "type": "IMAGE", + "imageUrl": { + "url": "data:image/' || v_ext || ';base64,'); + + request_json_part2 := to_clob('" + } + } + ] + } + ], + "maxTokens": 2000, + "temperature": 0 + } + }'); + + -- append part1 json to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part1,p_charset => 'AL32UTF8')); + + -- append base64 image to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => base64_image,p_charset => 'AL32UTF8')); + + -- append part2 json to request blob + dbms_lob.append(request_body, apex_util.clob_to_blob(p_clob => request_json_part2,p_charset => 'AL32UTF8')); + + -- call Gen AI Chat + chat_resp := dbms_cloud.send_request( + credential_name => p_oci_cred, + uri => gen_ai_endpoint || '/20231130/actions/chat', + method => dbms_cloud.METHOD_POST, + body => request_body + ); + + -- clear temp blobs + dbms_lob.freetemporary(request_body); + + RETURN json_value( dbms_cloud.get_response_text(chat_resp),'$.chatResponse.choices[0].message.content[0].text') ; +END; +/ \ No newline at end of file