Slide 1

Slide 1 text

TiDB Serverlessのベクトル検索機能の紹介 本多康夫 Technical support engineer at PingCAP Japan

Slide 2

Slide 2 text

これまでのウェビナースケジュール https://pingcap.co.jp/event/ 
 
 2023年7月27日(木) 14:00-15:00 TiDB Cloud最新状況の紹介 2023年9月14日(木) 14:00-15:00 TiDBとMySQLの互換性改善アップデート 2023年11月1日(木) 14:00-15:00 TiDB Operatorの紹介 2023年12月21日(木) 14:00-15:00 TiDB 7.4:MySQL 8.0互換性対応の紹介 2024年1月25日(木) 14:00-15:00 TiDB 7.5 LTS新機能の紹介 2024年2月29日(木) 14:00 - 15:00 TiDB Cloud APIとTerraform TiDB Cloud Providerの紹介 2024年3月28日(木) 14:00 - 15:00 TiProxyの紹介 2024年5月30日(木) 14:00 - 15:00 TiDB 8.0 DMR新機能の紹介 2024年7月25日(木) 14:00 - 15:00 TiDB Serverlessのベクトル検索機能の紹介 ※過去開催アーカイブ:https://pingcap.co.jp/event-video/

Slide 3

Slide 3 text

次回以降のウェビナースケジュール https://pingcap.co.jp/event/ 
 
 2024年9月予定 現在未定

Slide 4

Slide 4 text

アジェンダ ● TiDB Serverlessとは ● ベクトル検索とは ● TiDB Serverlessでのベクトル検索 ● 生成AIエコシステムとのつながり ● Q&A ● アンケートのお願い & 告知

Slide 5

Slide 5 text

おことわり ● 本ウェビナー実施日 (2024年7月25日)時点で、TiDB Serverlessにおけるベクトル検索は Public Beta となっております ● 予告なく機能の追加、変更が行われる可能性がございますのでご了承ください

Slide 6

Slide 6 text

TiDB Serverlessとは

Slide 7

Slide 7 text

TiDB Serverlessとは ● TiDB Cloudの2つの提供形態 ○ TiDB Dedicated : シングルテナント、リソース専有型 ○ TiDB Serverless : マルチテナント、リソース共有型 ● TiDB Serverlessの2つのプラン ● Free Cluster / Scalable Cluster ○ Free Cluster ■ クレジットカードの登録なく作成可能 ■ 5クラスタ、各クラスタ5GiB、50M RU ○ Scalable Cluster ■ Free Clusterの上限を超えてスケール可能 ■ Free ClusterからScalable Clusterへ移行可能 ■ クレジットカード登録必要 ■ Monthly Spending Limit(限度額)設定可能 ● TiFlashもFree Cluster/Scalable Cluster両方で利用可能 ○ 列指向のストレージエンジン ○ フルスキャンがTiKV(行指向)に比べて高速 ● 本ウェビナーで紹介する機能はすべて Free Clusterで利用可能

Slide 8

Slide 8 text

TiDB Serverlessベクトル検索 ● 2024年2月1日 ○ Private beta ○ 招待制として開始 ○ 限定されたリージョンのみ ● 2024年6月25日 ○ Public beta ○ 全TiDB Serverlessユーザー利用可能 ○ 全リージョンで利用可能

Slide 9

Slide 9 text

ベクトル検索とは

Slide 10

Slide 10 text

ベクトル検索とは ● ベクトルとは「向き」と「大きさ」とを持つ量 ○ 対比 : スカラーは「大きさ」のみをもつ量 ● 「向き」は次元で表すことができる ○ 例 : 三次元ベクトルであれば、 x,y,z軸で表すことが可能 ○ OpenAIが提供している text-embedding-ada-002 では 1536次元のベクトル ● ベクトル検索では、埋め込まれた複数のベクトルの「類似性」を関数を利用して検索 ○ マンハッタン距離、ユークリッド距離 ■ マンハッタン距離(Taxicab distance)/ユークリッド距離( Euclidean distance)、L1/L2ノル ムとは?:AI・機械学習の用語辞典 - @IT ○ コサイン距離 ■ コサイン類似度(Cosine Similarity)とは?:AI・機械学習の用語辞典 - @IT

