はじめに
昨今、マルチモーダル検索(テキスト↔画像の類似度検索)が注目されていますが、実装にはPython環境や推論サーバーの構築が必要でハードルが高いと感じていませんか?
Oracle AI Database 23ai (Autonomous AI Database) を使えば、データベースの中にAIモデル(ONNX)を直接取り込み、SQLだけで推論が可能になります。つまり、APEXなどのローコードツールと組み合わせることで、素早くでAIアプリが開発できます。
今回は、以前の記事「Oracle AI Database 26aiでマルチモーダル検索を実現! ~CLIP ONNXモデルを最速で手に入れる方法~」で作成したCLIPのONNXモデルを、Autonomous AI Database (ADB) 上のAPEXで利用できるようにするための「ONNXモデルのアップロードとロード手順」を解説します。
これができれば、APEXから「テキストで画像を検索」するアプリがすぐに作れるようになります!
ゴール
Autonomous Database (ADB) のAPEXからONNXモデルをロードし、APEXから利用できる状態にする。
前提条件
- ONNXファイルを持っていること
こちらに作成手順が載っています。 - OCIアカウントがあること
- Autonomous AI Database (Always Freeでも可)を使用
- APEXワークスペースを利用
参考リンク
Qiita:
ドキュメント
OCIチュートリアル
1. ONNXをオブジェクト・ストレージへアップロード
まずは、作成したONNXファイルをデータベースがアクセスできる場所(OCI Object Storage)に配置します。
参考:OCIチュートリアル - オブジェクト・ストレージを使う
1-1. オブジェクト・ストレージの作成
OCIコンソールからオブジェクト・ストレージへ移動し、バケットを作成します。ここに .onnx ファイルをアップロードします。



1-2. 事前認証済リクエストの取得
オブジェクトタブに移動し、それぞれのファイルに対して事前認証済リクエストの作成を行います。
まず、画像ベクトル化用のONNXの事前認証済リクエストの作成を行います。



画像をベクトル化するONNXファイル(clip_img.onnx)のURLをコピーします。

次に、テキストベクトル化用のONNXの事前認証済リクエストの作成を行います。


テキストをベクトル化するONNXファイル(clip_img.onnx)のURLをコピーします。

ここで取得したURLはなくさないようにメモ帳などに張り付けて取っておきましょう。
1-2. 認証情報の準備(APIキー/Auth Token)
データベースからオブジェクトストレージにアクセスするための認証情報を作成します。ユーザー設定からAPIキーまたはAuth Tokenを発行し、OCIDや秘密鍵などを控えておきます。
ポイント
この後、ADB側でクレデンシャルを作成する際に、ここで取得したOCIDやフィンガープリント、秘密鍵の中身を使用します。
次に、APIキー > APIキーの追加をクリックします。

秘密キーをダウンロードします。

構成ファイルのプレビューの内容を保存しておきます。

オブジェクト・ストレージのURL(text用とimg用で2つ)、構成ファイルのプレビューの内容、秘密キーの内容を全てメモ帳などに張り付けて、すぐに使えるようにしておきます。
2. Autonomous AI Database (ADB) 作成
ベースとなるADBを作成します。26aiを選択します。
参考:ADBインスタンスを作成してみよう
2-1. Autonomous AI Databaseの作成
OCIコンソール画面からAutonomous AI Databaseを選択/作成します。

下記の項目を記入していきます。
- 表示名:分かりやすい名前にします
- データベース名:分かりやすい名前にします
- ワークロード・タイプ:トランザクション処理
- Always Free:無償枠を利用したい場合はONにします。
- データベース・バージョンの選択:26ai
- ECPU数:自由(節約のため1を記入)
- 自動スケーリング:自由(節約のためOFF)
- ストレージ:自由(節約のため100GB)
- パスワード:自由
Oracle AI DatabaseでAI機能を存分に活用するために26aiを選択しましょう!
3. APEXワークスペースの作成と権限付与
3-1. APEXワークスペースの作成
ADB付属のAPEXを利用するためのセットアップを行います。
まず、Autonomous AI Databaseのコンソール画面から
データベース・アクション > すべてのデータベース・アクションの表示を選択し、
開発タブからAPEXをクリックして開きます。


先ほど作成したAutonomous AI Databaseの管理用パスワードを記入します。

ワークスペースを作成します。
3-2. 必要な権限の付与
画面右上のスキーマを確認します。
私の場合、「WKSP_MULTIMODALADB」となっています。後程この情報を使います。

