ベクトルデータ型
ベクトルは、 [0.3, 0.5, -0.1, ...]などの浮動小数点数のシーケンスです。TiDB は、AI アプリケーションで広く使用されているベクトル埋め込みを効率的に保存およびクエリするために特別に最適化されたベクトル データ型を提供します。
注記:
この機能はベータ版です。予告なく変更される可能性があります。バグを見つけた場合は、GitHub で問題報告を行ってください。
注記:
ベクトルデータ型は、TiDB Self-Managed、 TiDB Cloudスターター TiDB Cloudエッセンシャル使用できますTiDB Cloud専用 Self-Managed およびTiDB Cloud Dedicated の場合、TiDB バージョンは v8.4.0 以降である必要があります (v8.5.0 以降を推奨)。
現在、次のベクター データ型が利用可能です。
VECTOR: 任意の次元の単精度浮動小数点数のシーケンス。VECTOR(D): 固定次元Dを持つ単精度浮動小数点数のシーケンス。
ベクトル データ型を使用すると、 JSON型を使用する場合に比べて次の利点があります。
- ベクトル インデックスのサポート: ベクトルの検索を高速化するためにベクター検索インデックス構築できます。
 - 次元の強制: 異なる次元のベクトルの挿入を禁止する次元を指定できます。
 - 最適化されたstorage形式: ベクター データ型はベクター データの処理に最適化されており、 
JSON型と比較して優れたスペース効率とパフォーマンスを実現します。 
構文
次の構文の文字列を使用して Vector 値を表すことができます。
'[<float>, <float>, ...]'
例:
CREATE TABLE vector_table (
    id INT PRIMARY KEY,
    embedding VECTOR(3)
);
INSERT INTO vector_table VALUES (1, '[0.3, 0.5, -0.1]');
INSERT INTO vector_table VALUES (2, NULL);
無効な構文でベクトル値を挿入すると、エラーが発生します。
[tidb]> INSERT INTO vector_table VALUES (3, '[5, ]');
ERROR 1105 (HY000): Invalid vector text: [5, ]
次の例では、テーブルの作成時にembedding列に次元3が強制されるため、異なる次元のベクトルを挿入するとエラーが発生します。
[tidb]> INSERT INTO vector_table VALUES (4, '[0.3, 0.5]');
ERROR 1105 (HY000): vector has 2 dimensions, does not fit VECTOR(3)
ベクトル データ型で使用できる関数と演算子については、 ベクトル関数と演算子参照してください。
ベクター検索インデックスの構築と使用の詳細については、 ベクター検索インデックス参照してください。
異なる次元のベクトルを保存する
VECTOR型の次元パラメータを省略すると、同じ列に異なる次元のベクトルを保存できます。
CREATE TABLE vector_table (
    id INT PRIMARY KEY,
    embedding VECTOR
);
INSERT INTO vector_table VALUES (1, '[0.3, 0.5, -0.1]'); -- 3 dimensions vector, OK
INSERT INTO vector_table VALUES (2, '[0.3, 0.5]');       -- 2 dimensions vector, OK
ただし、ベクトル距離は同じ次元のベクトル間でのみ計算できるため、この列にベクター検索インデックス構築できないことに注意してください。
比較
比較演算子を使用して、 = 、 != 、 < 、 > 、 <= 、 >=などのベクトルデータ型を比較できます。ベクトルデータ型の比較演算子と関数の完全なリストについては、 ベクトル関数と演算子参照してください。
ベクトルデータ型は要素ごとに数値的に比較されます。例:
[1] < [12][1,2,3] < [1,2,5][1,2,3] = [1,2,3][2,2,3] > [1,2,3]
異なる次元を持つ 2 つのベクトルは、次の規則に従って辞書式比較を使用して比較されます。
- 2 つのベクトルは最初から要素ごとに比較され、各要素は数値的に比較されます。
 - 最初の不一致要素によって、どのベクトルが辞書式に他のベクトルより小さいか大きいかが決まります。
 - あるベクトルが別のベクトルの接頭辞である場合、短いベクトルは辞書順でもう一方より小さくなります。例えば、 
[1,2,3] < [1,2,3,0]。 - 同じ長さで同一の要素を持つベクトルは辞書的に等しいです。
 - 空ベクトルは、辞書順で空でないベクトルよりも小さい。例えば、 
[] < [1]。 - 2 つの空のベクトルは辞書的に等しいです。
 