Slide 11

Slide 11 text

全体図 ● TBD

Slide 12

Slide 12 text

RAG ● Retrieval-Augmented Generationの略 ● https://blogs.nvidia.co.jp/2023/11/17/what-is-retrieval-augmented-generation/ “Retrieval-Augmented Generation は、外部ソースから取得した情報を用いて、生成 AI モデルの精度と 信頼性を向上させるテクノロジです ” ● ここでの「外部ソース」として、 TiDB Serverlessのベクトル検索機能が利用可能

Slide 13

Slide 13 text

TiDB Serverlessでのベクトル検索

Slide 14

Slide 14 text

TiDB Serverlessでのベクトル検索 ● TiDB Serverlessでのベクトル検索は「ベクトル型」と「関数」から成り立っています ● ベクトル型 ○ テーブルの型として、 VECTORを追加 ● 関数 ○ ベクトル距離関数 ■ 2つのベクトルの距離 (類似度)を返す ■ 例 VEC_COSINE_DISTANE ○ その他のベクトル関数 ■ ベクトルの次元数を返す、ベクトルをテキストに変換するなど ■ 例 : VEC_DIMS, VEC_AS_TEXT ○ 集約関数 ■ 従来の関数の引数にベクトル型をとれるように変更 ● データ型、関数ともに従来のデータベースからある概念 ○ SQLで操作可能 ○ MySQLプロトコルで接続可能

Slide 15

Slide 15 text

● VECTOR型(引数は次元数) mysql> create table t (embedding vector(3)); mysql> insert into t(embedding) values( '[1,1,1]'); mysql> select * from t\G *************************** 1. row *************************** embedding: [1,1,1] ● 次元数を定義した場合、その次元数のベクトルのみ追加可能 ○ ベクトルはArrayのようなリテラルで記述 例: '[1,1,1]' ● VECTOR型に定義された次元を超える場合はエラーとなる mysql> insert into t(embedding) values(' [1,1,1,1]'); ERROR 1105 (HY000): vector has 4 dimensions, does not fit VECTOR(3) ● VECTOR型に定義された次元に満たない場合もエラーとなる mysql> insert into t(embedding) values(' [1]'); ERROR 1105 (HY000): vector has 1 dimensions, does not fit VECTOR(3) mysql> insert into t(embedding) values(' []'); ERROR 1105 (HY000): vector has 0 dimensions, does not fit VECTOR(3) ● ベクトルの要素が単精度浮動小数点で表せない場合は syntax errorとなる mysql> insert into t(embedding) values(' ['a','b','c']'); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 36 near "a','b','c']')" ベクトル型 (VECTOR)

Slide 16

Slide 16 text

● ベクトル型のデータの更新可能 mysql> create table t (id int auto_increment primary key, embedding vector(3)); mysql> insert into t(embedding) values('[1,1,1]'); mysql> select * from t; +----+-----------+ | id | embedding | +----+-----------+ | 1 | [1,1,1] | +----+-----------+ 1 row in set (0.02 sec) mysql> update t set embedding = '[1,1,2]' where id = 1; mysql> select * from t; +----+-----------+ | id | embedding | +----+-----------+ | 1 | [1,1,2] | +----+-----------+ 1 row in set (0.02 sec) ベクトル型 (VECTOR)

Slide 17

Slide 17 text

