143 lines
5.6 KiB
SQL
143 lines
5.6 KiB
SQL
create or replace function fnc_26ai_embed( p_string in varchar2,
|
|
p_emb_type in varchar2 default 'COHERE',
|
|
p_credential in varchar2 default 'OCI_CRED')
|
|
return clob
|
|
as
|
|
/*
|
|
|
|
Criado por: fernando.leal@oracle.com
|
|
Data: Oct/2025
|
|
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
|
|
|
v1 - embedding de dados com Cohere On-Demand- leal
|
|
|
|
*/
|
|
v_embedding clob;
|
|
v_string clob;
|
|
v_url VARCHAR2(700) := 'https://inference.generativeai.sa-saopaulo-1.oci.oraclecloud.com/20231130/actions/embedText';
|
|
v_body json_object_t;
|
|
r dbms_cloud_types.resp;
|
|
|
|
begin
|
|
|
|
v_string := replace(replace(replace(p_string,chr(13),' '),chr(10),' '),'"','') ;
|
|
|
|
if p_emb_type = 'ONNX' then
|
|
|
|
/* Carga previa do ONNX ao banco (pre requisito)
|
|
BEGIN
|
|
DBMS_VECTOR.LOAD_ONNX_MODEL_CLOUD(
|
|
model_name => 'multilingual_e5_base',
|
|
credential => 'OCI_CRED',
|
|
uri => 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-poc-rag/o/multilingual-e5-base.onnx',
|
|
metadata => JSON('{"function" : "embedding", "embeddingOutput" : "embedding" , "input": {"input": ["DATA"]}}')
|
|
);
|
|
END;
|
|
|
|
BEGIN
|
|
DBMS_VECTOR.DROP_ONNX_MODEL( model_name => 'paraphrase_multilingual');
|
|
END;
|
|
|
|
*/
|
|
|
|
SELECT VECTOR_EMBEDDING( multilingual_e5_base USING v_string AS data ) as embedding
|
|
into v_embedding;
|
|
|
|
elsif p_emb_type = 'COHERE' then
|
|
|
|
|
|
/* CUIDADO: dbms_vector_chain.utl_to_text( v_string ), O utl_to_text usa internamente o Oracle Text Filter (processo externo ctxfilt)
|
|
para converter documentos (PDF, DOCX, etc.) em texto puro.
|
|
O erro DRG-11225: Third-party filter timed out significa que esse processo
|
|
demorou mais que o timeout configurado e foi abortado pelo Oracle. */
|
|
|
|
select embed_vector
|
|
into v_embedding
|
|
from dual
|
|
CROSS JOIN TABLE(
|
|
dbms_vector_chain.utl_to_embeddings(
|
|
-- dbms_vector_chain.utl_to_chunks(
|
|
dbms_vector_chain.utl_to_text( v_string ),
|
|
-- json('{"by":"words","max":"400","overlap":40,"split":"sentence","normalize":"all"}')
|
|
-- ),
|
|
--
|
|
-- json para cohere embedding
|
|
--
|
|
json('{ "provider": "ocigenai",
|
|
"credential_name": "' || p_credential || '",
|
|
"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 VARCHAR2(4000) PATH '$.embed_data',
|
|
embed_vector CLOB PATH '$.embed_vector'
|
|
)
|
|
) AS et;
|
|
|
|
elsif p_emb_type = 'vLLM' then
|
|
|
|
declare
|
|
params clob;
|
|
v_embedding2 vector;
|
|
begin
|
|
|
|
-- Set host to local to disable credential
|
|
-- The provider value must specify openai
|
|
-- https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/utl_to_embedding-and-utl_to_embeddings-dbms_vector_chain.html
|
|
|
|
params := '{
|
|
"provider": "openai",
|
|
"url": "https://hub-gpus.DOMINIO.com.br/embed/v1/embeddings",
|
|
"host": "local",
|
|
"model": "Qwen/Qwen3-Embedding-4B",
|
|
"batch_size": 50}';
|
|
|
|
-- dicas: https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/utl_to_embedding-and-utl_to_embeddings-dbms_vector.html
|
|
|
|
v_embedding2 := dbms_vector_chain.utl_to_embedding( v_string , json(params)) ;
|
|
|
|
v_embedding := TO_CLOB(TO_CHAR( v_embedding2 ) ) ;
|
|
|
|
-- Confirmar resultado
|
|
--DBMS_OUTPUT.PUT_LINE('Dimensões : ' || VECTOR_DIMENSION_COUNT(v_embedding));
|
|
--DBMS_OUTPUT.PUT_LINE('Format : ' || VECTOR_DIMENSION_FORMAT(v_embedding));
|
|
exception
|
|
when OTHERS THEN
|
|
DBMS_OUTPUT.PUT_LINE('Erro: ' || SQLCODE || ' - ' || SQLERRM);
|
|
end;
|
|
|
|
|
|
-- neste tenancy nao tenho o endpoint do COHERE-DEDICATED - leal 17-10-2025
|
|
/* elsif p_emb_type = 'COHERE-DEDICATED' then
|
|
|
|
v_body := json_object_t('{"servingMode":{"servingType":"DEDICATED",
|
|
"endpointId":"ocid1.generativeaiendpoint.oc1.sa-saopaulo-1.amaaaaaaa2b7yriam5myabesz5cyoxez4f266vx656q3lrfwe3a753y5keoq"
|
|
},
|
|
"inputs":["' || v_string || '"],
|
|
"compartmentId":"ocid1.compartment.oc1..aaaaaaaa5ewni44wndu5nwrhbqss4jaoel742xvprjkg64kb7vt7es4utzua"}
|
|
');
|
|
|
|
r := dbms_cloud.send_request(
|
|
credential_name => 'OCI_CRED',
|
|
uri => v_url,
|
|
method => dbms_cloud.method_post,
|
|
body => utl_raw.cast_to_raw(v_body.to_clob),
|
|
headers => json_object('Accept' value 'application/json', 'X-Custom-Header' VALUE 'My-Custom-Value')
|
|
);
|
|
|
|
select jt.embeddings
|
|
into v_embedding
|
|
from dual j,
|
|
json_table( dbms_cloud.get_response_text(r), '$' columns (embeddings clob PATH '$.embeddings[*].vector()') ) jt;
|
|
*/
|
|
end if;
|
|
|
|
return v_embedding;
|
|
|
|
end;
|
|
/ |