ベクトル値
ベクトルは、構造化および非構造化入力データの数学的表現であり、最新の人工知能(AI)アプリケーションやセマンティック検索機能に不可欠である。 Db2 ベクターデータをインポートし、SQLステートメントで照会できる形式に変換できるようになりました。
なぜベクターデータが重要なのか?
機械学習モデルやディープラーニング技術を採用した多くのAIアプリケーションは、 高次元ベクトル埋め込みという形でベクトルを生成する。 高次元のベクトルは、異なるオブジェクトの量を記述する。 これらのアプリケーションは、 参照ベクトルとして使用するために、データセット内で類似性のあるベクトルを特定するために類似性検索技術を使用します。 類似度は通常、ユークリッド距離や余弦類似度など、2つのベクトル間の距離関数として測定される。
多くの企業がAIや GenAI テクノロジーを採用し、費用対効果が高く、安全で、簡素化されたベクターストレージのソリューションを求めている。 これらのニーズを満たすためには、アプリケーションは高次元のベクトル埋め込み集合に対する効率的な類似性検索機能を持たなければならない。 通常、これらの用途に必要な寸法数は数百から数千に及ぶ。 ベクターは各オブジェクトの小さな部分を表現するために使用されるため、これらのアプリケーションのデータベースに保存されるベクターの数は、通常非常に多い。 このようなアプリケーションは、1つのユーザープロンプトに対して多数の類似検索クエリを実行して答えを出す必要がある。 この種のクエリに期待される応答時間は、コンマ数秒からミリ秒の範囲である。 ベクトル埋め込みは通常、類似検索クエリに含めることができるメタデータを保持している。
ベクターデータの保存と操作に Db2 を選ぶ理由は?
- それらは外部のデータ・リポジトリに依存している。 ベクトルを元の入力と組み合わせる場合、ユーザーは複数のデータリポジトリを扱う必要があり、コスト、待ち時間、複雑さが増す。
- ベクトル埋め込みに関連するメタデータを使って、他のフィルタリング機能でクエリを強化する機能はほとんどない。
- 他のデータ管理分野での能力は限られている。
Db2 のクエリ機能は他の追随を許さず、ベクトル類似性検索を追加することで、これらの機能が強化される。
Db2 は長年にわたり、スケーラビリティ、セキュリティ、監査性、パフォーマンス、モニタリングなどの分野で業界をリードする機能を開発してきました。 ベクターに特化したソリューションのほとんどは、それを提供できない。
Db2、ベクターデータを管理するための実用的なアプリケーションの例については、 使用例を参照してください。
VECTOR データ型
- 構文
説明VECTOR (<dimension> ,<coordinate-type>)dimensionはベクトルの次元を指定する整数リテラルである。 行編成テーブルの場合、 FLOAT32 では 1 から 8168 まで、 INT8 では 1 から 32672 までの値でなければなりません(SQLSTATE 42611)。 列で構成されたテーブルの場合、 FLOAT32 では 1 から 8148 までの値、 INT8 では 1 から 32592 までの値でなければなりません(SQLSTATE 42611)。coordinate-typeはREALまたは 単精度4バイト浮動小数点値、または 1バイト整数。 FLOAT32 INT8
- 例
- 次の例は、異なるベクトル・データ型の2つの列を含むテーブルVTABLEを作成するためのコマンド構文です:
このコマンドは以下の表を生成する:CREATE TABLE VTABLE (RV VECTOR(100, REAL), -- Coordinates are single-precision (4-byte) floating point IV VECTOR(300, INT8)) -- Coordinates are 1-byte integers$ db2 describe table VTABLE Data type Column Column name schema Data type name Length Scale Nulls ------------------------------- --------- ------------------- ---------- ----- ------ RV SYSIBM VECTOR(FLOAT32) 100 0 Yes IV SYSIBM VECTOR(INT8) 300 0 Yes 1 record(s) selected.
ベクトル関数とその使い方
- VECTOR : 入力文字列からベクトルを構築する。
- VECTOR_SERIALIZE : ベクトルを文字列に変換する。
- VECTOR_DISTANCE : 指定されたメトリックを使って2つのベクトル間の距離を計算します。
- VECTOR_NORM :あるベクトルとゼロベクトルの間の距離を指定されたメトリックを用いて計算します。
- vector_dimension_count :ベクトル型定義の次元を返す。
ベクトルを使ったUPDATEとINSERT操作
VECTOR列には、バイナリ形式のベクトルが格納される。 Db2 は、アプリケーションとやりとりするときにベクターの文字列形式を使用する。
例えば、新しいVECTOR関数はベクトルの文字列表現をバイナリ形式に変換する。 次の例は、ホスト変数とベクターの文字列形式を使用して既存のベクター値を更新するコマンド構文を示しています:
C++
EXEC SQL BEGIN DECLARE SECTION;
// Generated by db2dclgn
sqlint32 id;
struct
{
short length;
char data[50];
} f32_3;
EXEC SQL END DECLARE SECTION;
id = 1;
sprintf(f32_3, "[0.123, -0.456, 0.789]");
EXEC SQL UPDATE VECTOR_TB SET F32_3 = VECTOR(:f32_3, 3, FLOAT32) WHERE ID = :id;
ベクトルを使った EXPORT、IMPORT、LOAD 操作
- EXPORT および IMPORT コマンドは、以下の VECTOR データ型をサポートしています。 Db212.1.2 以降でサポートされています。 LOAD コマンドは、 Db2 12.1.3 以降の VECTOR データ型をサポートしています。
- EXPORTコマンドは、ベクトル値を文字列として書き出します。 IMPORT コマンドと LOAD コマンドでは、入力ベクトル データ値が文字列形式であることが想定されています。
- EXPORTコマンドは、不要な空白を除いたベクトル値の文字列形式を出力する。
- 小サイズの INT8 VECTORタイプは6534次元までのもので、小サイズの FLOAT32/REAL VECTORタイプは2041次元までのものである。 これらの VECTOR 型では、EXPORT 操作によって生成されるベクタ値の文字列形式は 32672 バイトを超えない。
- EXPORT、IMPORT、LOAD コマンドは、これらの小さなVECTOR型をVARCHAR型の扱い方と同様に扱う。
- 大きなVECTOR型が、 INT8 ベクトルの場合は6534次元を超え、 FLOAT32/REAL ベクトルの場合は2041次元を超える場合、これらのベクターの文字列形式は、EXPORT操作によって生成されると、長さが32672バイトを超える可能性がある。
- EXPORT、IMPORT、および LOAD コマンドは、ラージ VECTOR 型を CLOB 型データの扱い方と同様の方法で扱い、 EXPORT、IMPORT、および LOAD コマンドが実際の CLOB 型を扱う方法と同様の使用シナリオと制限を持つ。
- ベクトル・データに対する EXPORT コマンドの実行ルール
- ラージ・オブジェクト(LOB)データを扱う場合、EXPORT文に含めることができるオプションがあります:
- LOB の宛先
- LOBFILE
- MODIFIED BY LOBSINFILE
- MODIFIED BY lobsinsepfiles
注: IMPORT コマンドは、切り捨てられたベクトル文字列を持つデータ行を VECTOR 列 ( SQL0420N ) に挿入しません。 ベクター文字列の切り捨て問題を回避または緩和する他の方法がない限り、EXPORTコマンドにLOBオプションを指定する。 - ベクトルデータに対するIMPORT およびLOAD コマンドの実行ルール
- 小さな VECTOR 列を持つテーブルに対して IMPORT 文 または LOAD 文を実行する場合、ベクトル文字列値はメインの入力データ・ファイルに存在し、値は切り捨てられてはならず、サイズは 32672 バイトを超えてはなりません。
- VECTORカラムが大きく、LOBオプションが指定されていない場合、ベクトル文字列値はメイン入力データファイルに存在しなければならない。 LOBオプションの例には、LOBS FROMとMODIFIED BY LOBSINFILEがある。 この場合も、ベクター文字列の値は切り捨てられてはならず、32700バイトを超えてはならない。
- VECTOR列が大きく、LOBオプションが指定されている場合、メインの入力データファイルには、別々のLOBデータファイル内のベクトル文字列値を指すLLSが含まれていなければならない。 この場合、LOADコマンドは 1MB (1048576バイト)までのベクター文字列値をサポートする。 EXPORT コマンドは、 1MB を超えるベクトル文字列値を生成しません。 LOAD コマンドでは、リモート・クライアントから LOAD コマンドが送信された場合も、LOAD コマンドが CLIENT パラメータを使用した場合も、個別の LOB データ・ファイルにサーバーからアクセスできる必要があります。 Db2 LOAD コマンドがリモート・クライアントから送信される場合も、LOAD コマンドが CLIENT パラメータを使用する場合も、サーバーからアクセス可能でなければなりません。
- リモートクライアントからLOADコマンドを実行する場合 Db2 クライアントと Db2 クライアントと Db2 サーバーのバージョンが 12.1.3 以降でなければならない。注: ベクトル入力データがEXPORTコマンドで生成されないこともあります:手動または他のツールやアプリケーションで作成できます。 このベクトル文字列データをVECTOR列型にインポートする場合は、EXPORTコマンドで生成されたデータをインポートまたはロードする 場合と同じルールに従います。
- ベクトルデータの EXPORT、IMPORT、LOAD 操作に適用されるルール
- ベクトル値が大きな VECTOR 列に正しく挿入されるようにするには、EXPORT コマンドと対応する IMPORT または LOAD コマンドの両方で LOB オプションを使用するか、LOB オプションを使用しない必要があります。 LOBオプションを使用しないと、ベクター文字列の値が切り捨てられるリスクがある。
- EXPORT、IMPORT、LOAD コマンドは、ベクトル文字列の値を数値ではなく文字列として扱います。 数値に適用されるファイルタイプ修飾子は、ベクトル文字列値には適用されません。 影響を受けるファイルタイプ修飾子は以下の通り:
decplusblank.decptx.implieddecimalIMPORTとLOADのみ。striplzeros輸出専用。
- VECTOR 列からベクトル値をエクスポートし、そのベクトル値を異なる型の VECTOR 列にインポートすることはサポートされていません。 異なるタイプの例としては、次元の異なるベクトルや座標型の異なるベクトルがある。注:
EXPORTおよびIMPORTコマンドは、クライアント側の機能である。 リモートクライアントからEXPORTおよびIMPORTコマンドを実行する場合 Db2 クライアントから Db2 クライアントと Db2 サーバ・インスタンスの両方が Db212.1.2 またはそれ以降が実行されている必要があります。
LOADコマンドには、クライアントサイドとサーバーサイドの両方のコンポーネントがある。 リモートクライアントからLOADコマンドを実行する場合 Db2 を実行する場合、 Db2 クライアントと Db2 サーバー・インスタンスの両方が Db212.1.3 またはそれ以降が実行されている必要があります。
ベクターの制限
- ユーザー定義タイプ:
- 特殊。
- 配列。
- 行タイプ
- 構造化されたタイプ。
- アンカーデータ型。
- ニックネームを作成します。
- タイプマッピングを作成する。
さらに、以下の制限があります。
- レプリケーションは VECTOR 列を持つテーブルをサポートしません。
- ベクターを比較することはできない。
LOADおよび の操作はベクトルをサポートしていない。INGEST- db2dart は/DDELオプションによるVECTOR列のダンプをサポートしていません。
- 論理バックアップおよびリストア操作は、
VECTORタイプをサポートしていません。 ALTOBJプロシージャは、 カラムを持つテーブルをサポートしていません。VECTOR- 既存の列をVECTORに変更することはできません。
- 既存のVECTOR列を異なるデータ型や異なる座標型に変更することはできません。
- 既存の VECTOR 列ディメンジョンは変更できません。
- DEFAULT 値として許されるのは NULL だけなので、NOT NULL ベクトル・カラムを既存のテーブルに追加することはできません。
- VECTOR 式は、REFRESH IMMEDIATE 体系化問い合わせテーブルの選択リストではサポートされていません。
- ベクトルを扱う場合、大なり小なりという概念がないため、VECTOR列やVECTOR結果データ型を持つ式は以下のような使い方はできません:
- 主キーとして。
- 外部キーとして。
- ユニーク・キーとして。
- CREATE INDEXキーとして。
- ORDER BY ソートキーとして。
- DPFのディストリビューション・キーとして。
- レンジ・パーティション・キーとして。
- MDCのキーとして。
- RCTキーとして。
- GROUP BY式として。
IS (NOT) NULL以外のジョイン条件の場合。- SELECT DISTINCT式として。
- COUNT DISTINCT式として。
- UNION ALL以外のセット演算子。
ユース・ケース
- 使用例 1: Db2 テーブルから類似の患者記録を検索する
- Db2、提案されているベクトルサポート機能を使って、リレーショナルレコードに対するベクトル類似性検索を実装することができる。
- 使用例2:生成AI/RAGアプリケーションのためのベクトル・ストレージ
- 近年、大規模言語モデル(LLM)の人気が高まっているが、これには限界がある。 彼らは訓練されたデータに対してのみ優れたパフォーマンスを発揮することができる。 新しい問題に直面したとき、彼らはしばしば間違った答えを出したり、作り話をしたりする。 これに対処するため、 検索補強生成 (RAG)と呼ばれる方法を用いてLLMの回答を強化する。 RAGはプライベート・ナレッジ・リポジトリーを利用しており、LLMへのプロンプトにはリポジトリからの関連文書のリストが含まれている。 そして、LLMはこれらの文書に基づいて答えを生成しようとする。 RAGを実装するには、ベクトル埋め込みを保存するための安全なデータベースと、機密の知識コンテンツのための安全なリポジトリが必要である。 このコンテンツは、PDF、Word文書、またはWikiページから取得することができます。 知識はベクトル埋め込みに変換され、安全にリポジトリに保存される。

