Oracle DatabaseへのONNXモデルのインポートのエンドツーエンドの例

ONNX形式の事前トレーニング済埋込みモデルをインポートし、ベクトル埋込みを生成する方法について学習します。

事前トレーニング済のONNX形式の埋込みモデルをOracle Databaseにインポートするには、次の手順に従います。

データ・ダンプ・ディレクトリの準備

データ・ダンプ・ディレクトリを準備し、dmuserに必要なアクセスおよび権限を提供します。

  1. 次のいずれかを選択します。
    1. トレーニング済のONNX埋込みモデルがすでにある場合は、作業フォルダに保存します。

    2. ONNX形式の事前トレーニング済の埋込みモデルがない場合は、「事前トレーニング済モデルからONNX形式への変換」に示されているステップを実行します。

  2. PDBでSYSDBAとしてSQL*Plusにログインします。

    CONN sys/<password>@pdb as sysdba;
  3. DB_DEVELOPER_ROLEdmuserに付与します。

    
    GRANT DB_DEVELOPER_ROLE TO dmuser identified by <password>;
  4. CREATE MINING MODEL権限をdmuserに付与します。

    GRANT create mining model TO dmuser;
  5. 作業フォルダをデータ・ダンプ・ディレクトリ(DM_DUMP)として設定し、ONNX埋込みモデルをロードします。

    CREATE OR REPLACE DIRECTORY DM_DUMP as '<work directory path>';
  6. DM_DUMPディレクトリに対するREAD権限をdmuserに付与します。

    GRANT READ ON DIRECTORY dm_dump TO dmuser;
  7. DM_DUMPディレクトリに対するWRITE権限をdmuserに付与します。

    GRANT WRITE ON DIRECTORY dm_dump TO dmuser;
  8. モデルがすでに終了している場合は削除します。

    exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'doc_model', force => true);

ONNXモデルのデータベースへのインポート

データ・ダンプ・ディレクトリを作成したので、ONNXモデルをデータベースにロードします。DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、モデルをロードします。DBMS_VECTOR.LOAD_ONNX_MODELプロシージャは、ONNX形式モデルをOracle Databaseにインポートする処理を容易にします。この例のこのプロシージャでは、DM_DUMPディレクトリからmy_embedding_model.ONNXという名前のONNXモデル・ファイルをデータベースにdoc_modelとしてロードし、埋込みタスクに使用することを指定します。

  1. dmuserとして接続します。

    CONN dmuser/<password>@<pdbname>;
  2. ONNXモデルをデータベースにロードします。

    インポートするONNXモデルにembeddingOutputという名前の出力のテンソルとdataという名前の入力文字列のテンソルがすでに含まれている場合、JSONメタデータは不要です。OML4Pyから変換されたモデルの埋込みは、この規則に従い、JSONメタデータなしでインポートできます。

    EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL(
      'DM_DUMP',
      'my_embedding_model.onnx',
      'doc_model');

    または、JSONメタデータを指定してONNX埋込みモデルをロードできます。

    EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL(
      'DM_DUMP',
      'my_embedding_model.onnx', 
      'doc_model', 
      JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}'));
プロシージャLOAD_ONNX_MODELは、次のパラメータを宣言します。
  • DM_DUMP: データ・ダンプのディレクトリ名を指定します。

    ノート:

    DM_DUMPディレクトリが定義されていることを確認します。
  • my_embedding_model: ONNXモデルの名前を指定するVARCHAR2型パラメータです。

  • doc_model: このパラメータは、モデルをOracle Databaseに格納するときのユーザー指定の名前です。

  • ONNXモデルに関連付けられたJSONメタデータは、次のように宣言されます。

    "function" : "embedding": テキスト埋込みモデルの関数名を示します。

    "embeddingOutput" : "embedding": 埋込み結果を含む出力変数を指定します。

  • "input": {"input": ["DATA"]}: モデルで予想される入力を記述するJSONオブジェクト("input")を指定します。"input"という名前の入力があり、その値が1つの要素"DATA"を持つ配列である必要があることを指定します。これは、モデルで埋込みを生成するために単一の文字列入力が想定されていることを示します。

LOAD_ONNX_MODELプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

または、ONNX埋込みモデルがクラウド・オブジェクト・ストレージにロードされている場合は、LOAD_ONNX_MODEL_CLOUDプロシージャを使用できます。詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

モデル統計の問合せ

モデルの属性を表示し、モデルの詳細を確認するには、機械学習ディクショナリ・ビューおよびモデル・ディテール・ビューを問い合せます。

ノート:

DOC_MODELは、埋込みテキスト・モデルのユーザー指定の名前です。
  1. USER_MINING_MODEL_ATTRIBUTESビューを問い合せます。

    SELECT model_name, attribute_name, attribute_type, data_type, vector_info
    FROM user_mining_model_attributes
    WHERE model_name = 'DOC_MODEL'
    ORDER BY ATTRIBUTE_NAME;

    USER_MINING_MODEL_ATTRIBUTESビューの詳細は、USER_MINING_MODEL_ATTRIBUTESを参照してください。

  2. USER_MINING_MODELSビューを問い合せます。

    SELECT MODEL_NAME, MINING_FUNCTION, ALGORITHM,
    ALGORITHM_TYPE, MODEL_SIZE
    FROM user_mining_models
    WHERE model_name = 'DOC_MODEL'
    ORDER BY MODEL_NAME;

    USER_MINING_MODELSビューの詳細は、USER_MINING_MODELSを参照してください。

  3. モデル・ディテール・ビューを表示して、モデル統計を確認します。DM$VMDOC_MODELビューを問い合せます。

    SELECT * FROM DM$VMDOC_MODEL ORDER BY NAME;

    ONNX埋込みモデルのモデル詳細ビューの詳細は、ONNXモデルのモデル詳細ビューを参照してください。

  4. DM$VPDOC_MODELモデル・ディテール・ビューを問い合せます。

    SELECT * FROM DM$VPDOC_MODEL ORDER BY NAME;
  5. DM$VJDOC_MODELモデル・ディテール・ビューを問い合せます。

    SELECT * FROM DM$VJDOC_MODEL;

