はじめに
Data Transformsの演算子でベクトル埋め込みができるようになりました。ということで試してみます。
Use Text Embedding Vector in a Data Flow
前提
- Autonomous Databaseを23aiで構築済み
- データベース・ユーザーDEMOUSER1を作成し、DWROLEを付与済み
- OCIユーザー、コンパートメント、テナンシーのOCIDを確認済み。またOCIユーザーでAPI署名キー・ペアを作成し、秘密キー、フィンガープリントを確認済み(OCI Generative AIのアクセスに必要)
- 2025/6時点で試した情報です
データベースにサンプル表を作成
ADMINユーザーでDatabase Actionsにログインし、データロードでサンプルデータをロードして表を作成します。
データの中身はこんな感じです。
ADMINユーザーに外部ネットワークへのアクセスを許可
続けて、SQLにアクセスします。以下を実行し、ADMINユーザーに外部ネットワークへのアクセスを許可します。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'admin',
principal_type => xs_acl.ptype_db));
END;
/
完了しました。
Data Transformsでデータフローを作成し、実行
Connectionを編集する
Data TransformsにADMINユーザーでログインします。Connectionでデフォルトで作成されているConnectionを編集し、ADMINで接続できるように設定し、Test Connectionで接続ができることを確認します。
Data Entityを検出する
Data Entityを選択して、Import Data Entitiesをクリックします。
Autonomous DatabaseのConnectionでDEMOUSER1のDEMO_RECIPESを検出します
検出できました。
OCI Generative AIへのConnectionを作成する
ConnectionsでCreate Connectionをクリックし、ServicesからOCI Generative AIを選択し、NEXTをクリックします。
名前にOCI_GENAI_CONN、OCI URLには以下を設定します。
https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText
そのほかのUser OCID、Tenancy OCID、Compartment OCID、Private Key、Fingerprintは適切な値を入力します。
接続の確認をします。Test Connectionをクリックすると、Oracle Connectionの選択画面となりますので、Autonomous DatabaseのConnectionを選択します。
成功することを確認後、Createをクリックして作成します。
データフローを作成する
左のメニューからProjectsを選択し、Create Data Flowをクリックしてデータフローを作成します。
Add a Schemaで利用するスキーマを選択します。ConnectionにAutonomous DatabaseのConnection、SchemaにDEMOUSER1を選択し、OKをクリックします。
Data EntitiyにDEMO_RECIPESが表示されますので、キャンバスにドラッグアンドドロップします。
上のMachine Learningをクリックし、TextEmbeddingVectorをドラッグアンドドロップし、DEMO_RECIPESからリンクします。
TextEmbeddingVectorのプロパティを入力していきます。
Generalでは以下のように設定します。
- AI Service: OCI Generative AI
- Connection: OCI_GENAI(作成したGenerative AIのConnection)
- AI Model: cohere.embed-multilingual-v3.0
Attributeはそのまま
Column Mappingではchunk_dataをドラッグし、input_textとマッピングします。
次にTextEmbeedingVectorの右上の+をクリックします。
Add Data Entityの画面になります。新しい表の設定をしていきます。NameにDEMO_RECIPES_EMBEDと入力し、Nextをクリックします。
新しくVECTOR_EMBEDDINGデータが追加されていることを確認します。Nextをクリックします。
プレビューを確認してSAVEします。
作成したデータ・フローを実行する
実行ボタンをクリックし、データフローを実行してみます。
右下のData Flow StatusがDoneとなり、成功しました!
SQLで検索
ADMINユーザーでDatabase ActionsのSQLにアクセスします
OCI Genrative AIのAPIコール用のクレデンシャルを作成します。OCIユーザー、コンパートメント、テナンシーのOCID、秘密キー、フィンガープリントを適切に指定して以下のSQLを実行します。
declare
jo json_object_t;
begin
-- create an OCI credential
jo := json_object_t();
jo.put('user_ocid', 'ocid1.user.oc1..aaaa***********************');
jo.put('tenancy_ocid', 'ocid1.tenancy.oc1..aaaa****************************************');
jo.put('compartment_ocid', 'ocid1.compartment.oc1..aaaaaa**********************************************************');
jo.put('private_key', '-----BEGIN RSA PRIVATE KEY-----
:
-----END RSA PRIVATE KEY-----');
jo.put('fingerprint', '**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**');
dbms_output.put_line(jo.to_string);
dbms_vector.create_credential(
credential_name => 'OCI_CRED',
params => json(jo.to_string));
end;
/
続けてクエリを実行します。例えば、”さっぱりしたものが食べたい”で検索してみました。
SELECT id, recipe, description
FROM demouser1.demo_recipes_embed
ORDER BY vector_distance(vector_embedding , (SELECT to_vector(et.embed_vector) embed_vector
FROM
dbms_vector_chain.utl_to_embeddings('さっぱりしたものが食べたい',
JSON('{"provider": "ocigenai", "credential_name": "OCI_CRED", "url": "https://inference.generativeai.ap-osaka-1.oci.oraclecloud.com/20231130/actions/embedText", "model": "cohere.embed-multilingual-v3.0"}')) t,
JSON_TABLE (t.column_value, '$[*]'
COLUMNS (
embed_id NUMBER PATH '$.embed_id',
embed_data VARCHAR2 ( 4000 ) PATH '$.embed_data',
embed_vector CLOB PATH '$.embed_vector')) et), COSINE) FETCH EXACT FIRST 4 ROWS ONLY;
さっぱりした料理が出力されました。(ペペロンチーノは違う気がしますが、、)
試していて気づいたことをいくつか
Test Connectionで失敗した場合は、選択したADBにクレデンシャルの残骸が残る
いずれも後で削除しましたが、USER_CREDENTIALSを検索してみると作成した覚えがないTEST_CREDで始まるクレデンシャルが存在。
select * from user_credentials;
CREDENTIAL_NAME USERNAME WINDOWS_DOMAIN COMMENTS ENABLED
------------------------ ---------------------------------------------------------------------------- -------------- ------------------------------------------------------------------------------------- -------
CRED_ADMIN oracleidentitycloudservice/yuka.arashi@oracle.com null {"comments":"Created via DBMS_CLOUD.create_credential"} TRUE
OCI$RESOURCE_PRINCIPAL ADMIN null {"comments":"Created resource principal credential via DBMS_CLOUD.create_credential"} TRUE
OCI_CRED ocid1.user.oc1..aaaaaaaaz56xoppdvh6dgui6v2mes5jbsg2qelcgcv3u227lxqg4bfzzhbaa null {"comments":"Created native credential via DBMS_CLOUD.create_credential"} TRUE
TEST_CRED_2025MAY26_0044 ocid1.user.oc1..aaaaaaaaz56xoppdvh6dgui6v2mes5jbsg2qelcgcv3u227lxqg4bfzzhbaa null {"comments":"Created native credential via DBMS_CLOUD.create_credential"} TRUE
Elapsed: 00:00:00.015
4行が選択されました。
フロー実行時はクレデンシャルを都度作成し、完了すると削除されるよう
作成したデータフローのコードを参照してみると、DT_AI_CREDという名前のクレデンシャルを削除―作成―削除していました。
us-chicago-1では成功するが、ap-osaka-1はInternal Errorになる
まだすべてのリージョンで利用できるというわけではないようです。
TextEmbeddingVectorの入力はCLOBのみのよう
生成されるコードを見るとdbms_vector_chain.utl_to_embeddingを実行していますが、入力がSUBSTR関数で2000文字で区切られていました。そのためSUBSTR関数の入力に利用できない配列の型(VECTOR_ARRAY_T)は使えなさそうです。
おわりに
Data Transformsでベクトルの埋め込みを試してみました。他にもDatabase Actionsのデータ・ロードを呼びだす機能も新しくリリースされていますし、Autonomous Databaseのデータ変換ツールとしてどんどん機能が拡張されているような気がします。