埋込み

ベクトルとして表されている数値次元内のデータを変換してコンテンツ類似性検索やその他の用途を可能にする、機械学習手法としての埋込みについて詳しく説明します。

ベクトル埋込みについて

トランスフォーマ・モデルは、埋込みモデルとも呼ばれ、単語、文、ドキュメント、画像などの様々なタイプのデータをそれらの意味をキャプチャする数値ベクトルに変換するために使用します。

これらのベクトルは多次元空間内のポイントとして表され、この空間では、ポイントの近接性は、それらが表すデータの意味的な類似性を示しています。つまり、ベクトル埋込みとは、テキスト、画像、ビデオ、音楽などの様々なタイプのデータを多次元空間内のポイントとして表す方法です。これらのポイントの位置と、他のポイントに対するそれらの近接性が、意味的に重要です。この変換により、機械学習アルゴリズムで、データをより効果的に処理し分析し、様々な距離メトリックを計算して類似するコンテンツを見つけられるようになります。ベクトル埋込みの作成では、機械学習モデル(多くの場合ニューラル・ネットワーク)を大量のデータセットでトレーニングしてそのデータ内のパターンと関係を学習する必要があります。このプロセスでは、そのデータが、複数の数値ベクトル(それぞれが高次元ベクトル空間内の1つのデータ・ポイントを一意に表す)に変換されます。ベクトル埋込みの用途は多岐にわたります(具体的には、自然言語処理(NLP)、検索エンジンおよびレコメンデーション・システム)。

埋込みを生成するための事前トレーニング済モデル

単語、テキスト文、イメージなど、様々なデータ・タイプの埋込みを生成する多くの事前トレーニング済モデルがあります。これらの事前トレーニング済モデルでは、多くの場合、前処理操作または後処理操作、あるいはその両方が必要です。

たとえば、テキストから文の埋込みを作成するほとんどのモデルには、トークン化と呼ばれる前処理ステップが必要です。トークン化は、一連のテキストをトークンと呼ばれる小さな部分に変換するプロセスです。その後、埋込みモデルではトークンが入力として処理されます。これらの事前トレーニング済のSentence Transformerの出力には、さらに後処理が必要になる場合もあります。このような後処理操作の1つはプーリングです。テキスト埋込みのプーリングは、テキスト・シーケンス内の個々の単語またはトークン埋込みの次元を集計および削減するために使用される手法です。このプロセスでは、複数の埋込みの機能を組み合せて、テキスト全体の単一の固定サイズの表現を形成します。たとえば、プーリング方法を使用すると、平均、最大などの集計機能を実行できます。もう1つの後処理操作は正規化です。テキスト埋込みの正規化は、個々の埋込みを調整して均一なスケールまたは分布を持つようにするプロセスです。このステップでは、埋込みを特定の構造に準拠するように変換し、多くの場合、データ・セット全体で一貫した長さまたはスケールを持つようにします。

したがって、前処理操作および後処理操作で拡張された事前トレーニング済モデルを使用して、埋込みを生成する必要があります。このドキュメントでは、my_embedding_model.onnxモデルを拡張されたONNX形式のモデルとして使用する例を示します。事前トレーニング済のモデルをダウンロードしてONNX形式のモデルに変換し、前処理および後処理のステップでモデルを拡張する場合は、「ONNXモデルのインポートおよび埋込みの生成」を参照してください。

ONNX埋込みモデルのデータ型

ONNXでは独自のデータ型を定義しています。ONNXモデルをOracle Databaseにインポートすると、そのデータ型はSQLデータ型に自動的にマップされます。

ONNX埋込みモデルの属性のデータ型

テキスト埋込みモデルの場合、入力は文字列です。このため、サポートされているデータ型はVARCHAR2CLOBNVARCHAR2およびNCLOBです。これは、入力文字列のサイズが4000バイト(最大文字列サイズが拡張に設定されている場合は32767バイト)に制限されることを意味します。

USER_MINING_MODEL_ATTRIBUTESビューでは、モデルの入力のSQLデータ型がレポートされます。

たとえば、USER_MINING_MODEL_ATTRIBUTESビューでは、モデルの選択した属性がレポートされます。ここでの埋込みモデルの入力データ型はVARCHAR2です。
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;
出力内容は次のようになります。
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)

ONNX埋込みモデルのターゲット・データ型

テキスト埋込みモデルの出力は、埋込みベクトルです。したがって、ターゲット・データ型はVECTORです。埋込みモデルからベクトルを生成するには、VECTOR_EMBEDDING SQLスコアリング関数を使用します。

