Passo 2 v2.0.0: V_26AI_TECH + prc_26ai_tech expõem campos novos ao LLM

- sql/04_v2_view_procedure_update.sql: CREATE OR REPLACE VIEW V_26AI_TECH
  (+35 colunas: 23 de TB_26AI_TECH_V2 + 12 de TB_26AI_TECH_CMDB, RAW_JSON de
  cada tabela virou RAW_JSON_TENABLE/RAW_JSON_CMDB pra não colidir nome) e
  CREATE OR REPLACE PROCEDURE prc_26ai_tech (só o json_object do ramo VUL
  ganhou os campos novos; ramo SYS, prompt, vetorização, log e exceção
  ficam byte-a-byte idênticos ao script original).
- Depende do Passo 1 (03_v2_ddl_schema_evolution.sql) já ter rodado no
  mesmo ambiente.
- TASKS.md atualizado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-09 14:55:17 -03:00
parent d37140b36b
commit e25fd93bf8
2 changed files with 710 additions and 1 deletions

View File

@@ -33,7 +33,11 @@ teste — a menos que você peça explicitamente o contrário.
incluindo `RAW_JSON` CLOB catch-all em cada uma), 100% aditivo (sem DROP), com checkpoint de
validação embutido no próprio script. **Pendência antes de rodar:** decidir em qual ambiente
(o atual está marcado como intocável — ver seção "Ponto de partida" acima).
- [ ] Atualizar `V_26AI_TECH` + `json_object` de `PRC_26AI_TECH` para expor os campos novos ao LLM
- [ ] **Pronto, aguardando você rodar e validar** — `sql/04_v2_view_procedure_update.sql`:
`V_26AI_TECH` ganha as 35 colunas novas (aliases `RAW_JSON_TENABLE`/`RAW_JSON_CMDB` pra não
colidir); `prc_26ai_tech` passa a incluir esses campos no `json_object` enviado ao LLM (só o
ramo `VUL` foi tocado — ramo `SYS`, prompt, vetorização, log e exceção ficam idênticos ao
original). **Depende do Passo 1 já ter rodado no mesmo ambiente.**
- [ ] Novos perfis de carga (`DL_TECH_VULNERABILIDADE_V3`, `DL_TECH_CMDB_V2`)
- [ ] Pipeline de staging: bucket → `TB_26AI_TECH_V2_STG` via `DBMS_CLOUD.COPY_DATA` (tabela nova,
não mexe nas existentes)

View File

