Oracle Database 23aiからベクトル検索として「AI Vector Search」が追加されました。
その機能の一つに、画像から説明文を生成するファンクションがあります。
今回は該当ファンクションの「DBMS_VECTOR_CHAIN.UTL_TO_GENERATE_TEXT」を試してみました。
なおその他のファンクションについては下記マニュアルに一覧があります。
Supported Third-Party Provider Operations and Endpoints
また今回は以下のチュートリアルを参考にしました。
Describe Images Using Public REST Providers
検証環境
本検証ではOCIで提供されている Autonomous Database の 23ai (23.6) を利用しました。
またインプットする画像ファイルはOCIの Object Storage に格納しました。
ADBの作成
ADBの作成は下記チュートリアルをご参照ください。
ADBインスタンスを作成してみよう
ちなみに今回はSQLやPL/SQLを実行するツールとして、同チュートリアルに記載されている「データベース・アクション」を利用しています。
DBユーザ作成
データベース・アクションでDBユーザを新規作成します。
ADBの詳細画面から赤枠の「データベース・ユーザ」を選択します。
ユーザー名、パスワード等を入力します。
その際に表領域の割当て、Webアクセス (データベース・アクションの有効化) を下記画像の赤枠の通りに設定します。
ADMINユーザでデータベース・アクションのSQLにログインし、作成したユーザーに権限を付与します。
GRANT DB_DEVELOPER_ROLE to docuser;
GRANT DWROLE to docuser;
GRANT CREATE MINING MODEL TO docuser;
GRANT EXECUTE ON DBMS_CLOUD TO docuser;
GRANT EXECUTE ON DBMS_VECTOR TO docuser;
GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO docuser;
作成したユーザーがREST API実行できるように設定します。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'docuser',
principal_type => xs_acl.ptype_db));
END;
/
以降はデータベース・アクションのSQLに作成したユーザーでログインし、各コマンドを実行していきます。
資格証明の作成
Object Storageにアクセスするための資格証明を作成します。
資格証明の作成に必要なトークンは下記チュートリアルを参照して準備します。
OCIオブジェクトストレージへのアクセス情報を取得
取得したトークンを使って資格証明を作成します。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OBJ_CRED',
username => '<your user name>',
password => '<your access token>'
);
END;
/
次に生成AIモデルを使うための資格証明を作成します。
私はGPT-4oを使ったため、OpenAI向けの資格証明を作成しました。
DECLARE
jo json_object_t;
BEGIN
jo := json_object_t();
jo.PUT('access_token', '<your openai access token>');
DBMS_VECTOR_CHAIN.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
params => json(jo.to_string));
END;
/
インプットする画像をObject Storageにアップロード
Object Storageへアップロードする手順、アップロードしたファイルのURL確認手順は下記チュートリアルをご参照ください。
OCIオブジェクトストレージへのデータアップロード
これで画像から説明文を生成する準備が整いました。
画像から説明文を生成するPL/SQL
以下PL/SQLのコードでGPT-4oに画像をインプットし、説明文を取得して標準出力できます。
declare
input clob;
media_data blob;
media_type varchar2(32);
params clob;
output clob;
begin
input := '画像の内容について説明してください。';
media_type := 'image/jpeg';
params := '{
"provider" : "openai",
"credential_name": "OPENAI_CRED",
"url" : "https://api.openai.com/v1/chat/completions",
"model" : "gpt-4o",
"max_tokens" : 200
}';
-- オブジェクトを取得
media_data := DBMS_CLOUD.GET_OBJECT(
credential_name => 'OBJ_CRED',
object_uri => '<your object url>');
output := dbms_vector_chain.utl_to_generate_text(
input, media_data, media_type, json(params));
dbms_output.put_line(output);
end;
/
出力結果は以下のようになりました。
この画像には、富士山が映し出されています。山の頂上に雲がかかっており、周囲の景色は夕焼けの光に照らされています。山のふもとには湖が広がっており、湖の上には船が浮
かんでいます。背景には澄んだ青空が広がり、美しい自然の風景が描かれています。
GPT-4oの説明文が的確すぎて驚愕しました...
おわりに
23aiのAI Vector Searchを使えばDB内で画像から説明文を生成できることがお分かり頂けたかと思います。
これを使えばECサイトなど画像を大量に扱うシステムで、自動的に説明文を付与してより高精度な検索に活用する、といった仕組みが作れそうですね。
また生成された説明文をベクトル化すれば、画像から意味的に類似した画像を探す、もしくは文章から類似画像を探す、といったマルチモーダル検索も実装できそうです。