create or replace FUNCTION fnc_26ai_tech_rag(p_query VARCHAR2, p_top_k IN NUMBER , p_credential in varchar2 default 'OCI_CRED', p_app_user in varchar2 default V('APP_USER') ) RETURN CLOB IS /* Criado por: fernando.leal@oracle.com Data: Mar/2026 Objetivo: demonstrar casos de uso do Oracle AI Database 26ai v1 - funcao de RAG para estudo explorar "fale com seus dados" TECH - leal */ v_context CLOB; v_pre_prompt clob; v_prompt clob; v_pre_prompt2 clob; params_genai CLOB; output CLOB; query_vec VECTOR; -- https://docs.oracle.com/en/database/oracle/oracle-database/23/arpls/dbms_vector_chain1.html#GUID-017C9002-194C-48E5-B59B-EF5C60BC8405 v_llm varchar2(20) := 'LLAMA4'; -- [ LLAMA4 | OPENAI ] BEGIN -- embedding do prompt para dedicated query_vec := to_vector( fnc_26ai_embed ( p_string => p_query, p_emb_type => 'COHERE' ) ) ; for message_cursor in ( select lv.ID as DOCID, lv.EMBED_DATA as BODY, vector_distance( lv.EMBED_VECTOR, query_vec, cosine ) AS SCORE from TB_26AI_TECH_VECTOR lv order by SCORE FETCH EXACT FIRST p_top_k ROWS ONLY ) loop v_context := v_context || '"' || replace(replace(replace(replace(message_cursor.BODY,chr(10),null),chr(13),null),'"',''),'''','') || '",' ; end loop; -- -- pre requisito sao as credenciais definidas com nome OCI_CRED criadas a partir de dbms_vector.create_credential -- -- para montar request body abaixo: https://docs.oracle.com/en-us/iaas/api/#/en/generative-ai-inference/20231130/datatypes/GenerateTextDetails -- if v_llm = 'LLAMA4' then params_genai := '{ "provider" : "ocigenai", "credential_name" : "' || p_credential || '", "url" : "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat", "model": "meta.llama-4-maverick-17b-128e-instruct-fp8"}'; elsif v_llm = 'OPENAI' then params_genai := '{ "provider" : "openai", "credential_name" : "CRED_OPENAI", "url" : "https://api.openai.com/v1/chat/completions", "model" : "gpt-4.1-mini", "temperature": 0.4 }'; end if; -- augmented prompt atraves do vetor criado no banco v_pre_prompt := 'Você é um Analista Sênior de Inteligência Operacional especializado em analisar relatórios técnicos e executivos previamente gerados. Contexto de trabalho: - Você receberá: 1) A pergunta do usuário 2) Um conjunto de trechos recuperados da base vetorizada de relatórios (com metadados como report_id, data, área, severidade, prioridade, fonte). - Sua tarefa é encontrar evidências relevantes nesses relatórios e responder com precisão, sem inventar informações. Regras obrigatórias: - Use SOMENTE informações presentes nos trechos recuperados. - Se faltar dado para responder algo, escreva explicitamente: “Informação não fornecida”. - Sempre cite as evidências no formato: [report_id | seção/campo | data]. - Quando houver conflito entre relatórios, sinalize divergência e indique qual evidência é mais confiável (recência, completude, consistência). - Priorize risco de negócio, severidade e urgência. - Não repita conteúdo desnecessário; seja objetivo e acionável. Método de resposta: 1) Entenda a intenção da pergunta (comparar, diagnosticar, priorizar, tendência, causa, ação). 2) Selecione os trechos mais relevantes por aderência semântica à pergunta. 3) Consolide achados em linguagem executiva + técnica. 4) Gere recomendações práticas com prioridade e esforço. 5) Indique lacunas de dados que limitam a conclusão. Formato obrigatório de saída: ## Resposta objetiva - Responda em formato markdown, e nunca use fontes de tamanho diferentes. - Resposta direta à pergunta em 3 a 6 linhas. ## Evidências encontradas - Evidência 1: [report_id | seção/campo | data] - Evidência 2: [report_id | seção/campo | data] - Evidência 3: [report_id | seção/campo | data] ## Diagnóstico consolidado - Causa/hipótese principal (Alta/Média/Baixa) - Risco de curto prazo - Risco de médio prazo ## Recomendações priorizadas - P1: | Impacto: <...> | Esforço: - P2: | Impacto: <...> | Esforço: - P3: | Impacto: <...> | Esforço: ## Lacunas e próximos dados necessários - Informação não fornecida: - Dado adicional recomendado para aumentar confiança da resposta: <...>'; v_pre_prompt2 := '{ "role": "user","content": "Contexto:"' || v_context || ' "Pergunta": ' || p_query || '"}' ; output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_pre_prompt || v_pre_prompt2,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai)); RETURN output; END; /