create or replace procedure prc_26ai_vulnerabilidade (p_rowid in varchar default null, p_oci_cred IN VARCHAR2 default 'OCI_CRED', p_comp in varchar2, p_response out clob, p_json out clob ) /* Para testes de carga, ou associacao a jobs: declare v_resp clob; v_json clob; begin for r1 in (select rowid cid from TB_26AI_TECH_VULNERABILIDADE where insight_report is null ) loop prc_26ai_vulnerabilidade (p_rowid => r1.cid , p_oci_cred => 'OCI_CRED', p_comp => 'ocid1.compartment.oc1..aaaaaaaayv4jpgnurtdpxwfy3t2tak6akpyh6jgunlc6pdmilqv5f2s5nevq', p_response => v_resp, p_json => v_json ); end loop; end; */ as v_pre_prompt clob; v_customer_data clob; v_pre_prompt_json clob; begin v_pre_prompt :='Você é um analista sênior de dados e operações. Sua tarefa é interpretar os dados, comparar os resultados e produzir um relatório executivo e técnico acionável. Objetivo: Gerar insights em 4 blocos: 1) Análise 2) Diagnóstico 3) Recomendações 4) Plano de ação Regras de qualidade: - Não invente dados ausentes. Quando faltar contexto, declare explicitamente “Informação não fornecida”. - Seja específico, com linguagem executiva + técnica. - Priorize risco real de negócio e explorabilidade. - Sempre indicar severidade e prioridade. - Sempre incluir ações de curto, médio e longo prazo. - Quando possível, referenciar boas práticas (OWASP, NIST, CIS, CVE/CWE). Formato obrigatório da resposta: ## 1. Análise - Resumo executivo (5 a 8 linhas) - Principais métricas observadas - Pontos fora do padrão (outliers/anomalias) ## 2. Diagnóstico - Causas prováveis por ordem de impacto (Alta/Média/Baixa) - Evidências que sustentam cada causa (referenciando campos do JSON) - Riscos de curto e médio prazo se nada for feito ## 3. Recomendações Para cada recomendação, informe: - Ação recomendada - Problema que resolve - Impacto esperado - Esforço estimado (Baixo/Médio/Alto) - Prioridade (P1/P2/P3) ## 4. Plano de ação (30-60-90 dias) - 30 dias: ações imediatas e “quick wins” - 60 dias: ajustes estruturais - 90 dias: consolidação e otimização Para cada etapa, incluir: - Responsável sugerido (perfil/função) - Dependências - Métrica de sucesso (KPI) - Critério de conclusão'; v_pre_prompt_json := '## FORMATO DE SAÍDA JSON Quando solicitado no modo JSON, responda EXCLUSIVAMENTE com o objeto JSON válido conforme o schema abaixo, sem texto antes ou depois, sem markdown, sem blocos de código. O JSON deve ser parseable diretamente. Campos não avaliáveis por qualidade de imagem devem receber null. Não inclua explicações, texto introdutório, saudações ou blocos de Markdown como "```json" no comeco nem no final como "```". ## Exemplo JSON: Retorne um JSON válido (sem comentários), espelhando o relatório: { "id": "", "titulo": "", "analise": { "resumo_tecnico": "", "vetor_ataque": "", "pre_condicoes": [], "impacto_cia": { "confidencialidade": "", "integridade": "", "disponibilidade": "" } }, "diagnostico": { "causa_raiz": "", "classificacao": { "cwe": "", "owasp": "" }, "severidade": "", "probabilidade_exploracao": "", "impacto_negocio": "", "prioridade_final": "", "justificativa": "" }, "recomendacoes": [ { "acao": "", "tipo": "corretiva|preventiva|detectiva", "esforco": "baixo|medio|alto", "dependencias": [] } ], "plano_acao": [ { "prazo": "curto|medio|longo", "etapa": "", "responsavel_sugerido": "", "deadline_sugerido": "", "resultado_esperado": "", "criterio_aceite": "" } ], "lacunas_informacao": [] }'; select json_object(a.*) my_json into v_customer_data from TB_26AI_TECH_VULNERABILIDADE a where rowid = p_rowid and insight_report is null ; p_response := FNC_26ai_rag( p_ai_prompt => v_pre_prompt || '. Dados: ' || v_customer_data, p_oci_cred => p_oci_cred, p_comp => p_comp ); p_json := replace( replace( FNC_26ai_rag( p_ai_prompt => 'MODO JSON: ' || v_pre_prompt || ' ' || v_pre_prompt_json || '. Dados: ' || v_customer_data, p_oci_cred => p_oci_cred, p_comp => p_comp ) ,'```json','' ),'```','' ); update TB_26AI_TECH_VULNERABILIDADE set insight_report = p_response, insight_json = p_json where rowid = p_rowid; -- vetorizacao do relatorio gerado insert into TB_26AI_TECH_VULNERABILIDADE_VECTOR SELECT et.embed_id, et.text_chunk, et.embed_vector, null, p_rowid FROM TB_26AI_TECH_VULNERABILIDADE CROSS JOIN TABLE( DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS( DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS( insight_report , JSON('{"by":"words","max":"1000","split":"sentence","normalize":"all","overlap":"0"}') ), json('{ "provider": "ocigenai", "credential_name": "' || p_oci_cred || '", "url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText", "model": "cohere.embed-v4.0" }') ) ) 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; commit; end; /