Upload files to "/"
This commit is contained in:
73
fnc_26ai_manufatura.sql
Normal file
73
fnc_26ai_manufatura.sql
Normal file
@@ -0,0 +1,73 @@
|
||||
create or replace function fnc_26ai_manufatura( p_image_id in number,
|
||||
p_comp_id in varchar2,
|
||||
p_credential in varchar2 default 'OCI_CRED')
|
||||
return clob
|
||||
as
|
||||
/*
|
||||
|
||||
Criado por: fernando.leal@oracle.com
|
||||
Data: Nov/2025
|
||||
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||
|
||||
v1 - similaridade e rag para Manufatura - leal
|
||||
|
||||
SelectAI para pesquisas por texto:
|
||||
|
||||
begin
|
||||
dbms_cloud_ai.create_profile(
|
||||
profile_name => 'PROF_26AI_MANUF_V1',
|
||||
attributes =>
|
||||
'{"provider": "oci",
|
||||
"credential_name": "OCI_CRED",
|
||||
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaaev2ipyek53f7sck5ibvtnqrp5w2k54qiuk2cikbfati5bk54yhka",
|
||||
"region": "us-chicago-1",
|
||||
"model": "meta.llama-4-maverick-17b-128e-instruct-fp8",
|
||||
"oci_apiformat": "GENERIC",
|
||||
"object_list": [
|
||||
{"owner": "AICHAT1", "name":"TB_26AI_MANUFATURA_CATALOGO_TEXTO"}
|
||||
],
|
||||
"comments": true,
|
||||
"annotations": true,
|
||||
"temperature": 0.1
|
||||
}'
|
||||
);
|
||||
end;
|
||||
|
||||
*/
|
||||
messages CLOB;
|
||||
v_vector clob;
|
||||
p_prompt clob;
|
||||
begin
|
||||
|
||||
SELECT json_value( fnc_26ai_embed_image_cohere(file_name, file_blob, p_credential , p_comp_id) , '$.embeddings[*].vector()')
|
||||
INTO v_vector
|
||||
from TB_26AI_MANUFATURA
|
||||
where id = p_image_id;
|
||||
|
||||
for message_cursor in (
|
||||
|
||||
SELECT embed_data
|
||||
FROM (
|
||||
SELECT 'Part Number: ' || PART_NUMBER || ' Descrição: ' || DESCRIPTION || ' Categoria: ' || CATEGORY || ' SKU: ' || SKU embed_data
|
||||
FROM TB_26AI_MANUFATURA_CATALOGO_TEXTO
|
||||
)
|
||||
ORDER BY VECTOR_DISTANCE( FNC_26AI_EMBED(embed_data,'COHERE') , v_vector , COSINE )
|
||||
FETCH EXACT FIRST 5 ROWS ONLY
|
||||
|
||||
) loop
|
||||
|
||||
messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data,chr(10),null),chr(13),null),'"',''),'''','') || '",' ;
|
||||
|
||||
END LOOP;
|
||||
|
||||
-- cuidado com temperatura usando "." ou ","
|
||||
--execute immediate('alter session set nls_numeric_characters=''.,'' ');
|
||||
|
||||
-- sem re-rank (opcao de uso para refinar resultado)
|
||||
p_prompt := ' A imagem fornecida tem associacao com descricoes, ou nomes do catalogo vetorizado. Identifique a maior semelhança.' ||
|
||||
' A resposta deve ser objetiva, descervendo SKU, Part Number, Categoria e Descricao. Dados do catalogo de produtos: ' || messages;
|
||||
|
||||
return fnc_26ai_rag_manufatura(p_prompt ,p_credential, p_image_id, p_comp_id);
|
||||
|
||||
end;
|
||||
/
|
||||
100
fnc_26ai_rag_agro.sql
Normal file
100
fnc_26ai_rag_agro.sql
Normal file
@@ -0,0 +1,100 @@
|
||||
create or replace function fnc_26ai_rag_agro (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: Oct/2025
|
||||
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||
|
||||
v1 - funcao de RAG para AGRO - 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_AGRO
|
||||
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.4,
|
||||
"numGenerations": 5,
|
||||
"topK": 1
|
||||
}
|
||||
}');
|
||||
|
||||
-- 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;
|
||||
/
|
||||
125
fnc_26ai_rag_aiagent.sql
Normal file
125
fnc_26ai_rag_aiagent.sql
Normal file
@@ -0,0 +1,125 @@
|
||||
create or replace FUNCTION fnc_26ai_rag_aiagent(p_query VARCHAR2,
|
||||
p_top_k IN NUMBER ,
|
||||
p_prompt_length out number,
|
||||
p_credential in varchar2 default 'OCI_CRED',
|
||||
p_app_user in varchar2 default V('APP_USER') )
|
||||
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 estudo explorar "fale com seus dados" (quando nao ter AgentAI disponivel para exibicao) - leal
|
||||
|
||||
*/
|
||||
v_context CLOB;
|
||||
v_pre_prompt clob;
|
||||
v_prompt clob;
|
||||
v_pre_prompt2 clob;
|
||||
params_genai CLOB;
|
||||
output CLOB;
|
||||
query_vec VECTOR;
|
||||
-- https://docs.oracle.com/en/database/oracle/oracle-database/23/arpls/dbms_vector_chain1.html#GUID-017C9002-194C-48E5-B59B-EF5C60BC8405
|
||||
v_llm varchar2(20) := 'LLAMA4'; -- [ LLAMA4 | OPENAI ]
|
||||
|
||||
BEGIN
|
||||
|
||||
|
||||
-- embedding do prompt para dedicated
|
||||
query_vec := to_vector( fnc_26ai_embed ( p_string => p_query, p_emb_type => 'COHERE' ) );
|
||||
|
||||
|
||||
for message_cursor in (
|
||||
select lv.ID as DOCID,
|
||||
lv.EMBED_DATA as BODY,
|
||||
vector_distance(lv.EMBED_VECTOR, query_vec, cosine ) AS SCORE,
|
||||
lv.FILE_NAME
|
||||
from TB_26AI_AIAGENT_VECTOR lv
|
||||
where lower(p_query) <> 'oi'
|
||||
and lower(p_query) <> 'ola'
|
||||
and lower(p_query) <> 'olá'
|
||||
and lower(p_query) <> 'bom dia'
|
||||
and lower(p_query) <> 'boa tarde'
|
||||
and lower(p_query) <> 'teste'
|
||||
-- and vector_distance(lv.EMBED_VECTOR, query_vec, cosine ) >= 8/10
|
||||
and ( upper(USER_NAME) like 'ADMIN%' or upper(USER_NAME) = upper(p_app_user) )
|
||||
order by SCORE
|
||||
FETCH EXACT FIRST p_top_k ROWS ONLY
|
||||
) loop
|
||||
|
||||
|
||||
v_context := v_context || '"' || replace(replace(replace(replace(message_cursor.BODY || ' - Citations: ' || message_cursor.file_name ,
|
||||
chr(10),null),chr(13),null),'"',''),'''','') || '",' ;
|
||||
|
||||
end loop;
|
||||
|
||||
|
||||
--
|
||||
-- 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
|
||||
--
|
||||
if v_llm = 'LLAMA4' then
|
||||
|
||||
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"}';
|
||||
|
||||
elsif v_llm = 'OPENAI' then
|
||||
|
||||
params_genai := '{
|
||||
"provider" : "openai",
|
||||
"credential_name" : "CRED_OPENAI",
|
||||
"url" : "https://api.openai.com/v1/chat/completions",
|
||||
"model" : "gpt-4.1-mini",
|
||||
"temperature": 0.4
|
||||
}';
|
||||
|
||||
end if;
|
||||
|
||||
-- augmented prompt atraves do vetor criado no banco
|
||||
v_pre_prompt := '"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "Objetivo
|
||||
Resgate informações dos documentos de modo a trazer explicações claras e objetivas.
|
||||
Escopo
|
||||
• Responda apenas sobre informações contidas em documentos.
|
||||
• Se a pergunta não estiver nesse escopo, retorne com recusa educada.
|
||||
• Se o prompt tiver um"oi", "olá", "bom dia", ou qualquer tipo de saudação, retorne apenas "Como posso lhe ajudar?"
|
||||
• Sempre cite a origem da resposta, descrita em "Citations" (nome do arquivo PDF, DOC ou imagem PNG, JPG, etc)
|
||||
Formato da resposta
|
||||
• 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 em 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.
|
||||
• Nunca resposnda com um JSON na resposta. Respostas são para usuários finais, devem ser respostas claras confoirme "Formato da resposta"
|
||||
Guardrails
|
||||
• Nunca exponha PII.
|
||||
• Se não houver evidências suficientes, declare claramente essa limitação no mesmo formato de lista.
|
||||
Linguagem
|
||||
• Sempre em português claro, executivo e direto.
|
||||
• Evite jargões técnicos.
|
||||
• Valores monetários em BRL.",';
|
||||
|
||||
|
||||
v_pre_prompt2 := '{ "role": "user","content": "Contexto:"' || v_context || ' "Pergunta": ' || p_query || '"}' ; -- sem ]'
|
||||
|
||||
v_prompt := v_pre_prompt || v_pre_prompt2 || ']';
|
||||
|
||||
-- para LLama, a contabilizacao é por caracteres
|
||||
p_prompt_length := fnc_26ai_char_count(v_prompt);
|
||||
|
||||
output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_prompt,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai));
|
||||
|
||||
RETURN output;
|
||||
|
||||
END;
|
||||
/
|
||||
98
fnc_26ai_rag_food.sql
Normal file
98
fnc_26ai_rag_food.sql
Normal file
@@ -0,0 +1,98 @@
|
||||
create or replace function fnc_26ai_rag_food (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: Oct/2025
|
||||
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||
|
||||
v1 - funcao de RAG para Food & Nutrition - 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_FOOD
|
||||
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.4,
|
||||
"numGenerations": 5,
|
||||
"topK": 1
|
||||
}
|
||||
}');
|
||||
|
||||
-- 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;
|
||||
/
|
||||
100
fnc_26ai_rag_siderurgia.sql
Normal file
100
fnc_26ai_rag_siderurgia.sql
Normal file
@@ -0,0 +1,100 @@
|
||||
create or replace function fnc_26ai_rag_siderurgia (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: Mar/2026
|
||||
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||
|
||||
v1 - funcao de RAG para Siderurgia - 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_SIDERURGIA
|
||||
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.4,
|
||||
"numGenerations": 5,
|
||||
"topK": 1
|
||||
}
|
||||
}');
|
||||
|
||||
-- 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;
|
||||
/
|
||||
Reference in New Issue
Block a user