Upload files to "/"

This commit is contained in:
2026-05-08 13:14:09 +00:00
parent 893f7d4f1e
commit ae793071ec
4 changed files with 478 additions and 0 deletions

View File

@@ -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;
/

168
fnc_26ai_rag_telecom.sql Normal file
View File

@@ -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 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 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;
/

View File

@@ -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;
/

117
fnc_26ai_rag_varejo.sql Normal file
View File

@@ -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;
/