Files
26ai_mvp_poc/prc_26ai_vulnerabilidade.sql
2026-05-08 13:09:57 +00:00

187 lines
6.2 KiB
SQL

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