VECTORデータ型の詳細は、「VECTORデータ型を使用する表の作成」を参照してください。VECTOR_EMBEDDING SQL演算子の詳細は、Oracle Database SQL言語リファレンスを参照してください。

例: 静的データ・ディクショナリ・ビュー

Oracle Machine Learningの静的データ・ディクショナリ・ビューを使用すると、使用可能なモデル、ONNX埋込みモデルの属性などの情報を表示できます。ONNX埋込みモデルをサポートする値が追加されました。

これらのビューのデータベース管理者(DBA)バージョンやUSERバージョンも使用可能です。

この項では、ONNX埋込みモデルの影響を受けるデータ・ディクショナリ・ビューの例を示します。

例: ALL_MINING_MODEL_ATTRIBUTES

現在のユーザーとして、ALL_MINING_MODEL_ATTRIBUTESビューを問い合せることで、機械学習モデルの属性を表示できます。

埋込みモデルのモデル属性の例を次に示します。ONNX埋込みモデルの名前はDOC_MODELです:

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;
 

出力内容は次のようになります。


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)

参照:

Oracle DatabaseリファレンスALL_MINING_MODEL_ATTRIBUTES

例: ALL_MINING_MODELS

ALL_MINING_MODELSビューを問い合せることで、現在のユーザーとして使用可能な機械学習モデルを確認できます。

埋込みモデルのモデルの詳細の例を次に示します。ONNX埋込みモデルの名前はDOC_MODELです:

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

出力内容は次のようになります。


MODEL_NAME           MINING_FUNCTION                ALGORITHM            ALGORITHM_ MODEL_SIZE
-------------------- ------------------------------ -------------------- ---------- ----------
DOC_MODEL                EMBEDDING                      ONNX                 NATIVE       17762137

参照:

Oracle DatabaseリファレンスALL_MINING_MODELS

スコアリング: ベクトル埋込みの生成

ONNX埋込みモデルをデータベースにインポートした後、VECTOR_EMBEDDING SQLスコアリング関数を使用して埋込みベクトルを生成できます。

VECTOR_EMBEDDING SQLスコアリング関数は、VECTOR(dimension, type)を返します。埋込みモデルでは、VECTOR_EMBEDDING演算子の出力ベクトルの次元数を定義します。VECTOR_EMBEDDING SQLスコアリング演算子の詳細は、VECTOR_EMBEDDINGを参照してください。

次の例では、データベースにインポートされた事前トレーニング済ONNX形式のモデルmy_embedding_model.ONNXを使用し、入力として"hello"を使用してベクトル埋込みを生成します。完全な例は、「ONNXモデルのインポートおよび埋込みの生成」を参照してください。

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

ノート:

出力はメタデータで明示的に定義するか、暗黙的に定義することができます。メタデータに出力を指定しない場合は、モデルに1つの出力があることが想定されます。

スコアリング関数が「サポートされているSQLスコアリング関数」の説明に準拠していない場合は、データに対するスコアリング操作の実行時にORA-40290エラーが発生します。また、サポートされていないスコアリング関数の場合は、ORA-40290エラーが発生します。

参照:

ONNXモデルでサポートされているSQLスコアリング関数をすべて示すリスト(Oracle Machine Learning for SQLユーザーズ・ガイド)

スコアリングでの欠落データの処理

ONNXでは、存在しない値の表現はサポートされません。つまり、SQLのNULLに相当するものはありません。

また、入力値が指定されていない場合、ONNX埋込みモデルの実行は失敗します。

  • 欠落した属性: スコアリングに使用される属性が、モデルのインポート(入力)時に指定された属性よりも少ない場合、スコアリングの実行時にエラーが発生します。つまり、ONNXモデルでスコアリング演算子のUSING句に少なくとも1つ以上の入力値が指定されていない場合、問合せはコンパイルされません。
  • NULL属性: 属性にNULL値がある場合、スコアリング演算子ではONNX Runtimeを使用したモデルの推論が実行されず、NULLの結果がただちに返されます。この動作を変更する場合は、NVL式を入力属性として使用する(NVL(input_attribute, default_value) AS input_attribute);など)か、モデルのインポート時にJSONメタデータを使用してこの入力属性のデフォルト値を指定することで、NULL値を適切な値に置き換えます。

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"を持つ配列である必要があることを指定します。これは、モデルで埋込みを生成するために単一の文字列入力が想定されていることを示します。

このPL/SQLプロシージャの詳細は、LOAD_ONNX_MODELプロシージャを参照してください。

モデル統計の問合せ

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

ノート:

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>@pdb as sysdba
grant db_developer_role to dmuser identified by dmuser;
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を参照してください。

ONNXモデルをインポートするための代替方法

DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャを使用して、モデルをインポートし、入力名を宣言します。次の手順では、ONNX形式のモデルをOracle Databaseにインポートする処理を容易にするPL/SQLヘルパー・ブロックを使用します。この関数は、サーバーのファイル・システムからモデル・ファイルを読み取り、データベースにインポートします。

DBMS_DATA_MINING PL/SQLパッケージを使用してONNXモデルをデータベースにインポートするには、次の手順を実行します。
  • dmuserとして接続します。

    CONN dmuser/<password>@<pdbname>;
  • 次のヘルパーPL/SQLブロックを実行します:

    DECLARE
        m_blob BLOB default empty_blob();
        m_src_loc BFILE ;
        BEGIN
        DBMS_LOB.createtemporary (m_blob, FALSE);
        m_src_loc := BFILENAME('DM_DUMP', 'my_embedding_model.onnx');
        DBMS_LOB.fileopen (m_src_loc, DBMS_LOB.file_readonly);
        DBMS_LOB.loadfromfile (m_blob, m_src_loc, DBMS_LOB.getlength (m_src_loc));
        DBMS_LOB.CLOSE(m_src_loc);
        DBMS_DATA_MINING.import_onnx_model ('doc_model', m_blob, JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}'));
        DBMS_LOB.freetemporary (m_blob);
        END;
        /

    このコードでは、BLOBオブジェクトとBFILEロケータを設定し、DM_DUMPディレクトリのmy_embedding_model.onnxファイルを格納するための一時BLOBを作成し、その内容をBLOBに読み取ります。その後、一時BLOBリソースを解放する前に、ファイルをクローズし、そのコンテンツを使用して、ONNXモデルを指定したメタデータとともにデータベースにインポートします。

IMPORT_ONNX_MODELプロシージャのスキーマは、DBMS_DATA_MINING.IMPORT_ONNX_MODEL(model_data, model_name, metadata)です。このプロシージャでは、DBMS_DATA_MININGパッケージからIMPORT_ONNX_MODELがロードされて、model_nameで指定された名前、m_blob内のBLOBコンテンツ、および関連するmetadataを使用してそのONNXモデルがデータベースにインポートされます。
  • doc_model: このパラメータは、インポートされたモデルをOracle Databaseに格納するときのユーザー指定の名前です。

  • m_blob: モデルのONNX表現を保持する、BLOB内のモデル・データです。

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

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

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

別の方法として、DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャでは、OCIオブジェクト・ストレージに格納されているロードするONNXファイルを表すBLOB引数を受け入れることもできます。次に、OCIオブジェクト・ストレージに格納されているONNXモデルをロードする例を示します。

DECLARE
  model_source BLOB := NULL;
BEGIN
  -- get BLOB holding onnx model 
  model_source := DBMS_CLOUD.GET_OBJECT(
    credential_name => 'myCredential',
    object_uri => 'https://objectstorage.us-phoenix -1.oraclecloud.com/' ||
      'n/namespace -string/b/bucketname/o/myONNXmodel.onnx'); 
 
  DBMS_DATA_MINING.IMPORT_ONNX_MODEL(
    "myonnxmodel",
    model_source,
    JSON('{ function : "embedding" })
  );
END;
/

このPL/SQLブロックでは、まずmodel_source変数がBLOB型として初期化され、最初はNULLに設定されます。次に、資格証明(OBJ_STORE_CRED)とモデルのURIを指定してDBMS_CLOUD.GET_OBJECTプロシージャを使用し、Oracle Cloud Object StorageからONNXモデルが取得されます。この場合は、ONNXモデルはbucketnameという名前の特定のバケット内にあり、指定されたURLからアクセスできます。次に、スクリプトにより、そのONNXモデルがmodel_source BLOBにロードされます。その後、DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャにより、このモデルがmyonnxmodelとしてOracle Databaseにインポートされます。インポート中に、埋込み操作のために、JSONメタデータでこのモデルのfunctionがembeddingとして指定されます。

このPL/SQLプロシージャの詳細は、「IMPORT_ONNX_MODELプロシージャ」およびGET_OBJECTプロシージャおよびファンクションを参照してください。

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

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

conn sys/<password>@pdb as sysdba
grant db_developer_role to dmuser identified by dmuser;
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"}'));
/
--Alternately, load the model
EXECUTE DBMS_DATA_MINING.IMPORT_ONNX_MODEL(
       'my_embedding_model.onnx',
	'doc_model', 
	JSON('{"function" : "embedding",
	"embeddingOutput" : "embedding",
	"input": {"input": ["DATA"]}}')
	);
 
--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