OCIコンソール画面のAutonomous AI Databaseの画面から
データベース・アクション > すべてのデータベース・アクションの表示
を選択します。
開発タブからSQLを選択します。
Database Actions (SQL) を開き、ADMINユーザーで実行してください。
下記のSQLでWKSP_MULTIMODALADBに対して権限付与を行います。
これは先ほど確認したSQLワークショップの画面右上に記載されていたスキーマ名となります。
GRANT RESOURCE to WKSP_MULTIMODALADB;
GRANT DB_DEVELOPER_ROLE to WKSP_MULTIMODALADB;
GRANT EXECUTE ON DBMS_CLOUD TO WKSP_MULTIMODALADB;
GRANT EXECUTE ON DBMS_VECTOR TO WKSP_MULTIMODALADB;
GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO WKSP_MULTIMODALADB;
GRANT CREATE ANY DIRECTORY TO WKSP_MULTIMODALADB;
ALTER USER WKSP_MULTIMODALADB QUOTA UNLIMITED ON DATA;
3-3. クレデンシャルの作成
APEXの設定画面に戻り、SQLワークショップ > SQLコマンドに移動します。

下記のSQLを実行します。
この情報は1-2. で取得したメモ帳に記載した情報をあてはめます。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OBJ_STORE_CRED',
user_ocid => 'OCIユーザーのOCID',
tenancy_ocid => 'OCIテナンシーのOCID',
private_key => '秘密鍵',
fingerprint => 'フィンガープリント'
);
END;
/
4. ONNXのアップロードとデータベースへのロード
いよいよONNXモデルをデータベース内に取り込みます。
4-1. ディレクトリの作成
ファイルを一時保存するディレクトリ・オブジェクトを作成します。
参考ドキュメント
CREATE DIRECTORY staging AS 'stage';
4-2. オブジェクトストレージからファイルをGET
DBMS_CLOUD.GET_OBJECT を使い、先ほどアップロードしたONNXファイルをDBサーバー上のディレクトリ(stage)にコピーします。
BEGIN
DBMS_CLOUD.GET_OBJECT(
credential_name => 'OBJ_STORE_CRED',
object_uri => 'オブジェクトストレージ上のclip_imgのONNXモデルファイルのURL',
directory_name => 'staging',
file_name => 'clip_img.onnx'
);
DBMS_CLOUD.GET_OBJECT(
credential_name => 'OBJ_STORE_CRED',
object_uri => 'オブジェクトストレージ上のclip_textのONNXモデルファイルのURL',
directory_name => 'staging',
file_name => 'clip_txt.onnx'
);
END;
/
確認:
SELECT OBJECT_NAME, CREATED FROM TABLE(DBMS_CLOUD.LIST_FILES('staging'));
4-3. ONNXモデルをIn-Databaseモデルとしてロード
DBMS_VECTOR.LOAD_ONNX_MODEL を実行すると、DBがONNXを解析し、SQLから使える関数として登録してくれます。
BEGIN
DBMS_VECTOR.LOAD_ONNX_MODEL(
'staging',
'clip_txt.onnx',
'CLIP_TXT_MODEL',
json('{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}')
);
DBMS_VECTOR.LOAD_ONNX_MODEL(
'staging',
'clip_img.onnx',
'CLIP_IMG_MODEL',
json('{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}')
);
END;
/
正しくロードされたか確認してみましょう。
SELECT MODEL_NAME, MINING_FUNCTION,
ALGORITHM, ALGORITHM_TYPE, round(MODEL_SIZE/1024/1024) MB FROM user_mining_models;
CLIP_TXT_MODEL と CLIP_IMG_MODEL が表示されていれば成功です!
5. APEXでの確認(ベクトル・プロバイダへの登録)
最後に、APEXの「ベクトル・プロバイダ」から、ロードしたモデルが見えているか確認します。
APEXワークスペースにログイン
アプリケーション・ビルダー > ワークスペース・ユーティリティ > すべてのワークスペース・ユーティリティ
ベクトル・プロバイダを選択
ここで「作成」をクリックし、プロバイダ・タイプでデータベースONNXモデルを選択すると、先ほどロードした CLIP_IMG_MODEL や CLIP_TXT_MODEL が選択肢として現れるはずです!
これで、APEXから、これらのモデルを使ってベクトル化ができるようになりました。
画像用のベクトル化モデル(CLIP_IMG_MODEL)とテキスト用のベクトル化モデル(CLIP_IMG_MODEL)によって、画像もテキストも同じベクトル空間上にベクトル化されます。
これによってテキスト↔テキスト、画像↔画像、画像↔テキストの類似度検索が可能になります。
おわりに
今回は、ONNXモデルをOracle AI Autonomous Databaseにロードし、APEXで利用可能にするまでの手順を紹介しました。
これができれば、あとはAPEX側で
- 画像をアップロードする
- CLIP_IMG_MODEL でベクトル化して保存
- 検索ワードを CLIP_TXT_MODEL でベクトル化して検索
というフローを組むだけで、マルチモーダル検索アプリの完成です。
外部APIを叩く必要がないので、セキュリティ的にも堅牢で、レスポンスも高速です。
ぜひ、データベース内のAIで遊んでみてください!






