● ベクトルの次元数(引数の値)を指定しないで作成可能 ○ 各行毎に任意の次元数のベクトルを追加可能 mysql> create table t2 (embedding vector); mysql> insert into t2(embedding) values('[123456.7]'); mysql> insert into t2(embedding) values('[1,1,1,1]'); mysql> select * from t2; +------------+ | embedding | +------------+ | [123456.7] | | [1,1,1,1] | +------------+ ● 最大利用可能な次元数は 16000 ○ insert時に次元数が16000を超えた場合 mysql> insert into t2(embedding) values( ['1,1,1,...........,1]' ); # 16000個以上 ERROR 1105 (HY000): vector cannot have more than 16000 dimensions ○ create時に次元数が16000を超えた場合 mysql> create table t3 (embedding vector( 16001)); ERROR 1105 (HY000): vector cannot have more than 16000 dimensions ベクトル型 (VECTOR)

Slide 18

Slide 18 text

● ベクトルの各次元の値は 単精度浮動小数点で保存される mysql> create table t (embedding vector(3)); ● 単精度浮動小数点の値の保存を試みる mysql> insert into t(embedding) values('[ 3.1415927,3.1415927,3.1415927]'); ● 倍精度浮動小数点の値の保存を試みる mysql> insert into t(embedding) values('[ 3.141592653589793 ,3.141592653589793,3.141592653589793]'); ● いずれも単精度浮動小数点として保存される mysql> select * from t; +---------------------------------+ | embedding | +---------------------------------+ | [3.1415927,3.1415927,3.1415927] | | [3.1415927,3.1415927,3.1415927] | +---------------------------------+ 2 rows in set (0.01 sec) ベクトル型 (VECTOR)

Slide 19

Slide 19 text

● ベクトル型のカラムを追加可能 (後述するHNSWインデックスがある場合を除く ) mysql> create table t (id int auto_increment primary key); mysql> alter table t add (embedding vector(3)); Query OK, 0 rows affected (0.49 sec) ● データが入っていないときだけ、ベクトルの次元数の増減が可能 mysql> create table t (embedding vector(3)); mysql> alter table t modify embedding vector(4); mysql> show create table t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `embedding` vector( 4) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 1 row in set (0.01 sec) ● データが入っているときは、ベクトルの次元数の増減のいずれも不可能 mysql> create table t (embedding vector(3)); mysql> insert into t(embedding) values('[1,1,1]'); mysql> alter table t modify embedding vector(4); ERROR 1105 (HY000): vector has 3 dimensions, does not fit VECTOR(4) mysql> alter table t modify embedding vector(2); ERROR 1105 (HY000): vector has 3 dimensions, does not fit VECTOR(2) ベクトル型 (VECTOR)

Slide 20

Slide 20 text

関数 ● TiDB Serverlessベクトル検索のため、新規関数の追加、既存関数の機能追加が行われています ● ベクトル距離関数の追加 ○ 2つのベクトル間の距離を返す関数 ● 集約関数への機能追加 ○ 既存の関数(MAX(),MIN())などの引数にベクトルをとれるように変更

Slide 21

Slide 21 text

● 3次元のVECTOR型の列を含むテーブルを作成 mysql> CREATE TABLE vector_table ( -> id BIGINT AUTO_RANDOM PRIMARY KEY, -> doc TEXT, -> embedding VECTOR(3)); ● 3行のレコードをinsert mysql> INSERT INTO vector_table (doc, embedding) VALUES -> ('apple', '[1,1,1]'), -> ('banana', '[1,1,2]'), -> ('cat', '[2,2,3]'); ● ベクトル型のカラムに ORDER BYを利用して検索(ORDER BY DESCも利用可能) mysql> SELECT doc, embedding FROM vector_table ORDER BY embedding ; +--------+-----------+ | doc | embedding | +--------+-----------+ | apple | [1,1,1] | | banana | [1,1,2] | | cat | [2,2,3] | +--------+-----------+ 3 rows in set (0.00 sec) ● TiDB Serverlessではembeddingのロジック自体は提供していません ○ 各フルーツの3次元のベクトル化は別のロジックで実行されているものとします ベクトル距離関数

Slide 22

Slide 22 text

● ベクトル距離関数を利用した検索 mysql> SELECT -> embedding, -> VEC_COSINE_DISTANCE(embedding, '[3,2,1]') AS cos_to_321, -> VEC_L1_DISTANCE(embedding, '[3,2,1]') AS l1_to_321, -> VEC_L2_DISTANCE(embedding, '[3,2,1]') AS l2_to_321, -> VEC_NEGATIVE_INNER_PRODUCT(embedding, '[3,2,1]') AS nip_to_321 -> FROM -> vector_table -> order by embedding; +-----------+---------------------+-----------+-------------------+------------+ | embedding | cos_to_321 | l1_to_321 | l2_to_321 | nip_to_321 | +-----------+---------------------+-----------+-------------------+------------+ | [1,1,1] | 0.07417990022744858 | 3 | 2.23606797749979 | -6 | | [1,1,2] | 0.23623738417402662 | 4 | 2.449489742783178 | -7 | | [2,2,3] | 0.15733515938218623 | 3 | 2.23606797749979 | -13 | +-----------+---------------------+-----------+-------------------+------------+ 3 rows in set (0.01 sec) ベクトル距離関数

Slide 23

Slide 23 text

● VEC_COSINE_DISTANCE ○ 2つのベクトルのコサイン距離を返す mysql> select VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1]'); +-------------------------------------------+ | VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1]') | +-------------------------------------------+ | 2 | +-------------------------------------------+ ○ 2つのベクトルの次元は一致している必要がある mysql> select VEC_COSINE_DISTANCE('[1, 1]', '[-1, -1, -1]'); ERROR 1105 (HY000): vectors have different dimensions: 2 and 3 ベクトル距離関数 : コサイン距離

Slide 24

Slide 24 text

● VEC_L1_DISTANCE ○ 2つのベクトルのL1距離(マンハッタン距離)を返す mysql> select VEC_L1_DISTANCE('[0,0]', '[3,4]'); +-----------------------------------+ | VEC_L1_DISTANCE('[0,0]', '[3,4]') | +-----------------------------------+ | 7 | +-----------------------------------+ ○ 2つのベクトルの次元は一致している必要がある mysql> select VEC_L1_DISTANCE('[0,0]', '[3,4,5]'); ERROR 1105 (HY000): vectors have different dimensions: 2 and 3 ベクトル距離関数 : マンハッタン距離

Slide 25

Slide 25 text

● VEC_L2_DISTANCE ○ 2つのベクトルのL2距離(ユークリッド距離)を返す mysql> select VEC_L2_DISTANCE('[0,3]', '[4,0]'); +-----------------------------------+ | VEC_L2_DISTANCE('[0,3]', '[4,0]') | +-----------------------------------+ | 5 | +-----------------------------------+ ○ 2つのベクトルの次元は一致している必要がある mysql> select VEC_L2_DISTANCE('[0,3]', '[4,0,0]'); ERROR 1105 (HY000): vectors have different dimensions: 2 and 3 ベクトル距離関数 : ユークリッド距離

Slide 26

Slide 26 text

● VEC_NEGATIVE_INNER_PRODUCT ○ 2つのベクトルの負の内積を返す mysql> select VEC_NEGATIVE_INNER_PRODUCT('[1,2]', '[3,4]'); +----------------------------------------------+ | VEC_NEGATIVE_INNER_PRODUCT('[1,2]', '[3,4]') | +----------------------------------------------+ | -11 | +----------------------------------------------+ ○ 2つのベクトルの次元は一致している必要がある mysql> select VEC_NEGATIVE_INNER_PRODUCT('[1,2]', '[3,4,5]'); ERROR 1105 (HY000): vectors have different dimensions: 2 and 3 ベクトル距離関数 : ベクトルの内積

Slide 27

Slide 27 text

● https://docs.pingcap.com/tidbcloud/vector-search-functions-and-operators ベクトル検索で利用可能な関数一覧

Slide 28

Slide 28 text