@@ -0,0 +1,705 @@
--------------------------------------------------------------------------------
-- ampmInsights v2.0.0 — Passo 2: expor os campos novos ao LLM (Fase 1, item 2)
--------------------------------------------------------------------------------
-- PRÉ-REQUISITO: o Passo 1 (sql/03_v2_ddl_schema_evolution.sql) já rodou e foi
-- validado no MESMO ambiente onde você vai rodar este script — as colunas
-- novas (DEFINITION_CVE, RAW_JSON, etc.) precisam existir em TB_26AI_TECH_V2 e
-- TB_26AI_TECH_CMDB antes deste CREATE OR REPLACE VIEW compilar.
--
-- O QUE ESTE SCRIPT FAZ
-- 1. CREATE OR REPLACE VIEW V_26AI_TECH — acrescenta as 23 colunas novas de
-- TB_26AI_TECH_V2 e as 12 de TB_26AI_TECH_CMDB (RAW_JSON de cada tabela
-- vira RAW_JSON_TENABLE / RAW_JSON_CMDB na view, pra não colidir nome).
-- Todas as colunas antigas continuam exatamente como estavam, na mesma
-- ordem — só foram ACRESCENTADAS colunas no final da lista.
-- 2. CREATE OR REPLACE PROCEDURE prc_26ai_tech — no ramo p_source_type='VUL'
-- (vulnerabilidades), o json_object enviado ao LLM ganha os mesmos campos
-- novos. O ramo 'SYS' (syslog) e todo o resto da procedure (prompt,
-- vetorização, log, tratamento de erro) ficam byte-a-byte idênticos ao
-- script original — só o bloco json_object do ramo VUL foi tocado.
-- O prompt (v_pre_prompt) NÃO muda: ele já pede "recomendações" e "plano
-- de ação", só faltava matéria-prima (ver ANALISE_DADOS_v1.4.0_gap_schema.md
-- seção 6, item 2).
--
-- COMO RODAR
-- 1. Mesmo ambiente/schema (AMPMINSIGHTS) onde o Passo 1 já foi validado.
-- 2. Rode o script inteiro de uma vez.
-- 3. Rode a query de validação no final e confirme STATUS = 'VALID' nos
-- dois objetos.
-- 4. Faça o teste manual sugerido no final (um SELECT no JSON de um
-- registro existente) e confira visualmente se os campos novos
-- aparecem. Me traga o resultado dos dois (validação + teste manual).
--
-- ROLLBACK, SE PRECISAR DESFAZER
-- Rode de novo o CREATE OR REPLACE VIEW/PROCEDURE do script original
-- (sql/01_ampminsights_db_setup.sql, trechos V_26AI_TECH e prc_26ai_tech) —
-- como são CREATE OR REPLACE, isso restaura o comportamento anterior sem
-- afetar dado nenhum (view e procedure não guardam estado).
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- 1) VIEW V_26AI_TECH
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE EDITIONABLE VIEW "V_26AI_TECH" ("CID", "AGE_IN_DAYS", "ASSET_DISPLAY_IPV4_ADDRESS", "ASSET_ID", "ASSET_NAME", "ASSET_TAGS", "DEFINITION_EXPLOITABILITY_EASE", "DEFINITION_FAMILY", "DEFINITION_ID", "DEFINITION_NAME", "DEFINITION_VPR_SCORE", "FIRST_OBSERVED", "ID", "LAST_SEEN", "OUTPUT", "PROTOCOL", "RESURFACED_DATE", "SEVERITY", "STATE", "INSIGHT_REPORT", "ID_INSIGHT", "NOME", "EMPRESA", "CLASSE", "AMBIENTE", "STATUS_OPERACIONAL", "DESCRICAO", "SOX", "COFRE", "ENDERECO_IP", "SISTEMA_OPERACIONAL", "TIPO_DE_REDE", "IS_VIRTUAL", "CRITICIDADE", "INSTANCIAS_BANCOS", "APLICACOES_RELACIONADAS", "JANELAS_DE_MANUTENCAO", "ANALISTA_RESPONSAVEL", "ANALISTAS_RESPONSAVEIS", "GERENCIADO_PELO_GRUPO", "GRUPOS_RESPONSAVEIS", "GRUPO_RESPONSAVEL", "EDR", "TENABLE", "SIEM", "APPLIANCE",
"DEFINITION_CVE", "DEFINITION_DESCRIPTION", "DEFINITION_SOLUTION", "DEFINITION_SYNOPSIS", "SOFTWARE_VULNS", "DEFINITION_CVSS3_BASE_SCORE", "DEFINITION_CVSS3_BASE_VECTOR", "DEFINITION_CPE", "DEFINITION_EPSS_SCORE", "CISA_KEV_FLAG", "EXPLOITED_BY_MALWARE_FLAG", "EXPLOITED_BY_NESSUS_FLAG", "PORT", "ASSET_OPERATING_SYSTEM", "LAST_FIXED", "TIME_TO_FIX", "VULN_SLA_DATE", "PATCH_PUBLISHED", "VULNERABILITY_PUBLISHED", "SOURCE_SCAN", "SCAN_ID", "SCAN_TARGET", "RAW_JSON_TENABLE",
"INSTALL_STATUS", "LIFE_CYCLE_STAGE_STATUS", "ASSIGNED_TO", "ATTESTATION_SCORE", "ATTESTATION_STATUS", "ATTESTED_FLAG", "ATTESTED_BY", "U_FIM_DO_SUPORTE", "LOCATION", "ASSET_TAG", "U_SERVER_ROLE", "RAW_JSON_CMDB") AS
SELECT
v.rowid cid,
v.AGE_IN_DAYS ,
v.ASSET_DISPLAY_IPV4_ADDRESS ,
v.ASSET_ID ,
v.ASSET_NAME ,
v.ASSET_TAGS ,
v.DEFINITION_EXPLOITABILITY_EASE ,
v.DEFINITION_FAMILY ,
v.DEFINITION_ID ,
v.DEFINITION_NAME ,
v.DEFINITION_VPR_SCORE ,
v.FIRST_OBSERVED ,
v.ID ,
v.LAST_SEEN ,
v.OUTPUT ,
v.PROTOCOL ,
v.RESURFACED_DATE ,
v.SEVERITY ,
v.STATE ,
v.INSIGHT_REPORT ,
v.ID_INSIGHT ,
replace(replace(initcap(c.NOME),'Ipiranga','Company'),'Ampm','Company') NOME ,
replace(replace(initcap(c.EMPRESA),'Ipiranga','Company'),'Ampm','Company') EMPRESA ,
c.CLASSE ,
c.AMBIENTE ,
c.STATUS_OPERACIONAL ,
c.DESCRIÇÃO DESCRICAO ,
c.SOX ,
c.COFRE ,
c.ENDEREÇO_IP ENDERECO_IP ,
c.SISTEMA_OPERACIONAL ,
c.TIPO_DE_REDE ,
c.É_VIRTUAL IS_VIRTUAL ,
c.CRITICIDADE ,
c.INSTÂNCIAS_BANCOS INSTANCIAS_BANCOS ,
c.APLICAÇÕES_RELACIONADAS APLICACOES_RELACIONADAS ,
c.JANELAS_DE_MANUTENÇÃO JANELAS_DE_MANUTENCAO ,
c.ANALISTA_RESPONSAVEL ,
c.ANALISTAS_RESPONSÁVEIS ANALISTAS_RESPONSAVEIS ,
c.GERENCIADO_PELO_GRUPO ,
c.GRUPOS_RESPONSÁVEIS GRUPOS_RESPONSAVEIS ,
c.GRUPO_RESPONSÁVEL GRUPO_RESPONSAVEL ,
c.EDR,
c.TENABLE ,
c.SIEM ,
c.APPLIANCE ,
-- v2.0.0 — campos novos de TB_26AI_TECH_V2 (Tier 1 Tenable)
v.DEFINITION_CVE ,
v.DEFINITION_DESCRIPTION ,
v.DEFINITION_SOLUTION ,
v.DEFINITION_SYNOPSIS ,
v.SOFTWARE_VULNS ,
v.DEFINITION_CVSS3_BASE_SCORE ,
v.DEFINITION_CVSS3_BASE_VECTOR ,
v.DEFINITION_CPE ,
v.DEFINITION_EPSS_SCORE ,
v.CISA_KEV_FLAG ,
v.EXPLOITED_BY_MALWARE_FLAG ,
v.EXPLOITED_BY_NESSUS_FLAG ,
v.PORT ,
v.ASSET_OPERATING_SYSTEM ,
v.LAST_FIXED ,
v.TIME_TO_FIX ,
v.VULN_SLA_DATE ,
v.PATCH_PUBLISHED ,
v.VULNERABILITY_PUBLISHED ,
v.SOURCE_SCAN ,
v.SCAN_ID ,
v.SCAN_TARGET ,
v.RAW_JSON RAW_JSON_TENABLE ,
-- v2.0.0 — campos novos de TB_26AI_TECH_CMDB (Tier 1 ServiceNow)
c.INSTALL_STATUS ,
c.LIFE_CYCLE_STAGE_STATUS ,
c.ASSIGNED_TO ,
c.ATTESTATION_SCORE ,
c.ATTESTATION_STATUS ,
c.ATTESTED_FLAG ,
c.ATTESTED_BY ,
c.U_FIM_DO_SUPORTE ,
c.LOCATION ,
c.ASSET_TAG ,
c.U_SERVER_ROLE ,
c.RAW_JSON RAW_JSON_CMDB
FROM TB_26AI_TECH_v2 v
LEFT OUTER JOIN
(SELECT *
FROM TB_26AI_TECH_CMDB
WHERE nome IN (SELECT nome
FROM TB_26AI_TECH_CMDB
GROUP BY nome
HAVING count(1) = 1 )
) c
ON ( upper(v.ASSET_NAME) = upper(c.nome) AND c.AMBIENTE IS NOT NULL );
--------------------------------------------------------------------------------
-- 2) PROCEDURE prc_26ai_tech — só o json_object do ramo 'VUL' foi tocado.
-- Todo o resto (prompt, ramo 'SYS', vetorização, log, exceção) é cópia
-- fiel do script original (sql/01_ampminsights_db_setup.sql).
--------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE prc_26ai_tech (p_rowid IN VARCHAR DEFAULT NULL,
p_oci_cred IN VARCHAR2 DEFAULT 'OCI_CRED',
p_comp IN VARCHAR2,
p_source_type VARCHAR2 DEFAULT 'VUL' )
/*
Projeto: ampmInsights
Gera o insight de IA (analise + diagnostico + recomendacoes + plano de acao)
para um registro de TB_26AI_TECH_V2 (vulnerabilidades) ou TB_26AI_TECH_SYS
(syslog), grava o resultado e cria o vetor (chunk) correspondente em
TB_26AI_TECH_VECTOR.
v2.0.0: ramo 'VUL' passou a enviar ao LLM os campos novos de
TB_26AI_TECH_V2/CMDB (CVE, CVSS, EPSS, CISA KEV, solucao, descricao,
pacotes, etc. - ver ANALISE_DADOS_v1.4.0_gap_schema.md). O prompt em si nao
mudou, so a materia-prima disponivel para ele.
Para processamento em lote / carga inicial (rode manualmente uma vez, ou use
o botao "Gerar Insights em Lote" da aplicacao APEX, que cria um job via
DBMS_SCHEDULER lendo EMBEDDING_CREDENTIAL/EMBEDDING_COMPARTMENT a partir de
TB_26AI_TECH_PARAMS - ver SECAO 2). O bloco abaixo tambem le o compartimento
direto da tabela de configuracao, entao nao ha nenhum OCID para colar aqui:
DECLARE
v_resp CLOB;
v_comp TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_comp FROM TB_26AI_TECH_PARAMS WHERE param_name = 'EMBEDDING_COMPARTMENT';
FOR r1 IN (SELECT rowid cid FROM TB_26AI_TECH_v2 WHERE insight_report IS NULL) LOOP
PRC_26AI_TECH (p_rowid => r1.cid,
p_oci_cred => 'OCI_CRED',
p_comp => v_comp,
p_source_type => 'VUL');
END LOOP;
END;
/
*/
AS
v_pre_prompt CLOB;
v_customer_data CLOB;
v_pre_prompt_json CLOB;
v_response CLOB;
v_json CLOB;
v_error CLOB;
v_genai_region TB_26AI_TECH_PARAMS.PARAM_VALUE%TYPE;
BEGIN
SELECT param_value INTO v_genai_region FROM TB_26AI_TECH_PARAMS WHERE param_name = 'GENAI_REGION';
IF p_source_type = 'VUL' THEN -- vulnerabilidades
v_pre_prompt :='Voce e um analista senior de dados e operacoes.
Sua tarefa e interpretar os dados, comparar os resultados e produzir um relatorio executivo e tecnico acionavel.
Objetivo:
Gerar insights em 4 blocos:
1) Analise
2) Diagnostico
3) Recomendacoes
4) Plano de acao
Regras de qualidade:
- Nao invente dados ausentes. Quando faltar contexto, declare explicitamente "Informacao nao fornecida".
- Seja especifico, com linguagem executiva + tecnica.
- Priorize risco real de negocio e explorabilidade.
- Sempre indicar severidade e prioridade.
- Sempre incluir acoes de curto, medio e longo prazo.
- Quando possivel, referenciar boas praticas (OWASP, NIST, CIS, CVE/CWE).
Formato obrigatorio da resposta:
## 1. Analise
- Resumo executivo (5 a 8 linhas)
- Principais metricas observadas
- Pontos fora do padrao (outliers/anomalias)
## 2. Diagnostico
- Causas provaveis por ordem de impacto (Alta/Media/Baixa)
- Evidencias que sustentam cada causa (referenciando campos do JSON)
- Riscos de curto e medio prazo se nada for feito
## 3. Recomendacoes
Para cada recomendacao, informe:
- Acao recomendada
- Problema que resolve
- Impacto esperado
- Esforco estimado (Baixo/Medio/Alto)
- Prioridade (P1/P2/P3)
## 4. Plano de acao (30-60-90 dias)
- 30 dias: acoes imediatas e "quick wins"
- 60 dias: ajustes estruturais
- 90 dias: consolidacao e otimizacao
Para cada etapa, incluir:
- Responsavel sugerido (perfil/funcao)
- Dependencias
- Metrica de sucesso (KPI)
- Criterio de conclusao';
v_pre_prompt_json := '## FORMATO DE SAIDA JSON
Quando solicitado no modo JSON, responda EXCLUSIVAMENTE com o objeto JSON
valido conforme o schema abaixo, sem texto antes ou depois, sem markdown,
sem blocos de codigo. O JSON deve ser parseable diretamente.
Campos nao avaliaveis por qualidade de imagem devem receber null.
Nao inclua explicacoes, texto introdutorio, saudacoes ou blocos de Markdown como "```json" no comeco nem no final como "```".
## Exemplo JSON:
Retorne um JSON valido (sem comentarios), espelhando o relatorio:
{
"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(
'AGE_IN_DAYS' VALUE AGE_IN_DAYS,
'ASSET_DISPLAY_IPV4_ADDRESS' VALUE ASSET_DISPLAY_IPV4_ADDRESS,
'ASSET_ID' VALUE ASSET_ID,
'ASSET_NAME' VALUE ASSET_NAME,
'ASSET_TAGS' VALUE ASSET_TAGS,
'DEFINITION_EXPLOITABILITY_EASE' VALUE DEFINITION_EXPLOITABILITY_EASE,
'DEFINITION_FAMILY' VALUE DEFINITION_FAMILY,
'DEFINITION_ID' VALUE DEFINITION_ID,
'DEFINITION_NAME' VALUE DEFINITION_NAME,
'DEFINITION_VPR_SCORE' VALUE DEFINITION_VPR_SCORE,
'FIRST_OBSERVED' VALUE FIRST_OBSERVED,
'ID' VALUE ID,
'LAST_SEEN' VALUE LAST_SEEN,
'OUTPUT' VALUE OUTPUT,
'PROTOCOL' VALUE PROTOCOL,
'RESURFACED_DATE' VALUE RESURFACED_DATE,
'SEVERITY' VALUE SEVERITY,
'STATE' VALUE STATE,
'INSIGHT_REPORT' VALUE INSIGHT_REPORT,
'ID_INSIGHT' VALUE ID_INSIGHT,
'NOME' VALUE NOME,
'EMPRESA' VALUE EMPRESA,
'CLASSE' VALUE CLASSE,
'AMBIENTE' VALUE AMBIENTE,
'STATUS_OPERACIONAL' VALUE STATUS_OPERACIONAL,
'DESCRICAO' VALUE DESCRICAO,
'SOX' VALUE SOX,
'COFRE' VALUE COFRE,
'ENDERECO_IP' VALUE ENDERECO_IP,
'SISTEMA_OPERACIONAL' VALUE SISTEMA_OPERACIONAL,
'TIPO_DE_REDE' VALUE TIPO_DE_REDE,
'IS_VIRTUAL' VALUE IS_VIRTUAL,
'CRITICIDADE' VALUE CRITICIDADE,
'INSTANCIAS_BANCOS' VALUE INSTANCIAS_BANCOS,
'APLICACOES_RELACIONADAS' VALUE APLICACOES_RELACIONADAS,
'JANELAS_DE_MANUTENCAO' VALUE JANELAS_DE_MANUTENCAO,
'ANALISTA_RESPONSAVEL' VALUE ANALISTA_RESPONSAVEL,
'ANALISTAS_RESPONSAVEIS' VALUE ANALISTAS_RESPONSAVEIS,
'GERENCIADO_PELO_GRUPO' VALUE GERENCIADO_PELO_GRUPO,
'GRUPOS_RESPONSAVEIS' VALUE GRUPOS_RESPONSAVEIS,
'GRUPO_RESPONSAVEL' VALUE GRUPO_RESPONSAVEL,
'EDR' VALUE EDR,
'TENABLE' VALUE TENABLE,
'SIEM' VALUE SIEM,
'APPLIANCE' VALUE APPLIANCE,
-- v2.0.0 — campos novos (ver Passo 1 / ANALISE_DADOS_v1.4.0_gap_schema.md)
'DEFINITION_CVE' VALUE DEFINITION_CVE,
'DEFINITION_DESCRIPTION' VALUE DEFINITION_DESCRIPTION,
'DEFINITION_SOLUTION' VALUE DEFINITION_SOLUTION,
'DEFINITION_SYNOPSIS' VALUE DEFINITION_SYNOPSIS,
'SOFTWARE_VULNS' VALUE SOFTWARE_VULNS,
'DEFINITION_CVSS3_BASE_SCORE' VALUE DEFINITION_CVSS3_BASE_SCORE,
'DEFINITION_CVSS3_BASE_VECTOR' VALUE DEFINITION_CVSS3_BASE_VECTOR,
'DEFINITION_CPE' VALUE DEFINITION_CPE,
'DEFINITION_EPSS_SCORE' VALUE DEFINITION_EPSS_SCORE,
'CISA_KEV_FLAG' VALUE CISA_KEV_FLAG,
'EXPLOITED_BY_MALWARE_FLAG' VALUE EXPLOITED_BY_MALWARE_FLAG,
'EXPLOITED_BY_NESSUS_FLAG' VALUE EXPLOITED_BY_NESSUS_FLAG,
'PORT' VALUE PORT,
'ASSET_OPERATING_SYSTEM' VALUE ASSET_OPERATING_SYSTEM,
'LAST_FIXED' VALUE LAST_FIXED,
'TIME_TO_FIX' VALUE TIME_TO_FIX,
'VULN_SLA_DATE' VALUE VULN_SLA_DATE,
'PATCH_PUBLISHED' VALUE PATCH_PUBLISHED,
'VULNERABILITY_PUBLISHED' VALUE VULNERABILITY_PUBLISHED,
'INSTALL_STATUS' VALUE INSTALL_STATUS,
'LIFE_CYCLE_STAGE_STATUS' VALUE LIFE_CYCLE_STAGE_STATUS,
'ASSIGNED_TO' VALUE ASSIGNED_TO,
'ATTESTATION_SCORE' VALUE ATTESTATION_SCORE,
'ATTESTATION_STATUS' VALUE ATTESTATION_STATUS,
'ATTESTED_FLAG' VALUE ATTESTED_FLAG,
'U_FIM_DO_SUPORTE' VALUE U_FIM_DO_SUPORTE,
'LOCATION' VALUE LOCATION,
'ASSET_TAG' VALUE ASSET_TAG,
'U_SERVER_ROLE' VALUE U_SERVER_ROLE
) AS my_json
INTO v_customer_data
FROM v_26ai_tech a
WHERE cid = p_rowid;
v_response := FNC_26ai_rag( p_ai_prompt => v_pre_prompt || '. Dados: ' || v_customer_data,
p_oci_cred => p_oci_cred,
p_comp => p_comp
);
v_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_v2
SET insight_report = v_response,
insight_json = v_json
WHERE rowid = p_rowid;
ELSIF p_source_type = 'SYS' THEN -- SYSLOG
v_pre_prompt :='Voce e um Assistente de Decisao Operacional especializado em interpretacao de eventos Syslog
gerados por servidores Linux que executam bancos de dados Oracle.
Seu objetivo e apoiar equipes de operacao, banco de dados, infraestrutura e seguranca a responder, de forma pratica e rastreavel,
perguntas como:
- Diante de um alarme, ocorrencia ou evento operacional, qual acao imediata e recomendada?
- Existe historico parecido nos dados recuperados?
- Qual procedimento operacional se aplica?
- Quando o caso deve ser escalado para DBA, infraestrutura, redes, seguranca, armazenamento ou gestao de crise?
- Qual evidencia do Syslog sustenta a recomendacao?
Esquema dos dados:
- `id`: identificador sequencial do evento no CSV.
- `timestamp`: data e hora do evento em formato ISO com fuso horario.
- `host`: servidor que gerou o evento.
- `facility`: origem Syslog, como `daemon`, `local0`, `kern`, `authpriv` ou `cron`.
- `severity`: severidade Syslog, como `info`, `notice`, `warning`, `err` ou `crit`.
- `process`: processo que registrou o evento, como `oracle`, `tnslsnr`, `rman`, `systemd`, `kernel`, `multipathd`, `crsd`, `cssd`, `oraagent`, `ora_lgwr_*`, `ora_arc*`, `ora_mrp*`, `ora_rfs*`.
- `pid`: identificador do processo.
- `oracle_instance`: instancia Oracle relacionada, como `PROD`, `STBY` ou `RAC1`.
- `message`: mensagem operacional normalizada.
- `raw_syslog`: linha Syslog original ou aproximada.
Contexto operacional esperado:
- `PROD` representa uma instancia Oracle primaria de producao.
- `STBY` representa uma instancia standby/Data Guard.
- `RAC1` representa um ambiente Oracle RAC/Clusterware.
- Eventos de `tnslsnr` estao associados ao listener Oracle e conectividade de clientes.
- Eventos de `rman` indicam operacoes de backup e recuperacao.
- Eventos `ora_arc*` indicam arquivamento de redo logs.
- Eventos `ora_lgwr*`, `ora_dbw*`, `ora_ckpt*` indicam processos criticos da instancia Oracle.
- Eventos `ora_mrp*` e `ora_rfs*` indicam replicacao/aplicacao de redo no standby.
- Eventos `crsd`, `cssd`, `ohasd` e `oraagent` indicam componentes de Oracle Clusterware/RAC.
- Eventos `kernel`, `multipathd`, `NetworkManager`, `systemd`, `chronyd`, `sshd`, `sudo` e `CROND` representam dependencias do sistema operacional, armazenamento, rede, tempo, acesso e automacao.
Regras de interpretacao:
1. Use prioritariamente os trechos recuperados pelo RAG. Nao invente eventos, historicos ou procedimentos que nao estejam sustentados pelo contexto.
2. Quando houver pouca evidencia, declare explicitamente a lacuna e indique quais dados adicionais seriam necessarios.
3. Classifique a criticidade operacional considerando `severity`, processo, instancia, mensagem, impacto potencial e recorrencia.
4. Diferencie eventos informativos de eventos que exigem acao.
5. Para eventos `err` ou `crit`, sempre avaliar impacto, acao imediata e escalacao.
6. Para eventos `warning`, avaliar tendencia, recorrencia e risco de evolucao para indisponibilidade.
7. Para eventos `info` ou `notice`, considerar se fazem parte de recuperacao, normalizacao ou sequencia posterior a uma falha.
8. Nunca recomendar comandos destrutivos ou mudancas irreversiveis sem etapa previa de validacao.
9. Quando sugerir comandos, priorize comandos de diagnostico, leitura e coleta de evidencia.
10. Use linguagem objetiva, orientada a operacao, sem excesso de explicacao teorica.
Padroes relevantes para decisao:
- `ORA-00600`: erro interno Oracle. Tratar como criticidade alta ou critica. Recomendar coleta de alert log, trace, incidente ADRCI e escalacao para DBA/fornecedor.
- `ORA-00257`: erro de archiver/FRA cheia. Tratar como risco direto de bloqueio de conexoes e indisponibilidade. Recomendar liberar espaco, validar archivelogs, backup RMAN e destino de archive.
- `RMAN-03009`: falha de backup. Recomendar verificar canal, destino, espaco, permissao, catalogo e janela de backup.
- `ORA-01034`: instancia Oracle indisponivel. Recomendar validar status da instancia, listener, alert log e servico systemd.
- `TNS-12535`: timeout de listener/conectividade. Recomendar validar rede, firewall, listener, carga e origem do cliente.
- `ORA-00060`: deadlock. Recomendar identificar sessoes/SQL envolvidos, avaliar aplicacao e recorrencia antes de escalar.
- `CRS-5017` ou falha de recurso RAC: avaliar Clusterware, recursos, logs do CRS e impacto no servico.
- Latencia em `LGWR`, `DBWR`, voting file, disco ou multipath: avaliar armazenamento, I/O, SAN, filesystem, ASM e impacto em performance.
- Eventos de Data Guard como gap, espera por sequencia, MRP/RFS: avaliar atraso de replicacao, transporte e aplicacao de redo.
- Eventos de memoria/cgroup/kernel: avaliar risco de OOM, consumo por instancia e limites de sistema.
- Eventos de `sudo`, `sshd` e autenticacao: correlacionar com mudancas operacionais ou incidentes de seguranca.
Tarefa:
Gere um report de decisao operacional com base na pergunta do usuario e no contexto recuperado.
Formato obrigatorio da resposta:
1. Resumo executivo
- Informe em 2 a 4 frases o que ocorreu, qual ativo/instancia foi afetado e qual o nivel de risco operacional.
2. Evidencias encontradas no Syslog
- Liste os eventos mais relevantes.
- Para cada evidencia, inclua `id`, `timestamp`, `host`, `oracle_instance`, `severity`, `process` e a mensagem.
- Se o contexto nao trouxer evidencia suficiente, diga isso explicitamente.
3. Interpretacao operacional
- Explique o significado provavel do evento no contexto Oracle/Linux.
- Indique se o evento parece isolado, recorrente, parte de uma sequencia de falha ou parte de recuperacao.
4. Acao recomendada
- Liste a acao imediata recomendada.
- Priorize contencao, diagnostico e reducao de impacto.
- Separe claramente o que deve ser feito agora do que deve ser tratado como analise posterior.
5. Procedimento aplicavel
- Indique o procedimento operacional mais adequado, por exemplo:
- verificar alert log Oracle;
- validar listener;
- validar servico systemd;
- checar FRA/archive logs;
- validar backup RMAN;
- investigar storage/multipath;
- investigar Data Guard;
- investigar Clusterware/RAC;
- acionar seguranca para eventos de autenticacao suspeitos.
6. Confianca da recomendacao
- Informe `Alta`, `Media` ou `Baixa`.
- Justifique com base na quantidade e qualidade das evidencias recuperadas.
Regras finais:
- Responda em portugues do Brasil.
- Seja objetivo e operacional.
- Nao omita risco quando houver `err`, `crit`, `ORA-*`, `RMAN-*`, `CRS-*`, falha de disco, latencia de I/O, falha de listener, Data Guard gap ou falha de servico.
- Nao declare causa raiz definitiva sem evidencia suficiente.
- Sempre diferencie fato observado, inferencia e recomendacao.';
v_pre_prompt_json := '## FORMATO DE SAIDA JSON
Quando solicitado no modo JSON, responda EXCLUSIVAMENTE com o objeto JSON
valido conforme o schema abaixo, sem texto antes ou depois, sem markdown,
sem blocos de codigo. O JSON deve ser parseable diretamente.
Campos nao avaliaveis por qualidade de imagem devem receber null.
Nao inclua explicacoes, texto introdutorio, saudacoes ou blocos de Markdown como "```json" no comeco nem no final como "```".
## Exemplo JSON:
Retorne um JSON valido (sem comentarios), espelhando o relatorio:
{
"tipo_relatorio": "decisao_operacional_syslog_oracle_linux",
"versao_schema": "1.0",
"fonte_dados": {
"arquivo_csv": "syslog_oracle_linux_examples.csv",
"mecanismo": "RAG",
"modelo_destino": "Llama 4",
"campos_csv": [
"id",
"timestamp",
"host",
"facility",
"severity",
"process",
"pid",
"oracle_instance",
"message",
"raw_syslog"
]
},
"classificacao_evento": {
"nivel_risco": "Baixo|Medio|Alto|Critico",
"severidade_syslog": "info|notice|warning|err|crit",
"categoria": "Banco de dados|Sistema operacional|Rede|Storage|Seguranca|Backup|Data Guard|RAC|Autenticacao",
"impacto_potencial": "Descrever impacto operacional provavel",
"estado": "Informativo|Em investigacao|Acao requerida|Escalado|Resolvido"
},
"resumo_executivo": {
"descricao": "Resumo em 2 a 4 frases do evento ou alarme analisado",
"ativo_afetado": {
"host": "Nome do servidor afetado",
"oracle_instance": "Instancia Oracle afetada",
"processo": "Processo principal relacionado ao evento"
},
"risco_operacional": "Descricao objetiva do risco",
"recomendacao_curta": "Acao recomendada em uma frase"
},
"evidencias_syslog": [
{
"id": 0,
"timestamp": "YYYY-MM-DDTHH:MM:SS-03:00",
"host": "host_origem",
"facility": "facility_syslog",
"severity": "severity_syslog",
"process": "processo_origem",
"pid": 0,
"oracle_instance": "instancia_oracle",
"message": "mensagem_normalizada",
"raw_syslog": "linha_syslog_original",
"relevancia": "Alta|Media|Baixa"
}
],
"interpretacao_operacional": {
"fato_observado": "O que foi observado diretamente no Syslog",
"inferencia": "Interpretacao operacional baseada nas evidencias",
"possivel_causa": "Hipotese provavel, sem declarar causa raiz definitiva sem evidencia",
"sequencia_eventos": "Evento isolado, sequencia de falha, recuperacao ou recorrencia",
"recorrencia": "Isolado|Recorrente|Sequencia de falha|Recuperacao|Indeterminado"
},
"acoes_recomendadas": {
"imediatas": [
{
"prioridade": 1,
"acao": "Acao imediata recomendada",
"objetivo": "Resultado esperado da acao",
"responsavel_sugerido": "Operacao N1|Operacao N2|DBA Oracle|Linux/Infraestrutura|Storage|Redes|Seguranca|Sustentacao de Aplicacao|Gestao de Crise"
}
]
}';
SELECT json_object(
'ID_1' VALUE a."ID_1",
'ID' VALUE a."ID",
'TIMESTAMP' VALUE a."TIMESTAMP",
'HOST' VALUE a."HOST",
'FACILITY' VALUE a."FACILITY",
'SEVERITY' VALUE a."SEVERITY",
'PROCESS' VALUE a."PROCESS",
'PID' VALUE a."PID",
'ORACLE_INSTANCE' VALUE a."ORACLE_INSTANCE",
'MESSAGE' VALUE a."MESSAGE",
'RAW_SYSLOG' VALUE a."RAW_SYSLOG"
) AS my_json
INTO v_customer_data
FROM "TB_26AI_TECH_SYS" a
WHERE rowid = p_rowid;
v_response := FNC_26ai_rag( p_ai_prompt => v_pre_prompt || '. Dados: ' || v_customer_data,
p_oci_cred => p_oci_cred,
p_comp => p_comp
);
UPDATE TB_26AI_TECH_SYS
SET insight_report = v_response,
insight_json = v_json
WHERE rowid = p_rowid;
END IF;
IF length(v_response) > 0 THEN
-- vetorizacao do relatorio gerado
INSERT INTO TB_26AI_TECH_VECTOR
SELECT et.embed_id,
v_response,
et.embed_vector,
null,
p_rowid,
p_source_type
FROM dual
CROSS JOIN TABLE(
DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS(
( v_response ) ,
json('{ "provider": "ocigenai",
"credential_name": "' || p_oci_cred || '",
"url": "https://inference.generativeai.' || v_genai_region || '.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;
PRC_26AI_TECH_LOG(
p_calling_object => 'PRC_26AI_TECH',
p_operation => 'EMBEDDING',
p_status => 'OK',
p_source_type => p_source_type,
p_source_id => p_rowid,
p_provider => 'ocigenai',
p_model_name => 'cohere.embed-v4.0',
p_prompt_chars => LENGTH(v_response)
);
END IF;
PRC_26AI_TECH_LOG(
p_calling_object => 'PRC_26AI_TECH',
p_operation => 'INSIGHT_PIPELINE',
p_status => 'OK',
p_source_type => p_source_type,
p_source_id => p_rowid
);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_error := sqlerrm;
PRC_26AI_TECH_LOG(
p_calling_object => 'PRC_26AI_TECH',
p_operation => 'INSIGHT_PIPELINE',
p_status => 'ERROR',
p_source_type => p_source_type,
p_source_id => p_rowid,
p_error_code => SQLCODE,
p_error_message => v_error
);
-- Antes, o erro tecnico (sqlerrm) era gravado direto em insight_report e
-- ficava visivel pro usuario de negocio no modal. Agora o erro completo
-- vai so pro log (TB_26AI_TECH_LOG); o usuario ve uma mensagem amigavel.
IF p_source_type = 'VUL' THEN
UPDATE TB_26AI_TECH_v2
SET insight_report = 'Nao foi possivel gerar o insight para este registro no momento.',
insight_json = null
WHERE rowid = p_rowid;
ELSIF p_source_type = 'SYS' THEN
UPDATE TB_26AI_TECH_SYS
SET insight_report = 'Nao foi possivel gerar o insight para este registro no momento.',
insight_json = null
WHERE rowid = p_rowid;
END IF;
COMMIT;
END;
/
--------------------------------------------------------------------------------
-- 3) Checkpoint de validação #1 — compilação dos objetos
--------------------------------------------------------------------------------
SELECT object_name, object_type, status
FROM user_objects
WHERE object_name IN ('V_26AI_TECH', 'PRC_26AI_TECH')
ORDER BY object_name;
-- Esperado: as duas linhas com STATUS = 'VALID'.
--------------------------------------------------------------------------------
-- 4) Checkpoint de validação #2 — teste manual, sem gastar chamada de LLM
-- Confirma que os campos novos chegam até a view, num registro qualquer
-- que já tenha as colunas novas preenchidas (pode dar tudo NULL se ainda
-- não recarregou dado nenhum com o Tenable/ServiceNow novos — normal,
-- só confirma que a COLUNA existe e é lida, não que tem dado).
--------------------------------------------------------------------------------
SELECT cid, asset_name, definition_cve, definition_solution, sistema_operacional, u_fim_do_suporte
FROM V_26AI_TECH
FETCH FIRST 3 ROWS ONLY;