カスタム距離関数

JavaScriptユーザー定義関数を使用して、カスタム・ベクトル距離を定義できます。これにより、使用できる距離方程式のタイプの柔軟性が高まり、ベクトル検索機能が幅広いユースケースに拡張されます。

カスタム距離関数は、Multilingual Engine (MLE)インライン・コール仕様で定義されたユーザー定義のJavaScript関数によって作成されます。関数のシグネチャは、既存の組込み距離関数のシグネチャと一致する必要があります。VECTOR型の引数を2つだけ受け取り、BINARY_DOUBLEを返す必要があります。関数のシグネチャには、DETERMINISTICキーワードも含める必要があります。次の関数定義は、カスタム距離関数の例を示しています。この場合はユークリッド平方距離を実装します:

CREATE OR REPLACE FUNCTION euclidean_sq_vector_distance("a" VECTOR, "b" VECTOR)
RETURN BINARY_DOUBLE
DETERMINISTIC PARALLEL_ENABLE
AS MLE LANGUAGE JAVASCRIPT PURE
{{
	let len = a.length;
	let sum = 0;
	for(let i = 0; i < len; i++) {
		const tmp = a[i] - b[i];
		sum += tmp * tmp;
	}
	return sum;
}};
/

カスタム距離関数は、HNSWベクトル索引で使用できます。ベクトル索引の並列度が1より大きい場合、カスタム距離関数にPARALLEL_ENABLE句を含める必要があります。索引の作成時には、DISTANCE句にカスタム距離の名前を指定できます。問合せでは、カスタム距離をORDER BY句およびSELECTリストで使用できます。ベクトル索引に関連付けられた距離関数は、VECSYS.VECTOR$INDEXビューを問い合せることで表示できます。

HNSW索引の作成に使用する場合、MLEコール仕様でPUREキーワードを指定する必要があります。PURE句は、現在有効なデータベース権限に関係なく、データベース表やPL/SQLパッケージなどのステートフル・オブジェクトがコードで変更されないことを保証する、制限された実行コンテキストでJavaScriptプログラムを実行する必要があることを示します。カスタム距離メトリックの作成に使用されるユーザー定義関数は、データベース状態へのアクセスを必要としない関数入力の計算のみを処理します。制限されたコンテキストは、不要なデータベースの変更を禁止することで、追加のセキュリティ・レイヤーを提供します。制限された実行コンテキストおよびPUREキーワードの詳細は、『Oracle Database JavaScript開発者ガイド』を参照してください。

カスタム距離関数に依存するベクトル索引を使用するには、索引の作成時に指定した関数に対するEXECUTE権限が必要です。JAVASCRIPTに対するEXECUTE権限も必要です。ベクトル索引の場合、定義者の権限のみがサポートされます。

距離関数が変更された場合、関連付けられたベクトル索引はUNUSABLE状態になります。

ノート:

IVF索引でのカスタム距離関数の使用は、現在サポートされていません。

前に作成したカスタム距離関数euclidean_sq_custom_distanceを使用して、最初にベクトル索引を作成します:

CREATE TABLE custom_dist_tab( id NUMBER, data_vector VECTOR(2, FLOAT32));

INSERT INTO custom_dist_tab VALUES (1, vector('[1.1,2.2]', 2, float32));
INSERT INTO custom_dist_tab VALUES (2, vector('[2.2,3.3]', 2, float32));
INSERT INTO custom_dist_tab VALUES (3, vector('[3.3,4.4]', 2, float32));
INSERT INTO custom_dist_tab VALUES (4, vector('[4.4,5.5]', 2, float32));
INSERT INTO custom_dist_tab VALUES (5, vector('[5.5,6.6]', 2, float32));

CREATE VECTOR INDEX cust_dist_idx_hnsw ON custom_dist_tab (data_vector)
ORGANIZATION INMEMORY
NEIGHBOR GRAPH WITH TARGET ACCURACY 95
DISTANCE CUSTOM EUCLIDEAN_SQ_VECTOR_DISTANCE
PARALLEL 3;

カスタム距離関数は、ORDER BY句またはSELECTリストの類似検索問合せで参照できます。

SELECT data_vector 
FROM custom_dist_tab
ORDER BY euclidean_sq_vector_distance(data_vector, VECTOR('[1, 2]'))
FETCH FIRST 5 ROWS ONLY;

SELECT
  data_vector,
  euclidean_sq_vector_distance(data_vector, VECTOR('[1, 2]')) edist
FROM custom_dist_tab
ORDER BY edist
FETCH FIRST 5 ROWS ONLY;

関連項目: