From 9eac9227b2958b99ac3317a48fc73a661a82e25d Mon Sep 17 00:00:00 2001 From: flealdba Date: Fri, 8 May 2026 13:13:13 +0000 Subject: [PATCH] Upload files to "/" --- fnc_26ai_utilities.sql | 347 ++++++++++++++++++++++++++++++++++++++ fnc_26ai_utilities_V2.sql | 241 ++++++++++++++++++++++++++ pck_26ai_apis.sql | 49 ++++++ pkg_26ai_auto_load.sql | 95 +++++++++++ 4 files changed, 732 insertions(+) create mode 100644 fnc_26ai_utilities.sql create mode 100644 fnc_26ai_utilities_V2.sql create mode 100644 pck_26ai_apis.sql create mode 100644 pkg_26ai_auto_load.sql diff --git a/fnc_26ai_utilities.sql b/fnc_26ai_utilities.sql new file mode 100644 index 0000000..6f5ad2f --- /dev/null +++ b/fnc_26ai_utilities.sql @@ -0,0 +1,347 @@ +create or replace function fnc_26ai_utilities( 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: Dez/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao principal de Utilities, com similaridade e RAG - leal + + +-- carga imagens + + DECLARE + v_bucket VARCHAR2(2000) := + 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o/'; + BEGIN + + -- lista todos arquivos do bucket que ainda nao foram vetorizados + FOR r1 IN ( + SELECT object_name, + substr(object_name,1,instr(object_name,'/')-1) torre_name, + substr(object_name,instr(object_name,'/')+1) file_name + FROM DBMS_CLOUD.LIST_OBJECTS('OCI_CRED', 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o') + WHERE lower(object_name) LIKE '%.jpg' + AND object_name NOT IN ( + SELECT object_name + FROM TB_26AI_UTILITIES_LOG + WHERE status = 'P' + ) + ) LOOP + + -- copia temporaria do PDF para o DIRECTORY + -- exemplo > https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o/T.472%2FDJI_0167.JPG + DBMS_CLOUD.GET_OBJECT( + credential_name => 'OCI_CRED', + object_uri => v_bucket || replace( r1.object_name, '%2F', '/') , + directory_name => 'DATA_PUMP_DIR' + ); + + -- teste: select * FROM DBMS_CLOUD.LIST_FILES ('DATA_PUMP_DIR') where object_name like 'DJI%' + + + insert into TB_26AI_UTILITIES + ( FILE_NAME, + FILE_MIMETYPE, + FILE_BLOB, + UPDATED_DATE, + CREATED_BY, + REFERENCE_NAME) + values( + r1.file_name, + 'image/jpeg', + to_blob(bfilename('DATA_PUMP_DIR', r1.file_name )), + sysdate, + 'admin2', + r1.torre_name + ); + + INSERT INTO TB_26AI_UTILITIES_LOG + VALUES (sysdate, r1.object_name, 'P'); + + COMMIT; + + -- remove o arquivo temporario armazenado no DATA_PUMP_DIR + DBMS_CLOUD.DELETE_FILE( + directory_name => 'DATA_PUMP_DIR', + file_name => r1.file_name + ); + + END LOOP; + + END; + + + + +--Ajuste de Status + + declare + v_status varchar2(200); + v_has number; + begin + + for r1 in (select * from TB_26AI_UTILITIES where status_torre is null ) loop + + v_status := FNC_26ai_rag ( 'A partir deste texto retorne uma "Classificação da Gravidade": + # Risco controlável - PRIORIDADE 3, PRIORITÁRIA 60D + # Risco alto - PRIORIDADE 2, URGÊNCIA 30D + # Risco elevado - PRIORIDADE 1, URGÊNCIA 15D + # Risco eminente - PRIORIDADE 0, EMERGÊNCIA (1 dia) + # Avaliação - PRIORIDADE 4, NECESSÁRIA 210D + # Monitoramento - PRIORIDADE 5, MONITORÁVEL 1A + # Histórico - PRIORIDADE 6, GERENCIÁVEL 3A + # Acompanhamento - PRIORIDADE 7, MONITORAMENTO 10 A + # Cadastro - PRIORIDADE 8, INFORMATIVA + Retorne apenas a classificaco como: "Risco controlável","Risco alto","Risco elevado","Risco eminente","Avaliação","Monitoramento","Histórico","Acompanhamento","Cadastro". Nenhum comentario é permitido. + Dados: ' || fnc_26ai_utilities( p_image_id => r1.id , + p_comp_id => 'ocid1.compartment.oc1..aaaaaaaakvd4bq4b3n7yn3gjjqzfhsl62dec44tjvi2iwa3sugw5frgfpzea' ) , + 'OCI_CRED', + '' + ) ; + + update TB_26AI_UTILITIES set status_torre = v_status where id = r1.id; + commit; + + end loop; + + end; + +-- Geo + +begin + UPDATE TB_26AI_UTILITIES t + SET GEOMETRY = SDO_GEOMETRY( + 2001, -- 2D point + 4326, -- SRID + SDO_POINT_TYPE(t.LONGITUDE, t.LATITUDE, NULL), + NULL, + NULL + ) + where GEOMETRY is null ; + commit; +end; + + +-- Carga PDFs para vetorizacao + + BEGIN + DBMS_CLOUD.GET_OBJECT( + credential_name => 'OCI_CRED', + object_uri => 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-database-26ai/o/GED_15328_CPFL.pdf', + directory_name => 'DATA_PUMP_DIR'); + END; + + INSERT INTO "TB_26AI_UTILITIES_VECTOR" + select 'GED_15328_CPFL.pdf' object_name, + embed_id, + text_chunk, + embed_vector + from dual dt + CROSS JOIN TABLE( + dbms_vector_chain.utl_to_embeddings( + dbms_vector_chain.utl_to_chunks( + dbms_vector_chain.utl_to_text( to_blob(bfilename('DATA_PUMP_DIR', 'GED_15328_CPFL.pdf' )) ), + json('{"by":"words","max":"320","split":"sentence","normalize":"all", "overlap":50}') + ), + json('{"provider":"database", "model":"CLIP_VIT_LARGE_PATCH14_TXT"}') + ) + ) t + CROSS JOIN JSON_TABLE( + t.column_value, + '$[*]' COLUMNS ( + embed_id NUMBER PATH '$.embed_id', + text_chunk VARCHAR2(4000) PATH '$.embed_data', + embed_vector CLOB PATH '$.embed_vector' + ) + ) AS et; + + Imagem + + select DBMS_VECTOR.UTL_TO_EMBEDDING( + to_blob(bfilename('DATA_PUMP_DIR', 'migrate.JPG')) , + 'image', + json('{"provider":"database", "model":"CLIP_VIT_LARGE_PATCH14_IMG"}') ) ; + + +*/ + messages CLOB; + params_genai CLOB; + v_vector clob; + p_prompt clob; + p_prompt2 clob; + reranked_output json; + output CLOB; + + v_best_text CLOB; + v_best_score NUMBER; +begin + + -- Referencia Multi Modal: https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/onnx-pipeline-models-multi-modal-embedding.html + + -- padrao 4 usa ONNX com CLIP_VIT_LARGE_PATCH14_IMG + -- embedding abaixo usa CLIP_VIT_LARGE_PATCH14_TXT + + SELECT json_value( fnc_26ai_embed_image_cohere(image_name => file_name, + image_blob => file_blob, + oci_cred => p_credential , + p_comp_id => p_comp_id, + p_code_mode => 4 -- cuidado + ) , '$.embeddings[*].vector()') + INTO v_vector + from TB_26AI_UTILITIES + where id = p_image_id; + + for message_cursor in ( + + SELECT embed_data , source + FROM TB_26AI_UTILITIES_VECTOR + ORDER BY VECTOR_DISTANCE(EMBED_VECTOR, v_vector , COSINE ) + FETCH EXACT FIRST 50 ROWS ONLY -- era 60 + ) loop + + messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data || ' (' || message_cursor.source || ')',chr(10),null),chr(13),null),'"',''),'''','') || '",' ; + + END LOOP; + + messages := RTRIM( messages , ',') ; + + p_prompt := 'Você é um especialista em inspeção aérea de linhas de transmissão utilizando drones, com profundo conhecimento em engenharia estrutural, manutenção de ativos elétricos de alta tensão e avaliação de riscos operacionais. +Sua tarefa é analisar imagens aéreas (ou frames de vídeo) capturadas por drones de inspeção, identificando falhas visíveis, sinais precoces de degradação e condições de risco em torres de transmissão e seus componentes associados. + +## Objetivo da Análise +Realizar uma avaliação visual detalhada e sistemática, explorando a vantagem do drone de acessar pontos elevados, ângulos não convencionais e regiões críticas, com foco em: +Detecção proativa de anomalias que possam evoluir para falhas +Detecção reativa de danos evidentes já instalados +Priorização de riscos à segurança e à continuidade do serviço + +## Considerações Específicas para Imagens de Drones +Durante a análise, leve em conta que: +A imagem pode apresentar variação de iluminação, sombras fortes ou reflexos +Alguns componentes podem estar parcialmente ocultos por cabos, vegetação ou pela própria estrutura +A resolução e o nível de zoom podem variar entre diferentes regiões da imagem +A perspectiva aérea pode causar distorções de escala ou alinhamento +Sempre que houver incerteza, registre explicitamente a limitação visual. + +## Pontos de Atenção Obrigatórios +1. Estrutura da Torre (Foco Aéreo) +Deformações, empenamentos ou desalinhamentos visíveis nos braços, travessas e montantes +Elementos estruturais ausentes, soltos ou deslocados +Parafusos, porcas e chapas de ligação com sinais de afrouxamento ou corrosão +Condições da base ou fundação quando visíveis a partir do voo +2. Corrosão e Degradação de Materiais +Corrosão superficial vs. corrosão avançada (escamas, perda de seção) +Concentração de corrosão em pontos críticos: +Juntas estruturais +Interfaces parafusadas +Regiões de acúmulo de água +Comparação visual entre diferentes partes da torre para identificar degradação desigual +3. Isoladores (Alta Prioridade em Inspeção por Drone) +Isoladores quebrados, trincados, lascados ou ausentes +Cadeias de isoladores desalinhadas ou com inclinação anormal +Sinais de contaminação severa (poluição, poeira, salinidade, fezes de aves) +Diferenças de aparência entre isoladores da mesma cadeia +4. Condutores, Cabos e Acessórios +Grampos de ancoragem e suspensão com desgaste ou deslocamento +Espaçadores e amortecedores de vibração ausentes, danificados ou fora de posição +Cabos com desgaste, fios rompidos, desalinhamento ou marcas térmicas +Distância inadequada entre cabos, torre e outros elementos +5. Riscos à Segurança e Operação +Qualquer condição que possa resultar em: +Curto-circuito +Descarga elétrica +Queda de componentes +Colapso estrutural parcial ou total +Presença de objetos estranhos (vegetação, pipas, cabos, ninhos) próximos a condutores ou isoladores +Situações que demandem intervenção imediata, monitoramento reforçado ou manutenção programada + +## Formato da Resposta Esperada +Organize sua análise da seguinte forma: +Resumo Geral da Condição da Torre (Visão Aérea) +Anomalias Identificadas +Descrição clara +Localização aproximada (ex.: braço superior direito, cadeia de isoladores, etc) +Procure referencias técnicas no documento da CPFL "GED_15328_CPFL.pdf" para contextualizar e formatar a resposta. +Classificação da Gravidade: +# Risco controlável - PRIORIDADE 3, PRIORITÁRIA 60D +# Risco alto - PRIORIDADE 2, URGÊNCIA 30D +# Risco elevado - PRIORIDADE 1, URGÊNCIA 15D +# Risco eminente - PRIORIDADE 0, EMERGÊNCIA (1 dia) +# Avaliação - PRIORIDADE 4, NECESSÁRIA 210D +# Monitoramento - PRIORIDADE 5, MONITORÁVEL 1A +# Histórico - PRIORIDADE 6, GERENCIÁVEL 3A +# Acompanhamento - PRIORIDADE 7, MONITORAMENTO 10 A +# Cadastro - PRIORIDADE 8, INFORMATIVA + +## Impacto Potencial na Segurança e na Operação +Recomendações Técnicas +Inspeção complementar (solo, térmica, LiDAR (Light Detection And Ranging), etc.) +Manutenção corretiva ou preventiva +Caso não sejam identificadas anomalias relevantes, declare explicitamente que nenhum problema visível foi detectado nas imagens analisadas, +ressaltando as limitações inerentes à inspeção por drone (ângulo, resolução, oclusões). + +## FONTES: +Sempre cite as referencias de pesquisa, como documentos PDF vetorizados. +Fonte CPFL: https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-database-26ai/o/GED_15328_CPFL.pdf +Procure referencias IEEE e na Abrate (Fonte: https://abrate.org.br/) '; + + -- 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) + -- + /* + -- + -- Pre Req para Re-Rank: criamos nova credential para Cohere + -- Podemos usar ReRank como ONNX atraves de https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/onnx-pipeline-models-reranking-pipeline.html + -- + DECLARE + jo json_object_t; + BEGIN + jo := json_object_t(); + jo.put('access_token', 'xxxxxxxxxxZBDKaQjPzB2Xdt8CkMtNz3KYRc1H0PjzRf6wkHxxxxxxxxxxxxx'); -- Token em https://dashboard.cohere.com/ + DBMS_VECTOR.CREATE_CREDENTIAL( + credential_name => 'COHERE_CRED', + params => json(jo.to_string)); + END; + */ + /* params_genai := '{"provider": "cohere", + "credential_name": "COHERE_CRED", + "url": "https://api.cohere.com/v1/rerank", + "model": "rerank-v3.5", + "return_documents": true, + "top_n": 15 }'; -- era 20 + + reranked_output := dbms_vector_chain.rerank( p_prompt , json('{ "documents": [ ' || messages || '] }'), json(params_genai)); + + p_prompt2 := JSON_SERIALIZE(reranked_output) ; + + -- Score do top resultado + v_best_score := JSON_VALUE( + p_prompt2, + '$[0].relevance_score' + RETURNING NUMBER + NULL ON ERROR -- ← evita exception silenciosa + ); + + -- Texto do top resultado + -- Campo correto é 'document.text', não 'content' + v_best_text := JSON_VALUE( + p_prompt2, + '$[0].document.text' + RETURNING CLOB + NULL ON ERROR + ); */ + + -- rag + output := fnc_26ai_rag_utilities(p_prompt || '. Dados: ' || messages , p_credential, p_image_id, p_comp_id); + + return output ; + +end; +/ \ No newline at end of file diff --git a/fnc_26ai_utilities_V2.sql b/fnc_26ai_utilities_V2.sql new file mode 100644 index 0000000..5372599 --- /dev/null +++ b/fnc_26ai_utilities_V2.sql @@ -0,0 +1,241 @@ +create or replace function fnc_26ai_utilities( 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: Dez/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - funcao principal de Utilities, com similaridade e RAG - leal + + +-- carga imagens + + DECLARE + v_bucket VARCHAR2(2000) := + 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o/'; + BEGIN + + -- lista todos arquivos do bucket que ainda nao foram vetorizados + FOR r1 IN ( + SELECT object_name, + substr(object_name,1,instr(object_name,'/')-1) torre_name, + substr(object_name,instr(object_name,'/')+1) file_name + FROM DBMS_CLOUD.LIST_OBJECTS('OCI_CRED', 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o') + WHERE lower(object_name) LIKE '%.jpg' + AND object_name NOT IN ( + SELECT object_name + FROM TB_26AI_UTILITIES_LOG + WHERE status = 'P' + ) + ) LOOP + + -- copia temporaria do PDF para o DIRECTORY + -- exemplo > https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o/T.472%2FDJI_0167.JPG + DBMS_CLOUD.GET_OBJECT( + credential_name => 'OCI_CRED', + object_uri => v_bucket || replace( r1.object_name, '%2F', '/') , + directory_name => 'DATA_PUMP_DIR' + ); + + -- teste: select * FROM DBMS_CLOUD.LIST_FILES ('DATA_PUMP_DIR') where object_name like 'DJI%' + + + insert into TB_26AI_UTILITIES + ( FILE_NAME, + FILE_MIMETYPE, + FILE_BLOB, + UPDATED_DATE, + CREATED_BY, + REFERENCE_NAME) + values( + r1.file_name, + 'image/jpeg', + to_blob(bfilename('DATA_PUMP_DIR', r1.file_name )), + sysdate, + 'admin2', + r1.torre_name + ); + + INSERT INTO TB_26AI_UTILITIES_LOG + VALUES (sysdate, r1.object_name, 'P'); + + COMMIT; + + -- remove o arquivo temporario armazenado no DATA_PUMP_DIR + DBMS_CLOUD.DELETE_FILE( + directory_name => 'DATA_PUMP_DIR', + file_name => r1.file_name + ); + + END LOOP; + + END; + + + + +--Ajuste de Status + + declare + v_status varchar2(200); + v_has number; + begin + + for r1 in (select * from TB_26AI_UTILITIES where status_torre is null ) loop + + v_status := FNC_26ai_rag ( 'A partir deste texto retorne uma "Classificação da Gravidade": + # Risco controlável - PRIORIDADE 3, PRIORITÁRIA 60D + # Risco alto - PRIORIDADE 2, URGÊNCIA 30D + # Risco elevado - PRIORIDADE 1, URGÊNCIA 15D + # Risco iminente - PRIORIDADE 0, EMERGÊNCIA (1 dia) + Retorne apenas a classificaco como: "Risco controlável","Risco alto","Risco elevado","Risco iminente". Nenhum comentario é permitido. + Dados: ' || fnc_26ai_utilities( p_image_id => r1.id , + p_comp_id => 'ocid1.compartment.oc1..aaaaaaaakvd4bq4b3n7yn3gjjqzfhsl62dec44tjvi2iwa3sugw5frgfpzea' ) , + 'OCI_CRED', + '' + ) ; + + update TB_26AI_UTILITIES set status_torre = v_status where id = r1.id; + commit; + + end loop; + + end; + +-- Geo + +begin + UPDATE TB_26AI_UTILITIES t + SET GEOMETRY = SDO_GEOMETRY( + 2001, -- 2D point + 4326, -- SRID + SDO_POINT_TYPE(t.LONGITUDE, t.LATITUDE, NULL), + NULL, + NULL + ) + where GEOMETRY is null ; + commit; +end; + +*/ + messages CLOB; + params_genai CLOB; + v_vector clob; + p_prompt clob; + p_prompt2 clob; + reranked_output json; + 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_UTILITIES + where id = p_image_id; + + for message_cursor in ( + + SELECT embed_data , source + FROM TB_26AI_UTILITIES_VECTOR + ORDER BY VECTOR_DISTANCE(EMBED_VECTOR, v_vector , COSINE ) + FETCH EXACT FIRST 20 ROWS ONLY -- era 60 + ) loop + + messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data || ' (' || message_cursor.source || ')',chr(10),null),chr(13),null),'"',''),'''','') || '",' ; + + END LOOP; + + p_prompt := 'Você é um especialista em inspeção aérea de linhas de transmissão utilizando drones, com profundo conhecimento em engenharia estrutural, manutenção de ativos elétricos de alta tensão e avaliação de riscos operacionais. +Sua tarefa é analisar imagens aéreas (ou frames de vídeo) capturadas por drones de inspeção, identificando falhas visíveis, sinais precoces de degradação e condições de risco em torres de transmissão e seus componentes associados. + +## Objetivo da Análise +Realizar uma avaliação visual detalhada e sistemática, explorando a vantagem do drone de acessar pontos elevados, ângulos não convencionais e regiões críticas, com foco em: +Detecção proativa de anomalias que possam evoluir para falhas +Detecção reativa de danos evidentes já instalados +Priorização de riscos à segurança e à continuidade do serviço + +## Considerações Específicas para Imagens de Drones +Durante a análise, leve em conta que: +A imagem pode apresentar variação de iluminação, sombras fortes ou reflexos +Alguns componentes podem estar parcialmente ocultos por cabos, vegetação ou pela própria estrutura +A resolução e o nível de zoom podem variar entre diferentes regiões da imagem +A perspectiva aérea pode causar distorções de escala ou alinhamento +Sempre que houver incerteza, registre explicitamente a limitação visual. + +## Pontos de Atenção Obrigatórios +1. Estrutura da Torre (Foco Aéreo) +Deformações, empenamentos ou desalinhamentos visíveis nos braços, travessas e montantes +Elementos estruturais ausentes, soltos ou deslocados +Parafusos, porcas e chapas de ligação com sinais de afrouxamento ou corrosão +Condições da base ou fundação quando visíveis a partir do voo +2. Corrosão e Degradação de Materiais +Corrosão superficial vs. corrosão avançada (escamas, perda de seção) +Concentração de corrosão em pontos críticos: +Juntas estruturais +Interfaces parafusadas +Regiões de acúmulo de água +Comparação visual entre diferentes partes da torre para identificar degradação desigual +3. Isoladores (Alta Prioridade em Inspeção por Drone) +Isoladores quebrados, trincados, lascados ou ausentes +Cadeias de isoladores desalinhadas ou com inclinação anormal +Sinais de contaminação severa (poluição, poeira, salinidade, fezes de aves) +Diferenças de aparência entre isoladores da mesma cadeia +4. Condutores, Cabos e Acessórios +Grampos de ancoragem e suspensão com desgaste ou deslocamento +Espaçadores e amortecedores de vibração ausentes, danificados ou fora de posição +Cabos com desgaste, fios rompidos, desalinhamento ou marcas térmicas +Distância inadequada entre cabos, torre e outros elementos +5. Riscos à Segurança e Operação +Qualquer condição que possa resultar em: +Curto-circuito +Descarga elétrica +Queda de componentes +Colapso estrutural parcial ou total +Presença de objetos estranhos (vegetação, pipas, cabos, ninhos) próximos a condutores ou isoladores +Situações que demandem intervenção imediata, monitoramento reforçado ou manutenção programada + +## Formato da Resposta Esperada +Organize sua análise da seguinte forma: +Resumo Geral da Condição da Torre (Visão Aérea) +Anomalias Identificadas +Descrição clara +Localização aproximada (ex.: braço superior direito, cadeia de isoladores fase B) +Classificação da Gravidade +# Risco controlável - PRIORIDADE 3, PRIORITÁRIA 60D +# Risco alto - PRIORIDADE 2, URGÊNCIA 30D +# Risco elevado - PRIORIDADE 1, URGÊNCIA 15D +# Risco iminente - PRIORIDADE 0, EMERGÊNCIA (1 dia) +Impacto Potencial na Segurança e na Operação +Recomendações Técnicas +Inspeção complementar (solo, térmica, LiDAR, etc.) +Manutenção corretiva ou preventiva +Caso não sejam identificadas anomalias relevantes, declare explicitamente que nenhum problema visível foi detectado nas imagens analisadas, ressaltando as limitações inerentes à inspeção por drone (ângulo, resolução, oclusões). +## Sempre cite as referencias de pesquisa, como documentos PDF vetorizados. Procure e cite também referencias da ABRATE: https://abrate.org.br/ '; + + -- 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": 5 }'; -- era 20 + + 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' ); + + -- rag + output := fnc_26ai_rag_utilities(p_prompt2 , p_credential, p_image_id, p_comp_id); + + return output ; + +end; +/ \ No newline at end of file diff --git a/pck_26ai_apis.sql b/pck_26ai_apis.sql new file mode 100644 index 0000000..c5dea25 --- /dev/null +++ b/pck_26ai_apis.sql @@ -0,0 +1,49 @@ +create or replace package pck_26ai_apis +as +/* + + Criado por: fernando.leal@oracle.com + Data: Oct/2025 + Objetivo: demonstrar casos de uso do Oracle AI Database 26ai + + v1 - package de chamada a APIs - leal + +*/ + procedure api_text2speech (p_text in varchar2, + p_filename in varchar2, + p_bucket in varchar2 , + p_comp_id in varchar2, + p_credential in varchar2 default 'OCI_CRED', + p_speaker in varchar2 default 'Felix', + p_language_code in varchar2 default 'pt-BR'); + /* + https://docs.oracle.com/en-us/iaas/api/#/en/speech/20220101/SynthesizeSpeech/SynthesizeSpeech + */ + + function api_visio( p_id in number, p_feature_type in varchar2 , p_comp_id in varchar2) return clob; + /* + 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. + */ + + function api_doc_understanding(p_id in number, p_feature_type in varchar2 , p_comp_id in varchar2) return clob; + /* + p_feature_type: https://docs.oracle.com/en-us/iaas/api/#/en/document-understanding/20221109/datatypes/DocumentClassificationFeature + + DOCUMENT_CLASSIFICATION + TABLE_EXTRACTION + TEXT_EXTRACTION + LANGUAGE_CLASSIFICATION + */ + + function api_translate(p_data_text in clob,p_source_code in varchar2 default 'en', p_target_code in varchar2 default 'pt-BR' , p_comp_id in varchar2) return clob; + /* + https://docs.oracle.com/en-us/iaas/api/#/en/language/20221001/BatchLanguageTranslation/BatchLanguageTranslation + */ + +end; +/ \ No newline at end of file diff --git a/pkg_26ai_auto_load.sql b/pkg_26ai_auto_load.sql new file mode 100644 index 0000000..3f12ba2 --- /dev/null +++ b/pkg_26ai_auto_load.sql @@ -0,0 +1,95 @@ +create or replace package pkg_26ai_auto_load +as + +/* + +-- Teste + + -- gerar arquivos a serem vetorizados + begin + PKG_26AI_AUTO_LOAD.prc_refresh_files(p_mimetype => 'PDF',p_embedding_name=>'COHERE'); + PKG_26AI_AUTO_LOAD.prc_refresh_files(p_mimetype => 'JPG',p_embedding_name=>'COHERE'); + PKG_26AI_AUTO_LOAD.prc_refresh_files(p_mimetype => 'CLOB',p_embedding_name=>'COHERE'); + end; + + -- liste de dados a serem vetorizados. Status incial: NULL + select * from tb_26ai_auto_load + + -- reserva de dados para associar aos jobs que executarao, marcado status como R + -- CUIDADO: nao preciso executar manulamnete opois faz parte da rotina de embedding AUTOMATICAMENTE + declare + v_name SYS.ODCIVARCHAR2LIST; + begin + PKG_26AI_AUTO_LOAD.prc_reserve_files ( + p_limit => 10, + p_worker_id => 1 , + p_oci_cred => 'OCI_CRED', + p_bucket => '', + p_docs =>v_name + ) ; + end; + + -- liste de dados a serem vetorizados. Status reservado por worker id em R + select * from tb_26ai_auto_load + + -- Embedding + -- CUIDADO: ja faz o reserve de acordo com p_worker_id e p_limit + declare + v_name SYS.ODCIVARCHAR2LIST; + begin + PKG_26AI_AUTO_LOAD.proc_embed_files ( + p_limit => 10, + p_worker_id => 1 , + p_stop_process_list => 'N' + ) ; + end; + + -- liste status + select * from tb_26ai_auto_load + + -- erro + select * from tb_26ai_auto_load_debug + + -- vector + select * from tb_26ai_auto_load_vector + + -- em caso de erro nos TESTES + begin + update tb_26ai_auto_load set ERROR_MSG= null, status = NULL, WORKER_ID = null where status is not null ; + delete tb_26ai_auto_load_debug; + delete tb_26ai_auto_load_vector; + end; + + +*/ + c_embedding_name CONSTANT VARCHAR2(10) := 'ONNX-E5'; -- requer ajuste do JSON usado nas rotinas de embedding no BODY + + PROCEDURE prc_refresh_files(p_oci_cred IN VARCHAR2 default 'OCI_CRED', + p_bucket in varchar2 default null, + p_mimetype in varchar2 default 'PDF', + p_embedding_name in varchar2 default 'COHERE'); + + PROCEDURE prc_reserve_files ( + p_limit IN NUMBER, + p_worker_id IN VARCHAR2, + p_oci_cred IN VARCHAR2 default 'OCI_CRED', + p_bucket in varchar2 , + p_docs OUT SYS.ODCIVARCHAR2LIST, + p_mimetype in varchar2 default 'PDF', + p_embedding_name in varchar2 default 'COHERE' ) ; + + PROCEDURE proc_embed_files(p_limit in number default 10, + p_worker_id in number, + p_stop_process_list in varchar2 default 'N', + p_mimetype in varchar2 default 'PDF', + p_embedding_name in varchar2 default 'COHERE'); + + PROCEDURE proc_remove_jobs; + + PROCEDURE proc_add_jobs(p_limit in number, + p_total_jobs in number, + p_mimetype in varchar2 default 'PDF', + p_embedding_name in varchar2 default 'COHERE'); + +end; +/ \ No newline at end of file