パブリックRESTプロバイダを使用したイメージから埋込みへの変換

サードパーティのサービス・プロバイダであるVertex AIにRESTコールを実行して、イメージから埋込みへの変換を実行します。この例では、マルチモーダル埋込みモデルを使用してイメージとテキストの入力の両方をベクトル化し、両方のコンテンツ・タイプのベクトルを含むベクトル空間を問い合せる方法を確認できます。

イメージに基づいてベクトル埋込みを直接生成できます。このベクトル埋込みは、イメージの分類または検出、大きいイメージのデータセットの比較、またはイメージを含むドキュメントに対するより効果的な類似検索の実行に使用できます。イメージの埋込みを取得するには、Vertex AIでサポートされている任意のイメージ埋込みモデルまたはマルチモーダル埋込みモデルを使用できます。イメージを分析することによって、モデルはイメージの各ビジュアル要素(形状、色、パターン、テクスチャ、アクションまたはオブジェクト)をベクトル表現としてエンコードするイメージ埋込みを生成します。

マルチモーダル埋込みは、テキストやイメージなどの様々なモダリティからデータをベクトル化する手法です。これにより、同じ埋込みモデルを使用して、両方のタイプのコンテンツの埋込みを生成できます。こうすることで、結果の埋込みが互換性を持ち、同じベクトル空間に配置されるため、類似検索で2つのモダリティ(テキストとイメージ)を効果的に比較できます。

ここでは、DBMS_VECTORまたはDBMS_VECTOR_CHAINパッケージのUTL_TO_EMBEDDINGファンクションを使用できます。

警告:

データベースの特定の機能により、たとえば、REST APIへのアクセスを容易にするJSON仕様を使用して、第三者によって個別に提供されるサービスにアクセスできる場合があります。

お客様によるこれらの機能の使用は、お客様自身の責任においてのみ行われ、お客様は、当該第三者サービスの使用に関連するあらゆる条件を遵守する責任を負います。第三者のサービスに関するその他の条件にかかわらず、お客様は、かかるデータベース機能の使用によって、そのリスクを受諾し、当該アクセスにより生じた一切の損害について、Oracleの責任または法的責任を明示的に除外することになります。

