Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TiDB Serverlessのベクトル検索機能の紹介

TiDB Serverlessのベクトル検索機能の紹介

ウェビナー開催日:2024年7月25日

TiDB Serverlessのベクトル検索機能について紹介します。
AIや機械学習の高まりの中で、ベクトルデータベースの需要が増しています。従来、TiDBは基本的なデータ型だけでなく、JSONなどの新しいデータ型への対応も積極的に行ってきました。同様に、ベクトル型MySQLプロトコル互換であるTiDB Serverlessにベクトル機能を追加しています。
全く異なる種類のデータベースや新しい問い合わせ言語を学習する必要はなく、優れたTiDB Serverlessのスケーラビリティを生かして、慣れ親しんだSQLを用いてベクトル検索を利用できます。

トピック:
・TiDB Serverlessで利用できるベクトル検索機能の紹介
・ベクトル検索のために追加されるデータ型、ベクトル関数、インデックスの紹介
・TiDBのベクトル検索をTiDB Cloudで利用するには

アーカイブ動画:https://youtu.be/NLgIz2Zg21Q

PingCAP-Japan

July 26, 2024
Tweet

More Decks by PingCAP-Japan

Other Decks in Technology

Transcript

  1. これまでのウェビナースケジュール 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/
  2. アジェンダ • TiDB Serverlessとは • ベクトル検索とは • TiDB Serverlessでのベクトル検索 •

    生成AIエコシステムとのつながり • Q&A • アンケートのお願い & 告知
  3. 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で利用可能
  4. TiDB Serverlessベクトル検索 • 2024年2月1日 ◦ Private beta ◦ 招待制として開始 ◦

    限定されたリージョンのみ • 2024年6月25日 ◦ Public beta ◦ 全TiDB Serverlessユーザー利用可能 ◦ 全リージョンで利用可能
  5. ベクトル検索とは • ベクトルとは「向き」と「大きさ」とを持つ量 ◦ 対比 : スカラーは「大きさ」のみをもつ量 • 「向き」は次元で表すことができる ◦

    例 : 三次元ベクトルであれば、 x,y,z軸で表すことが可能 ◦ OpenAIが提供している text-embedding-ada-002 では 1536次元のベクトル • ベクトル検索では、埋め込まれた複数のベクトルの「類似性」を関数を利用して検索 ◦ マンハッタン距離、ユークリッド距離 ▪ マンハッタン距離(Taxicab distance)/ユークリッド距離( Euclidean distance)、L1/L2ノル ムとは?:AI・機械学習の用語辞典 - @IT ◦ コサイン距離 ▪ コサイン類似度(Cosine Similarity)とは?:AI・機械学習の用語辞典 - @IT
  6. RAG • Retrieval-Augmented Generationの略 • https://blogs.nvidia.co.jp/2023/11/17/what-is-retrieval-augmented-generation/ “Retrieval-Augmented Generation は、外部ソースから取得した情報を用いて、生成 AI

    モデルの精度と 信頼性を向上させるテクノロジです ” • ここでの「外部ソース」として、 TiDB Serverlessのベクトル検索機能が利用可能
  7. TiDB Serverlessでのベクトル検索 • TiDB Serverlessでのベクトル検索は「ベクトル型」と「関数」から成り立っています • ベクトル型 ◦ テーブルの型として、 VECTORを追加

    • 関数 ◦ ベクトル距離関数 ▪ 2つのベクトルの距離 (類似度)を返す ▪ 例 VEC_COSINE_DISTANE ◦ その他のベクトル関数 ▪ ベクトルの次元数を返す、ベクトルをテキストに変換するなど ▪ 例 : VEC_DIMS, VEC_AS_TEXT ◦ 集約関数 ▪ 従来の関数の引数にベクトル型をとれるように変更 • データ型、関数ともに従来のデータベースからある概念 ◦ SQLで操作可能 ◦ MySQLプロトコルで接続可能
  8. • 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)
  9. • ベクトル型のデータの更新可能 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)
  10. • ベクトルの次元数(引数の値)を指定しないで作成可能 ◦ 各行毎に任意の次元数のベクトルを追加可能 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)
  11. • ベクトルの各次元の値は 単精度浮動小数点で保存される 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)
  12. • ベクトル型のカラムを追加可能 (後述する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)
  13. • 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次元のベクトル化は別のロジックで実行されているものとします ベクトル距離関数
  14. • ベクトル距離関数を利用した検索 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) ベクトル距離関数
  15. • 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 ベクトル距離関数 : コサイン距離
  16. • 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 ベクトル距離関数 : マンハッタン距離
  17. • 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 ベクトル距離関数 : ユークリッド距離
  18. • 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 ベクトル距離関数 : ベクトルの内積
  19. HNSWインデックス • ベクトル検索はデフォルトでは「最近傍探索」を行う ◦ 結果は厳密(正確)だが、計算コストが高い • 近似最近傍探索 ◦ おおよそ正確(98%程度)な結果を、計算コスト (≒検索時間)を低く返す

    • HNSW(Hierarchical Navigable Small Worlds)インデックス ◦ 近似最近傍探索を行うために TiDB Serverlessで追加されたインデックス ◦ 直訳: 階層的で探索可能な小世界 ◦ 大まかな位置を把握し、徐々に階層を下って細かく目的地に近づくイメージ • 行数の絞り込みのために利用する従来のインデックスとは性質が異なります ◦ 検索時間を短縮を目的とする点では同一 ◦ 通常のインデックスはあってもなくても検索結果は同一 ◦ HNSWインデックスを利用した場合は最近傍探索と結果は必ずしも同一とはならない
  20. • 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インデックス
  21. • 現在、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インデックス
  22. • 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インデックス
  23. • 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インデックス
  24. • 利用する距離関数に応じて、 HNSWインデックスの作成を検討します ◦ "HNSW(distance=cosine)" ▪ VEC_COSINE_DISTANCE ◦ "HNSW(distance=l2)" ▪

    VEC_L2_DISTANCE • 単一のベクトル列に対して作成可能な HNSWインデックスは1つのみです ◦ 複数のインデックスが必要な場合は、異なる列を作成する必要があります • HNSWインデックスは近似最近傍検索 ◦ インデックス(≒TiFlash)の容量 ◦ 厳密な検索結果を求めるのか近似値を求めるのかのトレードオフとなります HNSWインデックスの使用例
  25. • TiDB Vector Client ◦ Langchain,Llama index,Dify等から利用 ◦ TiDBに特化した部分を実装 $

    pip install tidb-vector • https://github.com/pingcap/tidb-vector-python エコシステムとのつながり