Upload files to "/"
This commit is contained in:
124
fnc_26ai_tech_rag.sql
Normal file
124
fnc_26ai_tech_rag.sql
Normal file
@@ -0,0 +1,124 @@
|
||||
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: <achado> [report_id | seção/campo | data]
|
||||
- Evidência 2: <achado> [report_id | seção/campo | data]
|
||||
- Evidência 3: <achado> [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: <ação> | Impacto: <...> | Esforço: <Baixo/Médio/Alto>
|
||||
- P2: <ação> | Impacto: <...> | Esforço: <Baixo/Médio/Alto>
|
||||
- P3: <ação> | Impacto: <...> | Esforço: <Baixo/Médio/Alto>
|
||||
|
||||
## Lacunas e próximos dados necessários
|
||||
- Informação não fornecida: <campo/contexto ausente>
|
||||
- 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;
|
||||
/
|
||||
Reference in New Issue
Block a user