HNSWインデックス ● ベクトル検索はデフォルトでは「最近傍探索」を行う ○ 結果は厳密(正確)だが、計算コストが高い ● 近似最近傍探索 ○ おおよそ正確(98%程度)な結果を、計算コスト (≒検索時間)を低く返す ● HNSW(Hierarchical Navigable Small Worlds)インデックス ○ 近似最近傍探索を行うために TiDB Serverlessで追加されたインデックス ○ 直訳: 階層的で探索可能な小世界 ○ 大まかな位置を把握し、徐々に階層を下って細かく目的地に近づくイメージ ● 行数の絞り込みのために利用する従来のインデックスとは性質が異なります ○ 検索時間を短縮を目的とする点では同一 ○ 通常のインデックスはあってもなくても検索結果は同一 ○ HNSWインデックスを利用した場合は最近傍探索と結果は必ずしも同一とはならない

Slide 29

Slide 29 text

● TiDB Serverlessが対応しているHNSWインデックスの種類 ○ コサイン距離 ○ L2距離(ユークリッド距離) ● 文法 : テーブル作成時にCOMMENTとして追加します mysql> create table t4 (embedding vector(3) COMMENT "HNSW(distance=cosine) "); mysql> show create table t4\G *************************** 1. row *************************** Table: t4 Create Table: CREATE TABLE `t4` ( `embedding` vector(3) DEFAULT NULL COMMENT 'HNSW(distance=cosine)' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 1 row in set (0.02 sec) mysql> create table t5 (embedding vector(3) COMMENT "HNSW(distance=l2)" ); mysql> show create table t5\G *************************** 1. row *************************** Table: t5 Create Table: CREATE TABLE `t5` ( `embedding` vector(3) DEFAULT NULL COMMENT 'HNSW(distance=l2)' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin HNSWインデックス

Slide 30

Slide 30 text

● 現在、HNSWインデックスは、テーブル新規作成時のみ追加可能です mysql> create table t5 (id int auto_increment primary key); mysql> alter table t5 add (embedding vector(3) comment "HNSW(distance=cosine)"); ERROR 1105 (HY000): currently HNSW index can be only defined when creating the table ● 現在、VECTOR型のカラムに、alter table/create indexでのインデックス追加はできませ ん mysql> create table t6 (embedding vector(3)); mysql> alter table t6 add index (embedding); ERROR 1105 (HY000): currently vector column index can be only specified via column comment mysql> create index i6 on t6(embedding); ERROR 1105 (HY000): currently vector column index can be only specified via column comment ● HNSWインデックスは、ベクトルの次元数が決められた列にのみ作成可能です mysql> create table t7 (embedding vector COMMENT "HNSW(distance=cosine)"); ERROR 1105 (HY000): HNSW index can only be defined on fixed-dimention vector columns ● https://docs.pingcap.com/tidbcloud/vector-search-index#create-the-hnsw-vec tor-index > The syntax to create a vector index might change in future releases. (試訳: ベクトルインデックスを作成する文法は将来のリリースで変更される可能性があり ます) HNSWインデックス

Slide 31

Slide 31 text

● TiDB Serverlessが対応しているHNSWインデックスの種類 ○ コサイン距離 ○ L2距離(ユークリッド距離) mysql> create table t4 (embedding vector(3) COMMENT "HNSW(distance=cosine) "); mysql> show create table t4\G *************************** 1. row *************************** Table: t4 Create Table: CREATE TABLE `t4` ( `embedding` vector(3) DEFAULT NULL COMMENT 'HNSW(distance=cosine)' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 1 row in set (0.02 sec) ● 下記のベクトル距離への HNSWインデックスは現状未対応です ○ L1(マンハッタン距離) ○ ベクトルの内積 mysql> create table t (embedding vector(3) COMMENT " HNSW(distance=l1) "); ERROR 1105 (HY000): unsupported HNSW distance metric 'l1' , available values: l2, cosine HNSWインデックス

Slide 32

Slide 32 text

● HNSWインデックスの実態 : TiFlash上に作成される mysql> select * from information_schema. tiflash_replica ; +--------------+------------+----------+---------------+-----------------+-----------+----------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_ID | REPLICA_COUNT | LOCATION_LABELS | AVAILABLE | PROGRESS | +--------------+------------+----------+---------------+-----------------+-----------+----------+ | test | t4 | 101 | 2 | | 1 | 1 | +--------------+------------+----------+---------------+-----------------+-----------+----------+ ● information_schema.tiflash_indexes ○ TiFlashのインデックスを表示 (現状HNSWのみ) ○ 2行あるのは、REPLICA_COUNT(TiFlashサーバー数)が2つのため mysql> select tidb_database,tidb_table,column_name,index_kind,tiflash_instance from information_schema.tiflash_indexes; +---------------+------------+-------------+------------+------------------+ | tidb_database | tidb_table | column_name | index_kind | tiflash_instance | +---------------+------------+-------------+------------+------------------+ | test | t4 | embedding | HNSW | store-7000164f | | test | t4 | embedding | HNSW | store-6ba728d2 | +---------------+------------+-------------+------------+------------------+ ● information_schema.tidb_indexesにはHNSWインデックスは含まれません mysql> select * from information_schema. tidb_indexes where table_schema = 'test'; Empty set (0.01 sec) HNSWインデックス

Slide 33

Slide 33 text

● 利用する距離関数に応じて、 HNSWインデックスの作成を検討します ○ "HNSW(distance=cosine)" ■ VEC_COSINE_DISTANCE ○ "HNSW(distance=l2)" ■ VEC_L2_DISTANCE ● 単一のベクトル列に対して作成可能な HNSWインデックスは1つのみです ○ 複数のインデックスが必要な場合は、異なる列を作成する必要があります ● HNSWインデックスは近似最近傍検索 ○ インデックス(≒TiFlash)の容量 ○ 厳密な検索結果を求めるのか近似値を求めるのかのトレードオフとなります HNSWインデックスの使用例

Slide 34

Slide 34 text

● コサイン距離の検索で HNSWインデックスがない場合の実行計画 ○ TiKV上にあるテーブルのフルスキャン ○ estRowsが557056と多い ○ 一般的に行指向のTiKVはフルスキャンには不向き HNSWインデックスの使用例

Slide 35

Slide 35 text

● L2距離の検索でHNSWインデックス("HNSW(distance=cosine)")がある場合の実行計画 ○ TiFlash上にあるテーブルの検索 ○ estRowsの値が1.00と少ない ○ operator info上のannIndex:COSINEよりHNSWインデックスが使用されていることがわ かる ○ HNSWインデックスの使用例

Slide 36

Slide 36 text

● L2距離の検索でマッチしない HNSWインデックス("HNSW(distance=cosine)")がある場合の実 行計画 ○ TiFlash上にあるテーブルのフルスキャンのみ ○ operator infoにHNSWインデックスの記述はなし HNSWインデックスの使用例

Slide 37

Slide 37 text

● https://docs.pingcap.com/tidbcloud/vector-search-improve-performance ○ ウェビナーで紹介した以外のベクトル検索の性能向上方法が記載されています HNSWインデックスの使用例

Slide 38

Slide 38 text

生成AIエコシステムとのつながり

Slide 39

Slide 39 text

● TiDB Serverlessのベクトル検索機能は、それ単体でのみで価値をもたらすわけではなく、生成 AIエコシス テムとのつながりにおいてユーザーに価値を提供します ● https://docs.llamaindex.ai/en/stable/examples/vector_stores/TiDBVector/ ● https://python.langchain.com/v0.2/docs/integrations/memory/tidb_chat_message_history/ ● https://github.com/langgenius/dify/releases/tag/0.6.11 エコシステムとのつながり

Slide 40

Slide 40 text

● TiDB Vector Client ○ Langchain,Llama index,Dify等から利用 ○ TiDBに特化した部分を実装 $ pip install tidb-vector ● https://github.com/pingcap/tidb-vector-python エコシステムとのつながり

Slide 41

Slide 41 text

● Data Service (beta) において、ベクトル検索のエンドポイントが追加 ○ DifyやGPTsとのインテグレーションも可能 ● https://docs.pingcap.com/tidbcloud/tidb-cloud-release-notes#july-23-2024 エコシステムとのつながり

Slide 42

Slide 42 text

Thank You! 
 https://www.pingcap.com/
 [email protected]