From 893f7d4f1e5113176deb18b4aaa32c63bf1d4683 Mon Sep 17 00:00:00 2001 From: flealdba Date: Fri, 8 May 2026 13:13:42 +0000 Subject: [PATCH] Upload files to "/" --- fnc_26ai_rag_vllm.sql | 56 +++++++++++++++ fnc_26ai_siderurgia.sql | 138 ++++++++++++++++++++++++++++++++++++ fnc_26ai_tech_rag.sql | 124 ++++++++++++++++++++++++++++++++ fnc_26ai_traffic_rag.sql | 89 +++++++++++++++++++++++ fnc_26ai_traffic_vision.sql | 53 ++++++++++++++ 5 files changed, 460 insertions(+) create mode 100644 fnc_26ai_rag_vllm.sql create mode 100644 fnc_26ai_siderurgia.sql create mode 100644 fnc_26ai_tech_rag.sql create mode 100644 fnc_26ai_traffic_rag.sql create mode 100644 fnc_26ai_traffic_vision.sql diff --git a/fnc_26ai_rag_vllm.sql b/fnc_26ai_rag_vllm.sql new file mode 100644 index 0000000..7e17bcb --- /dev/null +++ b/fnc_26ai_rag_vllm.sql @@ -0,0 +1,56 @@ +create or replace FUNCTION "FNC_26AI_RAG_VLLM" (p_ai_prompt IN clob) +RETURN CLOB AS + v_gen_ai_model varchar2(500) :='openai/gpt-oss-120b'; + resp dbms_cloud_types.RESP; +BEGIN +/* + + Criado por: fernando.leal@oracle.com + Data: Mar/2026 + Objetivo: RAG via PL/SQL usando um vLLM em arquitetura LOCAL + + v1 - funcao de RAG usando openai/gpt-oss-120b - fleal + + Set host to local to disable credential + The provider value must specify openai + https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/utl_to_embedding-and-utl_to_embeddings-dbms_vector_chain.html + +*/ + + resp := dbms_cloud.send_request( + credential_name => NULL, + uri => 'https://hub-gpus.DOMINIO.com.br/gpt120/v1/chat/completions', + method => DBMS_CLOUD.METHOD_POST, + headers => JSON_OBJECT('Content-Type' VALUE 'application/json'), + body => UTL_RAW.CAST_TO_RAW('{"model": "' || v_gen_ai_model || '", + "messages": [{"role": "user", + "content": "' || p_ai_prompt || '" + }]}') + ); + + + --RETURN json_value( dbms_cloud.get_response_text(resp) , '$.chatResponse.choices[0].message.content[0].text') ; + -- + RETURN DBMS_CLOUD.GET_RESPONSE_TEXT(resp) ; + + /* opcao 2: + declare + params clob; + input clob; + response clob; + begin + input := '[{"role": "user","content": "Fale sobre a Oracle"}]'; + params := '{ + "provider": "openai", + "url": "https://hub-gpus.DOMINIO.com.br/gpt120/v1/chat/completions", + "host": "local", + "model": "openai/gpt-oss-120b"}'; + response := dbms_vector_chain.utl_to_generate_text( input , json(params)) ; + DBMS_OUTPUT.PUT_LINE(response); + end; */ + +EXCEPTION + WHEN OTHERS THEN + RETURN sqlerrm; +END; +/ \ No newline at end of file diff --git a/fnc_26ai_siderurgia.sql b/fnc_26ai_siderurgia.sql new file mode 100644 index 0000000..ba7eff3 --- /dev/null +++ b/fnc_26ai_siderurgia.sql @@ -0,0 +1,138 @@ +create or replace function fnc_26ai_siderurgia( 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: Mar/2026 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - PDFs e vetorizacao para casos de Siderurgia + +*/ + messages CLOB; + v_vector clob; + p_prompt clob; + p_prompt2 clob; + reranked_output json; + params_genai CLOB; + output 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_SIDERURGIA + where id = p_image_id; + + for message_cursor in ( + + SELECT embed_data, doc_origem + FROM TB_26AI_SIDERURGIA_VECTOR + ORDER BY VECTOR_DISTANCE(EMBED_VECTOR, v_vector , COSINE ) + FETCH EXACT FIRST 40 ROWS ONLY + + ) loop + + messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data || '- Fonte:' || message_cursor.doc_origem ,chr(10),null),chr(13),null),'"',''),'''','') || '",' ; + + END LOOP; + + p_prompt := 'Você é um engenheiro especialista em siderurgia e metalurgia com vasta experiência em controle de qualidade de produtos siderúrgicos. +Sua tarefa é analisar imagens de produtos e processos de uma indústria siderúrgica e gerar um relatório técnico estruturado. +## CONTEXTO +As imagens podem conter: bobinas de aço, chapas, tiras, canos, tubos, perfis estruturais, tarugos, placas, fio-máquina, galvanizados, revestidos ou qualquer +outro produto ou etapa do processo siderúrgico. + +## Suas tarefas de análise +### 1. Identificação do Produto +Identifique o tipo de produto siderúrgico visível na imagem: +- Tipo: bobina / chapa / tubo / cano / perfil / tarugo / placa / fio / outro +- Forma de apresentação: laminado a quente / laminado a frio / galvanizado / revestido / trefilado / extrudado +- Estimativa de dimensões visíveis (largura, espessura, diâmetro — se possível) +- Possível liga ou tipo de aço: carbono / inoxidável / ligado / alta resistência / outro + +### 2. Características Superficias +Descreva as condições da superfície observadas: +- Acabamento superficial: brilhante / fosco / oxidado / pintado / revestido +- Presença de óxido, carepa ou incrustações +- Uniformidade do revestimento (se galvanizado ou pintado) +- Coloração e sua possível causa metalúrgica (ex: azulamento por temperatura) + +### 3. Detecção de defeitos e anomalias +Identifique e classifique possíveis defeitos visíveis: + +| Defeito | Localização | Severidade | Possível Causa | +|---|---|---|---| +| Trinca / rachadura | [região] | Alta / Média / Baixa | [causa] | +| Amassado / deformação | [região] | Alta / Média / Baixa | [causa] | +| Mancha / contaminação | [região] | Alta / Média / Baixa | [causa] | +| Ondulação / empeno | [região] | Alta / Média / Baixa | [causa] | +| Variação de espessura | [região] | Alta / Média / Baixa | [causa] | +| Corrosão / ferrugem | [região] | Alta / Média / Baixa | [causa] | +| Porosidade / bolha | [região] | Alta / Média / Baixa | [causa] | +| Risco / arranhado | [região] | Alta / Média / Baixa | [causa] | +| Dobramento indevido | [região] | Alta / Média / Baixa | [causa] | +| Separação de camadas | [região] | Alta / Média / Baixa | [causa] | + +Informe "Nenhum defeito visível identificado" se a superfície estiver íntegra. + +### 4. Avaliação de Qualidade +Com base na inspeção visual, classifique o produto: + +- **Grau A — Premium**: Sem defeitos visíveis, superfície uniforme, apto para aplicações nobres +- **Grau B — Padrão**: Defeitos menores que não comprometem a aplicação geral +- **Grau C — Restrito**: Defeitos moderados, uso restrito a aplicações não críticas +- **Grau D — Refugo**: Defeitos severos, produto inapto para uso, indicado para sucata ou reprocessamento + +Justifique a classificação em 2 a 3 frases. + +### 5. Recomendações técnicas +Com base nos achados, indique: +- Ação imediata recomendada (liberar / inspecionar fisicamente / segregar / refugar) +- Necessidade de ensaios complementares (dimensional, dureza, ultrassom, líquido penetrante, etc.) +- Possíveis ajustes de processo que possam ter gerado o defeito detectado +- Cuidados para próximos lotes ou etapas de produção + +### 6. Parecer Final +Declare claramente: +- ✅ PRODUTO APROVADO — apto para expedição ou próxima etapa +- ⚠️ APROVADO COM RESTRIÇÃO — requer inspeção adicional antes de prosseguir +- 🔁 REPROCESSAR — retornar à linha para correção +- ❌ REFUGO — produto inapto, encaminhar para sucata + +## REGRAS DE RESPOSTA +- Responda SEMPRE em Português do Brasil +- Use linguagem técnica compatível com o ambiente siderúrgico +- Seja objetivo e preciso — o relatório será usado por inspetores de qualidade e engenheiros de processo +- Se a qualidade da imagem impedir a análise de algum item, informe explicitamente: "Não foi possível avaliar devido à qualidade da imagem" +- Nunca invente defeitos que não sejam visíveis na imagem +- Se a imagem não contiver produto siderúrgico, informe: "Imagem fora do escopo siderúrgico" + +## FORMATO DE SAÍDA +Utilize os títulos de seção acima.'; + + -- cuidado com temperatura usando "." ou "," + execute immediate('alter session set nls_numeric_characters=''.,'' '); + + -- + -- ReRank (https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/use-reranking-better-rag-results.html) + -- + params_genai := '{"provider": "cohere", + "credential_name": "COHERE_CRED", + "url": "https://api.cohere.com/v1/rerank", + "model": "rerank-v3.5", + "return_documents": true, + "top_n": 10 }'; + + reranked_output := dbms_vector_chain.rerank( p_prompt , json('{ "documents": [ ' || messages || '] }'), json(params_genai)); + p_prompt2 := p_prompt || '. Informações obtidas para a imagem : ' || JSON_VALUE( JSON_SERIALIZE(reranked_output), '$[0].content' ) || '. Cite o documento de origem dos dados em destaque.' ; + + -- sem re-rank (opcao de uso para refinar resultado) + --p_prompt2 := p_prompt || '. Dados obtidos: ' || messages || '. Cite o documento de origem dos dados em destaque.'; + + return fnc_26ai_rag_siderurgia(p_prompt2 , p_credential , p_image_id, p_comp_id ); + +end; +/ \ No newline at end of file diff --git a/fnc_26ai_tech_rag.sql b/fnc_26ai_tech_rag.sql new file mode 100644 index 0000000..a2c9c48 --- /dev/null +++ b/fnc_26ai_tech_rag.sql @@ -0,0 +1,124 @@ +create or replace FUNCTION fnc_26ai_tech_rag(p_query VARCHAR2, + p_top_k IN 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: Mar/2026 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao de RAG para estudo explorar "fale com seus dados" TECH - 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 + from TB_26AI_TECH_VECTOR lv + order by SCORE + FETCH EXACT FIRST p_top_k ROWS ONLY + ) loop + + v_context := v_context || '"' || replace(replace(replace(replace(message_cursor.BODY,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 := 'Você é um Analista Sênior de Inteligência Operacional especializado em analisar relatórios técnicos e executivos previamente gerados. + +Contexto de trabalho: +- Você receberá: + 1) A pergunta do usuário + 2) Um conjunto de trechos recuperados da base vetorizada de relatórios (com metadados como report_id, data, área, severidade, prioridade, fonte). +- Sua tarefa é encontrar evidências relevantes nesses relatórios e responder com precisão, sem inventar informações. + +Regras obrigatórias: +- Use SOMENTE informações presentes nos trechos recuperados. +- Se faltar dado para responder algo, escreva explicitamente: “Informação não fornecida”. +- Sempre cite as evidências no formato: [report_id | seção/campo | data]. +- Quando houver conflito entre relatórios, sinalize divergência e indique qual evidência é mais confiável (recência, completude, consistência). +- Priorize risco de negócio, severidade e urgência. +- Não repita conteúdo desnecessário; seja objetivo e acionável. + +Método de resposta: +1) Entenda a intenção da pergunta (comparar, diagnosticar, priorizar, tendência, causa, ação). +2) Selecione os trechos mais relevantes por aderência semântica à pergunta. +3) Consolide achados em linguagem executiva + técnica. +4) Gere recomendações práticas com prioridade e esforço. +5) Indique lacunas de dados que limitam a conclusão. + +Formato obrigatório de saída: +## Resposta objetiva +- Responda em formato markdown, e nunca use fontes de tamanho diferentes. +- Resposta direta à pergunta em 3 a 6 linhas. + +## Evidências encontradas +- Evidência 1: [report_id | seção/campo | data] +- Evidência 2: [report_id | seção/campo | data] +- Evidência 3: [report_id | seção/campo | data] + +## Diagnóstico consolidado +- Causa/hipótese principal (Alta/Média/Baixa) +- Risco de curto prazo +- Risco de médio prazo + +## Recomendações priorizadas +- P1: | Impacto: <...> | Esforço: +- P2: | Impacto: <...> | Esforço: +- P3: | Impacto: <...> | Esforço: + +## Lacunas e próximos dados necessários +- Informação não fornecida: +- Dado adicional recomendado para aumentar confiança da resposta: <...>'; + + v_pre_prompt2 := '{ "role": "user","content": "Contexto:"' || v_context || ' "Pergunta": ' || p_query || '"}' ; + + output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_pre_prompt || v_pre_prompt2,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai)); + + RETURN output; + +END; +/ \ No newline at end of file diff --git a/fnc_26ai_traffic_rag.sql b/fnc_26ai_traffic_rag.sql new file mode 100644 index 0000000..732ed25 --- /dev/null +++ b/fnc_26ai_traffic_rag.sql @@ -0,0 +1,89 @@ +create or replace function fnc_26ai_traffic_rag (p_base64_image IN clob, + p_oci_cred IN VARCHAR2, + 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 PS - Tarffic Control - 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; + + request_json_part1 CLOB; + request_json_part2 CLOB; + request_body BLOB; +BEGIN + -- create temp blobs + dbms_lob.createtemporary(request_body, FALSE); + + 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": "' || 'Gere um JSON com a placa do veiculo, modelo do veiculo e se motorista estiver visivel com uso celular na direção, aponte a infração. Exemplo de saida: {placa:XXXX,modelo:XXXXXXXXXXXXXXXXX,infracao:XXXXXXXXXXXXXX}. Retorne apenas o JSON, sem nenhuma mensagem de introducao nem de explicacao.' || '" + }, + { + "type": "IMAGE", + "imageUrl": { + "url": "data:image/' || 'png' || ';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 => p_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_traffic_vision.sql b/fnc_26ai_traffic_vision.sql new file mode 100644 index 0000000..8d0bdf1 --- /dev/null +++ b/fnc_26ai_traffic_vision.sql @@ -0,0 +1,53 @@ +create or replace function fnc_26ai_traffic_vision( p_base64_image in clob, p_feature_type in varchar2 , p_comp_id in varchar2) + return clob + -- + -- Visio: https://docs.oracle.com/pt-br/solutions/ai-vision-extract-data/index.html#GUID-A4FD65D0-BF62-472B-B4C7-0ADF5425A566 + -- + as + /* + p_feature_type: https://docs.oracle.com/en-us/iaas/api/#/en/vision/20220125/datatypes/ImageFeature + + IMAGE_CLASSIFICATION: Label the image. + OBJECT_DETECTION: Identify objects in the image with bounding boxes. + TEXT_DETECTION: Recognize text at the word and line level. + FACE_DETECTION: Identify faces in the image with bounding boxes and face landmarks. + + */ + v_endpoint varchar2(500) := 'https://vision.aiservice.us-chicago-1.oci.oraclecloud.com/20220125/actions/analyzeImage'; + request_json CLOB; + l_response_body clob; + + begin + + request_json := to_clob('{ + "compartmentId": "' || p_comp_id || '", + "image": { + "source":"INLINE", + "data":"' || p_base64_image || '" + }, + "features":[ + { + "featureType":"' || p_feature_type || '", + "maxResults": 5 + } + ] + }' ); + + -- Definir os cabeçalhos da requisição + APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).NAME := 'Content-Type'; + APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).VALUE := 'application/json'; + APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).NAME := 'Accept'; + APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).VALUE := 'application/json'; + + -- Faça a chamada POST usando APEX_WEB_SERVICE e a credencial OCI + l_response_body := APEX_WEB_SERVICE.make_rest_request( + p_url => v_endpoint, + p_http_method => 'POST', + p_body => request_json, + p_credential_static_id => 'apex_cred' + ); + + return l_response_body; + + end; +/ \ No newline at end of file