類似検索を使用して、特定のイメージまたはテキスト入力に似た鳥を検索するには:

  1. ローカル・ユーザーとして接続し、データ・ダンプ・ディレクトリを準備します。
    1. SQL*PlusにSYSユーザーとしてログインし、SYSDBAとして接続します。
      conn sys/password as sysdba
      CREATE TABLESPACE tbs1
      DATAFILE 'tbs5.dbf' SIZE 20G AUTOEXTEND ON
      EXTENT MANAGEMENT LOCAL
      SEGMENT SPACE MANAGEMENT AUTO;
      SET ECHO ON
      SET FEEDBACK 1
      SET NUMWIDTH 10
      SET LINESIZE 80
      SET TRIMSPOOL ON
      SET TAB OFF
      SET PAGESIZE 10000
      SET LONG 10000
    2. ローカル・ユーザー(docuser)を作成し、必要な権限を付与します。
      drop user docuser cascade;
      create user docuser identified by docuser DEFAULT TABLESPACE tbs1 quota unlimited on tbs1;
      grant DB_DEVELOPER_ROLE to docuser;
    3. イメージ・ファイルを格納するローカル・ディレクトリ(VEC_DUMP)を作成します。必要な権限を付与します。
      create or replace directory VEC_DUMP as '/my_local_dir/';
      grant read, write on directory VEC_DUMP to docuser;
      
      commit;
    4. ローカル・ユーザー(docuser)として接続します:
      conn docuser/password
  2. HTTPプロキシ・サーバーを設定します(構成されている場合)
    EXEC UTL_HTTP.SET_PROXY('<proxy-hostname>:<proxy-port>');
  3. DBMS_NETWORK_ACL_ADMINプロシージャを使用して、ホストへの接続を許可するための接続権限をdocuserに付与します。

    この例では、*を使用して任意のホストを許可します。ただし、接続するホストを明示的に指定できます。

    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;
    /
  4. Vertex AIの資格証明を設定します。

    Vertex AIには、次の認証パラメータが必要です:

    { "access_token": "<access token>" }

    begin
      DBMS_VECTOR_CHAIN.DROP_CREDENTIAL(credential_name  => 'VERTEXAI_CRED');
    exception
      when others then null;
    end;
    /

    ここで、<access token>を独自の値に置き換えます:

    declare
      jo json_object_t;
    begin
      jo := json_object_t();
      jo.put('access_token', '<access token>');
      DBMS_VECTOR_CHAIN.CREATE_CREDENTIAL(
        credential_name   =>  'VERTEXAI_CRED',
        params            => json(jo.to_string));
    end;
    /
  5. リレーショナル表(docs)を作成し、その中にイメージを挿入します。

    後で、問合せイメージをこのデータベースのイメージと比較します。

    ここでは、最初にid列およびcontent列を含むdocs表を作成します。次に、to_blob関数を使用し、VEC_DUMPディレクトリからファイルを読み取って、イメージ・ファイルの内容をBLOBに変換し、content (blob列)に格納します。

    drop table docs;
    create table docs(id number primary key, content blob);
    
    insert into docs(id, content)
    values(1, to_blob(bfilename('VEC_DUMP', 'cat.jpg')));
    insert into docs (id, content)
    values(2, to_blob(bfilename('VEC_DUMP', 'eagle.jpg')));
  6. 問合せイメージ(parrots.jpg)のイメージ埋込みを取得します。

    まず、問合せイメージをVEC_DUMPディレクトリにアップロードします。

    次に、UTL_TO_EMBEDDINGを使用してそのイメージをベクトル化します。ここでは、入力としてparrots.jpg (VEC_DUMPディレクトリへのポインタを使用)、モダリティとしてimageが指定され、Vertex AIのプロバイダ固有の埋込みパラメータはJSONとして渡されます。

    ノート:

    サポートされているすべてのRESTエンドポイントのリストは、「サポートされているサードパーティ・プロバイダの操作およびエンドポイント」を参照してください。
    -- declare embedding parameters
    
    var params clob;
    
    begin
      :params := '
    {
      "provider": "vertexai",
      "credential_name": "VERTEXAI_CRED",
      "url": "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/publishers/google/models/",
      "model": "multimodalembedding:predict"
    }';
    end;
    /
    
    -- get image embedding: PL/SQL example
    
    declare
      v vector;
      output clob;
    begin
      v := dbms_vector_chain.utl_to_embedding(
        to_blob(bfilename('VEC_DUMP', 'parrots.jpg')), 'image', json(:params));
      output := vector_serialize(v);
      dbms_output.put_line('vector data=' || dbms_lob.substr(output, 100) || '...');
    end;
    /
    
    -- get image embedding: select example
    
    select dbms_vector_chain.utl_to_embedding(
      to_blob(bfilename('VEC_DUMP', 'parrots.jpg')), 'image', json(:params));
  7. イメージ入力を使用して検索します。ここで、入力は、問合せイメージ(parrots.jpg)に対して生成された埋込みです:
    select docs.id, vector_distance(
      dbms_vector_chain.utl_to_embedding(to_blob(bfilename('VEC_DUMP', 'parrots.jpg')), 'image', json(:params)),
      dbms_vector_chain.utl_to_embedding(docs.content, 'image', json(:params)),
      cosine) dist
    from docs
    order by dist asc;

    出力は次のようになります:

    ID       DIST                                                           
    -------  -----------                                                           
    2        5.847E-001                                                           
    1        6.295E-001

    この問合せは、ID 2 (eagle.jpg)は指定されたイメージ入力に最も近い一致であるのに対し、ID 1 (cat.jpg)はそれほど類似していないことを示しています。

  8. テキスト入力を使用して検索します。ここで、入力は、イメージの説明である「bald eagle」です。
    select docs.id, vector_distance(
      dbms_vector_chain.utl_to_embedding('bald eagle', json(:params)),
      dbms_vector_chain.utl_to_embedding(docs.content, 'image', json(:params)),
      cosine) dist
    from docs
    order by dist asc;

    出力は次のようになります:

    ID      DIST
    ------- -----------
    2       8.449E-001
    1       9.87E-001

    また、この問合せは、ID 2がテキスト入力に最も近い一致であることを示していますが、ID 1はそれほど類似していません。ただし、両方の値は、イメージを入力として指定した前の問合せの値より低くなっています。