ベクトル定数を比較する場合は、文字列値に基づく比較を避けるために、文字列からベクトルへの明示的なキャスト実行を検討してください。
-- Because string is given, TiDB is comparing strings:
[tidb]> SELECT '[12.0]' < '[4.0]';
+--------------------+
| '[12.0]' < '[4.0]' |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.01 sec)
-- Cast to vector explicitly to compare by vectors:
[tidb]> SELECT VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]');
+--------------------------------------------------+
| VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]') |
+--------------------------------------------------+
|                                                0 |
+--------------------------------------------------+
1 row in set (0.01 sec)
算術
ベクトルデータ型は算術演算+ (加算)と- (減算)をサポートします。ただし、異なる次元のベクトル間の算術演算はサポートされておらず、エラーが発生します。
例:
[tidb]> SELECT VEC_FROM_TEXT('[4]') + VEC_FROM_TEXT('[5]');
+---------------------------------------------+
| VEC_FROM_TEXT('[4]') + VEC_FROM_TEXT('[5]') |
+---------------------------------------------+
| [9]                                         |
+---------------------------------------------+
1 row in set (0.01 sec)
[tidb]> SELECT VEC_FROM_TEXT('[2,3,4]') - VEC_FROM_TEXT('[1,2,3]');
+-----------------------------------------------------+
| VEC_FROM_TEXT('[2,3,4]') - VEC_FROM_TEXT('[1,2,3]') |
+-----------------------------------------------------+
| [1,1,1]                                             |
+-----------------------------------------------------+
1 row in set (0.01 sec)
[tidb]> SELECT VEC_FROM_TEXT('[4]') + VEC_FROM_TEXT('[1,2,3]');
ERROR 1105 (HY000): vectors have different dimensions: 1 and 3
キャスト
ベクトル ⇔ 文字列間のキャスト
Vector と String 間のキャストを行うには、次の関数を使用します。
CAST(... AS VECTOR): 文字列 ⇒ ベクトルCAST(... AS CHAR): ベクトル ⇒ 文字列VEC_FROM_TEXT: 文字列 ⇒ ベクトルVEC_AS_TEXT: ベクトル ⇒ 文字列
ユーザビリティを向上させるため、ベクトル相関距離関数など、ベクトルデータ型のみをサポートする関数を呼び出す場合は、形式に準拠した文字列を渡すこともできます。この場合、TiDB は自動的に暗黙的なキャストを実行します。
-- The VEC_DIMS function only accepts VECTOR arguments, so you can directly pass in a string for an implicit cast.
[tidb]> SELECT VEC_DIMS('[0.3, 0.5, -0.1]');
+------------------------------+
| VEC_DIMS('[0.3, 0.5, -0.1]') |
+------------------------------+
|                            3 |
+------------------------------+
1 row in set (0.01 sec)
-- You can also explicitly cast a string to a vector using VEC_FROM_TEXT and then pass the vector to the VEC_DIMS function.
[tidb]> SELECT VEC_DIMS(VEC_FROM_TEXT('[0.3, 0.5, -0.1]'));
+---------------------------------------------+
| VEC_DIMS(VEC_FROM_TEXT('[0.3, 0.5, -0.1]')) |
+---------------------------------------------+
|                                           3 |
+---------------------------------------------+
1 row in set (0.01 sec)
-- You can also cast explicitly using CAST(... AS VECTOR):
[tidb]> SELECT VEC_DIMS(CAST('[0.3, 0.5, -0.1]' AS VECTOR));
+----------------------------------------------+
| VEC_DIMS(CAST('[0.3, 0.5, -0.1]' AS VECTOR)) |
+----------------------------------------------+
|                                            3 |
+----------------------------------------------+
1 row in set (0.01 sec)
複数のデータ型を受け入れる演算子または関数を使用する場合、文字列をその演算子または関数に渡す前に、文字列型を明示的にベクター型にキャストする必要があります。これは、TiDBが暗黙的なキャストを行わないためです。例えば、比較演算を実行する前に、文字列をベクターに明示的にキャストする必要があります。そうしないと、TiDBは文字列をベクター数値ではなく文字列値として比較します。
-- Because string is given, TiDB is comparing strings:
[tidb]> SELECT '[12.0]' < '[4.0]';
+--------------------+
| '[12.0]' < '[4.0]' |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.01 sec)
-- Cast to vector explicitly to compare by vectors:
[tidb]> SELECT VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]');
+--------------------------------------------------+
| VEC_FROM_TEXT('[12.0]') < VEC_FROM_TEXT('[4.0]') |
+--------------------------------------------------+
|                                                0 |
+--------------------------------------------------+
1 row in set (0.01 sec)
ベクトルを明示的に文字列表現にキャストすることもできます。1 VEC_AS_TEXT()を例に挙げましょう。
-- The string is first implicitly cast to a vector, and then the vector is explicitly cast to a string, thus returning a string in the normalized format:
[tidb]> SELECT VEC_AS_TEXT('[0.3,     0.5,  -0.1]');
+--------------------------------------+
| VEC_AS_TEXT('[0.3,     0.5,  -0.1]') |
+--------------------------------------+
| [0.3,0.5,-0.1]                       |
+--------------------------------------+
1 row in set (0.01 sec)
追加のキャスト関数については、 ベクトル関数と演算子参照してください。
ベクターと他のデータ型間のキャスト
現在、 Vector と他のデータ型( JSONなど)間の直接キャストはサポートされていません。この制限を回避するには、SQL文でキャストする際の中間データ型として String を使用してください。
テーブルに格納されているベクトル データ型の列は、 ALTER TABLE ... MODIFY COLUMN ...使用して他のデータ型に変換できないことに注意してください。
制限
ベクトル データ型の制限については、 ベクトル検索の制限およびベクトルインデックスの制限参照してください。
MySQLの互換性
ベクトル データ型は TiDB 固有であり、MySQL ではサポートされていません。