From 6359082956aad3af2232e36cbb764e2a4281dc6a Mon Sep 17 00:00:00 2001 From: flealdba Date: Fri, 8 May 2026 13:09:00 +0000 Subject: [PATCH] Upload files to "/" --- fnc_26ai_manufatura.sql | 73 +++++++++++++++++++++ fnc_26ai_rag_agro.sql | 100 +++++++++++++++++++++++++++++ fnc_26ai_rag_aiagent.sql | 125 ++++++++++++++++++++++++++++++++++++ fnc_26ai_rag_food.sql | 98 ++++++++++++++++++++++++++++ fnc_26ai_rag_siderurgia.sql | 100 +++++++++++++++++++++++++++++ 5 files changed, 496 insertions(+) create mode 100644 fnc_26ai_manufatura.sql create mode 100644 fnc_26ai_rag_agro.sql create mode 100644 fnc_26ai_rag_aiagent.sql create mode 100644 fnc_26ai_rag_food.sql create mode 100644 fnc_26ai_rag_siderurgia.sql diff --git a/fnc_26ai_manufatura.sql b/fnc_26ai_manufatura.sql new file mode 100644 index 0000000..baa858c --- /dev/null +++ b/fnc_26ai_manufatura.sql @@ -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; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_agro.sql b/fnc_26ai_rag_agro.sql new file mode 100644 index 0000000..a0c732a --- /dev/null +++ b/fnc_26ai_rag_agro.sql @@ -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; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_aiagent.sql b/fnc_26ai_rag_aiagent.sql new file mode 100644 index 0000000..01578a4 --- /dev/null +++ b/fnc_26ai_rag_aiagent.sql @@ -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; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_food.sql b/fnc_26ai_rag_food.sql new file mode 100644 index 0000000..75a6229 --- /dev/null +++ b/fnc_26ai_rag_food.sql @@ -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; +/ \ No newline at end of file diff --git a/fnc_26ai_rag_siderurgia.sql b/fnc_26ai_rag_siderurgia.sql new file mode 100644 index 0000000..01f4b87 --- /dev/null +++ b/fnc_26ai_rag_siderurgia.sql @@ -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; +/ \ No newline at end of file