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