埋込みの生成

モデルを適用し、入力のベクトル埋込みを生成します。ここで、入力はhelloです。

VECTOR_EMBEDDING関数を使用してベクトル埋込みを生成します。

SELECT TO_VECTOR(VECTOR_EMBEDDING(doc_model USING 'hello' as data)) AS embedding;

VECTOR_EMBEDDING SQLファンクションの詳細は、VECTOR_EMBEDDINGを参照してください。DBMS_VECTOR_CHAIN PL/SQLパッケージのUTL_TO_EMBEDDINGファンクションを使用して、RESTエンドポイントを介してベクトル埋込みを生成できます。これらの関数を調べるには、「テキスト文字列から埋込みへの変換」の例を参照してください。

例: 事前トレーニング済ONNXモデルのOracle Databaseへのインポート

ONNX埋込みのインポートとベクトル埋込みの生成の包括的なステップバイステップの例を次に示します。

conn sys/<password>@pdbname as sysdba
grant db_developer_role to dmuser identified by <password>;
grant create mining model to dmuser;
 
create or replace directory DM_DUMP as '<work directory path>';
grant read on directory dm_dump to dmuser;
grant write on directory dm_dump to dmuser;
>conn dmuser/<password>@<pdbname>;

–- Drop the model if it exits								  
exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'doc_model', force => true);

-- Load Model
EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL(
	'DM_DUMP', 
	'my_embedding_model.onnx', 
	'doc_model', 
	JSON('{"function" : "embedding", "embeddingOutput" : "embedding"}'));
/
 
--check the attributes view
set linesize 120
col model_name format a20
col algorithm_name format a20
col algorithm format a20
col attribute_name format a20
col attribute_type format a20
col data_type format a20 

SQL> SELECT model_name, attribute_name, attribute_type, data_type, vector_info
FROM user_mining_model_attributes
WHERE model_name = 'DOC_MODEL'
ORDER BY ATTRIBUTE_NAME;
 
 
OUTPUT:
 
MODEL_NAME           ATTRIBUTE_NAME       ATTRIBUTE_TYPE       DATA_TYPE  VECTOR_INFO
-------------------- -------------------- -------------------- ---------- ---------------
DOC_MODEL                INPUT_STRING         TEXT                 VARCHAR2
DOC_MODEL                ORA$ONNXTARGET       VECTOR               VECTOR     VECTOR(128,FLOA
                                                                          T32)
 
 
 
SQL> SELECT MODEL_NAME, MINING_FUNCTION, ALGORITHM,
ALGORITHM_TYPE, MODEL_SIZE
FROM user_mining_models
WHERE model_name = 'DOC_MODEL'
ORDER BY MODEL_NAME;
 
OUTPUT:
MODEL_NAME           MINING_FUNCTION                ALGORITHM            ALGORITHM_ MODEL_SIZE
-------------------- ------------------------------ -------------------- ---------- ----------
DOC_MODEL                EMBEDDING                      ONNX                 NATIVE       17762137
 
 
 
SQL> select * from DM$VMDOC_MODEL ORDER BY NAME;
 
OUTPUT:
NAME                                     VALUE
---------------------------------------- ----------------------------------------
Graph Description                        Graph combining g_8_torch_jit and torch_
                                         jit
                                         g_8_torch_jit
 
 
 
                                         torch_jit
 
 
Graph Name                               g_8_torch_jit_torch_jit
Input[0]                                 input:string[1]
Output[0]                                embedding:float32[?,128]
Producer Name                            onnx.compose.merge_models
Version                                  1
 
6 rows selected.
 
 
SQL> select * from DM$VPDOC_MODEL ORDER BY NAME;
 
OUTPUT:
NAME                                     VALUE
---------------------------------------- ----------------------------------------
batching                                 False
embeddingOutput                          embedding
 
 
SQL> select * from DM$VJDOC_MODEL;
 
OUTPUT:
METADATA
--------------------------------------------------------------------------------
{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}
 
 
 
--apply the model
SQL> SELECT TO_VECTOR(VECTOR_EMBEDDING(doc_model USING 'hello' as data)) AS embedding;
  
--------------------------------------------------------------------------------
[-9.76553112E-002,-9.89954844E-002,7.69771636E-003,-4.16760892E-003,-9.69305634E-002,
-3.01141385E-002,-2.63396613E-002,-2.98553891E-002,5.96499592E-002,4.13885899E-002,
5.32859489E-002,6.57707453E-002,-1.47056757E-002,-4.18472625E-002,4.1588001E-002,
-2.86354572E-002,-7.56499246E-002,-4.16395674E-003,-1.52879998E-001,6.60010576E-002,
-3.9013084E-002,3.15719917E-002,1.2428958E-002,-2.47651711E-002,-1.16851285E-001,
-7.82847106E-002,3.34323719E-002,8.03267583E-002,1.70483496E-002,-5.42407483E-002,
6.54291287E-002,-4.81935125E-003,6.11041225E-002,6.64106477E-003,-5.47

Oracle AI Vector SearchのSQLシナリオ

database-concepts23ai.pdfおよびoracle-ai-vector-search-users-guide.pdfのチャンク化、ベクトル埋込みの生成、およびベクトル索引を使用した類似検索の実行方法については、「クイック・スタートSQL」を参照してください。