SPARSEベクトル

ベクトルの格納形式は、SPARSEまたはDENSEとして指定できます。通常、疎ベクトルは多数の次元を持つがゼロ以外の次元値はほとんどないベクトルですが、密ベクトルはすべての次元に値(ゼロ値を含む)が格納されるベクトルです。

疎ベクトルは、SPLADEやBM25などの疎エンコーディング・モデルで生成できます。一般に、SPLADEなどの疎モデルは、キーワード認識検索でBERTやAll-MiniLMなどの密モデルよりもよいパフォーマンスとなります。また、疎ベクトルと密ベクトルを組み合せることで、ハイブリッド・ベクトル検索にも広く使用されています。

概念的には、疎ベクトルは、すべての次元が特定の語彙のキーワードに対応するベクトルと考えることができます。特定のドキュメントの場合、疎ベクトルには、そのドキュメント内でのキーワードの出現回数を表すゼロ以外の次元値が含まれています。たとえば、BERTの語彙サイズが30,522の場合、一部の疎エンコーダではこの次元のベクトルが生成されます。

ゼロ以外のFLOAT32次元値が100個のみの30,522次元の密ベクトルを表す場合でも、30,522 * 4 = ~120KBの記憶域が必要です。このような形式では、ほとんどの次元値が0であるため、意味もなく多くの領域が使用されます。これにより、このようなベクトルのSPARSE表現と比較して、パフォーマンスが大幅に低下します。

そのため、SPARSEベクトルを使用する場合、ゼロ以外の次元値のみが物理的に格納されます。

SPARSEベクトルの作成および挿入の例を次に示します:

DROP TABLE my_sparse_tab PURGE;
CREATE TABLE my_sparse_tab (v01 VECTOR(5, INT8, SPARSE));

INSERT INTO my_sparse_tab VALUES('[5,[2,4],[10,20]]');
INSERT INTO my_sparse_tab VALUES('[[2,4],[10,20]]');

SELECT * FROM my_sparse_tab;

V01
--------------------
[5,[2,4],[10,20]]
[5,[2,4],[10,20]]

INSERT文内のSPARSEテキスト形式と、DENSEベクトルに使用されるテキスト形式の違いを確認できます。SPARSEのテキスト形式は次のようになります:

'[Total Dimension Count, [Dimension Index Array], [Dimension Value Array]]'

この例では、合計の次元数を使用します(ここでは5次元ですが、この場合は、列の宣言で定義されているため、指定することはオプションです)。その後、ゼロ以外の値を持つ座標のリスト、および対応する値のリストを示します。この例では、座標2の値は10で、座標4の値は20です。座標1、3、および5の値は0です。

SPARSEベクトルの場合はDENSEテキスト形式を使用できず、その逆もできません。ただし、次のサンプル・コードに示すように、表my_sparse_tab (前のスニペットで作成)を使用し、ベクトル関数を使用して一方をもう一方に変換できます。

次のINSERT文は失敗します:

INSERT INTO my_sparse_tab VALUES('[0, 10, 0, 20, 0]');

Error starting at line : 1 in command -
INSERT INTO my_sparse_tab VALUES ('[0,10,0,20,0]')
Error at Command Line : 1 Column : 33
Error report -
SQL Error: ORA-51833: Textual input conversion between sparse and dense vector is not
supported.

ただし、次の挿入は機能します:

INSERT INTO my_sparse_tab VALUES (TO_VECTOR('[0,0,10,0,20]', 5, INT8, DENSE));

SELECT * FROM my_sparse_tab;

V01
____________________
[5,[2,4],[10,20]]
[5,[2,4],[10,20]]
[5,[3,5],[10,20]]

必要に応じて、SPARSEベクトルをDENSEテキスト形式に変換することもでき、その逆も可能です:

SELECT FROM_VECTOR(v01 RETURNING CLOB FORMAT DENSE) 
FROM my_sparse_tab 
WHERE ROWNUM<2;

FROM_VECTOR(V01RETURNINGCLOBFORMATDENSE)
___________________________________________
[0,10,0,20,0]

ノート:

前述の例で使用されているRETURNING句は、VARCHAR2またはBLOBを戻すこともできます。