Upload files to "/"
This commit is contained in:
192
fnc_26ai_food.sql
Normal file
192
fnc_26ai_food.sql
Normal file
@@ -0,0 +1,192 @@
|
||||
create or replace function fnc_26ai_food( p_image_id in number,
|
||||
p_comp_id in varchar2,
|
||||
p_credential in varchar2 default 'OCI_CRED')
|
||||
return clob
|
||||
as
|
||||
/*
|
||||
|
||||
Criado por: fernando.leal@oracle.com
|
||||
Data: Oct/2025
|
||||
Objetivo: demonstrar casos de uso de Food & Nutrition
|
||||
|
||||
v1 - Food & Nutrition leal
|
||||
|
||||
-- PDF
|
||||
|
||||
BEGIN
|
||||
DBMS_CLOUD.GET_OBJECT(
|
||||
credential_name => 'OCI_CRED',
|
||||
object_uri => 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-database-26ai/o/food02.pdf',
|
||||
directory_name => 'DATA_PUMP_DIR');
|
||||
END;
|
||||
|
||||
-- Embedding:
|
||||
|
||||
CREATE TABLE "TB_26AI_FOOD_VECTOR"
|
||||
( "EMBED_ID" NUMBER,
|
||||
"EMBED_DATA" VARCHAR2(4000),
|
||||
"EMBED_VECTOR" VECTOR,
|
||||
"DOC_ORIGEM" VARCHAR2(200)
|
||||
) ;
|
||||
|
||||
CREATE TABLE "TB_26AI_FOOD"
|
||||
( "ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 66 CACHE 20 ORDER NOCYCLE NOKEEP NOSCALE NOT NULL ENABLE,
|
||||
"FILE_NAME" VARCHAR2(200),
|
||||
"FILE_MIMETYPE" VARCHAR2(200),
|
||||
"FILE_CHARSET" VARCHAR2(200),
|
||||
"FILE_BLOB" BLOB,
|
||||
"UPDATED_DATE" DATE,
|
||||
CREATED_BY varchar2(200) default 'ADMIN'
|
||||
) ;
|
||||
|
||||
|
||||
INSERT INTO "TB_26AI_FOOD_VECTOR"
|
||||
select embed_id,
|
||||
text_chunk,
|
||||
embed_vector,
|
||||
'guia_alimentar_populacao_brasileira_2ed.pdf'
|
||||
from dual dt
|
||||
CROSS JOIN TABLE(
|
||||
dbms_vector_chain.utl_to_embeddings(
|
||||
dbms_vector_chain.utl_to_chunks(
|
||||
-- PDF Embrapa - Doencas no cultivo da Soja
|
||||
dbms_vector_chain.utl_to_text( to_blob(bfilename('DATA_PUMP_DIR', 'guia_alimentar_populacao_brasileira_2ed.pdf')) ),
|
||||
json('{"by":"words","max":"100","split":"sentence","normalize":"none", "overlap":0}')
|
||||
),
|
||||
json('{
|
||||
"provider": "ocigenai",
|
||||
"credential_name": "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 CLOB PATH '$.embed_data',
|
||||
embed_vector CLOB PATH '$.embed_vector'
|
||||
)
|
||||
) AS et;
|
||||
|
||||
|
||||
INSERT INTO "TB_26AI_FOOD_VECTOR"
|
||||
select embed_id,
|
||||
text_chunk,
|
||||
embed_vector,
|
||||
'food02.pdf'
|
||||
from dual dt
|
||||
CROSS JOIN TABLE(
|
||||
dbms_vector_chain.utl_to_embeddings(
|
||||
dbms_vector_chain.utl_to_chunks(
|
||||
dbms_vector_chain.utl_to_text( to_blob(bfilename('DATA_PUMP_DIR', 'food02.pdf')) ),
|
||||
json('{"by":"words","max":"150","split":"newline","sentence":"none", "overlap":0}')
|
||||
),
|
||||
json('{
|
||||
"provider": "ocigenai",
|
||||
"credential_name": "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 CLOB PATH '$.embed_data',
|
||||
embed_vector CLOB PATH '$.embed_vector'
|
||||
)
|
||||
) AS et;
|
||||
|
||||
|
||||
|
||||
INSERT INTO "TB_26AI_FOOD_VECTOR"
|
||||
select embed_id,
|
||||
text_chunk,
|
||||
embed_vector,
|
||||
'guia_alimentar_cardapios.pdf'
|
||||
from dual dt
|
||||
CROSS JOIN TABLE(
|
||||
dbms_vector_chain.utl_to_embeddings(
|
||||
dbms_vector_chain.utl_to_chunks(
|
||||
dbms_vector_chain.utl_to_text( to_blob(bfilename('DATA_PUMP_DIR', 'guia_alimentar_cardapios.pdf')) ),
|
||||
json('{"by":"words","max":"120","split":"sentence","normalize":"none", "overlap":0}')
|
||||
),
|
||||
json('{
|
||||
"provider": "ocigenai",
|
||||
"credential_name": "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 CLOB PATH '$.embed_data',
|
||||
embed_vector CLOB PATH '$.embed_vector'
|
||||
)
|
||||
) AS et;
|
||||
|
||||
|
||||
*/
|
||||
messages CLOB;
|
||||
v_vector clob;
|
||||
p_prompt clob;
|
||||
p_prompt2 clob;
|
||||
v_total_calorias varchar(200);
|
||||
begin
|
||||
|
||||
SELECT json_value( fnc_26ai_embed_image_cohere(file_name, file_blob, p_credential, p_comp_id) , '$.embeddings[*].vector()')
|
||||
INTO v_vector
|
||||
from TB_26AI_FOOD
|
||||
where id = p_image_id;
|
||||
|
||||
for message_cursor in (
|
||||
|
||||
SELECT embed_data, doc_origem
|
||||
FROM TB_26AI_FOOD_VECTOR
|
||||
ORDER BY VECTOR_DISTANCE(EMBED_VECTOR, v_vector , COSINE )
|
||||
FETCH EXACT FIRST 60 ROWS ONLY
|
||||
|
||||
) loop
|
||||
|
||||
messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data || '- Fonte:' || message_cursor.doc_origem ,chr(10),null),chr(13),null),'"',''),'''','') || '",' ;
|
||||
|
||||
END LOOP;
|
||||
|
||||
p_prompt := 'Você é um analista de nutrição profissional especializado em avaliar refeições usando entradas de imagem e em recuperar informações nutricionais utilizando RAG a partir do Oracle 26ai Vector Database.
|
||||
Sua tarefa:
|
||||
Analisar a imagem de entrada.
|
||||
Identificar cada item alimentar no prato.
|
||||
Estimar tamanhos de porções.
|
||||
Inferir ingredientes ocultos (óleo, manteiga, molhos, açúcar, sal).
|
||||
Gerar embeddings.
|
||||
Converter cada item alimentar detectado em uma descrição textual normalizada (adequada para embeddings).
|
||||
Exemplo: “peito de frango grelhado 120g”, “arroz branco 150g”, “salada verde 80g com molho”.
|
||||
Executar a Vector Similarity Search.
|
||||
Recuperar os fatos nutricionais mais próximos do repositório vetorial.
|
||||
Dados típicos retornados:
|
||||
calorias;
|
||||
proteínas;
|
||||
carboidratos;
|
||||
gorduras;
|
||||
fibras;
|
||||
densidade de micronutrientes;
|
||||
impacto glicêmico;
|
||||
Consulte a base da TBCA para obter a composição nutricional (macronutrientes, micronutrientes, fibras, etc.) - Tabela Brasileira de Composição de Alimentos, versão 7.3. São Paulo: USP; 2025.
|
||||
Combine os resultados do RAG com sua própria estimativa visual.
|
||||
Quando dados estiverem faltando, estime valores de forma conservadora.
|
||||
Sua resposta deve sempre estar totalmente fundamentada nos dados retornados pelo RAG quando disponíveis.
|
||||
Se o RAG não retornar nenhuma correspondência, declare explicitamente "fonte": "estimativa visual". Responda em formato Markdown e portugues Brasil.';
|
||||
|
||||
-- cuidado com temperatura usando "." ou ","
|
||||
--execute immediate('alter session set nls_numeric_characters=''.,'' ');
|
||||
|
||||
-- sem re-rank (opcao de uso para refinar resultado)
|
||||
p_prompt2 := p_prompt || '. Dados privados encontrados: ' || messages || '. Cite o documento de origem dos dados.';
|
||||
|
||||
return fnc_26ai_rag_food(p_prompt2 , p_credential , p_image_id, p_comp_id );
|
||||
|
||||
end;
|
||||
/
|
||||
Reference in New Issue
Block a user