Upload files to "/"
This commit is contained in:
245
fnc_26ai_html.sql
Normal file
245
fnc_26ai_html.sql
Normal file
@@ -0,0 +1,245 @@
|
||||
create or replace FUNCTION fnc_26ai_html(p_query VARCHAR2,
|
||||
p_top_k IN NUMBER default 20,
|
||||
p_credential in varchar2 default 'OCI_CRED' )
|
||||
RETURN CLOB IS
|
||||
/*
|
||||
|
||||
Criado por: fernando.leal@oracle.com
|
||||
Data: Oct/2025
|
||||
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||
|
||||
v1 - geracao de codigo HTML a partir de dados obtidos com SelectAI - leal
|
||||
|
||||
begin
|
||||
dbms_cloud_ai.create_profile(
|
||||
profile_name => 'PROF_26AI_HTML_V1',
|
||||
attributes =>
|
||||
'{"provider": "oci",
|
||||
"credential_name": "OCI_CRED",
|
||||
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaakvd4bq4b3n7yn3gjjqzfhsl62dec44tjvi2iwa3sugw5frgfpzea",
|
||||
"region": "us-chicago-1",
|
||||
"model": "meta.llama-4-maverick-17b-128e-instruct-fp8",
|
||||
"oci_apiformat": "GENERIC",
|
||||
"object_list": [
|
||||
{"owner": "AICHAT1", "name":"TB_26AI_HTML"}
|
||||
],
|
||||
"comments": true,
|
||||
"annotations": true,
|
||||
"temperature": 0.1
|
||||
}'
|
||||
);
|
||||
end;
|
||||
|
||||
*/
|
||||
|
||||
v_pre_prompt clob;
|
||||
v_prompt clob;
|
||||
params_genai CLOB;
|
||||
output CLOB;
|
||||
v_response clob;
|
||||
v_response_sql clob;
|
||||
v_pre_prompt2 clob;
|
||||
v_select_ai_preprompt varchar2(4000) := ' . Não adicione nenhum filtro de data a menos que seja solicitado.';
|
||||
v_select_ai_profile varchar2(20) := 'PROF_26AI_HTML_V1';
|
||||
--
|
||||
-- Modo debug
|
||||
--
|
||||
v_select_ai_debug_flag varchar2(1) := 'N';
|
||||
|
||||
BEGIN
|
||||
|
||||
begin
|
||||
SELECT DBMS_CLOUD_AI.GENERATE(prompt => p_query || v_select_ai_preprompt ,
|
||||
profile_name => v_select_ai_profile,
|
||||
action => 'runsql') response
|
||||
into v_response;
|
||||
|
||||
if v_select_ai_debug_flag = 'Y' then
|
||||
SELECT DBMS_CLOUD_AI.GENERATE(prompt => p_query || v_select_ai_preprompt ,
|
||||
profile_name => v_select_ai_profile,
|
||||
action => 'showsql') response
|
||||
into v_response_sql;
|
||||
end if; -- fim v_select_ai_debug_flag
|
||||
|
||||
if v_response like 'Sorry%' or v_response like 'No data found%' then
|
||||
v_response := '--' ;
|
||||
end if;
|
||||
exception
|
||||
when others then
|
||||
v_response := '-' ;
|
||||
end;
|
||||
|
||||
--
|
||||
-- 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
|
||||
--
|
||||
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"}'; --
|
||||
|
||||
|
||||
-- augmented prompt atraves do vetor criado no banco
|
||||
v_pre_prompt := 'Você é um Desenvolvedor Front-End especialista em HTML5 semântico e acessível (WCAG).
|
||||
Seu objetivo é criar estruturas HTML que sejam bem organizadas, lógicas e otimizadas para motores de busca (SEO).
|
||||
#### REGRA: somente o HTML deve ser retornado.
|
||||
#### EXEMPLO:
|
||||
<!DOCTYPE html>
|
||||
<html lang="pt-br">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Data Dashboard</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
.main-color {
|
||||
color: #007bff;
|
||||
}
|
||||
.chart-container {
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-fluid p-4">
|
||||
<h1 class="main-color">Data Dashboard</h1>
|
||||
<h4 class="text-secondary">Overview of Data</h4>
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-3">
|
||||
<div class="card border-0 shadow">
|
||||
<div class="card-body text-center">
|
||||
<h5 class="card-title">Total Transações</h5>
|
||||
<h2 class="main-color">63,459,400</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card border-0 shadow">
|
||||
<div class="card-body text-center">
|
||||
<h5 class="card-title">Modalidades</h5>
|
||||
<h2 class="main-color">5</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card border-0 shadow">
|
||||
<div class="card-body text-center">
|
||||
<h5 class="card-title">Mês/Ano</h5>
|
||||
<h2 class="main-color">9</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card border-0 shadow">
|
||||
<div class="card-body text-center">
|
||||
<h5 class="card-title">Total Meses</h5>
|
||||
<h2 class="main-color">9</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-12">
|
||||
<div class="card border-0 shadow">
|
||||
<div class="card-body">
|
||||
<canvas class="chart-container" id="lineChart"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-12">
|
||||
<div class="card border-0 shadow">
|
||||
<div class="card-body">
|
||||
<table id="table" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>MES_ANO</th>
|
||||
<th>MODAL</th>
|
||||
<th>TRANSACOES</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>12025</td>
|
||||
<td>BRT</td>
|
||||
<td>642,600</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>12025</td>
|
||||
<td>Ônibus</td>
|
||||
<td>1,800,000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const data = [
|
||||
{''ID'': 1, ''MES_ANO'': ''12025'', ''MODAL'': ''BRT'', ''TRANSACOES'': 642600},
|
||||
{''ID'': 2, ''MES_ANO'': ''12025'', ''MODAL'': ''Ônibus'', ''TRANSACOES'': 1800000},
|
||||
{''ID'': 3, ''MES_ANO'': ''12025'', ''MODAL'': ''Van'', ''TRANSACOES'': 167300},
|
||||
{''ID'': 4, ''MES_ANO'': ''92025'', ''MODAL'': ''VLT'', ''TRANSACOES'': 984400}
|
||||
];
|
||||
|
||||
new Chart(document.getElementById(''lineChart'').getContext(''2d''), {
|
||||
type: ''line'',
|
||||
data: {
|
||||
labels: data.map(item => `${item.MES_ANO} - ${item.MODAL}`),
|
||||
datasets: [{
|
||||
label: ''Transações'',
|
||||
data: data.map(item => item.TRANSACOES),
|
||||
backgroundColor: ''rgba(0, 123, 255, 0.2)'',
|
||||
borderColor: ''rgba(0, 123, 255, 1)'',
|
||||
borderWidth: 1
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
scales: {
|
||||
y: {
|
||||
beginAtZero: true
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
#### TAREFA 1: GERAÇÃO DE CÓDIGO HTML ####
|
||||
Se a entrada do usuário for uma solicitação para criar um dashboard, sua saída DEVE seguir o seguinte formato:
|
||||
- A saída conterá APENAS o código HTML.
|
||||
- Crie insigths dos dados, exiba de forma com foco na inovação para surpreender o usuário.
|
||||
- Não inclua explicações, texto introdutório, saudações ou blocos de Markdown como ```html.
|
||||
- O código deve ser bem formatado, com indentação clara e usar tags semânticas (como <main>, <article>, <nav>, etc.).
|
||||
- O insigth principal deve ser sempre exibido.
|
||||
#### Sugestões:
|
||||
1- Para prompt como "qual volume de transacao por mes?" traga no insigth o valor total do período.
|
||||
2- Para prompt como "qual volume de transação por modalidade?" traga no insight o maior valor e menor valor encontrado entre as modalidades.
|
||||
Dados que devem ser utilizados na criação do dashborad HTML: ';
|
||||
|
||||
v_pre_prompt2 := '{ "role": "user","content": "Dados": ' || v_response || ' "Pergunta": ' || p_query || '"}' ; -- sem ]'
|
||||
|
||||
v_prompt := v_pre_prompt || v_pre_prompt2 || ']';
|
||||
|
||||
output := dbms_vector_chain.utl_to_generate_text( replace(replace(replace(replace(v_prompt,chr(10),null),chr(13),null),'"',''),'''','') , json(params_genai));
|
||||
|
||||
|
||||
RETURN output;
|
||||
|
||||
END;
|
||||
/
|
||||
176
fnc_26ai_query_insights_list.sql
Normal file
176
fnc_26ai_query_insights_list.sql
Normal file
@@ -0,0 +1,176 @@
|
||||
create or replace function FNC_26ai_query_INSIGHTS_LIST(p_query_id IN VARCHAR2,
|
||||
p_comp_id in varchar2,
|
||||
p_credential in varchar2 default 'OCI_CRED')
|
||||
return t_26ai_array pipelined parallel_enable
|
||||
as
|
||||
l_sql VARCHAR2(4000) ;
|
||||
|
||||
l_cursor_id INTEGER;
|
||||
l_desc_tab dbms_sql.desc_tab;
|
||||
l_col_cnt INTEGER;
|
||||
|
||||
v_labels clob;
|
||||
v_label_char varchar2(400);
|
||||
v_label_number varchar2(400);
|
||||
v_label_date varchar2(400);
|
||||
|
||||
v_str_to_llm clob;
|
||||
v_insigths clob;
|
||||
|
||||
v_has number ;
|
||||
-- funcao pipeline de retorno
|
||||
v_id number := 0 ;
|
||||
v_array t_26ai_array := t_26ai_array();
|
||||
|
||||
v_ignore_group varchar2(1);
|
||||
|
||||
begin
|
||||
|
||||
begin
|
||||
select query_text
|
||||
into l_sql
|
||||
from TB_26AI_QUERY_HISTORY
|
||||
where query_id = p_query_id;
|
||||
|
||||
v_has := 1;
|
||||
|
||||
exception
|
||||
when no_data_found then
|
||||
v_has := 0 ;
|
||||
dbms_output.put_line(' Registro nao existente para a query ');
|
||||
end;
|
||||
|
||||
if v_has = 1 then
|
||||
|
||||
--
|
||||
-- rotina de identificacao de grupos (data types) baseado nos tipos de dados nas colunas da consulta
|
||||
--
|
||||
BEGIN
|
||||
|
||||
v_ignore_group := 'N';
|
||||
|
||||
l_cursor_id := DBMS_SQL.OPEN_CURSOR;
|
||||
dbms_sql.parse(l_cursor_id, l_sql, dbms_sql.native);
|
||||
dbms_sql.describe_columns(l_cursor_id, l_col_cnt, l_desc_tab);
|
||||
|
||||
FOR i IN 1..l_col_cnt LOOP
|
||||
|
||||
if l_desc_tab(i).col_type not in (2,12) then -- varchar2
|
||||
v_str_to_llm := v_str_to_llm || 'Column ' || i || ' Data Type VARCHAR2: ' || l_desc_tab(i).col_name || ', ';
|
||||
v_label_char := v_label_char || l_desc_tab(i).col_name || ', ';
|
||||
|
||||
elsif l_desc_tab(i).col_type = 2 then -- number
|
||||
v_str_to_llm := v_str_to_llm || 'Column ' || i || ' Data Type NUMBER: ' || l_desc_tab(i).col_name || ', ';
|
||||
v_label_number := v_label_number || l_desc_tab(i).col_name || ', ';
|
||||
|
||||
elsif l_desc_tab(i).col_type = 12 then -- date
|
||||
v_str_to_llm := v_str_to_llm || 'Column ' || i || ' Data Type DATE: ' || l_desc_tab(i).col_name || ', ';
|
||||
v_label_date := v_label_date || l_desc_tab(i).col_name || ', ';
|
||||
|
||||
end if;
|
||||
END LOOP;
|
||||
v_labels := 'Colunas: (' || v_label_char || v_label_number || v_label_date || ')';
|
||||
v_labels := replace(v_labels,', )',')');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
v_ignore_group := 'Y';
|
||||
dbms_output.put_line( sqlerrm );
|
||||
END;
|
||||
|
||||
v_insigths := FNC_26AI_RAG('O SQL executado no Oracle para referência: ' || l_sql || '.' ||
|
||||
'Colunas e data types: ' || v_str_to_llm || '.' ||
|
||||
' As colunas são classificadas de 2 tipos:' ||
|
||||
' Quantificadores: São entidades, fazem a contagem de alguma informação, são as colunas de agru-padores. Ela é a informação para ser analisar.' ||
|
||||
' O "Geral" será sempre implícito.' ||
|
||||
' Totalizadores: Fazem a totalização de uma informação, baseada na soma, média, mínimo, máximo, etc.' ||
|
||||
' O treinamento da IA precisa ser feito para que ela compreenda que colunas de tabelas que:' ||
|
||||
' As que iniciam com "cd_" e que são PK, são quantificadores/entidades.' ||
|
||||
' As que iniciam com "dt_" e tem tipo date/datetime/timestamp são informações de uma data, que se pode quebar a informação em dia, mês, ano e dia da semana' ||
|
||||
' As que iniciam com "qt_" ou possuem "quantidade", "qtde" e são de tipos numéricos (inteiro ou decimais) são informações totalizadoras.' ||
|
||||
' As que iniciam com "vl" ou possuem "valor" e são de tipos numéricos (inteiro ou decimais) são in-formações totalizadoras.' ||
|
||||
' Basicamente terá um padrão de nomes. Comentários nas colunas no banco podem ajudar na formatação do resultado do insight, conforme visto mais adiante.' ||
|
||||
' Os totalizadores compostos são totais extraídos da soma de várias colunas Totalizadoras. Por exemplo, uma consulta que possui as colunas "icms", "ipi", "pis", "cofins" ' ||
|
||||
' irão possuir os totalizadores conforme vistos antes, com agrupamentos também conforme vistos antes. No entanto, poderá haver também um totalizador composto chamado ' ||
|
||||
' "Valor dos impostos" que será o resultado da soma desses 4 impostos. Esse totalizador composto é também pode aplicar totalizações pelas colunas Quantificadores ' ||
|
||||
' (Valor de impostos por geral, Valor de impostos por cd_material, etc).' ||
|
||||
' Tipos de insights' ||
|
||||
' Os exemplos anteriores baseiam-se em totalizações por soma, média, mínimo e máximo. Esses exemplos foram simplificados para compreendimento do funcionamento.' ||
|
||||
' Avançando nesse sentido, para que os insights possam gerar informações de alto nível, outros cálculos de estatística descritiva podem ser adicionados, como média, ' ||
|
||||
' mediana, moda e desvio padrão, bem como técnicas estatísticas de detecção de anomalias, como granularidades horária, diária, semanais e mensais, além de muitas' ||
|
||||
' outras utilizadas normalmente em dashboard de BI’s.' ||
|
||||
' Considerando os exemplos que vimos anteriormente, poderão ser gerados insights automáticos para fornecer informações que responderiam as seguintes análises:' ||
|
||||
' Qual material eu mais movimento?' ||
|
||||
' Qual dia da semana mais movimento materiais?' ||
|
||||
' Qual a variação percentual entre o valor mínimo e o máximo do material "X"?' ||
|
||||
' Qual o maior desvio entre a quantidade do material "Y";' ||
|
||||
' Qual o maior e menor intervalo de tempo de movimentação de um material?' ||
|
||||
' Exemplo de insight:' ||
|
||||
' ID: 1' ||
|
||||
' Insight: Contagem por cd_material' ||
|
||||
' Informação: count(*)' ||
|
||||
' Como: group by cd_material' ||
|
||||
' Por exemplo: para o Oracle SQL "SELECT CD_MOVIMENTO, DT_MOVIMENTO, CD_MATERIAL, QUANTIDADE, VALOR FROM ESMOVIME" ' ||
|
||||
' Temos: ' ||
|
||||
' QUANTIFICADOR: select CD_MOVIMENTO, count(*) FROM ESMOVIME group by CD_MOVIMENTO ' ||
|
||||
' TOTALIZADOR: select max(QUANTIDADE), min(QUANTIDADE), avg(QUANTIDADE), sum(QUANTIDADE) FROM ESMOVIME ' ||
|
||||
' Gere insigths deste tipo, incluindo composicao de colunas para que seja possivel gerar maior numero de insigths possivel: ' ||
|
||||
case
|
||||
when v_ignore_group = 'N' then
|
||||
' Composição de colunas VARCHAR2: ' || v_label_char || ' ' ||
|
||||
' Composição de colunas NUMBER: ' || v_label_number || ' ' ||
|
||||
' Composição de colunas DATE: ' || v_label_date
|
||||
end ||
|
||||
' O resultado deve ser um documento em JSON, com atributos: "tipo" (totalizador ou quantificador), ' ||
|
||||
' "descricao" (se será uma contagem, soma, média, e sobre qual colunas ou colunas), "insigth", "informacao" ' ||
|
||||
' (descrição de como realizar o insight), "sql" (comando). ' ||
|
||||
' Exemplo de JSON e sua estrutura: ' ||
|
||||
'{ "tipo": "quantificador", ' ||
|
||||
' "descricao": "Contagem por CD_MOVIMENTO", ' ||
|
||||
' "insight": "Contagem de movimentos", ' ||
|
||||
' "informacao": "Count(*)", ' ||
|
||||
' "sql": "SELECT CD_MOVIMENTO, COUNT(*) FROM ESMOVIME GROUP BY CD_MOVIMENTO" } ' ||
|
||||
' Certifique-se de que o JSON gerado não contenha comentários, caracteres extras ou ' ||
|
||||
' qualquer outro elemento que invalide o JSON.', p_credential,p_comp_id);
|
||||
|
||||
|
||||
else -- v_has = 0
|
||||
|
||||
dbms_output.put_line(' Insights ja existem para SQL ' || p_query_id );
|
||||
|
||||
end if;
|
||||
|
||||
|
||||
dbms_output.put_line(v_insigths);
|
||||
|
||||
-- retorno da funcao pipeline
|
||||
for r1 in ( SELECT jt.tipo, jt.descricao, jt.insight, jt.informacao, jt.sql_query, p_query_id, sysdate
|
||||
FROM JSON_TABLE(
|
||||
replace( substr( v_insigths,
|
||||
instr( v_insigths , '```' ) + 3,
|
||||
instr( v_insigths , '```',1,2) - instr( v_insigths , '```' ,1,1) - 3
|
||||
) , 'json', '')
|
||||
,
|
||||
'$[*]' COLUMNS (
|
||||
tipo VARCHAR2(50) PATH '$.tipo',
|
||||
descricao VARCHAR2(255) PATH '$.descricao',
|
||||
insight VARCHAR2(255) PATH '$.insight',
|
||||
informacao VARCHAR2(255) PATH '$.informacao',
|
||||
sql_query VARCHAR2(1000) PATH '$.sql'
|
||||
)
|
||||
) jt ) loop
|
||||
v_id := v_id + 1;
|
||||
v_array.extend;
|
||||
v_array(v_array.last) := t_26ai_insight_record(v_id,
|
||||
r1.tipo ,
|
||||
r1.descricao ,
|
||||
r1.insight ,
|
||||
r1.informacao ,
|
||||
r1.sql_query,
|
||||
p_query_id,
|
||||
sysdate);
|
||||
PIPE ROW( v_array(v_id) );
|
||||
end loop;
|
||||
|
||||
end;
|
||||
/
|
||||
55
fnc_26ai_rag.sql
Normal file
55
fnc_26ai_rag.sql
Normal file
@@ -0,0 +1,55 @@
|
||||
create or replace FUNCTION FNC_26ai_rag (p_ai_prompt IN clob,
|
||||
p_oci_cred IN VARCHAR2 default 'OCI_CRED',
|
||||
p_comp in varchar2
|
||||
)
|
||||
RETURN CLOB AS
|
||||
/*
|
||||
|
||||
Criado por: fernando.leal@oracle.com
|
||||
Data: Oct/2025
|
||||
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
||||
|
||||
v1 - funcao global de RAG com Llama4 - leal
|
||||
|
||||
*/
|
||||
v_gen_ai_endpoint varchar2(500) := 'https://inference.generativeai.us-chicago-1.oci.oraclecloud.com';
|
||||
v_gen_ai_model varchar2(500) := 'meta.llama-4-maverick-17b-128e-instruct-fp8';
|
||||
resp dbms_cloud_types.RESP;
|
||||
BEGIN
|
||||
resp := dbms_cloud.send_request(
|
||||
credential_name => p_oci_cred,
|
||||
uri => v_gen_ai_endpoint || '/20231130/actions/chat',
|
||||
method => dbms_cloud.METHOD_POST,
|
||||
body => utl_raw.cast_to_raw(json_object(
|
||||
'compartmentId' value p_comp,
|
||||
'servingMode' value
|
||||
(json_object(
|
||||
'modelId' value v_gen_ai_model,
|
||||
'servingType' value 'ON_DEMAND'
|
||||
)),
|
||||
'chatRequest' value
|
||||
(json_object(
|
||||
'apiFormat' value 'GENERIC',
|
||||
'messages' value
|
||||
(json_array(JSON_OBJECT(
|
||||
'role' value 'USER',
|
||||
'content' value
|
||||
(json_array(JSON_OBJECT(
|
||||
'type' value 'TEXT',
|
||||
'text' value p_ai_prompt
|
||||
)))
|
||||
))),
|
||||
'temperature' value 0.1,
|
||||
'topK' value -1
|
||||
))
|
||||
))
|
||||
);
|
||||
RETURN json_value( dbms_cloud.get_response_text(resp) , '$.chatResponse.choices[0].message.content[0].text') ;
|
||||
|
||||
-- cuidado: removido 'maxTokens' value 1000 em 14-11-25 leal
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RETURN 'Não foi possível gerar um texto com base nas informações.';
|
||||
END;
|
||||
/
|
||||
Reference in New Issue
Block a user