MLEのJavaScriptでのVECTORデータ型のサポート
Oracle Multilingual Engine (MLE)では、JavaScript TypedArraysとSQLベクトルの間のINT8、FLOAT32およびFLOAT64形式の変換がサポートされています。JavaScriptデータ型とVECTORデータ型間のデータ交換は、MLE JavaScript SQLドライバ、MLEコール仕様およびMLE JavaScriptバインディングによってサポートされます。
VECTORデータ型は、IN、OUTおよびIN OUTバインド引数、および戻り型として指定できます。MLEコール仕様のSIGNATURE句では、次のJavaScript型がサポートされます。
Float32ArrayFloat64ArrayInt8ArraySparseVector
表A-5 VECTORデータ型からJavaScript型へのマッピング
| SQL型 | JavaScript型 |
|---|---|
VECTOR(*, float32) |
Float32Array (TypedArray)
|
VECTOR(*, float64) |
Float64Array (TypedArray)
|
VECTOR(*, int8) |
Int8Array (TypedArray)
|
VECTOR(*) |
Float64Array脚注1(TypedArray)
|
VECTOR(*, float32, SPARSE) |
SparseVector脚注2 |
脚注1 ベクトル形式または記憶域形式が指定されていない場合、デフォルトで密Float64Arrayが使用されます
脚注2 記憶域形式が指定されていない場合、デフォルトで密形式が使用されます。スパース・ベクトルの形式は、入力の形式(FLOAT32、FLOAT64またはINT8)によって決まります。
表A-6 JavaScript型からVECTORデータ型へのマッピング
| JavaScript型 | SQL型 |
|---|---|
Float32Array |
VECTOR(*, float32) |
Float64Array |
VECTOR(*, float64) |
Int8Array |
VECTOR(*, int8) |
Array |
VECTOR(*, float64) |
SparseVector |
VECTOR(*, [float32 | float64 | int8], SPARSE)脚注3 |
脚注3 SQLのスパース・ベクトルの形式は、ファンクション・シグネチャで指定された形式によって異なります。
指定しないかぎり、ベクトルの記憶域形式はデフォルトでDENSEになります。これは、ゼロ値を含むベクトルのすべてのディメンションが物理的に格納されることを意味します。SPARSEベクトルは、ほとんどのディメンションがゼロであり、ゼロ以外の値のみが物理的に格納されるベクトルです。ほぼ完全にゼロ値のディメンションで構成されるベクトルがある場合、スパース・ベクトルを使用すると、パフォーマンスが向上し、記憶域要件が削減されます。
データベース内JavaScriptでは、スパース(および密)ベクトルは、データベースに挿入してMLEからフェッチでき、IN、OUTおよびINOUTファンクションの引数として使用され、MLEコール仕様のシグネチャで指定できます。JavaScriptでは、スパース・ベクトルは、次のプロパティを持つSparseVectorオブジェクトを使用して表されます。
numDimensions: ゼロ値およびゼロ以外の値を含むベクトルのディメンションの数。indices: ゼロ以外の値を持つディメンションの索引(ゼロベース)を含む配列。values: 指定された索引のディメンションのゼロ以外の値を含む配列。
dense()メソッドを使用して、SparseVectorオブジェクトを密ベクトルに変換できます。dense()をSparseVectorで使用すると、Oracle AI Databaseのスパース・ベクトル列のゼロ以外の値の記憶域形式に応じて、8ビット整数、32ビット浮動小数点数または64ビット浮動小数点数のTypedArrayが返されます。
SparseVectorオブジェクトは、次の方法で定義できます。
- ディメンション数、ゼロ以外の値の場所を表す索引の配列、および値の配列を含むJSON配列の形式の文字列として:
oracledb.SparseVector('[10, [1, 3, 5], [1.5, 3.5, 7.7]]') - 値の配列、ゼロ以外の値の場所を表す索引の配列、およびディメンションの数を含むオブジェクトとして:
oracledb.SparseVector({values: [1.5, 3.5, 7.7], indices: [1, 3, 5], numDimensions: 10}) - 密配列(JavaScript配列またはTypedArray)として:
oracledb.SparseVector([0, 1.5, 0, 3.5, 0, 7.7, 0, 0, 0, 0])
関連項目:
-
VECTORデータ型およびOracle AI Vector Search機能の詳細は、Oracle AI Database AI Vector Searchユーザーズ・ガイドを参照してください SPARSEベクトルの詳細は、Oracle AI Database AI Vector Searchユーザーズ・ガイドを参照してください。
例A-1 MLEでのVECTORデータ型の使用
この例では、引数で使用されるVECTORデータ型と、MLEコール仕様の戻り型のサポートを示します。
SET SERVEROUTPUT ON;
CREATE OR REPLACE MLE MODULE vec_mod
LANGUAGE JAVASCRIPT AS
/**
* Add two vectors
* @param v1 the first vector
* @param v2 the second vector
* @returns the resulting vector after adding v1 and v2
*/
export function addVectors(v1, v2){
return v1.map((element, index) => element + v2[index]);
}
/**
* Subtract two vectors
* @param v1 the first vector
* @param v2 the second vector
* @returns the resulting vector after subtracting v2 from v1
*/
export function subtractVectors(v1, v2){
return v1.map((element, index) => element - v2[index]);
}
/
CREATE OR REPLACE PACKAGE mle_vec_pkg AS
FUNCTION addVectors(
input_vector1 IN VECTOR,
input_vector2 IN VECTOR
)
RETURN VECTOR
AS MLE MODULE vec_mod
SIGNATURE 'addVectors';
FUNCTION subtractVectors(
input_vector1 IN VECTOR,
input_vector2 IN VECTOR
)
RETURN VECTOR
AS MLE MODULE vec_mod
SIGNATURE 'subtractVectors';
END mle_vec_pkg;
/
SELECT mle_vec_pkg.addVectors(
VECTOR('[1, 2]'),
VECTOR('[3, 4]')
) AS result;
結果:
RESULT
---------------------------------------------
[4.0E+000,6.0E+000]
SELECT mle_vec_pkg.subtractVectors(
VECTOR('[3, 4]'),
VECTOR('[1, 2]')
) AS result;
結果:
RESULT
---------------------------------------------
[2.0E+000,2.0E+000]
例A-2 MLEでのスパース・ベクトルの使用
CREATE OR REPLACE MLE MODULE my_sparse_mod
LANGUAGE JAVASCRIPT AS
/**
* print out the dimensions of a sparse vector input by first
* calling the sparseVector constructor over the input argument
* and then by changing the JavaScript object to a JSON string
* @param {vector} input - a vector with dimension values to be printed
*/
export function printSparseVec(input) {
const sparseVec = oracledb.SparseVector(input);
const sparseVal = JSON.stringify(sparseVec);
console.log(sparseVal);
}
/
CREATE OR REPLACE PROCEDURE
print_sparse_vec(input IN VECTOR)
AS MLE MODULE MY_SPARSE_MOD
SIGNATURE 'printSparseVec(SparseVector)';
/
BEGIN
print_sparse_vec(vector('[5, [2, 3], [41.0, 51.0]]', 5, FLOAT64, SPARSE));
END;
/
結果:
{"numDimensions":5,"indices":{"0":2,"1":3},"values":{"0":41,"1":51}}
また、Float64Arrayのようにシグネチャに型を指定することもできます。シグネチャに型が含まれていない場合、デフォルトはSparseVectorです。
CREATE OR REPLACE PROCEDURE
print_sparse_vec_64(input IN VECTOR)
AS MLE MODULE MY_SPARSE_MOD
SIGNATURE 'printSparseVec(Float64Array)';
/
BEGIN
print_sparse_vec_64(vector('[5,[2,3],[41.0,51.0]]', 5, FLOAT64, SPARSE));
END;
/
結果:
0,0,41,51,0
親トピック: MLEの型変換